Обработка реакции в командах перезаписи Discord.py - PullRequest
0 голосов
/ 03 ноября 2019

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

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

Обновление : я обнаружил, что wait_for() делает именно то, чтоЯ хочу, но проблема сейчас в том, как проверить, установлена ​​ли неправильная реакция? (т.е. если я нажму вторую реакцию, удалите сообщение)

    if is_admin:
        msg = await ctx.send('Clear: Are you sure you would like to purge this entire channel?')
        emoji1 = u"\u2705"
        emoji2 = u"\u274E"
        await msg.add_reaction(emoji=emoji1)
        await msg.add_reaction(emoji=emoji2)

        def check(reaction, user):
            return user == ctx.message.author and reaction.emoji == u"\u2705"

        try:
            reaction, user = await self.client.wait_for('reaction_add', timeout=10.0, check=check)
        except asyncio.TimeoutError:
            return await msg.delete()
        else:
            channel = ctx.message.channel
            new_channel = await channel.clone(name=channel.name, reason=f'Clear Channel ran by {ctx.message.author.name}')
            await new_channel.edit(position=channel.position)
            await channel.delete(reason=f'Clear Channel ran by {ctx.message.author.name}')
            await new_channel.send('Clear: Channel has now been cleared.', delete_after=7)
    else:
        await ctx.send(f"Sorry, you do not have access to this command.", delete_after=5)

1 Ответ

1 голос
/ 03 ноября 2019

Вот функция, которую я использую для генерации check функций для wait_for:

from collections.abc import Sequence

def make_sequence(seq):
    if seq is None:
        return ()
    if isinstance(seq, Sequence) and not isinstance(seq, str):
        return seq
    else:
        return (seq,)

def reaction_check(message=None, emoji=None, author=None, ignore_bot=True):
    message = make_sequence(message)
    message = tuple(m.id for m in message)
    emoji = make_sequence(emoji)
    author = make_sequence(author)
    def check(reaction, user):
        if ignore_bot and user.bot:
            return False
        if message and reaction.message.id not in message:
            return False
        if emoji and reaction.emoji not in emoji:
            return False
        if author and user not in author:
            return False
        return True
    return check

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

check = reaction_check(message=msg, author=ctx.author, emoji=(emoji1, emoji2))
try: 
    reaction, user = await self.client.wait_for('reaction_add', timeout=10.0, check=check)
    if reaction.emoji == emoji1:
        # emoji1 logic
    elif reaction.emoji == emoji2:
        # emoji2 logic
except TimeoutError:
    # timeout logic
...