質問編集履歴

3

書式の改善

2023/02/25 12:13

投稿

poketatsu
poketatsu

スコア19

test CHANGED
File without changes
test CHANGED
@@ -22,145 +22,150 @@
22
22
 
23
23
  ```python
24
24
  # main.py
25
+ import asyncio
26
+
25
27
  import discord
26
- client = discord.Client()
27
28
 
29
+ import environments
30
+
31
+ client = discord.Client(intents=discord.Intents.all())
32
+ TOKEN="トークン"
28
33
  # テキストチャンネルの先頭につける文字
29
34
  CHANNEL_PREFIX = "private_"
30
35
  # botたちのロール名 (botはテキストチャンネルに参加していてほしい)
31
36
  BOT_ROLE_NAME = "bot"
32
37
 
33
- VoiceChannelID_1 = "ボイスチャンネルID"
38
+ voice_channelID_1: int = 1234456789123456789
34
- VoiceChannelID_2 = "ボイスチャンネルID2"
39
+ voice_channelID_2: int = 1234456789123456789
40
+ execute_voice_id: tuple = (voice_channelID_1, voice_channelID_2)
35
41
 
36
42
 
37
- # 接続できたときに実行される
38
- @client.event
39
- async def on_ready():
40
- # 初期化処理などが行えるよ
41
- print("On ready")
42
43
 
43
44
 
44
- # ボイスチャンネル内の状態が変化したときに実行される
45
45
  @client.event
46
- async def on_voice_state_update(member, before, after):
46
+ async def on_voice_state_update(
47
- # チャンネルを移動していない場合処理をしない
47
+ member: discord.Member,
48
+ before: discord.VoiceState,
49
+ after: discord.VoiceState
50
+ ):
51
+
52
+ # 同一チャンネル内は無視
48
53
  if before.channel == after.channel:
49
54
  return
55
+ print(before.channel)
56
+ print(after.channel)
57
+ # 新規参加vcが特定のチャンネルの時
58
+ # ボイスチャンネル参加時の対応
59
+ before2 = before.channel
60
+ after2 = after.channel
61
+ if (before.channel is None):
62
+ await _create_channel(after, member)
63
+ # ボイスチャンネル退出時の対応
50
64
 
51
- # チャンネルから退出してきた場合
52
- if before.channel is not None:
53
- # ボイスチャンネルに誰もいなくなった場合
54
- if len(before.channel.members) == 0:
65
+ if len(before.channel.members) == 0:
55
- # テキストチャンネルを削除する
56
- await _channel_delete(member, before.channel)
57
- else:
58
- # テキストチャンネルから退出させる
59
- await _channel_exit(member, before.channel)
66
+ await _exit_task(before, member)
60
67
 
61
- # ボイスチャンネルに参加してきた場合
62
- if after.channel is not None:
68
+ # if (after.channel is not None) :
63
- # 参加したチャンネルの1人目だった場合
64
- if len(after.channel.members) == 1:
69
+ # if len(after.channel.members) == 0:
65
- # テキストチャンネルを作成する
66
- await _channel_create(member, after.channel)
70
+ # elif len(after.channel is None):
67
- else:
68
- # テキストチャンネルに参加させる
69
- await _channel_join(member, after.channel)
71
+ # await _exit_task(after, member)
70
-
71
- # 入室時にメンションでチャンネルに案内
72
- await _channel_send_join(member, after.channel)
73
-
74
- print("fin voice state update event")
75
72
 
76
73
 
77
- # テキストチャンネルを検索する関数
78
- def _channel_find(voiceChannel):
79
- text_channels = voiceChannel.guild.text_channels
80
- voice_channels = voiceChannel.guild.voice_channels(VoiceChannelID_1)
81
- channel_name = CHANNEL_PREFIX + str(voiceChannel.id)
82
- channel_name_2 = CHANNEL_PREFIX + "会議部屋"
83
- channel_name_3 = CHANNEL_PREFIX + "個通部屋"
84
- # 名前からチャンネルオブジェクトを取得する
85
- return discord.utils.get(text_channels, voice_channels, name=channel_name, name2=channel_name_2)
86
74
 
87
75
 
88
- # チャンネル作成時の権限リストを返す
76
+
77
+
89
- def _init_overwrites(guild, member):
78
+ def _overwrites(guild: discord.Guild, member: discord.Member):
90
79
  overwrites = {
91
- # デフォルトのユーザーはメッセージを見れないように
92
80
  guild.default_role: discord.PermissionOverwrite(read_messages=False),
93
- # 参加したメンバーは見ることができるように
94
81
  member: discord.PermissionOverwrite(read_messages=True)
95
82
  }
96
83
 
97
- bots_role = discord.utils.get(guild.roles, name=BOT_ROLE_NAME)
84
+ but_role = discord.utils.get(guild.roles, name=BOT_ROLE_NAME)
98
- if bots_role is not None:
85
+ if but_role is not None:
99
- # Botもメッセージを見れるように
100
- bot_overwrite = {
86
+ overwrites.update(
87
+ {
101
- bots_role: discord.PermissionOverwrite(read_messages=True)
88
+ but_role: discord.PermissionOverwrite(read_messages=True)
102
- }
89
+ }
103
- overwrites.update(bot_overwrite)
90
+ )
104
-
105
91
  return overwrites
106
92
 
107
93
 
108
- # テキストチャンネルを作成する関数
109
- async def _channel_create(member, voiceChannel):
94
+ async def _create_channel(after: discord.VoiceState, member: discord.Member):
95
+ channel = after.channel
96
+ members = after.channel.members
110
- guild = voiceChannel.guild
97
+ guild = channel.guild
111
98
 
112
- channel_name = CHANNEL_PREFIX + str(voiceChannel.id)
99
+ # チャンネルに対するoverwritesの取得
113
- channel_name_2 = str("会議部屋") + str(voiceChannel.id)
114
- channel_name_3 = str("個通部屋") + str(voiceChannel.id)
115
- overwrites = _init_overwrites(guild, member)
100
+ overwrites = _overwrites(guild, member)
101
+ # チャンネルの作成
102
+ if(channel.name) == "会議部屋":
103
+ if len(members)==1:
104
+ meeting_channel = await channel.category.create_voice_channel(
116
- category = voiceChannel.category
105
+ name=f"会議部屋{member.name}"
106
+ )
117
107
 
118
- # テキストチャンネルを作成
119
- await guild.create_text_channel(
120
- channel_name, overwrites=overwrites, category=category)
121
108
 
122
- await guild.create_voice_channel(
109
+ await member.move_to(meeting_channel)
123
- channel_name_2, overwrites=overwrites, category=category)
124
110
 
125
- await guild.create_voice_channel(
111
+ await channel.category.create_text_channel(
112
+ name=f"{CHANNEL_PREFIX}{meeting_channel.id}",
126
- channel_name_3, overwrites=overwrites, category=category)
113
+ overwrites=overwrites
114
+ )
115
+ await meeting_channel.connect()
127
116
 
128
117
 
129
118
 
119
+ if (channel.name) == "個通部屋":
120
+ if len(members) == 1:
130
- async def _channel_delete(member, voiceChannel):
121
+ personal_channel = await channel.category.create_voice_channel(
122
+ name=f"個通部屋{member.name}"
123
+ )
124
+
131
- target = _channel_find(voiceChannel)
125
+ await member.move_to(personal_channel)
126
+ await channel.category.create_text_channel(
127
+ name=f"{CHANNEL_PREFIX}{personal_channel.id}",
132
- if target is not None:
128
+ overwrites=overwrites
129
+ )
130
+ await personal_channel.connect()
131
+ #overwrites=overwrites
132
+
133
+ # .5秒待つ(連続でAPIを呼び出すとdiscord側に負荷がかかるため)
133
- await target.delete()
134
+ #await asyncio.sleep(.5)
135
+ # 会議部屋に移動
136
+ #await member.move_to(meeting_channel)
137
+ #await asyncio.sleep(.5)
138
+ # await meeting_channel.connect()
134
139
 
135
140
 
136
- # テキストチャンネルに参加させる関数
137
- async def _channel_join(member, voiceChannel):
141
+ async def _exit_task(before: discord.VoiceState, member: discord.Member):
138
- target = _channel_find(voiceChannel)
139
- if target is not None:
140
- overwrites = discord.PermissionOverwrite(read_messages=True)
141
- # 該当メンバーに読み取り権限を付与
142
- await target.set_permissions(member, overwrite=overwrites)
143
142
 
143
+ if len(before.channel.members) == 0:
144
+ # チャンネルのメンバーが一人かつそれがbotの時、そのbotを退出、チャンネル削除
145
+ # for _client in client.voice_clients:
146
+ #
147
+ # if members[0].id == client.user.id:
148
+ # await _client.disconnect(force=True)
149
+ category = before.channel.category
150
+ # カテゴリ内の会議チャンネルを探す
151
+ # text_channel = discord.utils.get(category.channels, name=f"{CHANNEL_PREFIX}{member.id}")
152
+ meeting_channel = discord.utils.get(category.channels, name=f"会議部屋{member.name}")
153
+ personal_channel = discord.utils.get(category.channels, name=f"個通部屋{member.name}")
154
+ text_meeting_channel = discord.utils.get(category.channels, name=f"{CHANNEL_PREFIX}{meeting_channel.id}")
155
+ text_personal_channel = discord.utils.get(category.channels, name=f"{CHANNEL_PREFIX}{personal_channel.id}")
144
156
 
145
- # テキストチャンネルから退出させる関数
157
+ # チャンネルの削除
146
- async def _channel_exit(member, voiceChannel):
158
+ # if len(before.channel.members) == 0:
147
- target = _channel_find(voiceChannel)
148
- if target is not None:
149
- # 該当メンバーの読取権限を取り消し
150
- await target.set_permissions(member, overwrite=None)
151
159
 
160
+ if (before.channel.name== meeting_channel.name) == True:
161
+ await text_meeting_channel.delete()
162
+ await meeting_channel.delete()
163
+ # if len(personal_channel.members) == 0:
164
+ if (before.channel.name == personal_channel.name) == True:
165
+ await text_personal_channel.delete()
166
+ await personal_channel.delete()
152
167
 
153
- # 入室時にメンションを飛ばして案内したい
154
- async def _channel_send_join(member, voiceChannel):
155
- target = _channel_find(voiceChannel)
156
- if target is not None:
157
- await target.send(member.mention + "さん 通話中のチャット・コマンド入力はこちらを、お使いください")
158
-
159
-
160
-
161
-
162
- if __name__ == "__main__":
163
- client.run("トークン")
168
+ client.run(TOKEN)
164
169
  ```
165
170
 
166
171
  ### 試したこと

2

文法の修正

2022/10/01 12:08

投稿

poketatsu
poketatsu

スコア19

test CHANGED
File without changes
test CHANGED
@@ -169,5 +169,5 @@
169
169
 
170
170
  ### 補足情報(FW/ツールのバージョンなど)
171
171
 
172
- ここにより詳細な情報を記載ださい。
172
+ ボット歴は短いですが、宜しくお願致します
173
173
 

1

文法の修正

2022/10/01 12:07

投稿

poketatsu
poketatsu

スコア19

test CHANGED
@@ -1 +1 @@
1
- 自動 テキスチャンネル・ボイスチャンネル作成
1
+ 自動 テキスチャンネル・ボイスチャンネル作成
test CHANGED
File without changes