Массовое удаление сообщений на discord.net 2.x

    [Command("purge")]
    [Summary("Deletes the specified amount of messages.")]
    [RequireUserPermission(GuildPermission.Administrator)]
    [RequireBotPermission(ChannelPermission.ManageMessages)]
    public async Task PurgeChat(int amount)
    {
        var messages = Context.Channel.GetMessagesAsync(amount + 1).Flatten();
        await ((ITextChannel)Context.Channel).DeleteMessagesAsync(messages);
    }

Я хочу удалить последние amount сообщения и придумал этот код. Но, видимо, я получаю сообщение об ошибке

Код серьезности Описание Ошибка состояния подавления строки файла проекта CS1503 Аргумент 1: невозможно преобразовать из «System.Collections.Generic.IAsyncEnumerable» в «System.Collections.Generic.IEnumerable»

Я использую Discord.net 2.x. Как исправить ошибку и почему она возникла?


person Rishav    schedule 16.06.2018    source источник
comment
Какой тип сообщений?   -  person galakt    schedule 17.06.2018
comment
Обычные текстовые сообщения. @галакт   -  person Rishav    schedule 17.06.2018
comment
Я спрашиваю типа, а не что это значит   -  person galakt    schedule 17.06.2018


Ответы (2)


Я воспользовался помощью неофициального сервера Discord-api, и они сказали мне, что я должен await использовать этот метод, а также использовать FlattenAsync(), а не Flatten() в discord.net 2.x.

Итак, я подвел итог

IEnumerable<IMessage> messages = await Context.Channel.GetMessagesAsync(amount + 1).FlattenAsync();
await ((ITextChannel) Context.Channel).DeleteMessagesAsync(messages);
const int delay = 3000;
IUserMessage m = await ReplyAsync($"I have deleted {amount} messages for ya. :)");
await Task.Delay(delay);
await m.DeleteAsync();

и это работает идеально.

person Rishav    schedule 19.06.2018

Вы забыли ключевое слово await,

var messages = (await Context.Channel.GetMessagesAsync(amount + 1)).Flatten();

Если вам нужно, чтобы они выполнялись параллельно с другой задачей в этом методе (в чем я сомневаюсь), вы можете использовать ContinueWith().

person Kaynn    schedule 18.06.2018
comment
Использование этого дало мне ошибку 'IAsyncEnumerable<IReadOnlyCollection<IMessage>>' does not contain a definition for 'GetAwaiter' and no extension method 'GetAwaiter' accepting a first argument of type 'IAsyncEnumerable<IReadOnlyCollection<IMessage>>' could be found (are you missing a using directive or an assembly reference?) - person Rishav; 19.06.2018