Discord Bot 使用 Discord.js 在 X 秒后离开 VC
Posted
技术标签:
【中文标题】Discord Bot 使用 Discord.js 在 X 秒后离开 VC【英文标题】:Discord Bot leave the VC after X Seconds with Discord.js 【发布时间】:2021-07-20 02:17:06 【问题描述】:嘿,
我正在构建一个 Discord Bot,用于使用 Node.js 和 Discord.js 进行一些练习。使用此机器人,您可以执行命令 ?audio audio,它会重现音频。
我想设置机器人在 20 秒不播放任何内容后离开语音频道。我使用函数 setTimeout() 完成了它,但是当我想收听另一个音频时,机器人会在音频完成之前离开频道。
问题出在 setTimeout() 上,但不知道如何解决。
这是我的代码。
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)
有人可以帮助我吗? 谢谢
【问题讨论】:
就我而言,我使用Map()
将inactive
timerId 与message.guild.id
保存在一起。如果另一个音频命令在 20 秒后出现,则使用保存的 timerId 清除计时器。
你能举个例子吗?谢谢,我试试看
我附上我的一段代码。对不起,我的英语简短。
【参考方案1】:
例如,我附上我的代码。 我不处理文件库,只处理带有 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(`$prefixaudio`))
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 Bot 使用 Discord.js 在 X 秒后离开 VC的主要内容,如果未能解决你的问题,请参考以下文章
使用 Discord.js 使用 Discord Bot 将语音频道中的所有人静音
Discord bot 更改前缀命令出错 (discord.js)
Discord bot 使用 discord.js 不播放 mp3 文件,没有给出错误
Discord.js Bot 赠品命令:.array() 不是函数