当前位置: 首页 > 知识库问答 >
问题:

Discord Bot在X秒后与Discord一起离开VC。js

岳玉堂
2023-03-14

嘿,

我正在构建一个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)

有人能帮我吗?非常感谢。

共有1个答案

屠锐
2023-03-14

例如,我附上我的代码
我处理的不是文件库,而是带有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分钟)离开一个语音通道,但我真的很挣扎。有什么帮助吗?