Discord бот, применяющий роль в вопросе проверки реакции бота - PullRequest
0 голосов
/ 19 марта 2019

Привет, это функция cog, при которой бот отправляет сообщение on_member_join и позволяет пользователю реагировать на сообщение, в котором бот добавляет пользователю определенную роль, в данном случае это Members.У меня проблемы с добавлением чека.

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

  2. В этом методе, по-видимому, есть недостаток, который позволяет любому, включая бота, реагировать большими пальцами смайликов и дает присоединяющемуся пользователю роль Членов, а не самого пользователя.Кажется, проверка необходима только для регистрации присоединяющегося пользователя, который использовал реакцию thumbs up.

Возможно ли это?

Вот с чем я работаю:

Я процитировал задачи с # в блоке кода, чтобы дать вам представление.

thumbs_up = "\N{THUMBS UP SIGN}"

def react_check(user, msg, emoji):
    def check(reaction, user):
       return user==user and reaction.message.id==msg.id and 
reaction.emoji==emoji
    return check
    class Welcome(commands.Cog):
    def __init__(self, bot):
        self.bot = bot


@commands.Cog.listener()
async def on_member_join(self, user: discord.Member):
    guildName = user.guild.name
    channel = self.bot.get_channel(555844758778544160) 
    embed = discord.Embed(colour=discord.Color(random.randint(0x000000, 0xFFFFFF)))
    embed.title = "Hello {}, welcome to {}!".format(user, guildName)
    embed.description = "Before you continue we just want to make sure you have read up on our all important group guidelines. if you haven't you can find them in <#546694486391128066>. Once you're satified with them go ahead and give my message a :thumbsup:."
    embed.set_image(url='')
    msg = await channel.send(embed=embed)
    await msg.add_reaction(thumbs_up) # todo: make bot set a thumbs_up emoji but only set members role when the user mentioned reacts. 
    await self.bot.wait_for('reaction_add', check=react_check(user, msg, thumbs_up))
    role = get(user.guild.roles, name="Members")
    if self.bot: #supposed check to see if the bot 
        pass
    else: 
        await user.add_roles(role)
        await channel.send(':thumbsup: Awesome! you\'re now set to go. If you would like to add some roles head over to <#555913791615926302> for more details. ')# Check 

def setup(bot):
    bot.add_cog(Welcome(bot))

1 Ответ

0 голосов
/ 19 марта 2019

В вашем react_check вы делаете user==user, что всегда будет правдой. Вместо этого вам нужно указать имя одного из пользователей (в исходном коде вы заметите, что я использовал user и usr, что, вероятно, смущало вас):

def react_check(user, msg, emoji):
    def check(reaction, reacting_user):
       return user==reacting_user and reaction.message.id==msg.id and reaction.emoji==emoji
    return check

В этом коде используется немного сложный, но очень полезный шаблон, называемый замыканиями. Закрытие - это в основном методика создания нескольких версий одной и той же функции, которые используют разные значения для некоторых переменных. Здесь вызов react_check вернет функцию check, которая будет проверять реакцию на значения, которые вы передали react_check

Кроме того, self.bot также всегда должно быть правдой, поэтому я не думаю, что проверка что-нибудь сделает.

...