using Discord; using Discord.WebSocket; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Noikoio.RegexBot { /// /// Main class. On start, initializes bot modules and passes the DiscordSocketClient to them /// class RegexBot { private static Configuration _config; private readonly DiscordSocketClient _client; private BotModule[] _modules; internal static Configuration Config => _config; internal IEnumerable Modules => _modules; internal RegexBot() { // Welcome message string name = nameof(RegexBot); string sv = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(3); Logger.GetLogger(name) .Invoke($"{name} v{sv} - https://github.com/Noikoio/RegexBot") .Wait(); // Load configuration _config = new Configuration(this); if (!_config.LoadInitialConfig()) { #if DEBUG Console.WriteLine("Press any key to exit."); Console.ReadKey(); #endif Environment.Exit(1); } // Set Discord client settings _client = new DiscordSocketClient(new DiscordSocketConfig() { LogLevel = LogSeverity.Info, AlwaysDownloadUsers = true, DefaultRetryMode = RetryMode.AlwaysRetry, MessageCacheSize = 0 }); // Hook up basic handlers and other references _client.Connected += _client_Connected; EntityCache.EntityCache.SetClient(_client); // Initialize modules _modules = new BotModule[] { new Module.DMLogger.DMLogger(_client), new Module.AutoMod.AutoMod(_client), new Module.ModCommands.ModCommands(_client), new Module.AutoRespond.AutoRespond(_client), new Module.EntryAutoRole.EntryAutoRole(_client), new Module.VoiceRoleSync.VoiceRoleSync(_client), new Module.VoteTempChannel.VoteTempChannel(_client), // EntityCache loads before anything using it new EntityCache.ECModule(_client), new Module.ModLogs.ModLogs(_client) }; // Set up logging var dlog = Logger.GetLogger("Discord.Net"); _client.Log += async (arg) => await dlog( String.Format("{0}: {1}{2}", arg.Source, ((int)arg.Severity < 3 ? arg.Severity + ": " : ""), arg.Message)); // Finish loading configuration var conf = _config.ReloadServerConfig().Result; if (conf == false) { Console.WriteLine("Failed to load server configuration."); #if DEBUG Console.WriteLine("Press any key to exit."); Console.ReadKey(); #endif Environment.Exit(1); } } internal async Task Start() { await _client.LoginAsync(TokenType.Bot, Config.BotUserToken); await _client.StartAsync(); await Task.Delay(-1); } private async Task _client_Connected() => await _client.SetGameAsync(Config.CurrentGame); // Defined within this class because a reference to the client is required public void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) { e.Cancel = true; Logger.GetLogger("Runtime")("Caught cancel key. Will attempt to disconnect...").Wait(); _client.LogoutAsync().Wait(); _client.Dispose(); #if DEBUG Console.WriteLine("Press enter to exit."); Console.ReadLine(); #endif Environment.Exit(0); } } }