using System; using System.Collections.Generic; using OpenMetaverse; using Discord; using BetterSecondBotShared.Static; using Discord.WebSocket; using System.Threading.Tasks; using System.Linq; using System.Timers; using BetterSecondBotShared.logs; namespace BetterSecondBot.DiscordSupervisor { public abstract class DiscordBot : DiscordInbound { protected Timer ReconnectTimer; protected virtual async Task StartDiscordClientService() { DiscordClient = new DiscordSocketClient(); DiscordClient.Ready += DiscordClientReady; DiscordClient.LoggedOut += DiscordClientLoggedOut; DiscordClient.LoggedIn += DicordClientLoggedin; DiscordClient.MessageReceived += DiscordClientMessageReceived; ReconnectTimer = new Timer(); ReconnectTimer.Interval = 10000; ReconnectTimer.Elapsed += ReconnectTimerEvent; ReconnectTimer.AutoReset = false; ReconnectTimer.Enabled = false; LogFormater.Info("Discord is starting", true); await DiscordClient.LoginAsync(TokenType.Bot, myconfig.DiscordFull_Token); } protected override Task DiscordClientLoggedOut() { LogFormater.Info("Discord has logged out", true); ReconnectTimer = new Timer(); ReconnectTimer.Interval = 10000; ReconnectTimer.Elapsed += ReconnectTimerEvent; ReconnectTimer.AutoReset = false; ReconnectTimer.Enabled = false; return Task.CompletedTask; } protected virtual async Task DicordClientLoggedin() { LogFormater.Info("Discord has logged in", true); await DiscordClient.StartAsync().ConfigureAwait(false); ReconnectTimer = new Timer(); ReconnectTimer.Interval = 10000; ReconnectTimer.Elapsed += ReconnectTimerEvent; ReconnectTimer.AutoReset = false; ReconnectTimer.Enabled = false; return Task.CompletedTask; } private void ReconnectTimerEvent(Object source, System.Timers.ElapsedEventArgs e) { ReconnectTimer.Enabled = false; _ = StartDiscordClientService().ConfigureAwait(false); } protected virtual async Task DiscordClientReady() { LogFormater.Info("Discord is active", true); ReconnectTimer.Enabled = false; await DiscordClient.SetStatusAsync(Discord.UserStatus.Idle); await DiscordClient.SetGameAsync("Not connected", null, ActivityType.CustomStatus); DiscordServer = DiscordClient.GetGuild(myconfig.DiscordFull_ServerID); if (DiscordServer != null) { if (myconfig.DiscordFull_Enable == true) { login_bot(false); } DiscordUnixTimeOnine = helpers.UnixTimeNow(); DiscordClientConnected = true; await DiscordRebuildChannels(); } else { DiscordClientConnected = false; } return Task.CompletedTask; } } }