【问题标题】:Make Discord-Bot to reply same message for any command让 Discord-Bot 为任何命令回复相同的消息
【发布时间】:2018-11-21 15:18:53
【问题描述】:
我希望我的机器人无论收到什么命令都回复相同的消息。我知道如何在知道命令时回复命令,但在这里我想回复一个特定的字符串,而不考虑命令。
我试过了:
[Command("")]
public async Task gg()
{
await ReplyAsync("gg");
await Context.Channel.SendMessageAsync("hi there");
}
但显然我得到一个运行时错误,因为它无法添加空白或空命令。 (错误日志没用)
根本不放置[Command(string)] 永远不会触发我所能做的任务。
【问题讨论】:
标签:
c#
discord
discord.net
【解决方案1】:
不可能将其作为命令来实现。您必须订阅 DiscordSocketClient 的 MessageReceived 事件,并在频道触发时将消息发送回频道。
private async Task OnMessageReceived(SocketMessage socketMessage)
{
// We only want messages sent by real users
if (!(socketMessage is SocketUserMessage message))
return;
// This message handler would be called infinitely
if (message.Author.Id == _discordClient.CurrentUser.Id)
return;
await socketMessage.Channel.SendMessageAsync(socketMessage.Content);
}
【解决方案2】:
假设您在设置命令服务时遵循 Discord.NET documentation tutorials...
你可能有一个HandleCommand 函数,或者类似的东西。它应该包含如下代码行:
if(!(message.HasStringPrefix("PREFIX", ref argPos))) return;
这基本上意味着“如果此消息在开始时没有前缀,则退出该功能”。 (其中message 是SocketUserMessage 而argPos 是int,通常为0)
把你的代码行放在后面,所以它看起来像这样......
//Blah
if(!(message.HasStringPrefix("PREFIX", ref argPos))) { return; }
await message.Channel.SendMessageAsync("blah");
//stuff
但是,如果您希望机器人仅在机器人没有为用户发送的当前命令找到合适的命令时回复,您可以改为:
if(!(message.HasStringPrefix("PREFIX", ref argPos))) { return; }
var context = new CommandContext(client, message);
var result = await commands.ExecuteAsync(context, argPos, service);
if(!result.IsSuccess) {
//If Failed to execute command due to unknown command
if(result.Error.Value.Equals(CommandError.UnknownCommand)) {
await message.Channel.SendMessageAsync("blah");
} else {
//blah
}
}