【Discord.js V14】取得するVCの音声をロールによって判別する

皆さん初めまして。Morichanと申します。
下記の※の記述を理解したうえで、記事を読んでください。

※DiscordBot開発初心者の書いた記事です。
（また、プログラミング自体、２年ほどのブランクあり）

BOTでVCに音楽を流す機能やBOTでVCを録音する機能までの流れに関しては、別の記事にまとめてあります。

関連記事：
* [【Windows11】Discord BOTを開発するための開発環境を整える。](https://qiita.com/Mori-chan/items/add6f63b04f70ff53732)
* [【Discord.js V14】Discord BOTにスラッシュコマンドを実装してみる](https://qiita.com/Mori-chan/items/2e869c0e2060b78f0380)
* [【Discord.js V14】Discord BOTをVCに参加させてみる](https://qiita.com/Mori-chan/items/2df4ad15adc79cf2a167)
* [【Discord.js V14】２つのBOTを別々のVCに参加させてみる](https://qiita.com/Mori-chan/items/7d598933753d0abe1b91)


## 目次
1. [開発環境](#開発環境)
2. [テスト用のロールを作成、付与する](#テスト用のロールを作成付与する)
3. [取得するVCの音声をロールによって判別する](#取得するvcの音声をロールによって判別する)
1. [関連記事](#関連記事)


## 開発環境
OS (Windows11)
discord.js (14.7.1)
node.js (18.13.0)
npm (8.19.3)
@discordjs/voice (^0.14.0)


## テスト用のロールを作成、付与する
今回は仮にtestというロールを作成、付与して実行。
* ロールを作成して、IDを取得。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3109638/ec496ac8-efbd-c773-ae29-1b128b02b198.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3109638/460b92aa-f4bf-4b7d-b335-ae6e599db5bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3109638/998601f9-2ce9-5c5d-d7a6-ecc8f2f4a4e0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3109638/94fe3394-60b8-1847-7179-19e6565f8ed9.png)

* `config.json`に必要な記述を追記。
```
{
    "LISTENER": {
        "CLIENT_ID": "ここにBOT1のCLIENT_IDを記述",
        "TOKEN": "ここにBOT1のTOKENを記述"
    },
    "SPEAKER": {
        "CLIENT_ID": "ここにBOT2のCLIENT_IDを記述",
        "TOKEN": "ここにBOT2のTOKENを記述"
    }
    "GUILD_ID": "ここにBOTを追加したサーバーのIDを記述",
    "TEST_ROLE": "ここにtestというロールのIDを記述"
}

```

## 取得するVCの音声をロールによって判別する
* `stream.js`でuserIdからユーザーを取得する。
```
connection1.receiver.speaking.on('start', (userId) => {
	let member = interaction.guild.members.cache.get(userId);
```
* `stream.js`にtestというロールがあるか判別するコードを記述する。
```
		if (member.roles.cache.has(TEST_ROLE)) {
			const standaloneInput = new AudioMixer.Input({
---（省略）---
			rawStream.on('end', () => {
				if (this.audioMixer != null) {
					this.audioMixer.removeInput(standaloneInput);
					standaloneInput.destroy();
					rawStream.destroy();
					p.destroy();
				}
			});
		}
		else {
			return;
		}
	});
}
await interaction.reply('VCを中継します！');
```

* `node index.js`を行い、Discordでコマンド`/stream`を入力。
無事に、テストというロールが付与されたユーザーの音声のみが中継されました。


## 関連記事
* [【Windows11】Discord BOTを開発するための開発環境を整える。](https://qiita.com/Mori-chan/items/add6f63b04f70ff53732)
* [【Discord.js V14】Discord BOTにスラッシュコマンドを実装してみる](https://qiita.com/Mori-chan/items/2e869c0e2060b78f0380)
* [【Discord.js V14】Discord BOTをVCに参加させてみる](https://qiita.com/Mori-chan/items/2df4ad15adc79cf2a167)
* [【Discord.js V14】２つのBOTを別々のVCに参加させてみる](https://qiita.com/Mori-chan/items/7d598933753d0abe1b91)
* [【Discord.js V14】スラッシュコマンドのオプションで、既に選択済みの選択肢を２つ目の引数のリストから消す。](https://qiita.com/Mori-chan/items/89ad3245443f1e8ace07)
* [【Discord.js V14】Discord BOTにVCに音楽を流す機能を実装してみる](https://qiita.com/Mori-chan/items/84622c733dc43c419dc5)
* [【Discord.js V14】Discord BOTにVCから１人分の音声を取得して、録音する機能を実装してみる](https://qiita.com/Mori-chan/items/8fcb1770c4d0020a8284)
* [【Discord.js V14】VC１からVC２に音声をStreaming（中継）するBOTを作成する。](https://qiita.com/Mori-chan/items/e9ced87c0d68a9eb2a9a)
* 【Discord.js V14】取得するVCの音声をロールによって判別する