public static async Task Main(string[] args) { Console.Title = "Bot Ido"; //Always download users to make sure we can always get them var config = new DiscordSocketConfig { AlwaysDownloadUsers = true }; var interactiveConfig = new InteractiveServiceConfig { DefaultTimeout = TimeSpan.FromMinutes(10) }; // Dependency injection. All objects use constructor injection. _client = new DiscordSocketClient(config); _commands = new CommandService(); _services = new ServiceCollection() .AddSingleton(_client) .AddSingleton(_commands) .AddSingleton <GuildHandler>() .AddSingleton <CommandHandler>() .AddSingleton <LogHandler>() .AddSingleton <UserHandler>() .AddSingleton <ScheduleHandler>() .AddSingleton <DataService>() .AddSingleton <Random>() .AddSingleton <GoogleCalendar>() .AddSingleton <YouTube>() .AddSingleton <ReservationService>() .AddSingleton <PlaytestService>() .AddSingleton <RconService>() .AddSingleton <SrcdsLogService>() .AddSingleton <VoiceChannelHandler>() .AddSingleton <ToolsService>() .AddSingleton <VerificationService>() .AddSingleton <IHelpService, HelpService>() .AddSingleton(s => new InteractiveService(_client, interactiveConfig)) .BuildServiceProvider(); _dataService = _services.GetRequiredService <DataService>(); _log = _services.GetRequiredService <LogHandler>(); _services.GetRequiredService <GuildHandler>(); _services.GetRequiredService <ScheduleHandler>(); await _services.GetRequiredService <CommandHandler>().InstallCommandsAsync(); _services.GetRequiredService <UserHandler>(); _services.GetRequiredService <VoiceChannelHandler>(); _services.GetRequiredService <SrcdsLogService>(); _services.GetRequiredService <ToolsService>(); //Google APIs _services.GetRequiredService <GoogleCalendar>(); _services.GetRequiredService <YouTube>(); // Remember to keep token private or to read it from an // external source! In this case, we are reading the token // from an environment variable. If you do not know how to set-up // environment variables, you may find more information on the // Internet or by using other methods such as reading from // a configuration. await _client.LoginAsync(TokenType.Bot, _services.GetRequiredService <DataService>().RSettings.ProgramSettings.BotToken); _dataService.SetLogHandler(_services.GetRequiredService <LogHandler>()); //Set handlers for static classes DatabaseUtil.SetHandlers(_services.GetRequiredService <LogHandler>(), _services.GetRequiredService <DataService>()); DownloadHandler.SetHandlers(_services.GetRequiredService <LogHandler>(), _services.GetRequiredService <DataService>()); GeneralUtil.SetHandlers(_services.GetRequiredService <LogHandler>(), _services.GetRequiredService <DataService>(), _services.GetRequiredService <Random>()); DemoParser.SetHandlers(_services.GetRequiredService <LogHandler>(), _services.GetRequiredService <DataService>()); HeatmapGenerator.SetHandlers(_services.GetRequiredService <LogHandler>(), _services.GetRequiredService <DataService>()); await _client.StartAsync(); // Block this task until the program is closed. await Task.Delay(-1); }