Discordのボイスチャンネルから強制切断してくれるBotをつくる

2 min読了の目安(約2100字TECH技術記事

こんにちは。スイミンタロウです。

概要

Discordのサーバーのボイスチャンネルにいるユーザーを、強制的に切断するコードの紹介。

環境

Python3.8でdiscord.pyを使用しています。
Botの権限は最高権限の「Administer」を設定。

人追い出す処理

APIリファレンスを見ると、以下のような記載があります。
https://discordpy.readthedocs.io/ja/latest/api.html#member

channel (Optional[VoiceChannel]) -- The new voice channel to move the member to. Pass None to kick them from voice.

引数にNoneを入れることで、ボイスチャンネルから切断できるようです。

async def move_to_none():
	# 接続に利用するオブジェクト
	client = discord.Client()
	# 該当サーバーの特定のチャンネルIDを入れてください。
	talk_channel_id = **** 
	channel = client.get_channel(talk_channel_id)
	# チャンネル経由でサーバー内のボイスチャンネル全体を走査
	for ch in channel.guild.voice_channels:
		for member in ch.members:
			# move_to(None)で特定のメンバーを切断する
			await member.move_to(None)

ソースコード全文

import discord # インストールした discord.py
import datetime # 滞在時間計測用
import asyncio

token = '************************'

client = discord.Client() # 接続に使用するオブジェクト

# 強制退出処理
async def move_to_none():
	# 接続に利用するオブジェクト
	client = discord.Client()
	# 該当サーバーの特定のチャンネルIDを入れてください。
	talk_channel_id = **** 
	channel = client.get_channel(talk_channel_id)
	# チャンネル経由でサーバー内のボイスチャンネル全体を走査
	for ch in channel.guild.voice_channels:
		for member in ch.members:
			# move_to(None)で特定のメンバーを切断する
			await member.move_to(None)

# 起動時に通知してくれる処理
@client.event
async def on_ready():
	last_clocked_time = datetime.datetime.now()
				
	while True:
		#ここから30秒間隔の処理
		if last_clocked_time.hour is not datetime.datetime.now().hour:
			# 2時に強制退出
			if datetime.datetime.now().hour == 2:
				print("強制退出を実行します")
				await move_to_none()
		last_clocked_time = datetime.datetime.now() #時刻更新処理
		await asyncio.sleep(30)
# botの接続と起動
# (tokenにはbotアカウントのアクセストークンを入れてください)
client.run(token)

あとがき

あまりに居心地のいいサーバーのボイスチャンネルにいると、
平日でも時間を忘れてしまう…

そんなあなたにぴったりのBotです。
私たちのサーバーでは2時に強制切断されるように設定して利用しています。

実装してから、みんな早く寝るようになったのかというと…
そんなことはありません。

追い出されるのを必ず待っていて、
逆に2時まで起きてしまってる現象が…

つたない記事ですが、どなたかの力になれれば幸いです。

おまけ discord.jsだったら

以下のように書けるようです。discord.jsで動くBotも作ってみたいですね。

client.on("message", message => {
	const member = message.member;
	member.voice.setChannel(null); // これで切断
});