Discord Bot - 跨渠道沟通

Posted

技术标签:

【中文标题】Discord Bot - 跨渠道沟通【英文标题】:Discord Bot - Cross-Channel Communication 【发布时间】:2020-12-27 13:01:20 【问题描述】:

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

如果我正确解释了this page of the Discord.js API Documentation,这应该可以。 “高级用法”部分似乎确实为我想要做的事情提供了一个代码 sn-p。

我可以让机器人将音频录制到我的计算机上,并从我的计算机上播放音频,但是从一个来源到另一个来源(即使在同一频道内)的流式语音对我来说似乎是不可能的。

我的代码如下。 有什么方法可以让我的 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);

【问题讨论】:

你有没有让它工作?这听起来真的很酷而且很有用 @TenaciousB 目前还没有。已经有一段时间没有做这件事了,但不知何故,我什至无法让单个声音从一个频道流到另一个频道。如果您正在寻找这样的东西,我认为像 TeamSpeak 这样的软件可能值得研究,它似乎默认支持更复杂的语音通道操作。 我真的希望他们在某个时候不和谐地实施它,现在很难让任何人安装teampeak了 【参考方案1】:

根据设计,Discord 只允许每个帐户一次使用一个语音频道。

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

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

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

【讨论】:

如果你设法让机器人与这个系统一起工作,请不要犹豫在这里提一下(我也会这样做)!处理音频流稍微有点超出我的能力,在新的一年里我有很多工作要做,但是让这个功能为 Discord 工作会很棒。【参考方案2】:

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

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

p>

【讨论】:

以上是关于Discord Bot - 跨渠道沟通的主要内容,如果未能解决你的问题,请参考以下文章

使 Discord.py Bot 仅在特定渠道中工作

“错误:未找到 FFMPEG”但应安装 FFMPEG - Discord Bot

如何使用 Discord.py Cogs 使 Discord Bot 加入语音频道并在成员加入频道时播放音频文件

使用 Discord.js 跨渠道发送消息会产生“未定义”错误

Discord Bot 读取对设置消息的反应

Discord bot 查找来自用户的消息