discord.jsでグローバルボイスチャットを作った。

NeoXBotというdiscordのbotを作ったときに、
グローバルボイスチャットのリクエストがあったので、
作りました。

■環境:discord.js

★コード公開中

🔵作成者:KOU00000 / Ruby

 

準備
"discord.js" をnpmからインストール

```
npm install discord.js
```
・音声用に "discordjs/opus" を同じくnpmからインストール

```
npm install @discordjs/opus
```

 
//グローバルボイスチャットの名前
const gvcName = "グローバルボイスチャット";
const token = "あなたのbotのtoken"

const discord = require("discord.js");
const client = new discord.Client();
client.login(token);

/**
DiscordID:696600519283572766
©X / KOU00000
orichalcum.gom@gmail.com
*/

//音データ作成用
const {Readable}=require('stream');

//音の流れない音データを作る。
class Silence extends Readable{
_read(){this.push(Buffer.from([0xF8,0xFF,0xFE]))}
};
/**
* discord の client が ready 状態になってないと、
* client.channels..... を行えない。
*/
client.on("ready",()=>{
console.info("ready...")
client.channels.cache.filter
//グローバルボイスチャットが変数gvcNameと同じチャンネルを抽出
(ch=>ch.type === "voice" && ch.name === gvcName)
.forEach(ch=>
{
ch.join()//vcに参加
.then(conn => {//connに参加したvcのデータが含まれる。

//音の流れない音データを配信
//(最初にbotがVCで音データを流さないと音の取得ができないため。)
conn.play(new Silence,{ type: 'opus' });
let receiver = conn.receiver;
//だれかがVCで発言したら。
conn.on('speaking', (user, speaking) => {
//botだったら放送しない。
if(user.bot)return;
//音を取得
const UserVoice = receiver.createStream(user);
const broadcast = client.voice.createBroadcast();
//流す音
broadcast.play(UserVoice,{ type: 'opus' });
//一斉にbotが接続中のVCに取得した音声を配信。
for (const connection of client.voice.connections.values()) {
connection.play(broadcast);
};
});
});
});
});


※ ※ ※
ここにのせたコードは、
NeoXBotに搭載してるものとは別に、
公開用にシンプルにしたバージョンのコードなのですが、
ちゃんとしたテストなどを行っていないので、
もしかしたらちゃんと動かないかもしれないです。
答えられる限り答えるので、何かあればコメントでお願いします。

 

おまけ(?)

今まで作ったもの

ASCII ART ジェネレータ (カラー版:若干重い/画像を文字絵に変換する)

ASCII ART ジェネレータ (白黒版:割と軽い/画像を文字絵に変換する)

※大きなサイズの画像を入れると固まったりするので気を付けて。

※☝スマホとか特に!