-
-
Save peco2282/8fca1065c6f59e1b6f2f1d5d4acc3983 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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