回答編集履歴
7
情報を追記
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
説明を修正
answer
CHANGED
@@ -45,10 +45,20 @@
|
|
45
45
|
)
|
46
46
|
```
|
47
47
|
|
48
|
-
## `
|
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
コード修正
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.
|
44
|
+
vchannel.members.each(/* ... */)
|
45
45
|
)
|
46
46
|
```
|
47
47
|
|
4
コード修正
answer
CHANGED
@@ -35,12 +35,12 @@
|
|
35
35
|
|
36
36
|
`Array.prototype.filter()`と同じような関数で、返値は`Channel`ではなく`Collection`です。
|
37
37
|
|
38
|
-
そのため、各チャンネルの`members`プロパティを取得するには`
|
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.
|
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.
|
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
コード修正
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
注意点が分かりやすいように修正
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
説明を追記
answer
CHANGED
@@ -79,4 +79,5 @@
|
|
79
79
|
```
|
80
80
|
|
81
81
|
こんな感じでしょうか。
|
82
|
+
一応、`guild`, `vchannels`, `channel`が`null`や`undefined`, `[]`だった場合のエラー処理をしていませんのでご注意ください。
|
82
83
|
ご参考まで。
|