ボイスチャンネルに参加している人たち全員に、メンションを投げたいシチュエーションで利用
コード例
import os import traceback import discord from discord.ext import commands token = "bot_token" bot = commands.Bot(command_prefix='/') @bot.event async def on_voice_state_update(member, before, after): if not before.channel and after.channel: set_mention_name = after.channel.name role = discord.utils.get(member.guild.roles, name=set_mention_name) await member.add_roles(role) elif before.channel and not after.channel: remove_mention_name = before.channel.name role = discord.utils.get(member.guild.roles, name=remove_mention_name) await member.remove_roles(role) bot.run(token)
注意点
- あらかじめサーバにボイスチャンネル名と同じ名前のロールを作っておく必要がある。
- 【要改善点】ボイスチャンネル間を移動した場合、最初に付与したロールが付いたままになってしまう。 また、ボイスチャンネル間を移動したあと、移動先のロールは付与されない。 さらに、その後ボイスチャンネルから離れた後もロールはついたままになってしまう。
解説
ボイスチャンネル名と同じ名前で、参加している人全員にロールを割り当てることで、 簡単にボイスチャットに参加している人たちへのメンションを作成できる。
on_voice_state_update(member, before, after)
ユーザのボイスステータスが変わったときに呼び出される。
詳細はリファレンスへ
after.channel.name
で、ユーザが参加しているボイスチャンネル名を取得している。
member.guild.roles
で、サーバに設定されているロールのリストを取得することができる。
discord.utils.get
で、「name」にボイスチャンネル名をしているすることで、member.guild.roles
からボイスチャンネル名と同じ名前のロールを取得している。
member.add_roles(role)
で、ユーザにロールを付与する。
ユーザがボイスチャンネルを離れると、同じようにロールを取得し、
member.remove_roles(role)
でロールを外している。
応用
今回は、あらかじめサーバにロールが設定されていることを想定したものになっているが、
用意してあるチャンネル数があまりにも多い場合は、ロールの設定一覧が汚れる...。
その場合は、都度ロールを作成削除する処理にしてもいいかもしれない。
けど、ロールの付与状況を確認してから処理しないといけないから、設計するにしても注意が必要。