Заставить Discord-Bot отвечать одним и тем же сообщением на любую команду

Я хочу, чтобы мой бот отвечал на одно и то же сообщение независимо от того, какую команду он получает. Я знаю, как отвечать на команды, когда они известны, но здесь я хочу ответить на определенную строку независимо от команды.

Я попытался:

[Command("")]
public async Task gg()
{
    await ReplyAsync("gg");
    await Context.Channel.SendMessageAsync("hi there");
}

но, видимо, я получаю ошибку времени выполнения, так как не могу добавить пустую или нулевую команду. (журнал ошибок бесполезен) Отсутствие [Command(string)] вообще никогда не запускало бы задачу для того, что я мог разобрать.


person Rishav    schedule 12.06.2018    source источник


Ответы (2)


Предполагая, что вы следуете документации Discord.NET при настройке командная служба...

Вероятно, у вас есть функция 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
                }
            }
person Kaynn    schedule 12.06.2018

Невозможно реализовать это как команду. Вы должны подписаться на событие MessageReceived вашего DiscordSocketClient и просто отправить сообщение обратно на канал, когда оно сработает.

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);
}
person lorisleitner    schedule 12.06.2018