Discord Bot-跨渠道通信

时间:2020-09-09 06:21:44

标签: javascript discord

最近,为了方便玩游戏,我想看看我是否可以制作一个Discord Bot,它可以将来自一个通道的所有音频传输到另一个通道。这样的想法是,您将拥有一种“观众”频道,人们可以一边听另一频道的“表演”一边聊天,每个人都可以听到表演,而听众可以互相交谈。

如果我正确解释了this page of the Discord.js API Documentation,这应该可以工作。 “高级用法”部分似乎从字面上提供了我想要做的代码片段。

我可以让机器人将该音频录制到我的计算机上,然后从我的计算机上播放音频,但是对我来说似乎无法将声音从一个来源流到另一个来源(即使是在同一通道内)。

我的代码如下。 是否可以让Discord机器人将一个或多个用户声音从一个通道传输到另一个通道?

const Discord = require('discord.js');
const client = new Discord.Client();
const {prefix, token, help, transmit, recieve, end} = require('./config.json');

client.once('ready', () => {
    console.log('Ready!');
});

let transmitting = false;
let t_channel;
let recieving = false;
let r_channel;
let t_connection;
let r_connection;
let sender;
let audio;

client.on('message', message => {
    // Take command input
    if (!message.content.startsWith(prefix) || message.author.bot) return;
    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const command = args.shift().toLowerCase();
    
    switch (command) {
        case `${help}`:
            message.channel.send(`Commands: ${transmit}, ${recieve}, ${end}`);
            break
        case `${transmit}`:
            message.channel.send('Transmitting');
            transmitting = true;
            t_channel = message.member.voice.channel;
            sender = message.author;
            break;
        case `${recieve}`:
            message.channel.send('Receiving');
            recieving = true;
            r_channel = message.member.voice.channel;
            break;
        case `${end}`:
            message.channel.send('Ending');
            transmitting = false;
            recieving = false;
            end_broadcast();
            break;
    }

    if (transmitting && recieving) {
        broadcast();
    }
});

async function broadcast() {
    t_connection = await t_channel.join();
    r_connection = await r_channel.join();
    audio = t_connection.receiver.createStream(sender);
    r_connection.play(audio, { type: 'opus' });
    console.log("Working!");
}

async function end_broadcast() {
    audio.destroy();
    r_channel.leave();
    t_connection.disconnect;
    r_connection.disconnect;
}

client.login(token);

2 个答案:

答案 0 :(得分:4)

Discord 按照设计只允许每个帐户一次在一个语音频道上。

我刚开始研究这个,但我遇到了这个: 问:我可以同时进入两个不和谐的语音频道吗? 答:是的,您可以运行多个帐户。这些都是不和谐的合法实例,每个实例都处理自己的身份验证令牌,因此您可以根据需要打开任意数量的客户端并为每个客户端运行一个帐户,这意味着您可以登录任意数量的帐户。

我认为您可以通过运行两个具有不同帐户的独立机器人来实现这一点。基本上,Bot A 在语音通道 1 上收听和录音,然后 Bot B 在语音通道 2 上播放录音。它基本上是一个生产者(Bot A)和消费者(Bot B)模型。

我有兴趣做出贡献,因为我想在我的“我们中间”服务器上尝试这个!

答案 1 :(得分:0)

我仍在为播客类型的机器人编写代码,现在它一次只能发送一个用户语音。因此,如果一个音乐机器人正在播放,而我正在谈论它,它会完全覆盖我的机器人,当我说完后,它会留在我身上,因为机器人的语音活动没有改变。我会将其放入 github repository。如果有人发现如何成功合并 2 个或更多音频流,请将其放入 issue 中并立即告诉我以及我需要更改的内容。

对于您的情况,您只需要添加另一个 'receiver' 和 'send',还要确保在 .on('speaking', 下放置 if(user.id===<client/bot>.user.id) return,这样它就不会不是自己捡起来

相关问题