The problem with connecting two bots.

I'm developing a functionality to relay a message from one source to multiple Discord channels simultaneously. I need to use commands from one bot to redirect the connection for another bot. Currently, it's not working as expected: When bot A is called --> Bot A joins the channel. When bot B is subsequently called --> Bot A joins the channel again (and vice versa). I would be extremely grateful for any assistance because this issue is now causing all the work to come to a halt.
2 Replies
d.js toolkit
d.js toolkit17mo ago
- What's your exact discord.js npm list discord.js and node node -v version? - Not a discord.js issue? Check out #other-js-ts. - Consider reading #how-to-get-help to improve your question! - Explain what exactly your issue is. - Post the full error stack trace, not just the top part! - Show your code! - Issue solved? Press the button!
mireg
miregOP17mo ago
Code MAIN:
let mainBotConnections = new Map();

mainBot.on('interactionCreate', async (interaction) => {
const { commandName, options } = interaction;

if (commandName === 'join-main-bot') {
const userVoiceChannelId = interaction.member?.voice?.channelId;

if (!userVoiceChannelId) {
return interaction.reply('Вы должны находиться в голосовом канале, чтобы бот мог присоединиться.');
}

const isAdmin = interaction.member.permissions.has('ADMINISTRATOR');

if (!isAdmin) {
return interaction.reply('У вас недостаточно прав для использования этой команды.');
}

try {
const connectionMain = joinVoiceChannel({
channelId: userVoiceChannelId,
guildId: interaction.guildId,
adapterCreator: interaction.guild.voiceAdapterCreator,
});

const audioPlayerMain = createAudioPlayer();
mainBotConnections.set(interaction.guildId, { connection: connectionMain, audioPlayer: audioPlayerMain });

connectionMain.subscribe(audioPlayerMain);

audioPlayerMain.on(AudioPlayerStatus.Playing, () => {
console.log('[MAIN] Воспроизведение началось.');
});

audioPlayerMain.on(AudioPlayerStatus.Idle, () => {
playNextAudio();
});

audioPlayerMain.on('error', error => {
console.error("[Ошибка]", error);
});

connectionMain.on('error', (error) => {
console.error('Произошла ошибка в голосовом соединении:', error);
});

interaction.reply('Основной бот присоединился к вашему голосовому каналу!');

} catch (error) {
interaction.reply('Произошла ошибка при присоединении основного бота к голосовому каналу: ' + error.message);
}
}
let mainBotConnections = new Map();

mainBot.on('interactionCreate', async (interaction) => {
const { commandName, options } = interaction;

if (commandName === 'join-main-bot') {
const userVoiceChannelId = interaction.member?.voice?.channelId;

if (!userVoiceChannelId) {
return interaction.reply('Вы должны находиться в голосовом канале, чтобы бот мог присоединиться.');
}

const isAdmin = interaction.member.permissions.has('ADMINISTRATOR');

if (!isAdmin) {
return interaction.reply('У вас недостаточно прав для использования этой команды.');
}

try {
const connectionMain = joinVoiceChannel({
channelId: userVoiceChannelId,
guildId: interaction.guildId,
adapterCreator: interaction.guild.voiceAdapterCreator,
});

const audioPlayerMain = createAudioPlayer();
mainBotConnections.set(interaction.guildId, { connection: connectionMain, audioPlayer: audioPlayerMain });

connectionMain.subscribe(audioPlayerMain);

audioPlayerMain.on(AudioPlayerStatus.Playing, () => {
console.log('[MAIN] Воспроизведение началось.');
});

audioPlayerMain.on(AudioPlayerStatus.Idle, () => {
playNextAudio();
});

audioPlayerMain.on('error', error => {
console.error("[Ошибка]", error);
});

connectionMain.on('error', (error) => {
console.error('Произошла ошибка в голосовом соединении:', error);
});

interaction.reply('Основной бот присоединился к вашему голосовому каналу!');

} catch (error) {
interaction.reply('Произошла ошибка при присоединении основного бота к голосовому каналу: ' + error.message);
}
}
if (commandName === 'join-second-bot') {
const userVoiceChannelId = interaction.member?.voice?.channelId;
const guildId = interaction.guildId;

if (!userVoiceChannelId) {
return interaction.reply('Вы должны находиться в голосовом канале, чтобы бот мог присоединиться.');
}

const isAdmin = interaction.member.permissions.has('ADMINISTRATOR');

if (!isAdmin) {
return interaction.reply('У вас недостаточно прав для использования этой команды.');
}

try {
secondBot.joinSecondBotToVoice(userVoiceChannelId, guildId);
interaction.reply('Второй бот присоединился к вашему голосовому каналу!');
} catch (error) {
interaction.reply('Произошла ошибка при присоединении второго бота к голосовому каналу: ' + error.message);
}
}
});
if (commandName === 'join-second-bot') {
const userVoiceChannelId = interaction.member?.voice?.channelId;
const guildId = interaction.guildId;

if (!userVoiceChannelId) {
return interaction.reply('Вы должны находиться в голосовом канале, чтобы бот мог присоединиться.');
}

const isAdmin = interaction.member.permissions.has('ADMINISTRATOR');

if (!isAdmin) {
return interaction.reply('У вас недостаточно прав для использования этой команды.');
}

try {
secondBot.joinSecondBotToVoice(userVoiceChannelId, guildId);
interaction.reply('Второй бот присоединился к вашему голосовому каналу!');
} catch (error) {
interaction.reply('Произошла ошибка при присоединении второго бота к голосовому каналу: ' + error.message);
}
}
});
Second bot:
const secondBot = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.DirectMessages,
GatewayIntentBits.MessageContent,
],
});

