リアクションを付けた人に役職を付与する
例えば、新規メンバーが利用規約を読んでリアクションを押さないと、
チャンネルを見ることができない、というような用途に使えます。
ソースコード
ID_CHANNEL_README = 729000364261967998 # 該当のチャンネルのID
ID_ROLE_WELCOME = 775643766212653538 # 付けたい役職のID
@client.event
async def on_raw_reaction_add(payload):
# channel_id から Channel オブジェクトを取得
channel = client.get_channel(payload.channel_id)
# 該当のチャンネル以外はスルー
if channel.id != ID_CHANNEL_README:
return
# guild_id から Guild オブジェクトを取得
guild = client.get_guild(payload.guild_id)
# user_id から Member オブジェクトを取得
member = guild.get_member(payload.user_id)
# 用意した役職IDから Role オブジェクトを取得
role = guild.get_role(ID_ROLE_WELCOME)
# リアクションを付けたメンバーに役職を付与
await member.add_roles(role)
# 分かりやすいように歓迎のメッセージを送る
await channel.send('いらっしゃいませ!')
固定のメッセージに対するリアクションであれば、
on_reaction_add
ではなく on_raw_reaction_add
を使います。
https://discordpy.readthedocs.io/en/latest/api.html#discord.on_raw_reaction_add
ただし、on_reaction_add はbotがログインする前のメッセージに付くリアクションを検知できません。
また、引数の payload
は少し特殊で、各 id が格納されているため、
get や fetch といったメソッドを使って各オブジェクトを取得する必要があります。
https://discordpy.readthedocs.io/en/latest/api.html#discord.RawReactionActionEvent
コマンドを打つ -> botがメッセージを出す -> リアクションを見る
という流れであれば on_reaction_add
を使う方がシンプルです。
https://discordpy.readthedocs.io/en/latest/api.html#discord.on_reaction_add