回答編集履歴

7

情報を追記

2021/10/28 08:40

投稿

fj68
fj68

スコア752

test CHANGED
@@ -120,7 +120,15 @@
120
120
 
121
121
 
122
122
 
123
+ 【追記】
124
+
125
+ hinanonさんによると「await member.voice.kick().catch(console.error)にしたら動きました」とのことです。
126
+
127
+ 以下のコードもその情報に合わせて修正しました。
128
+
129
+
130
+
123
- `member.voice.disconnect('理由')`は`Promise`を返す **非同期関数** なので、`await`で処理が終わるまで以降のコードの実行を中断します。
131
+ `member.voice.disconnect('理由')`や`member.voice.kick()`は`Promise`を返す **非同期関数** なので、`await`で処理が終わるまで以降のコードの実行を中断します。
124
132
 
125
133
  `await`を使うにはそのコードが含まれる関数を`async`にしなければいけないので、そこも修正します。
126
134
 
@@ -150,7 +158,7 @@
150
158
 
151
159
  // kick()を使う方法
152
160
 
153
- member.voice.kick()
161
+ await member.voice.kick().catch(console.error)
154
162
 
155
163
 
156
164
 

6

説明を修正

2021/10/28 08:40

投稿

fj68
fj68

スコア752

test CHANGED
@@ -92,12 +92,32 @@
92
92
 
93
93
 
94
94
 
95
+ ## ユーザを`VoiceChannel`から退出させる方法
96
+
97
+
98
+
95
- ## `member.voice.kick()`く`member.voice.disconnect()`
99
+ いくつか方法があり、その中もバージョンによって動くものと動かいものがあるようです。
100
+
101
+
102
+
96
-
103
+ - [ボイスチャットからユーザーを蹴る - Discord.js Japan User Group](https://scrapbox.io/discordjs-japan/ボイスチャットからユーザーを蹴る)
97
-
98
104
 
99
105
  - [VoiceState.disconnect() - discord.js Documentation](https://discord.js.org/#/docs/main/stable/class/VoiceState?scrollTo=disconnect)
100
106
 
107
+ - [javascript - How do I disconnect a user from a voice channel in discord.js? - Stack Overflow](https://stackoverflow.com/questions/57650739/how-do-i-disconnect-a-user-from-a-voice-channel-in-discord-js)
108
+
109
+ - [javascript - Discord.Js disconnect members voice channel - Stack Overflow](https://stackoverflow.com/questions/64008957/discord-js-disconnect-members-voice-channel)
110
+
111
+
112
+
113
+ `member.voice.setChannel(null)`や`member.setVoiceChannel(null)`はメンバーのチャンネル情報を`null`に設定することにより、ボイスチャンネルから退出させるというものです。
114
+
115
+
116
+
117
+ 一方、`member.voice.disconnect()`や`member.voice.kick()`は文字通りメンバーをボイスチャンネルから退出させるために用意された関数です。
118
+
119
+ バージョンによって`disconnect()`が使える・使えない分かれるようですが、どのバージョンから使えるのかは残念ながらわかりません。`kick()`は公式ドキュメントから見つけることすらできませんでしたが、ユーザ発の情報では割とありましたので、昔からある方法なのかもしれません(この辺は伝聞になってしまいますが申し訳ない)。
120
+
101
121
 
102
122
 
103
123
  `member.voice.disconnect('理由')`は`Promise`を返す **非同期関数** なので、`await`で処理が終わるまで以降のコードの実行を中断します。
@@ -122,8 +142,18 @@
122
142
 
123
143
  if (member) {
124
144
 
145
+ // disconnect()を使う方法
146
+
125
147
  await member.voice.disconnect(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
126
148
 
149
+
150
+
151
+ // kick()を使う方法
152
+
153
+ member.voice.kick()
154
+
155
+
156
+
127
157
  console.log(member.id)
128
158
 
129
159
  }

5

コード修正

2021/10/28 07:51

投稿

fj68
fj68

スコア752

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  vchannels.each(vchannel =>
86
86
 
87
- vchannel.members.forEach(/* ... */)
87
+ vchannel.members.each(/* ... */)
88
88
 
89
89
  )
90
90
 

4

コード修正

2021/10/27 19:50

投稿

fj68
fj68

スコア752

test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
 
74
74
 
75
- そのため、各チャンネルの`members`プロパティを取得するには`forEach`しましょう。
75
+ そのため、各チャンネルの`members`プロパティを取得するには`Collection.each()`しましょう。
76
76
 
77
77
 
78
78
 
@@ -82,7 +82,7 @@
82
82
 
83
83
 
84
84
 
85
- vchannels.forEach(vchannel =>
85
+ vchannels.each(vchannel =>
86
86
 
87
87
  vchannel.members.forEach(/* ... */)
88
88
 
@@ -112,9 +112,13 @@
112
112
 
113
113
 
114
114
 
115
+ `vchannel.members`も`Collection`なので、`forEach()`ではなく`each()`を使っています。
116
+
117
+
118
+
115
119
  ```js
116
120
 
117
- vchannel.members.forEach(async member => {
121
+ vchannel.members.each(async member => {
118
122
 
119
123
  if (member) {
120
124
 

3

コード修正

2021/10/27 19:48

投稿

fj68
fj68

スコア752

test CHANGED
@@ -150,9 +150,11 @@
150
150
 
151
151
  await member.voice.disconnect(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
152
152
 
153
+
154
+
155
+ /* 処理待ちは必要ない */
156
+
153
157
  await channel.send(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
154
-
155
- })
156
158
 
157
159
  ```
158
160
 

2

注意点が分かりやすいように修正

2021/10/27 19:44

投稿

fj68
fj68

スコア752

test CHANGED
@@ -158,6 +158,10 @@
158
158
 
159
159
 
160
160
 
161
+ ---
162
+
163
+
164
+
161
165
  こんな感じでしょうか。
162
166
 
163
167
  一応、`guild`, `vchannels`, `channel`が`null`や`undefined`, `[]`だった場合のエラー処理をしていませんのでご注意ください。

1

説明を追記

2021/10/27 19:41

投稿

fj68
fj68

スコア752

test CHANGED
@@ -160,4 +160,6 @@
160
160
 
161
161
  こんな感じでしょうか。
162
162
 
163
+ 一応、`guild`, `vchannels`, `channel`が`null`や`undefined`, `[]`だった場合のエラー処理をしていませんのでご注意ください。
164
+
163
165
  ご参考まで。