ちょっとばかしハマったのでメモしておきます。
特定のメッセージに特定のリアクションをつけたら役職(role)をつける
@client.event
async def on_raw_reaction_add(payload):
if payload.message_id == リアクションを付けてほしいメッセージID:
checked_emoji = payload.emoji.id
guild_id = payload.guild_id
guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds)
if checked_emoji == リアクションのID:
role = guild.get_role(役職のID)
await payload.member.add_roles(role)
リアクションを消したらその役職(role)が消える
@client.event
async def on_raw_reaction_remove(payload):
if payload.message_id == リアクションを付けてほしいメッセージID:
checked_emoji = payload.emoji.id
guild_id = payload.guild_id
guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds)
if checked_emoji == リアクションのID:
role = guild.get_role(役職のID)
member = guild.get_member(payload.user_id)
await member.remove_roles(role)
ハマったところ
役職をつける方は、
await payload.member.add_roles(role)
でいけるのですが、消すほうは、
member = guild.get_member(payload.user_id)
await member.remove_roles(role)
という感じでいったんmember
を取得する必要があります。
リアクションが付けられた場合はpayload
の中にmember
が入ってくるのですが、リアクションが消されたときはmember
が存在しないためです。
await payload.member.remove_roles(role)
と書いたりして、
AttributeError: 'NoneType' object has no attribute 'remove_roles'
と怒られまくったりしてる人がこの記事を見て解決に至ってくれれば幸いです。