質問するログイン新規登録

回答編集履歴

7

情報を追記

2021/10/28 08:40

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -59,7 +59,11 @@
59
59
  一方、`member.voice.disconnect()`や`member.voice.kick()`は文字通りメンバーをボイスチャンネルから退出させるために用意された関数です。
60
60
  バージョンによって`disconnect()`が使える・使えない分かれるようですが、どのバージョンから使えるのかは残念ながらわかりません。`kick()`は公式ドキュメントから見つけることすらできませんでしたが、ユーザ発の情報では割とありましたので、昔からある方法なのかもしれません(この辺は伝聞になってしまいますが申し訳ない)。
61
61
 
62
+ 【追記】
63
+ hinanonさんによると「await member.voice.kick().catch(console.error)にしたら動きました」とのことです。
64
+ 以下のコードもその情報に合わせて修正しました。
65
+
62
- `member.voice.disconnect('理由')`は`Promise`を返す **非同期関数** なので、`await`で処理が終わるまで以降のコードの実行を中断します。
66
+ `member.voice.disconnect('理由')`や`member.voice.kick()`は`Promise`を返す **非同期関数** なので、`await`で処理が終わるまで以降のコードの実行を中断します。
63
67
  `await`を使うにはそのコードが含まれる関数を`async`にしなければいけないので、そこも修正します。
64
68
 
65
69
  また、細かいことですが、`if`文周りでバグが入りそうなコードになっている(おそらく`member == null`のときでも`console.log(member.id)`が実行される)ので`{...}`で範囲を明確にしました。
@@ -74,7 +78,7 @@
74
78
  await member.voice.disconnect(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
75
79
 
76
80
  // kick()を使う方法
77
- member.voice.kick()
81
+ await member.voice.kick().catch(console.error)
78
82
 
79
83
  console.log(member.id)
80
84
  }

6

説明を修正

2021/10/28 08:40

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -45,10 +45,20 @@
45
45
  )
46
46
  ```
47
47
 
48
- ## `member.voice.kick()`ではなく`member.voice.disconnect()`
48
+ ## ユーザを`VoiceChannel`から退出させる方法
49
49
 
50
+ いくつか方法があり、その中でもバージョンによって動くものと動かないものがあるようです。
51
+
52
+ - [ボイスチャットからユーザーを蹴る - Discord.js Japan User Group](https://scrapbox.io/discordjs-japan/ボイスチャットからユーザーを蹴る)
50
53
  - [VoiceState.disconnect() - discord.js Documentation](https://discord.js.org/#/docs/main/stable/class/VoiceState?scrollTo=disconnect)
54
+ - [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)
55
+ - [javascript - Discord.Js disconnect members voice channel - Stack Overflow](https://stackoverflow.com/questions/64008957/discord-js-disconnect-members-voice-channel)
51
56
 
57
+ `member.voice.setChannel(null)`や`member.setVoiceChannel(null)`はメンバーのチャンネル情報を`null`に設定することにより、ボイスチャンネルから退出させるというものです。
58
+
59
+ 一方、`member.voice.disconnect()`や`member.voice.kick()`は文字通りメンバーをボイスチャンネルから退出させるために用意された関数です。
60
+ バージョンによって`disconnect()`が使える・使えない分かれるようですが、どのバージョンから使えるのかは残念ながらわかりません。`kick()`は公式ドキュメントから見つけることすらできませんでしたが、ユーザ発の情報では割とありましたので、昔からある方法なのかもしれません(この辺は伝聞になってしまいますが申し訳ない)。
61
+
52
62
  `member.voice.disconnect('理由')`は`Promise`を返す **非同期関数** なので、`await`で処理が終わるまで以降のコードの実行を中断します。
53
63
  `await`を使うにはそのコードが含まれる関数を`async`にしなければいけないので、そこも修正します。
54
64
 
@@ -60,7 +70,12 @@
60
70
  ```js
61
71
  vchannel.members.each(async member => {
62
72
  if (member) {
73
+ // disconnect()を使う方法
63
74
  await member.voice.disconnect(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
75
+
76
+ // kick()を使う方法
77
+ member.voice.kick()
78
+
64
79
  console.log(member.id)
65
80
  }
66
81
  })

5

コード修正

2021/10/28 07:51

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -41,7 +41,7 @@
41
41
  const vchannels = guild.channels.cache.filter(channel => channel.type === 'voice')
42
42
 
43
43
  vchannels.each(vchannel =>
44
- vchannel.members.forEach(/* ... */)
44
+ vchannel.members.each(/* ... */)
45
45
  )
46
46
  ```
47
47
 

4

コード修正

2021/10/27 19:50

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -35,12 +35,12 @@
35
35
 
36
36
  `Array.prototype.filter()`と同じような関数で、返値は`Channel`ではなく`Collection`です。
37
37
 
38
- そのため、各チャンネルの`members`プロパティを取得するには`forEach`しましょう。
38
+ そのため、各チャンネルの`members`プロパティを取得するには`Collection.each()`しましょう。
39
39
 
40
40
  ```js
41
41
  const vchannels = guild.channels.cache.filter(channel => channel.type === 'voice')
42
42
 
43
- vchannels.forEach(vchannel =>
43
+ vchannels.each(vchannel =>
44
44
  vchannel.members.forEach(/* ... */)
45
45
  )
46
46
  ```
@@ -55,8 +55,10 @@
55
55
  また、細かいことですが、`if`文周りでバグが入りそうなコードになっている(おそらく`member == null`のときでも`console.log(member.id)`が実行される)ので`{...}`で範囲を明確にしました。
56
56
  `if`や`while`などは例え1行だとしても`if (...) {...}`にしておくと意図しない動作を防げます。
57
57
 
58
+ `vchannel.members`も`Collection`なので、`forEach()`ではなく`each()`を使っています。
59
+
58
60
  ```js
59
- vchannel.members.forEach(async member => {
61
+ vchannel.members.each(async member => {
60
62
  if (member) {
61
63
  await member.voice.disconnect(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
62
64
  console.log(member.id)

3

コード修正

2021/10/27 19:48

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -74,8 +74,9 @@
74
74
 
75
75
  ```js
76
76
  await member.voice.disconnect(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
77
+
78
+ /* 処理待ちは必要ない */
77
79
  await channel.send(`2時になったのでボイスチャットからキックしました(*'▽')`).catch(console.error)
78
- })
79
80
  ```
80
81
 
81
82
  ---

2

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

2021/10/27 19:44

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -78,6 +78,8 @@
78
78
  })
79
79
  ```
80
80
 
81
+ ---
82
+
81
83
  こんな感じでしょうか。
82
84
  一応、`guild`, `vchannels`, `channel`が`null`や`undefined`, `[]`だった場合のエラー処理をしていませんのでご注意ください。
83
85
  ご参考まで。

1

説明を追記

2021/10/27 19:41

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -79,4 +79,5 @@
79
79
  ```
80
80
 
81
81
  こんな感じでしょうか。
82
+ 一応、`guild`, `vchannels`, `channel`が`null`や`undefined`, `[]`だった場合のエラー処理をしていませんのでご注意ください。
82
83
  ご参考まで。