質問編集履歴
3
書式の改善
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
|
-
|
38
|
+
voice_channelID_1: int = 1234456789123456789
|
34
|
-
|
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(
|
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
|
-
|
65
|
+
if len(before.channel.members) == 0:
|
55
|
-
# テキストチャンネルを削除する
|
56
|
-
await _channel_delete(member, before.channel)
|
57
|
-
else:
|
58
|
-
# テキストチャンネルから退出させる
|
59
|
-
|
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) ==
|
69
|
+
# if len(after.channel.members) == 0:
|
65
|
-
# テキストチャンネルを作成する
|
66
|
-
|
70
|
+
# elif len(after.channel is None):
|
67
|
-
else:
|
68
|
-
# テキストチャンネルに参加させる
|
69
|
-
await _
|
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 _
|
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
|
-
b
|
84
|
+
but_role = discord.utils.get(guild.roles, name=BOT_ROLE_NAME)
|
98
|
-
if b
|
85
|
+
if but_role is not None:
|
99
|
-
# Botもメッセージを見れるように
|
100
|
-
|
86
|
+
overwrites.update(
|
87
|
+
{
|
101
|
-
b
|
88
|
+
but_role: discord.PermissionOverwrite(read_messages=True)
|
102
|
-
}
|
89
|
+
}
|
103
|
-
|
90
|
+
)
|
104
|
-
|
105
91
|
return overwrites
|
106
92
|
|
107
93
|
|
108
|
-
# テキストチャンネルを作成する関数
|
109
|
-
async def _channel
|
94
|
+
async def _create_channel(after: discord.VoiceState, member: discord.Member):
|
95
|
+
channel = after.channel
|
96
|
+
members = after.channel.members
|
110
|
-
guild =
|
97
|
+
guild = channel.guild
|
111
98
|
|
112
|
-
|
99
|
+
# チャンネルに対するoverwritesの取得
|
113
|
-
channel_name_2 = str("会議部屋") + str(voiceChannel.id)
|
114
|
-
channel_name_3 = str("個通部屋") + str(voiceChannel.id)
|
115
|
-
overwrites = _
|
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
|
-
|
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
|
109
|
+
await member.move_to(meeting_channel)
|
123
|
-
channel_name_2, overwrites=overwrites, category=category)
|
124
110
|
|
125
|
-
await
|
111
|
+
await channel.category.create_text_channel(
|
112
|
+
name=f"{CHANNEL_PREFIX}{meeting_channel.id}",
|
126
|
-
|
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
|
-
|
121
|
+
personal_channel = await channel.category.create_voice_channel(
|
122
|
+
name=f"個通部屋{member.name}"
|
123
|
+
)
|
124
|
+
|
131
|
-
t
|
125
|
+
await member.move_to(personal_channel)
|
126
|
+
await channel.category.create_text_channel(
|
127
|
+
name=f"{CHANNEL_PREFIX}{personal_channel.id}",
|
132
|
-
|
128
|
+
overwrites=overwrites
|
129
|
+
)
|
130
|
+
await personal_channel.connect()
|
131
|
+
#overwrites=overwrites
|
132
|
+
|
133
|
+
# .5秒待つ(連続でAPIを呼び出すとdiscord側に負荷がかかるため)
|
133
|
-
|
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 _
|
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
|
-
|
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
|
-
|
168
|
+
client.run(TOKEN)
|
164
169
|
```
|
165
170
|
|
166
171
|
### 試したこと
|
2
文法の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -169,5 +169,5 @@
|
|
169
169
|
|
170
170
|
### 補足情報(FW/ツールのバージョンなど)
|
171
171
|
|
172
|
-
|
172
|
+
ボット歴は短いですが、宜しくお願い致します。
|
173
173
|
|
1
文法の修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
自動 テキスチャンネル・ボイスチャンネル作成
|
1
|
+
自動 テキストチャンネル・ボイスチャンネル作成
|
test
CHANGED
File without changes
|