如何在没有命令的情况下发送消息?

时间:2018-08-22 06:33:09

标签: c# discord.net

我想设置一个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

该如何解决?

2 个答案:

答案 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)

执行Discord接收的命令。

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){}块来了解可能发生的错误并自己处理异常

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

答案 1 :(得分:0)

好的,据我所知,我假设您在方法中以某种方式使用了_client。要在您的漫游器所在的频道中发送消息,您可以

await _client.GetGuild(guild_id_here).GetTextChannel(channel_id_here).SendMessageAsync("your messagee");