using Valour.Sdk.Client; using Valour.Sdk.Models; using DotNetEnv; using SkyBot; using Valour.Sdk.Services; using System.Net.NetworkInformation; Env.Load(); var token = Environment.GetEnvironmentVariable("TOKEN"); var allowedUserIds = new List { 15652354820931584 }; var client = new ValourClient("https://api.valour.gg/"); client.SetupHttpClient(); if (string.IsNullOrWhiteSpace(token)) { Console.WriteLine("TOKEN environment variable not set."); return; } var loginResult = await client.InitializeUser(token); if (!loginResult.Success) { Console.WriteLine($"Login Failed: {loginResult.Message}"); return; } Console.WriteLine($"Logged in as {client.Me.Name} (ID: {client.Me.Id})"); await Utils.UpdateValourUserCountAsync(); Utils.StartValourUserUpdater(); //Dictionaries var channelCache = new Dictionary(); var InitializedPlanets = new HashSet(); _ = Task.Run(async () => { while (true) { foreach (var planet in client.PlanetService.JoinedPlanets) { if (InitializedPlanets.Contains(planet.Id)) return; Console.WriteLine($"Initializing Planet: {planet.Name}"); await planet.EnsureReadyAsync(); await planet.FetchInitialDataAsync(); foreach (var channel in planet.Channels) { channelCache[channel.Id] = channel; if (channel.ChannelType == Valour.Shared.Models.ChannelTypeEnum.PlanetChat) { await channel.OpenWithResult("SkyBot"); Console.WriteLine($"Realtime opened for: ${planet.Name} -> {channel.Name}"); } } InitializedPlanets.Add(planet.Id); } await Task.Delay(5000); } }); client.MessageService.MessageReceived += async (message) => { string content = message.Content ?? ""; long channelId = message.ChannelId; var member = await message.FetchAuthorMemberAsync(); var pingMember = $"«@m-{member.Id}»"; if (content is null) return; if (message.AuthorUserId == client.Me.Id) return; if (allowedUserIds.Contains(message.AuthorUserId)) { if (Utils.IsSingleEmoji(content)) { await message.AddReactionAsync(content); } }; var echoprefixes = new[] { "s/echo"}; if (Utils.ContainsAny(content, echoprefixes)) { var matchedPrefix = echoprefixes.First(p => content.StartsWith(p, StringComparison.OrdinalIgnoreCase)); var reply = content.Substring(matchedPrefix.Length).TrimStart(); if (string.IsNullOrWhiteSpace(reply)) await Utils.SendReplyAsync(channelCache, channelId, $"{pingMember} Enter a message to echo."); reply = $"{pingMember} {reply}"; if (reply.Length > 2048) { reply = reply.Substring(0, 2048); } await Utils.SendReplyAsync(channelCache, channelId, reply); }; var echorawprefixes = new[] { "s/rawecho"}; if (Utils.ContainsAny(content, echorawprefixes)) { if (message.AuthorUserId != 15652354820931584) { await Utils.SendReplyAsync(channelCache, channelId, "You do not have permission to execute this command."); return; } var matchedPrefix = echorawprefixes.First(p => content.StartsWith(p, StringComparison.OrdinalIgnoreCase)); var reply = content.Substring(matchedPrefix.Length).TrimStart(); if (string.IsNullOrWhiteSpace(reply)) { await Utils.SendReplyAsync(channelCache, channelId, $"{pingMember} Enter a message to echo."); return; } reply = $"{reply}"; if (reply.Length > 2048) { reply = reply.Substring(0, 2048); } await Utils.SendReplyAsync(channelCache, channelId, reply); }; if (Utils.ContainsAny(content, "s/suggest")) { await Utils.SendReplyAsync(channelCache, channelId, $"{pingMember} You can suggest a command to be added here: https://docs.google.com/spreadsheets/d/1CzcpLAuMiPL_RODrZ5x25cPj8yE-rR3mEnqrd_2Fbmk"); }; if (Utils.ContainsAny(content, "s/source")) { await Utils.SendReplyAsync(channelCache, channelId, $"{pingMember} You can see my source code here: https://github.com/SkyJoshua/SkyBot"); }; if (Utils.ContainsAny(content, "s/cmds")) { await Utils.SendReplyAsync(channelCache, channelId, @$"{pingMember} Here is a list of my commands: - `s/echo - Echos text into the chat` - `s/suggest - Shares the suggestions link` - `s/source - Sends link for the source code` - `s/cmds - Shows this list` - `s/usercount - Shows the user count of Valour` - `s/devcentral - Sends the invite link to the Bot Central Planet`"); }; if (Utils.ContainsAny(content, "s/usercount")) { await Utils.SendReplyAsync(channelCache, channelId, @$"{pingMember} Current Valour user count is: {Utils.ValourUserCount:N0} You can see a graph of the user count here: /meow"); }; if (Utils.ContainsAny(content, "s/devcentral")) { await Utils.SendReplyAsync(channelCache, channelId, @$"{pingMember} you can join the Dev Central planet here: https://app.valour.gg/I/k2tz9c4i"); } }; Console.WriteLine("Listening for messages..."); await Task.Delay(Timeout.Infinite);