如何用Discord.js检测用户被谁移出语音频道并实现报复功能
使用Discord.js实现检测语音频道移除并执行报复的方案
完全可以实现你想要的功能,核心是通过监听成员状态更新事件,结合审计日志识别操作发起者,再执行对应的报复逻辑,具体步骤如下:
1. 监听成员语音频道变更事件
利用Discord.js的guildMemberUpdate事件,对比成员更新前后的语音频道状态。当指定用户从某个语音频道变为不在任何频道时,触发后续的操作者识别逻辑:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildVoiceStates ] }); // 替换成你要监控的用户ID const TARGET_USER_ID = '你的用户ID'; client.on('guildMemberUpdate', (oldMember, newMember) => { // 检查是否是目标用户,且确实被移出了语音频道 if (newMember.id === TARGET_USER_ID && oldMember.voice.channel && !newMember.voice.channel) { getRemovalOperator(newMember.guild, oldMember.id) .then(operator => { if (operator) { performRetaliation(operator); } }) .catch(err => console.error('获取操作者信息失败:', err)); } });
2. 从审计日志识别操作发起者
用户被移出语音频道属于公会管理操作,会被记录在审计日志中。通过fetchAuditLogs方法筛选对应条目,提取执行者:
async function getRemovalOperator(guild, targetUserId) { // 获取最近的成员更新类审计日志 const auditLogs = await guild.fetchAuditLogs({ type: 'MEMBER_UPDATE', limit: 10 }); // 筛选出针对目标用户、涉及语音频道移除的日志条目 const relevantLog = auditLogs.entries.find(entry => { return entry.target.id === targetUserId && entry.changes.some(change => { return change.key === 'voice_channel_id' && change.new === null; }); }); return relevantLog?.executor; }
3. 实现报复逻辑
根据需求编写报复操作,比如将操作者移出当前语音频道(需机器人拥有MoveMembers权限):
function performRetaliation(operator) { if (operator.voice.channel) { operator.voice.disconnect() .then(() => console.log(`已对操作者 ${operator.tag} 执行报复`)) .catch(err => console.error('报复操作失败:', err)); } else { console.log('操作者不在语音频道,无法执行报复'); } } // 记得登录机器人 client.login('你的机器人Token');
关键注意事项
- 必须在Discord开发者后台开启
GuildMembers和GuildVoiceStates意图,否则无法监听相关事件。 - 机器人需要具备对应的权限:比如执行移出操作需要
MoveMembers权限,禁言需要ManageRoles权限等。 - 避免过度使用报复功能,违反Discord服务条款可能导致机器人账号被封禁。
内容的提问来源于stack exchange,提问作者BenJ
相关产品推荐
相关产品推荐

