我首先要说这是我和我的朋友之间的一台小型服务器,我们所有人都同意使用这样的东西,因此我认为它不会违反任何不和谐的准则。
我首先编写了一些测试代码,以测试该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。
答案 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);
}