机器人直接向我的整个服务器发送消息时遇到问题

时间:2019-01-27 01:30:05

标签: c# discord.net

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

我首先编写了一些测试代码,以测试该bot能够对服务器上的所有用户进行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是否为null。我以为这将克服The server responded with error 50007: Cannot send messages to this user的错误,但是我错了。

给出此错误后,我将如何继续执行foreach循环,因为它完全停止了进程,并且我希望漫游器只忽略它并继续发送DM。

2 个答案:

答案 0 :(得分:0)

好吧,所以在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设置为无用的var,因为坦率地说我根本不在乎它是什么,我只是想让foreach循环继续发送DM。

答案 1 :(得分:0)

为了有趣,作者写了一个实际上可以并行运行任务的版本。您只需等待每一个,然后继续下一个。

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);
}