Nの外部記憶

作ったアプリや、作成時の備忘録を書くブログ。やりたいことが多すぎるッ!

【Discord.py】VCに参加したタイミングでロールを自動で割り当てる

ボイスチャンネルに参加している人たち全員に、メンションを投げたいシチュエーションで利用

コード例

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)でロールを外している。

応用

今回は、あらかじめサーバにロールが設定されていることを想定したものになっているが、
用意してあるチャンネル数があまりにも多い場合は、ロールの設定一覧が汚れる...。
その場合は、都度ロールを作成削除する処理にしてもいいかもしれない。
けど、ロールの付与状況を確認してから処理しないといけないから、設計するにしても注意が必要。