Проблема добавления роли при реагировании на сообщение - PullRequest
1 голос
/ 18 марта 2019

У меня проблема с добавлением роли, когда пользователь реагирует на сообщение.

Как я хочу, чтобы это работало, так это то, что когда пользователь присоединяется к серверу Discord, бот отправит отправить сообщениеиспользуя событие on_join (сейчас я использую команду test для тестирования).

Следующим шагом является событие on_reaction_add, когда пользователь реагирует на это сообщение, бот добавляет роль этому пользователю.

Вот с чем я работаю.Я проверил это, однако, я не получаю желаемый результат.

(перезаписать на discord.py)

 @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

Ответы [ 2 ]

1 голос
/ 18 марта 2019

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

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)

Тогда в вашем основном боте вам нужна строка с надписью

from mycog import MyCog

bot.add_cog(MyCog(bot))
0 голосов
/ 18 марта 2019
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))
...