问题
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