示例#1
0
        public async Task RunAsync()
        {
            string discordToken = await File.ReadAllTextAsync("Tokens/Discord.txt");

            string githubToken = await File.ReadAllTextAsync("Tokens/Github.txt");

            var githubRest = new GithubRest(githubToken);

            _client = new DiscordSocketClient(new DiscordSocketConfig()
            {
                LogLevel = LogSeverity.Info,
            });

            _client.Log += (message) =>
            {
                Console.WriteLine(message);
                return(Task.CompletedTask);
            };

            _client.Ready += () =>
            {
                Console.WriteLine("Connected!");
                return(Task.CompletedTask);
            };

            _client.Disconnected += (exception) => //Kills the bot if it doesn't reconnect
            {
                Task.Run(async() =>
                {
                    CancellationTokenSource cts = new CancellationTokenSource();
                    Task ctsTask()
                    {
                        cts.Cancel();
                        return(Task.CompletedTask);
                    }

                    _client.Connected += ctsTask;
                    try { await Task.Delay(30000, cts.Token); } catch { }
                    if (!cts.IsCancellationRequested)
                    {
                        Environment.Exit(1);
                    }
                    _client.Connected -= ctsTask;
                    cts.Dispose();
                });
                return(Task.CompletedTask);
            };

            _client.MessageReceived += (message) =>
            {
                Task.Run(async() =>
                {
                    if (message is IUserMessage userMessage)
                    {
                        if (userMessage.Author.IsBot)
                        {
                            return;
                        }
                        if (userMessage.Channel is ITextChannel tc && tc.GuildId == 81384788765712384 && userMessage.Channel.Name != "dotnet_discord-net" && userMessage.Channel.Name != "testing" && userMessage.Channel.Name != "playground")
                        {
                            return;
                        }
                        MatchCollection matches = _githubRegex.Matches(userMessage.Content);
                        if (matches.Count > 0)
                        {
                            var urls = await githubRest.GetIssuesUrlsAsync(matches.Take(3).Select(x => x.Groups["number"].Value));
                            await userMessage.Channel.SendMessageAsync(string.Join("\n", urls));
                        }
                    }
                });
                return(Task.CompletedTask);
            };

            var services = new ServiceCollection();

            services.AddSingleton(_client);
            services.AddSingleton(new PaginatorService(_client));
            services.AddSingleton(githubRest);

            _mainController = new MainController(_client, services.BuildServiceProvider());
            await _mainController.InitializeEarlyAsync();

            await _client.LoginAsync(TokenType.Bot, discordToken);

            await _client.StartAsync();

            await Task.Delay(-1);
        }