作りたいと思ったきっかけ
パーティビースト(自動ボイスチャンネル作成)というボットと組み合わせて、テキストチャンネルの自動作成を使っていたのですが、
移動するときに、privateのチャットが残ってしまうため、作ろうと思いました。
実現したいこと
・特定のボイスチャンネルを押下したときに自動でボイスチャンネルを作成したい
・ボイスチャンネル作成時に作成したボイスチャンネルに移動させたい。
・テキストチャンネルはどこのボイスチャンネルでも自動作成したい
発生している問題・エラーメッセージ
ボイスチャンネルとテキストチャンネルを自動で作成まではできたのですが、
切断したときに削除をしてくれません。
該当のソースコード
python
1# main.py 2import asyncio 3 4import discord 5 6import environments 7 8client = discord.Client(intents=discord.Intents.all()) 9TOKEN="トークン" 10# テキストチャンネルの先頭につける文字 11CHANNEL_PREFIX = "private_" 12# botたちのロール名 (botはテキストチャンネルに参加していてほしい) 13BOT_ROLE_NAME = "bot" 14 15voice_channelID_1: int = 1234456789123456789 16voice_channelID_2: int = 1234456789123456789 17execute_voice_id: tuple = (voice_channelID_1, voice_channelID_2) 18 19 20 21 22@client.event 23async def on_voice_state_update( 24 member: discord.Member, 25 before: discord.VoiceState, 26 after: discord.VoiceState 27): 28 29 # 同一チャンネル内は無視 30 if before.channel == after.channel: 31 return 32 print(before.channel) 33 print(after.channel) 34 # 新規参加vcが特定のチャンネルの時 35 # ボイスチャンネル参加時の対応 36 before2 = before.channel 37 after2 = after.channel 38 if (before.channel is None): 39 await _create_channel(after, member) 40 # ボイスチャンネル退出時の対応 41 42 if len(before.channel.members) == 0: 43 await _exit_task(before, member) 44 45 # if (after.channel is not None) : 46 # if len(after.channel.members) == 0: 47 # elif len(after.channel is None): 48 # await _exit_task(after, member) 49 50 51 52 53 54 55def _overwrites(guild: discord.Guild, member: discord.Member): 56 overwrites = { 57 guild.default_role: discord.PermissionOverwrite(read_messages=False), 58 member: discord.PermissionOverwrite(read_messages=True) 59 } 60 61 but_role = discord.utils.get(guild.roles, name=BOT_ROLE_NAME) 62 if but_role is not None: 63 overwrites.update( 64 { 65 but_role: discord.PermissionOverwrite(read_messages=True) 66 } 67 ) 68 return overwrites 69 70 71async def _create_channel(after: discord.VoiceState, member: discord.Member): 72 channel = after.channel 73 members = after.channel.members 74 guild = channel.guild 75 76 # チャンネルに対するoverwritesの取得 77 overwrites = _overwrites(guild, member) 78 # チャンネルの作成 79 if(channel.name) == "会議部屋": 80 if len(members)==1: 81 meeting_channel = await channel.category.create_voice_channel( 82 name=f"会議部屋{member.name}" 83 ) 84 85 86 await member.move_to(meeting_channel) 87 88 await channel.category.create_text_channel( 89 name=f"{CHANNEL_PREFIX}{meeting_channel.id}", 90 overwrites=overwrites 91 ) 92 await meeting_channel.connect() 93 94 95 96 if (channel.name) == "個通部屋": 97 if len(members) == 1: 98 personal_channel = await channel.category.create_voice_channel( 99 name=f"個通部屋{member.name}" 100 ) 101 102 await member.move_to(personal_channel) 103 await channel.category.create_text_channel( 104 name=f"{CHANNEL_PREFIX}{personal_channel.id}", 105 overwrites=overwrites 106 ) 107 await personal_channel.connect() 108 #overwrites=overwrites 109 110 # .5秒待つ(連続でAPIを呼び出すとdiscord側に負荷がかかるため) 111 #await asyncio.sleep(.5) 112 # 会議部屋に移動 113 #await member.move_to(meeting_channel) 114 #await asyncio.sleep(.5) 115 # await meeting_channel.connect() 116 117 118async def _exit_task(before: discord.VoiceState, member: discord.Member): 119 120 if len(before.channel.members) == 0: 121 # チャンネルのメンバーが一人かつそれがbotの時、そのbotを退出、チャンネル削除 122 # for _client in client.voice_clients: 123 # 124 # if members[0].id == client.user.id: 125 # await _client.disconnect(force=True) 126 category = before.channel.category 127 # カテゴリ内の会議チャンネルを探す 128 # text_channel = discord.utils.get(category.channels, name=f"{CHANNEL_PREFIX}{member.id}") 129 meeting_channel = discord.utils.get(category.channels, name=f"会議部屋{member.name}") 130 personal_channel = discord.utils.get(category.channels, name=f"個通部屋{member.name}") 131 text_meeting_channel = discord.utils.get(category.channels, name=f"{CHANNEL_PREFIX}{meeting_channel.id}") 132 text_personal_channel = discord.utils.get(category.channels, name=f"{CHANNEL_PREFIX}{personal_channel.id}") 133 134 # チャンネルの削除 135 # if len(before.channel.members) == 0: 136 137 if (before.channel.name== meeting_channel.name) == True: 138 await text_meeting_channel.delete() 139 await meeting_channel.delete() 140 # if len(personal_channel.members) == 0: 141 if (before.channel.name == personal_channel.name) == True: 142 await text_personal_channel.delete() 143 await personal_channel.delete() 144 145client.run(TOKEN)
試したこと
テキストチャンネルとボイスチャンネルの自動作成はできた。
補足情報(FW/ツールのバージョンなど)
ボット歴は短いですが、宜しくお願い致します。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/06 11:46
2022/11/15 12:52
2022/11/17 06:07
2022/11/28 11:27
2022/11/30 04:28
2022/11/30 04:48
2023/02/18 12:48 編集
2023/02/20 01:14
2023/02/21 23:46 編集
2023/02/25 00:18
2023/02/25 06:14
2023/02/25 12:09
2023/02/25 12:17
2023/02/25 13:21
2023/02/25 19:03
2023/02/26 01:54 編集
2023/02/26 06:06
2023/03/04 12:52