首页 > 解决方案 > 在 unreact 上删除角色无法获得成员

问题描述

这是一个基本代码,当您使用特定表情符号对特定消息做出反应时,它会为您提供一个角色,或者当您没有反应时删除该角色

import discord
import os
from discord.ext import commands


intents = discord.Intents.default()
intents.members = True
bot = commands.Bot(command_prefix=',', intents=intents)


@bot.event
async def on_ready():
  print('bot is online')

#this works
@bot.event
async def on_raw_reaction_add(payload):
  message_id = payload.message_id
  if message_id == 869153559042748446:
    guild_id = payload.guild_id
    guild = discord.utils.find(lambda g : g.id == guild_id, bot.guilds)

    if payload.emoji.name == '''1️⃣''':
      role = discord.utils.get(guild.roles, id=868532817984901151)
    else:
      print('''else''')
      role = None

  if role is not None:
    member = payload.member
    if member is not None:
      await member.add_roles(role)
      print('''gave role {} to {}'''.format(role, member))
    else:
      print('''member not found''')
  else:
    print ('''role not found''')

#This is an exact copy of **on_raw_reaction_add** but
#**await member.add_roles(role)** changed to *await member.remove_roles(role)*
@bot.event
async def on_raw_reaction_remove(payload):
  message_id = payload.message_id
  if message_id == 869153559042748446:
    guild_id = payload.guild_id
    guild = discord.utils.find(lambda g : g.id == guild_id, bot.guilds)

    if payload.emoji.name == '''1️⃣''':
      role = discord.utils.get(guild.roles, id=868532817984901151)
    else:
      print('''else''')
      role = None

  if role is not None:
    member = payload.member
    if member is not None:
      await member.remove_roles(role)
      print('''gave role {} to {}'''.format(role, member))
    else:
      print('''member not found''') #This always prints
  else:
    print ('''role not found''')


bot.run(os.getenv('TOKEN'))

on_raw_reaction_add按预期工作,
但是当涉及到on_raw_reaction_remove时,即使它是on_raw_reaction_add的精确副本,它也找不到成员

存在意图和服务器成员意图已打开。

标签: pythondiscorddiscord.py

解决方案


有效载荷上的member属性仅在添加反应时才有效(文档

添加反应的成员。仅当 event_type 为 REACTION_ADD 并且反应在公会内部时才可用。

您可以尝试使用discord.utilsguild.get_member()


例子:

@bot.event
async def on_raw_reaction_remove(payload):
    ...
    # discord.utils.get()
    member = discord.utils.get(guild.members, id=payload.user_id)

    # guild.get_member()
    member = guild.get_member(payload.user_id)

    ...

推荐阅读