嘿,
我正在构建一个Discord机器人,以便使用Node进行一些练习。和不和谐。js。你可以用这个机器人来执行命令吗?音频,它将复制音频。
我想设置20秒后不播放任何东西的机器人离开语音频道。我用函数setTimeout()做到了,但是当我想听另一个音频时,机器人会在音频结束前离开频道。
问题是obv setTimeout(),但idk如何修复它。
这是我的密码。
execute(message, args, CanaleVocale, AudioFiles) {
let inactive
let name = args[1] + ".mp3";
console.log("[Command] ?audio " + message.author.id)
if (!CanaleVocale) {
message.channel.send("Il Koala e' confuso, non ti vede in nessun canale vocale :( ")
console.log(`[Voice] The user ${message.author.id} isn't in a voice channel` )
} else {
if (AudioFiles.includes(name)) {
CanaleVocale.join()
.then(connection => {
clearTimeout(inactive)
inactive = undefined
connection.voice.setSelfDeaf(true);
connection.play(`./audio/${name}`)
console.log(`[Voice] Played the sound ${name} for the user ${message.author} `)
inactive = setTimeout(function(){
CanaleVocale.leave()
console.log(`[Voice] Left from the channel of ${message.author.id}`)
message.channel.send("Il Koala e' annoiato e quindi esce dalla chat vocale")
}, 20*1000)
})
} else {
message.channel.send(`L'audio ${name} non esiste!`)
console.log(`[Voice] The user ${message.author} tried to play ${name} but it doesn't exist!`)
}
}
}
}
如果你需要整个项目,它被上传到GitHub上,“KoalaBot”by EnderF5027(可能代码很丑,我在学习,如果你愿意,你可以给我一些建议: D)
有人能帮我吗?非常感谢。
例如,我附上我的代码
我处理的不是文件库,而是带有ytdl的youtube<因此,问题可能会有所不同。
我处理加入的渠道与Map()
Object.
// message.guild.id = '1234567812345678'
const queue = new Map();
// 1. set new queue
const queueContruct = {
textChannel: message.channel,
voiceChannel: voiceChannel,
connection: null,
songs: [],
search: [],
volume: 5,
playing: true,
leaveTimer: null /* 20 seconds in question */
};
queue.set('1234567812345678', queueContruct);
// 2. get queueContruct from queue
const serverQueue = queue.get('1234567812345678');
if(!serverQueue) { /* not exist */ }
// 3. delete from queue
queue.delete('1234567812345678');
当播放列表为空时,我用setTimeout
设置计时器,当新的播放列表进来时,用clearTimeout
取消设置。
下面是我的一段代码<我希望这会有帮助。
const Discord = require('discord.js');
const bot = new Discord.Client();
const queue = new Map();
const prefix = "?"; // this prefix is in Question.
bot.on("message", async message => {
// if direct-message received, message.guild could be null
// Not handle that case.
const serverQueue = queue.get(message.guild.id);
if(message.content.startsWith(`${prefix}audio`)) {
execute(message, serverQueue);
}
});
// I assume user message is "?audio audioName"
function execute(message, serverQueue) {
const audioName = message.content.split(' ')[1]; // "audioName"
// check user who send message is in voiceChannel
const voiceChannel = message.member.voice.channel;
if(!voiceChannel) {
return message.channel.send("YOU ARE NOT IN VOICE CHANNEL");
}
// check permission
const permissions = voiceChannel.permissionsFor(message.client.user);
if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) {
return message.channel.send("PERMISSION ERROR");
}
/*
I handle only songs with google youtube api
So, I skip how to get & push song information
*/
if(!serverQueue) {
// create new serverQueue
const queueContruct = {
textChannel: message.channel,
voiceChannel: voiceChannel,
connection: null,
songs: [],
search: [],
volume: 5,
playing: true
};
queue.set(message.guild.id, queueContruct);
// "song" value is one of play list in my case
// var song = {title: 'audioName', url: 'youtube-url'};
queueContruct.songs.push(song);
try {
var connection = await voiceChannel.join();
queueContruct.connection = connection;
playStart(message.guild, queueContruct.songs[0]);
} catch (err) {
queue.delete(message.guild.id);
return message.channel.send(err);
}
}
else { // exist serverQueue
// "song" value is one of play list in my case
// var song = {title: 'audioName', url: 'youtube-url'};
serverQueue.songs.push(song);
if(serverQueue.songs.length == 1) {
playStart(message.guild, serverQueue.songs[0]);
}
}
}
function play(guild, song) {
const serverQueue = queue.get(guild.id);
if(!song) {
if(serverQueue.songs.length == 0) {
serverQueue.leaveTimer = setTimeout(function() {
leave_with_timeout(guild.id);
}, 20 * 1000); // 20 seconds is for follow question
}
return;
}
// clear timer before set
try {
clearTimeout(serverQueue.leaveTimer);
} catch(e) {
// there's no leaveTimer
}
const dispatcher = serverQueue.connection
.play(ytdl(song.url))
.on('finish', () => {
serverQueue.songs.shift(); // pop front
play(guild, serverQueue.songs[0]); // play next
})
.on('error' error => console.log(error));
dispatcher.setVolumeLogarithmic( 1 );
serverQueue.textChannel.send(`Play Start ${song.title}`);
}
function leave_with_timeout(guild_id) {
const serverQueue = queue.get(guild_id);
if(serverQueue) {
serverQueue.textChannel.send(`20 seconds left. Bye!`);
serverQueue.voiceChannel.leave();
queue.delete(guild_id);
}
}
我想添加一个事件,如果用户在歌曲仍在播放时离开,我的音乐机器人会立即离开语音频道。如果频道中有多个用户,机器人当然应该留在频道中。我只有一种方法,但需要帮助。我会尝试以下操作: 但不知怎么的,这似乎不起作用。我知道事实上,有一个类似的职位,但这并不适用于我太多,因为我定义了一些不同的事情。 我的第二次尝试是: (也不起作用。) 定义:我现在以不同的方式构建函数: 这是一个完全不同的计数。我试图做的
我正在为我的discord服务器构建一个机器人来播放YouTube视频,因为我还没有在网上找到一个可靠的机器人。 在我输入后,机器人会连接到我的语音频道!播放{url}命令,但即使url有效,也会立即离开。 我的代码如下: 我尝试过在我的PC上使用一个硬编码的文件,但我得到了相同的结果,机器人一连接就离开了语音通道。 我确实通过在cmd窗口中运行命令来验证ffmpeg和youtube-dl是否正常
我在挑拨离间。v12上的js Bot,包括一个静音命令,用于静音您所在的整个语音频道。问题是当有人离开频道时,他们保持沉默。我正试图用一个简单的事件来解除此人的静音,但我不理解和和。我搜索了很多,但我只能找到一个适合加入风投的,而不是离开风投的。以下是我到目前为止得到的信息: 静音命令: 取消静音事件: 谢谢你花时间帮助我!:)
我目前正在做一个项目,我希望一个图像在3秒钟后弹出。一旦图像弹出,用户必须点击图像,使一个“完成”的图像弹出,该图像将在3秒钟后自动消失。 除了消失的那部分,我的大部分都在工作。有人知道我怎么能在3秒钟后让图像消失吗?
我无法使用exoplayer2.2离线播放歌曲。 这是我的密码。 我得到以下错误。 谁能帮忙吗。
我用Java(Discord JDA)制作了一个Discord音乐机器人,我一直试图让机器人在一段时间后(例如1分钟)离开一个语音通道,但我真的很挣扎。有什么帮助吗?