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() 不是函数

Discord.js Discord Bot:SyntaxError:输入意外结束

需要帮助将 Bot 更新到 Discord.js v12