secondBot.once('ready', () => {
console.log('Второй бот запущен!');
});

let secondBotConnections = new Map();

const joinSecondBotToVoice = async (channelId, guildId) => {
try {
const userVoiceChannelId = channelId;
const adapterCreator = secondBot.guilds.cache.get(guildId).voiceAdapterCreator;

const connectionSecond = joinVoiceChannel({
channelId: userVoiceChannelId,
guildId: guildId,
adapterCreator: adapterCreator,
});


// Создаем новый экземпляр audioPlayer для второго бота
const audioPlayerSecond = createAudioPlayer();
secondBotConnections.set(guildId, { connection: connectionSecond, audioPlayer: audioPlayerSecond });

connectionSecond.subscribe(audioPlayerSecond);

audioPlayerSecond.on(AudioPlayerStatus.Playing, () => {
console.log('[SECOND] Воспроизведение началось.');
});

audioPlayerSecond.on(AudioPlayerStatus.Idle, () => {
playNextAudio();
});

audioPlayerSecond.on('error', error => {
console.error("[SECOND Ошибка]", error);
});

connectionSecond.on('error', (error) => {
console.error('Произошла ошибка в голосовом соединении второго бота:', error);
});

console.log('Второй бот присоединился к вашему голосовому каналу!');

} catch (error) {
console.log('Произошла ошибка при присоединении второго бота к голосовому каналу: ' + error.message);
}
};
const secondBot = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.DirectMessages,
GatewayIntentBits.MessageContent,
],
});

secondBot.once('ready', () => {
console.log('Второй бот запущен!');
});

let secondBotConnections = new Map();

const joinSecondBotToVoice = async (channelId, guildId) => {
try {
const userVoiceChannelId = channelId;
const adapterCreator = secondBot.guilds.cache.get(guildId).voiceAdapterCreator;

const connectionSecond = joinVoiceChannel({
channelId: userVoiceChannelId,
guildId: guildId,
adapterCreator: adapterCreator,
});


// Создаем новый экземпляр audioPlayer для второго бота
const audioPlayerSecond = createAudioPlayer();
secondBotConnections.set(guildId, { connection: connectionSecond, audioPlayer: audioPlayerSecond });

connectionSecond.subscribe(audioPlayerSecond);

audioPlayerSecond.on(AudioPlayerStatus.Playing, () => {
console.log('[SECOND] Воспроизведение началось.');
});

audioPlayerSecond.on(AudioPlayerStatus.Idle, () => {
playNextAudio();
});

audioPlayerSecond.on('error', error => {
console.error("[SECOND Ошибка]", error);
});

connectionSecond.on('error', (error) => {
console.error('Произошла ошибка в голосовом соединении второго бота:', error);
});

console.log('Второй бот присоединился к вашему голосовому каналу!');

} catch (error) {
console.log('Произошла ошибка при присоединении второго бота к голосовому каналу: ' + error.message);
}
};
Deps:
{
"dependencies": {
"@discordjs/opus": "^0.9.0",
"@discordjs/voice": "^0.16.0",
"cookie-parser": "^1.4.6",
"discord.js": "^14.11.0",
"ejs": "^3.1.9",
"express": "^4.18.2",
"express-session": "^1.17.3",
"lamejs": "^1.2.1",
"node-lame": "^1.3.2",
"opusscript": "^0.0.8",
"unirest": "^0.6.0",
"ws": "^8.13.0"
}
}
{
"dependencies": {
"@discordjs/opus": "^0.9.0",
"@discordjs/voice": "^0.16.0",
"cookie-parser": "^1.4.6",
"discord.js": "^14.11.0",
"ejs": "^3.1.9",
"express": "^4.18.2",
"express-session": "^1.17.3",
"lamejs": "^1.2.1",
"node-lame": "^1.3.2",
"opusscript": "^0.0.8",
"unirest": "^0.6.0",
"ws": "^8.13.0"
}
}
Oh... Really... Thx
Want results from more Discord servers?
Add your server