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 ジェネレータ (白黒版:割と軽い/画像を文字絵に変換する)
※大きなサイズの画像を入れると固まったりするので気を付けて。
※☝スマホとか特に!