首页 > 解决方案 > 如何在没有命令的情况下发送消息?

问题描述

如果不断运行的代码发生某些事情(如错误),我想设置一个 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

如何解决这个问题?

标签: c#discord.net

解决方案


你得到 a 是因为你在你的方法中NullException重新创建了。通过查看您的代码,我假设您正在使用该库,在这种情况下,该类包含此方法:DiscordSocketClientAnnounce()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)

https://discord.foxbot.me/docs/api/Discord.Commands.CommandService.html#Discord_Commands_CommandService_ExecuteAsync_Discord_Commands_ICommandContext_System_Int32_IServiceProvider_Discord_Commands_MultiMatchHandling_

该方法返回一个IResult对象,包含以下属性:

https://discord.foxbot.me/docs/api/Discord.Commands.IResult.html#properties

如果其中一个命令未能执行以及使用这些属性的原因,您可以获得信息,这并不涵盖您的所有代码,但至少涵盖了命令部分。您可以使用Sentry等第三方库来处理整个应用程序的错误处理,或者构建自己的实现,例如,使用try {} catch(Exception){}您知道可能发生错误的块并自己处理异常。

如果您需要更多帮助,请随时与我联系。


推荐阅读