c# - 如何在没有命令的情况下发送消息?
问题描述
如果不断运行的代码发生某些事情(如错误),我想设置一个 Discord.Net C# 机器人来输出消息。
如何在不收听消息的情况下向任何频道发送消息?
所有教程都创建了依赖于 COMMAND 的命令,以使机器人“回复”您。这可能吗?
这是我的 C# 代码。
我想要没有命令的发送消息。
public async Task RunBotAsync()
{
_client = new DiscordSocketClient(new DiscordSocketConfig
{
WebSocketProvider = WS4NetProvider.Instance
});
_commands = new CommandService();
_services = new ServiceCollection()
.AddSingleton(_client)
.AddSingleton(_commands)
.BuildServiceProvider();
string BotToken = "my_token";
_client.Log += Log;
await RegisterCommandsAsync();
await _client.LoginAsync(TokenType.Bot, BotToken);
await _client.StartAsync();
await Task.Delay(-1);
}
我试过这个:
public async Task Announce() // 1
{
DiscordSocketClient _client = new DiscordSocketClient(); // 2
ulong id = 123456789012345678; // 3
var chnl = _client.GetChannel(id) as IMessageChannel; // 4
await chnl.SendMessageAsync("Announcement!"); // 5
}
但我收到一条错误消息Errro- NullException - chl=Null
如何解决这个问题?
解决方案
你得到 a 是因为你在你的方法中NullException
重新创建了。通过查看您的代码,我假设您正在使用该库,在这种情况下,该类包含此方法:DiscordSocketClient
Announce()
Discord.Net
public async Task Announce() // 1
{
DiscordSocketClient _client = new DiscordSocketClient(); // 2
ulong id = 123456789012345678; // 3
var chnl = _client.GetChannel(id) as IMessageChannel; // 4
await chnl.SendMessageAsync("Announcement!"); // 5
}
ModuleBase<SocketCommandContext>
应该从看起来像这样继承:
public class MyClass : ModuleBase<SocketCommandContext>
{
//...
public async Task Announce() // 1
{
//...
}
}
允许您访问一个名为 的属性,该属性包含您用于使用提供的令牌进行连接Context
的初始实例。DiscordSocketClient
您还可以访问其他属性,例如公会、用户等。
具有以下所有可访问属性的官方文档SocketCommandContext
:
https://discord.foxbot.me/docs/api/Discord.Commands.SocketCommandContext.html#properties
在您的情况下,为了能够获得一个频道,您必须在您的Announce()
方法中使用它:
public async Task Announce() // 1
{
DiscordSocketClient _client = Context.Client; // 2
ulong id = 123456789012345678; // 3
var chnl = _client.GetChannel(id) as IMessageChannel; // 4
await chnl.SendMessageAsync("Announcement!"); // 5
}
这NullException
至少可以解决你的问题,但仍然不能回答你的问题,所以让我们试试这个:
该类CommandService
负责使用方法执行 Discord 接收到的命令ExecuteAsync(ICommandContext, Int32, IServiceProvider, MultiMatchHandling)
该方法返回一个IResult
对象,包含以下属性:
https://discord.foxbot.me/docs/api/Discord.Commands.IResult.html#properties
如果其中一个命令未能执行以及使用这些属性的原因,您可以获得信息,这并不涵盖您的所有代码,但至少涵盖了命令部分。您可以使用Sentry等第三方库来处理整个应用程序的错误处理,或者构建自己的实现,例如,使用try {} catch(Exception){}
您知道可能发生错误的块并自己处理异常。
如果您需要更多帮助,请随时与我联系。
推荐阅读
- java - 仅返回具有最大找到长度的元素 java 流
- ios - 带有表情符号的文本未解码 - iOS Swift
- path - 我无法使用 Glassfish 部署战争文件
- animation - 如何在glTF动画中找到给定时间内最接近的两个样本
- python - 如何为可变大小的图像配置 tf.data.Dataset?
- python - Pandas 均值函数返回所有 NaN
- java - 以前使用 data.sql 导入数据时无法使用 save() 插入
- android - org.mockito.exceptions.verification.NoInteractionsWanted:单元测试失败 - MVI 架构
- github - 如何将用户添加到 GitHub 并生成令牌?
- ag-grid - 如何在 Ag-Grid 中将相同的相邻行与动态行跨度合并?