Discord.NET从一个控制台应用程序项目中运行多个机器人

时间:2020-05-28 08:04:17

标签: c# .net discord.net

我已经看到了许多如何运行Discord.NET Bot的示例,但是所有这些示例都显示了如何每运行1个机器人 1个控制台应用程序项目或一个服务器分片的机器人,那么此库是否仅设计用于1 <-> 1方法,因为我还看到singleton用于连接零件?是否可以从一个代码库运行多个机器人?我需要它来跟踪机器人/连接器并查看Web应用程序中的状态,但是如果我采用多种控制台应用程序方法,则可能是一个错误的决定。

1 个答案:

答案 0 :(得分:0)

尽管您可能应该为每个不和谐的bot使用object和class,但是我想让您知道如何实现这种效果。我可能还会使用更好的日志记录系统(也许有一些日志记录库?)。但是,如果我是您,我会考虑使用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);
        }
    }
}