【问题标题】:Discord.py Why removing roles doesn't work?Discord.py 为什么删除角色不起作用?
【发布时间】:2020-10-25 21:50:43
【问题描述】:

赋予角色正确。但是绝对复制的“on_reaction_remove”没有给出任何结果,甚至是例外。我尝试在第二个帐户中选择反应,是的,机器人提供了一个角色,但是当我删除反应机器人时没有做任何事情:/

import discord
from discord import utils
from discord.ext import commands
import config

client = commands.Bot(command_prefix = '#')

@client.event
async def on_ready():
    print('Logged on as {0}!'.format(client.user.name))

@client.event
async def on_reaction_add(reaction, user):
    if str(reaction.message.channel) == 'giving-roles':
        try:
            channel = reaction.message.channel
            role = utils.get(user.guild.roles, id = config.ROLES[str(reaction)])

            await user.add_roles(role)
            print(f'[SUCCESS] Role [{config.ROLES[str(reaction)]} for [{user}] was added ')

        except Exception as e:
            print(repr(e))

@client.event
async def on_reaction_remove(reaction, user):
    if str(reaction.message.channel) == 'giving-roles':
        try:
            channel = reaction.message.channel
            role = utils.get(user.guild.roles, id = config.ROLES[str(reaction)])

            await user.remove_roles(role)
            print(f'[SUCCESS] Role [{config.ROLES[str(reaction)]} for [{user}] was removed ')

        except Exception as e:
            print(repr(e))

# RUN
client.run(config.TOKEN)

【问题讨论】:

  • 如果去掉try和except,会不会产生错误?

标签: python-3.x discord.py


【解决方案1】:

我不久前尝试过这个,我发现使用 on_raw_reaction_add(payload)on_raw_reaction_remove(payload) 效果更好。

@client.event
async def on_raw_reaction_add(payload):
    message_id = payload.message_id

#Soft Ocean   
    if message_id == 677963887122841625: # This can be changed but i was using an individual message
        guild_id = payload.guild_id 
        guild = discord.utils.find(lambda g : g.id == guild_id, client.guilds) # This gets the guild

        if payload.emoji.name == 'tick': #This is the name of the emoji that is used
            role = discord.utils.get(guild.roles, name='Soft Ocean') # Enter the role name here

        if role is not None: # If role exists
            member = discord.utils.find(lambda m : m.id == payload.user_id, guild.members) #Gets the member
            if member is not None: # Checks if member is real
                await member.add_roles(role) # Gives the role
            else:
                print("Member not found")
        else:
            print("Role not found")

@client.event
async def on_raw_reaction_remove(payload):
    message_id = payload.message_id

#Soft Ocean   
    if message_id == 677963887122841625:
        guild_id = payload.guild_id
        guild = discord.utils.find(lambda g : g.id == guild_id, client.guilds)

        if payload.emoji.name == 'tick':
            role = discord.utils.get(guild.roles, name='Soft Ocean')

        if role is not None:
            member = discord.utils.find(lambda m : m.id == payload.user_id, guild.members)
            if member is not None:
                await member.remove_roles(role)
            else:
                print("Member not found")
        else:
            print("Role not found")

【讨论】:

  • 谢谢,非常有帮助。但不是 member = discord.utils.find(lambda m : m.id == payload.user_id, guild.members) 我用的是: member = await(await client.fetch_guild(payload.guild_id)).fetch_member(payload.user_id )
【解决方案2】:

辛苦了,我当然明白你已经解决了你的问题,但我还是找到了比我们的同志更容易解决的方法。例如查看和品尝这段代码:

@bot.event
async def on_reaction_add(reaction, member): 
    Channel = bot.get_channel(id ur channel)
    if not member.bot:
        if reaction.message.channel == Channel:
            if reaction.emoji == 'ur emoji':
                zxc = discord.utils.get(member.guild.roles, name="zxc")
                await member.add_roles(zxc)
        else:
            pass
@bot.event
async def on_reaction_remove(reaction, member):
    Channel = bot.get_channel(ur id )
    if reaction.message.channel == Channel:
        if reaction.emoji == 'ur emoji':
            zxc = discord.utils.get(member.guild.roles, name="zxc")
            await member.remove_roles(zxc)

当然,兄弟,我什么都懂(绝对什么),代码很原始(嗯,很简单),但他会像手指在沥青上一样解决你的问题(即一两个(我希望你了解(我只是不是美国人)))。让 giritTT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 2020-08-03
    • 1970-01-01
    • 2021-10-10
    • 2020-04-09
    • 2021-06-24
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多