您好,有一种方法可以实现,这样您就可以拥有1种方式的vc,其中(到目前为止ive设置的方式)以某种方式连接了2个帐户(ive使2可以从一个jda项目运行) 然后在一个vc中拥有一个机器人,在另一个vc中拥有另一个机器人。 第一个bot听到vc的声音,然后第二个bot发出声音在第二个vc中共享 因此第一个vc中的人听不到第二个vc中的人,但是第二个vc中的人可以听到第一个vc中的人
顺便说一下,这就是我在一个jda项目中连接2个机器人的方式 Main.java:
public class Main {
public static void main(String[] args){
Bot bot = new Bot("token for bot 1");
Bot2 bot2 = new Bot2("token for bot 2");
bot.start();
bot2.start();
}
}
Bot.java:
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import javax.security.auth.login.LoginException;
public class Bot {
ListenerAdapter[] listenerAdapters= new ListenerAdapter[]{new Help()};
String token;
public Bot(String token) {
this.token = token;
}
public void start() {
JDABuilder jdaBuilder = JDABuilder.createDefault(token);
jdaBuilder.addEventListeners(listenerAdapters);
jdaBuilder.setActivity(Activity.watching("1!help"));
try {
JDA jda = jdaBuilder.build();
jda.awaitReady();
} catch (LoginException | InterruptedException e){
e.printStackTrace();
}
}
}
Bot2.java:
import commands2.*;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import javax.security.auth.login.LoginException;
public class Bot2 {
ListenerAdapter[] listenerAdapters = new ListenerAdapter[]{new Help2()};
String token;
public Bot2(String token) {
this.token = token;
}
public void start() {
JDABuilder jdaBuilder = JDABuilder.createDefault(token);
jdaBuilder.addEventListeners(listenerAdapters);
jdaBuilder.setActivity(Activity.watching("2!help"));
try {
JDA jda = jdaBuilder.build();
jda.awaitReady();
} catch (LoginException | InterruptedException e){
e.printStackTrace();
}
}
}
这个想法可行吗? (顺便说一句,我想办法是在intellij中运行它,然后两个机器人都可以工作)
答案 0 :(得分:0)
我只会向您展示如何进行“从一个机器人到另一个机器人的音频流传输”。
实施完全取决于您(以及您是要通过命令激活它还是希望机器人在启动时加入特定渠道等)
为了能够跳过这一部分,我将假定两个机器人都已经在其专用通道中。
在开始之前,您必须对现有代码进行一些更改,因为以后可能需要它们:
{
"cmake.sourceDirectory": "${workspaceFolder}/llvm",
"cmake.configureSettings": {
"LLVM_ENABLE_PROJECTS" : "mlir",
"LLVM_BUILD_EXAMPLES" : "ON",
"LLVM_TARGETS_TO_BUILD" : "X86;NVPTX;AMDGPU",
"CMAKE_BUILD_TYPE" : "Release",
"LLVM_ENABLE_ASSERTIONS" : "ON",
"CMAKE_C_COMPILER" : "clang",
"CMAKE_CXX_COMPILER" : "clang++",
"LLVM_ENABLE_LLD" : "ON",
"PYTHON_EXECUTABLE" : "python3",
}
}
我更改了代码,使其可以使用import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import javax.security.auth.login.LoginException;
public class Bot {
ListenerAdapter[] listenerAdapters= new ListenerAdapter[]{new Help()};
String token;
// this is new
JDA jda;
public Bot(String token) {
this.token = token;
}
public void start() {
JDABuilder jdaBuilder = JDABuilder.createDefault(token);
jdaBuilder.addEventListeners(listenerAdapters);
jdaBuilder.setActivity(Activity.watching("1!help"));
try {
// and this changed as well
this.jda = jdaBuilder.build();
jda.awaitReady();
} catch (LoginException | InterruptedException e){
e.printStackTrace();
}
}
}
通过JDA
访问Bot
实例。当然,这些更改也必须在Bot.jda
中进行。
进行更改后,您必须实现一种方法,使漫游器可以加入其专用语音通道,但这取决于您。
您基本上想要的是将一个机器人收到的音频插入到另一个机器人发出的音频中。
幸运的是,JDA提供了example关于如何让漫游器播放接收到的音频的信息。在其中,您可以找到类Bot2
。
EchoHandler
该课程基本上为您完成所有艰苦的工作。您可以输入public static class EchoHandler implements AudioSendHandler, AudioReceiveHandler
{
/*
All methods in this class are called by JDA threads when resources are available/ready for processing.
The receiver will be provided with the latest 20ms of PCM stereo audio
Note you can receive even while setting yourself to deafened!
The sender will provide 20ms of PCM stereo audio (pass-through) once requested by JDA
When audio is provided JDA will automatically set the bot to speaking!
*/
private final Queue<byte[]> queue = new ConcurrentLinkedQueue<>();
/* Receive Handling */
@Override // combine multiple user audio-streams into a single one
public boolean canReceiveCombined()
{
// limit queue to 10 entries, if that is exceeded we can not receive more until the send system catches up
return queue.size() < 10;
}
@Override
public void handleCombinedAudio(CombinedAudio combinedAudio)
{
// we only want to send data when a user actually sent something, otherwise we would just send silence
if (combinedAudio.getUsers().isEmpty())
return;
byte[] data = combinedAudio.getAudioData(1.0f); // volume at 100% = 1.0 (50% = 0.5 / 55% = 0.55)
queue.add(data);
}
/*
Disable per-user audio since we want to echo the entire channel and not specific users.
@Override // give audio separately for each user that is speaking
public boolean canReceiveUser()
{
// this is not useful if we want to echo the audio of the voice channel, thus disabled for this purpose
return false;
}
@Override
public void handleUserAudio(UserAudio userAudio) {} // per-user is not helpful in an echo system
*/
/* Send Handling */
@Override
public boolean canProvide()
{
// If we have something in our buffer we can provide it to the send system
return !queue.isEmpty();
}
@Override
public ByteBuffer provide20MsAudio()
{
// use what we have in our buffer to send audio as PCM
byte[] data = queue.poll();
return data == null ? null : ByteBuffer.wrap(data); // Wrap this in a java.nio.ByteBuffer
}
@Override
public boolean isOpus()
{
// since we send audio that is received from discord we don't have opus but PCM
return false;
}
}
并将其插入具有所需结果的AudioReceiveHandler
中。
现在只剩下要做的事情了。
您希望第二个机器人播放第一个机器人的音频,就像这样:
(注意:您必须从AudioSendHandler
和guild
的jda实例中获取guild2
和Bot
。)
Bot2