BETA

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

投稿日:2020-01-30
最終更新:2020-02-01

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

コード例

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

応用

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

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

作ったアプリや、その他技術的な備忘録を書くブログ。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう