尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Discord Player语音状态处理:Bot如何在无人时自动离开频道?3种自定义方案

Discord Player语音状态处理:Bot如何在无人时自动离开频道?3种自定义方案 Discord Player语音状态处理Bot如何在无人时自动离开频道3种自定义方案【免费下载链接】discord-player Complete framework to simplify the implementation of music commands using discord.js v14项目地址: https://gitcode.com/gh_mirrors/di/discord-playerDiscord Player是一套基于 Discord.js v14 的完整音乐 Bot 开发框架内置语音状态监听机制当音乐频道里最后一个用户离开时Bot 会自动感知空频道并择机退出避免僵死在语音频道里浪费资源。本文带你搞懂它的默认行为并给出 3 种自定义方案轻松掌控何时走、怎么走。 默认逻辑揭秘Bot 为什么知道没人了Discord Player 在初始化 Player 时会监听客户端的voiceStateUpdate事件见 Player.ts每次有人进出语音频道都会交给默认处理函数 DefaultVoiceStateHandler.ts 处理。核心判断链如下监听成员离开任何成员离开频道时触发处理逻辑判断频道是否真空Util.isVoiceEmpty()统计频道内非 Bot 成员数量归零才算空Bot 自己不算人启动离开倒计时根据leaveOnEmptyCooldown设定等待时长倒计时结束仍无人执行queue.delete()断开连接、释放队列并派发EmptyChannel事件。 妙处在于倒计时设计如果用户在冷却期内重新进频道会触发ChannelPopulate事件并取消离开计划避免了人刚走 Bot 就退、人刚回又重连的尴尬。关键行为由以下队列选项控制默认值见 GuildNodeManager.ts选项默认值作用leaveOnEmptytrue频道无人时是否自动离开leaveOnEmptyCooldown0毫秒离开前的等待冷却时间pauseOnEmptyfalse频道变空时是否暂停播放leaveOnEnd/leaveOnStoptrue队列播完 / 用户停止后是否离开此外默认逻辑还会处理两个细节Bot 被管理员静音时自动暂停在舞台频道被禁言时自动暂停并请求发言权限。 方案一通过 nodeOptions 调整离开策略最简单大多数场景只需在player.play()时传入nodeOptions即可无需写一行处理逻辑await player.play(interaction.member.voice.channel, query, { nodeOptions: { leaveOnEmpty: true, // 无人时离开频道 leaveOnEmptyCooldown: 300000, // 等待 5 分钟再走给别人反应时间 leaveOnStop: true, // 用户停止播放后离开 leaveOnEndCooldown: 15000 // 队列播完后等 15 秒 } }); 适用场景想让 Bot多留一会儿比如大服务器里成员进出不频繁5 分钟冷却能覆盖绝大多数中途离开的情况。完整选项列表见 GuildNodeCreateOptions 类型定义。⏸️ 方案二pauseOnEmpty —— 不离开只暂停对于 24 小时电台、社区常驻音乐 Bot人走了音乐停、人回来音乐续比直接断开更优雅。只需开启pauseOnEmptyawait player.play(channel, query, { nodeOptions: { pauseOnEmpty: true, // 频道变空 → 自动暂停 leaveOnEmpty: false // 关闭自动离开 } });默认处理函数内部会自动完成空则暂停、满则恢复的双向切换见 DefaultVoiceStateHandler.ts 中的handlePauseOnEmpty用户回来时音乐无缝续播连接不中断、状态不丢失。️ 方案三完全接管语音状态处理最灵活需要自定义复杂逻辑如空频道 30 秒内无人、且当前不是付费用户的电台时段才离开Discord Player 提供了两层接管方式① 完全替换默认处理器player.onVoiceStateUpdate((player, queue, oldState, newState) { // 在这里写你自己的空频道判断、离开/暂停逻辑 // 例如检查成员权限、读取频道人数、按时间段策略决定行为 });② 订阅事件 锁定默认行为监听队列的voiceStateUpdate事件事件签名定义见 GuildQueue.ts时消费该事件会自动停用默认处理器让你自由决策而如果你只想在默认逻辑之外搭车处理可以调用player.lockVoiceStateHandler()锁定默认行为之后随时用unlockVoiceStateHandler()解除。 使用 Eris / Oceanic 等兼容模式时框架无法直接订阅底层事件需手动转发语音状态client.on(voiceStateUpdate, (oldState, newState) { player.handleVoiceState(oldState, newState); }); 相关文件速查默认语音状态处理逻辑packages/discord-player/src/DefaultVoiceStateHandler.ts事件监听与处理器切换onVoiceStateUpdate/lockVoiceStateHandler/handleVoiceStatepackages/discord-player/src/Player.ts队列行为选项与默认值packages/discord-player/src/queue/GuildNodeManager.ts空频道事件定义EmptyChannel/ChannelPopulate/Disconnectpackages/discord-player/src/queue/GuildQueue.ts空频道判断工具方法isVoiceEmptypackages/discord-player/src/utils/Util.ts 总结需求推荐方案简单控制离开时机方案一nodeOptions配置常驻电台、音乐不断方案二pauseOnEmpty复杂策略权限/时段/条件组合方案三自定义voiceStateUpdate处理器三种方案由浅入深覆盖 Discord 音乐 Bot 语音状态管理的全部常见需求。掌握leaveOnEmpty、pauseOnEmpty与事件接管这三个核心机制你的 Bot 就能像识趣的听众一样在正确的时间优雅退场。【免费下载链接】discord-player Complete framework to simplify the implementation of music commands using discord.js v14项目地址: https://gitcode.com/gh_mirrors/di/discord-player创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表