我想设置一个Discord.Net C#机器人,以便在持续运行的代码上发生某些事情(例如错误)时输出一条消息。
如何在不收听消息的情况下将消息发送到任何频道?
所有教程均创建依赖COMMAND的命令,以使bot向您“回复”。这可能吗?
这是我的C#代码。
我想要没有命令的Sendmessage。
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
该如何解决?
答案 0 :(得分:1)
由于在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
类负责使用方法ExecuteAsync(ICommandContext, Int32, IServiceProvider, MultiMatchHandling)
该方法返回一个IResult
对象,其中包含以下属性:
https://discord.foxbot.me/docs/api/Discord.Commands.IResult.html#properties
如果其中一个命令执行失败,以及为什么使用这些属性,您可以获得信息,这不能覆盖您代码的全部,但至少可以覆盖部分命令。您可以使用Sentry之类的第三方库来处理整个应用程序中的错误,也可以构建自己的实现,例如,使用try {} catch(Exception){}
块来了解可能发生的错误并自己处理异常
如果您需要更多帮助,请随时与我联系。
答案 1 :(得分:0)
好的,据我所知,我假设您在方法中以某种方式使用了_client
。要在您的漫游器所在的频道中发送消息,您可以
await _client.GetGuild(guild_id_here).GetTextChannel(channel_id_here).SendMessageAsync("your messagee");