我正在为我的discord服务器开发一个机器人。机器人的功能之一——通过将该消息复制到一个特殊频道来批准玩家的提议(消息格式为"文本+附加文件"(。我找不到使用SendMessageAsync
函数发送文件的方法,所以我使用SendFileAsync
,如下所示:
[Command("approve")]
public async Task Approve([Remainder] ulong id)
{
var sourceMsg = await Context.Channel.GetMessageAsync(id);
if (sourceMsg == null)
return;
await Context.Channel.SendMessageAsync($"Approving offer at {id}");
var targetChannel = Context.Guild.TextChannels.Single(x => x.Name == _config["approved"]);
if (sourceMsg.Attachments.Count > 0)
{
var httpClient = new HttpClient();
var file = await httpClient.GetByteArrayAsync(sourceMsg.Attachments.ElementAt(0).Url);
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(file))
{
var fileAtt = new FileAttachment(stream, sourceMsg.Attachments.ElementAt(0).Filename);
await targetChannel.SendFileAsync(fileAtt, sourceMsg.Content);
}
return;
}
await Context.Channel.SendMessageAsync("Can not approve offer without attached songfile");
}
问题是,当调用SendFileAsync
时,机器人程序由于某种未知原因挂起,而没有抛出任何异常。
我在互联网上寻找解决方案,但没有找到任何可以理解的
我还认为,也许问题是,在发送机器人程序之前,使用HttpClient
下载文件,但如果我指定了一个本地文件,而不是下载的文件,直接放在装有机器人程序可执行文件的文件夹中,也会发生同样的事情
我使用的是Discord.Net v3.1.0,.Net Core 5.0
UPD:机器人仍然对命令做出反应,但每一个新的'!approve命令仍然冻结在SendFileAsync
上
UPD2:好的,我解决了。问题是文件的重量太大了。默认情况下,Discord用户可以发送不超过8MB的文件,但意外的是,我所有的测试文件的重量都超过了8MB,所以Discord阻止了文件发送,而且,我不知道为什么,机器人没有崩溃,也没有抛出任何异常。如果你也面临这个问题,只需检查文件的重量
更改此行:
await Context.Channel.SendMessageAsync($"Approving offer at {id}");
收件人:
await Context.Channel.SendMessageAsync($"Approving offer at {id}").ConfigureAwait(true);
做同样的事情其他异步调用以及