【问题标题】:Discord.NET run multiple bots from one console app projectDiscord.NET 从一个控制台应用程序项目运行多个机器人
【发布时间】:2020-09-15 11:33:12
【问题描述】:

我看过很多如何运行 Discord.NET Bot 的示例,但所有这些示例都展示了如何在每个示例中运行 1 个机器人 1 个控制台应用程序项目或一个与服务器分片的机器人,所以这个库是否仅设计用于 11 方法,因为我还看到单例用于连接部分?是否可以从一个代码库运行多个机器人?我需要它来跟踪机器人/连接并查看 web 应用程序中的状态,但如果我使用多个控制台应用程序方法,这可能是一个错误的决定。

【问题讨论】:

  • 您好,编辑您的问题并添加一些代码来说明您正在尝试做什么以及遇到问题的地方可能是个好主意!
  • 您需要做的就是在程序中登录多个 DiscordSocketClients 或 Sharded 客户端。
  • 现在我只是想了解如何对整个系统进行建模,但是对于那些多个客户端 DiscordSocketClients,我需要在某个地方安全地存储和保存,这可能是并发字典或其他东西存储不应长期处置
  • 但是客户端的内存存储可以增长可能不是扩展的最佳方式,但找不到其他方式

标签: c# .net discord.net


【解决方案1】:

尽管您可能应该为每个不和谐机器人使用对象和类,但我想告诉您如何实现这样的效果。我可能还会使用更好的日志系统(也许是一些日志库?)。但如果我是你,我可能会考虑使用 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);
        }
    }
}

【讨论】:

  • 谢谢你的例子!是的,我也可以考虑 docker compose,但现在我需要简单的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2017-03-16
相关资源
最近更新 更多