Skip to content

Instantly share code, notes, and snippets.

@peco2282
Created February 20, 2023 01:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save peco2282/8fca1065c6f59e1b6f2f1d5d4acc3983 to your computer and use it in GitHub Desktop.
Save peco2282/8fca1065c6f59e1b6f2f1d5d4acc3983 to your computer and use it in GitHub Desktop.
# main.py
import asyncio
import discord
import environments
client = discord.Client(intents=discord.Intents.all())
# テキストチャンネルの先頭につける文字
CHANNEL_PREFIX = "private_"
# botたちのロール名 (botはテキストチャンネルに参加していてほしい)
BOT_ROLE_NAME = "bot"
voice_channelID_1: int = 000000000000000000
voice_channelID_2: int = 111111111111111111
execute_voice_id: tuple[int, int] = (voice_channelID_1, voice_channelID_2)
def _overwrites(guild: discord.Guild, member: discord.Member):
overwrites = {
guild.default_role: discord.PermissionOverwrite(read_messages=False),
member: discord.PermissionOverwrite(read_messages=True)
}
but_role = discord.utils.get(guild.roles, name=BOT_ROLE_NAME)
if but_role is not None:
overwrites.update(
{
but_role: discord.PermissionOverwrite(read_messages=True)
}
)
return overwrites
async def _create_channel(after: discord.VoiceState, member: discord.Member):
channel = after.channel
guild = channel.guild
# チャンネルに対するoverwritesの取得
overwrites = _overwrites(guild, member)
# チャンネルの作成
await channel.category.create_text_channel(
name=f"{CHANNEL_PREFIX}{member.id}",
overwrites=overwrites
)
meeting_channel = await channel.category.create_voice_channel(
name=f"会議部屋{member.id}",
)
personal_channel = await channel.category.create_voice_channel(
name=f"個通部屋{member.id}",
overwrites=overwrites
)
# .5秒待つ(連続でAPIを呼び出すとdiscord側に負荷がかかるため)
await asyncio.sleep(.5)
# 会議部屋に移動
await member.move_to(meeting_channel)
await asyncio.sleep(.5)
await meeting_channel.connect()
async def _exit_task(before: discord.VoiceState, member: discord.Member):
members = before.channel.members
if len(before.channel.members) == 1:
# チャンネルのメンバーが一人かつそれがbotの時、そのbotを退出、チャンネル削除
for _client in client.voice_clients:
if members[0].id == client.user.id:
await _client.disconnect(force=True)
category = before.channel.category
# カテゴリ内の会議チャンネルを探す
text_channel = discord.utils.get(category.channels, name=f"{CHANNEL_PREFIX}{member.id}")
meeting_channel = discord.utils.get(category.channels, name=f"会議部屋{member.id}")
personal_channel = discord.utils.get(category.channels, name=f"個通部屋{member.id}")
# チャンネルの削除
if text_channel is not None:
await text_channel.delete()
if meeting_channel is not None:
await meeting_channel.delete()
if personal_channel is not None:
await personal_channel.delete()
@client.event
async def on_voice_state_update(
member: discord.Member,
before: discord.VoiceState,
after: discord.VoiceState
):
# 同一チャンネル内は無視
if before.channel == after.channel:
return
# 新規参加vcが特定のチャンネルの時
# ボイスチャンネル参加時の対応
if after.channel is not None:
if before.channel is None and after.channel.id in execute_voice_id:
await _create_channel(after, member)
# ボイスチャンネル退出時の対応
if (before.channel is not None) and\
(after.channel is None) and\
(before.channel.id not in execute_voice_id):
await _exit_task(before, member)
client.run(environments.TOKEN)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment