обнаружение реакции на неизвестную проблему discord.py - PullRequest
0 голосов
/ 29 мая 2020

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

@BOT.command(pass_context = True , name = "join_game")
async def join_game(context):
    roles = {"minecraft" : "minecraft" , "AC" : "animal crossing" , "pokemon" : "pokemon"} #"emoji_name" : "role_name" , ...
    roleEmojis = {get(context.message.guild.emojis, name = emoji_name) : get(context.message.guild.roles , name = role_name) for emoji_name , role_name in zip(roles , roles.keys())}
    reactions = []
    msg = await context.message.channel.send("react with which game(s) you would like to be a part of.\n**press the :OK: when you are done**")

    for emoji in roleEmojis.keys():
        await msg.add_reaction(emoji)
    await msg.add_reaction(get(context.message.guild.emojis, name = "OK"))

    while True:
        reaction , user = await BOT.wait_for("reaction_add" , check = lambda react , user : True if react in [emoji for emoji in roleEmojis.keys()] and user == BOT.user else False) 
        if reaction == get(context.message.guild.emojis, name = "OK"):
            continue
        else:
            reactions.append(reaction)

    print(reactions)

    #add roles

все работает так, как ожидалось, ошибок нет, но он не обнаруживает, когда я добавляю реакцию, так как нет вывода, а пока l oop продолжается навсегда, не ломаясь. Я уверен, что это связано с моей функцией проверки, но, честно говоря, я не совсем уверен. Не то чтобы это моя первая попытка создать своего первого бота, и я, вероятно, пропустил что-то очень очевидное.

1 Ответ

0 голосов
/ 29 мая 2020

Вам следует попробовать использовать клиентское событие on_reaction_add.

(я предполагаю, что вы уже определили get() в другом месте кода)

@BOT.command(pass_context = True , name = "join_game")
async def join_game(context):
    roles = {"minecraft" : "minecraft" , "AC" : "animal crossing" , "pokemon" : "pokemon"} #"emoji_name" : "role_name" , ...
    roleEmojis = {get(context.message.guild.emojis, name = emoji_name) : get(context.message.guild.roles , name = role_name) for emoji_name , role_name in zip(roles , roles.keys())}
    reactions = []
    msg = await context.message.channel.send("react with which game(s) you would like to be a part of.\n**press the :OK: when you are done**")

@BOT.event
async def on_reaction_add(reaction, user):

    # check if the user did the command #
    message = reaction.message
    if reaction.emoji == get(message.guild.emojis, name='minecraft'):
        role_to_assign = message.guild.get_role(ID_OF_MINECRAFT_ROLE_GOES_HERE)
    elif reaction.emoji == get(message.guild.emojis, name='AC'):
        role_to_assign = message.guild.get_role(ID_OF_ANIMALCROSSING_ROLE_GOES_HERE)
    elif reaction.emoji == get(message.guild.emojis, name='pokemon'):
        role_to_assign = message.guild.get_role(ID_OF_POKEMON_ROLE_GOES_HERE)
    elif reaction.emoji == get(message.guild.emojis, name='OK'):
        # do stuff to clean up (no more roles assigned) #
        return
    await user.add_role(role_to_assign)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...