Issue adding a role when reacting to a post

浪尽此生 提交于 2021-01-28 11:11:44

问题


I'm having an issue adding a role when a user reacts to a post.

How I'm wanting it to function is that when a user joins the Discord server the bot will send send a message using the on_join event (for now I'm using the command test for testing purposes).

The next step is the on_reaction_add event, when the user reacts to this message the bot will add the role to that user.

Here is what I'm working with. I've tested this however, I'm not getting the desired result.

(on discord.py rewrite)

 @commands.command(pass_context=True)
async def test(self, user: discord.Member): #lets change this to the command 'test' for now and change on on_join event later. 
    guildName = user.guild.name
    embed = discord.Embed(colour=discord.Color(random.randint(0x000000, 0xFFFFFF)))
    embed.title = "Welcome to {} {}!".format(guildName, user)
    embed.description = "Head over to <#443133907102203912> to have a read up on our rules. Once you have read them please reaction to this post with a :thumbsup:"
    embed.set_image(url='')
    await user.send(embed=embed)

async def on_reaction_add(reaction, user): 
    channelid = '555844758778544160' #The text-channel where the react should happen
    role = discord.utils.get(user.guild.roles, name="Members") #The role applied when the post is reacted to

    if reaction.message.channel.id != channelid:
        return #So it only happens in the specified channel
    if str(reaction.emoji) == "<:thumbsup:555844758778544160>":#The reaction (not sure if this should be raw in discord.py rewrite)
        await user.add_roles(user, role)#Adds role when post is reacted to

回答1:


You can wait for a reaction to a specific message if you need to. This is handy for times like this, where you maybe want to wait for a reaction then keep doing your coroutine. I will write the below assuming you're using the most up-to-date rewrite. You can find the documentation for all this here:

from discord.utils import get
from discord.ext.commands import Cog, command
listener = Cog.listener

thumbs_up = "\N{THUMBS UP SIGN}"

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

class MyCog(Cog):
    def __init__(self, bot):
        self.bot = bot
    @listener()
    async def on_member_join(self, member):
        guildName = user.guild.name
        embed = discord.Embed(colour=discord.Color(random.randint(0x000000, 0xFFFFFF)))
        embed.title = "Welcome to {} {}!".format(guildName, user)
        embed.description = "Head over to <#443133907102203912> to have a read up on our rules. Once you have read them please reaction to this post with a :thumbsup:"
        embed.set_image(url='')
        msg = await user.send(embed=embed)
        await self.bot.wait_for('reaction_add', check=react_check(user, msg, thumbs_up))
        role = get(user.guild.roles, name="Members")
        await user.add_roles(role)

Then in your main bot, you need a line that says

from mycog import MyCog

bot.add_cog(MyCog(bot))



回答2:


from discord.ext import commands
import discord
import random
from .utils import checks
from random import randint
from discord.utils import get


thumbs_up = "\N{THUMBS UP SIGN}"

def react_check(user, msg, emoji):
    def check(reaction, usr):
        return usr==user and reaction.message==msg 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 = "Welcome to {} {}!".format(guildName, user)
    embed.description = "Head over to <#443133907102203912> to have a read up on our rules. Once you have read them please reaction to this post with a :thumbsup:"
    embed.set_image(url='')
    msg = await channel.send(embed=embed)
    await self.bot.wait_for('reaction_add', check=react_check(user, msg, thumbs_up))
    role = get(user.guild.roles, name="Members")
    await user.add_roles(role)
    await channel.send('test')# Check 

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


来源:https://stackoverflow.com/questions/55225017/issue-adding-a-role-when-reacting-to-a-post

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!