Discord. NET запускать несколько ботов из одного проекта консольного приложения - PullRequest
0 голосов
/ 28 мая 2020

Я видел много примеров, как запускать Discord. NET Бот, но все эти примеры показывают, как запустить 1 бота на 1 проект консольного приложения или одного бота, сегментированного с серверами, поэтому эта библиотека предназначена только для 1 <- > 1 подход, потому что я видел также используется синглтон для подключения части? Можно ли запускать несколько ботов из одной кодовой базы? Мне это нужно для отслеживания ботов / подключений и просмотра статусов в веб-приложении, но это может быть плохим решением, если я go использую несколько консольных приложений.

1 Ответ

0 голосов
/ 28 мая 2020

Вам, вероятно, следует использовать объект и класс для каждого бота Discord, но я хотел дать вам представление о том, как вы можете достичь такого эффекта. Я бы, вероятно, также использовал лучшую систему журналов (может быть, какую-нибудь библиотеку журналов?). Но на вашем месте я бы подумал, может быть, использовать docker и docker -compose?

Ура

using System.Threading;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;

namespace temp
{
    public class Program
    {
        public static async Task Bot1(Func<LogMessage, Task> log, CancellationToken cancellationToken)
        {
            var client = new DiscordSocketClient();
            client.Log += log;
            await client.LoginAsync(TokenType.Bot, "token1");
            await client.StartAsync();
            await Task.Delay(-1, cancellationToken);
        }
        public static async Task Bot2(Func<LogMessage, Task> log, CancellationToken cancellationToken)
        {
            var client = new DiscordSocketClient();
            client.Log += log;
            await client.LoginAsync(TokenType.Bot, "token2");
            await client.StartAsync();
            await Task.Delay(-1, cancellationToken);
        }
        public static void Main()
        {
            var cancellationToken = new CancellationTokenSource();
            Console.CancelKeyPress += (sender, args) =>
            {
                cancellationToken.Cancel();
                args.Cancel = true;
            };
            Task.WhenAll(new Task[]
            {
                Bot1(Log, cancellationToken.Token),
                Bot2(Log, cancellationToken.Token)
            });
        }

        private static async Task Log(LogMessage message)
        {
            Console.WriteLine(message);
        }
    }
}
...