【问题标题】:Trouble having bot direct message my whole server无法让机器人直接向我的整个服务器发送消息
【发布时间】:2019-06-20 09:56:28
【问题描述】:

我想首先说这是我和我的朋友之间的小型服务器,我们所有人都同意使用这样的东西,因此我认为它不会违反任何不和谐的准则。

我首先编写了一些测试代码来测试机器人能够 DM 服务器上的所有用户,如下所示:

[Command("dm")]
        public async Task DmAsync()
        {
            var guild = Program._client.GetGuild(Context.Guild.Id) as IGuild;
            await Context.Guild.DownloadUsersAsync();
            await Task.Delay(500);
            var users = await guild.GetUsersAsync();

            foreach (var user in users)
            {
                var u = user as IGuildUser;

                if (!u.IsBot && !u.IsWebhook)
                {
                    IUserMessage dm = await u.SendMessageAsync("Mass dm test", false);

                    if (dm == null)
                    {
                        continue;
                    }
                }
            }
        }

我知道我的一个朋友阻止了我的机器人,所以我为什么要检查 dm 是否为空。我以为这会越过The server responded with error 50007: Cannot send messages to this user的错误,但我错了。

在给出此错误后,我将如何继续 foreach 循环,因为它完全停止了该过程,我希望机器人忽略它并继续发送 DM。

【问题讨论】:

  • 你有什么问题?
  • 在给出此错误后我将如何继续 foreach 循环,因为它完全停止了该过程,我希望机器人忽略它并继续发送 DM。也可以编辑到 OP 中。
  • 你知道如何使用try and catch处理异常吗?
  • 我想补充一点,Context.Client 可供您使用;避免将您的客户端作为全局静态变量。此外,DownloadUsersAsync 可以通过在客户端配置中设置 AlwaysDownloadUsers 来省略。尽管如此,由于 API 上的大量垃圾邮件,通常不推荐这种设计和想法。

标签: c# discord.net


【解决方案1】:

好的,所以我在 Visual Studio 中进行了一些额外的谷歌搜索和搞砸后,最终自己弄清楚了。

foreach (var user in users)
            {
                var u = user as IGuildUser;

                if (!u.IsBot && !u.IsWebhook)
                {
                    try
                    {
                        await u.SendMessageAsync("Hi");
                    }
                    catch (Exception e)
                    {
                        var useless = e;
                    }
                }
            }

我将Exception e 设置为无用的变量,因为坦率地说,我不在乎它是什么,我只是希望 foreach 循环继续发送 DM。

【讨论】:

  • 这是 Discord API 中的不良设计,应予以禁止;与其向用户群发消息和向 API 发送垃圾邮件,不如提及用户共享和拥有的角色。
【解决方案2】:

为了好玩,我写了一个版本,它实际上将并行运行任务。你的只是等待每一个然后移动到下一个。

var recipients = users
    .OfType<IGuildUser>()
    .Where
    (
        u => !u.IsBot && !u.IsWebhook
    );
var tasks = recipients
    .Select
    (
        r => r.SendMessageAsync("Hi")
    );
try
{
    await Task.WhenAll( tasks );
}
catch
{
    var exceptions = tasks.Where(t => t.Exception != null)
                          .Select(t => t.Exception);
}

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2021-01-28
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多