discord.js v12下拉菜单角色系统无法分配多角色问题求助
修复方案
问题原因
- 代码仅处理
menu.values数组的第一项menu.values[0],未遍历全部选中的选项 - 每个角色处理逻辑结束后都调用了
return,直接终止了整个事件函数执行,剩余选中项不会被处理 - 重复的条件判断逻辑冗余,后续新增/修改角色配置成本高
优化后可支持多选的代码
// 先定义角色配置映射表,后续修改角色直接改这个表即可 const roleConfig = { quote_pings: { id: "809011668465745940", name: "quote pings" }, economy_pings: { id: "809354393413222431", name: "economy pings" }, server_pings: { id: "772763475973242900", name: "server pings" }, event_pings: { id: "828575560137572402", name: "event pings" }, movie_pings: { id: "828575746845835305", name: "movie pings" }, chat_pings: { id: "872241962588201031", name: "chat revive pings" } } client.on('clickMenu', async menu => { const replyMsgs = [] const member = menu.clicker.member // 遍历所有用户选中的选项 for (const selectedValue of menu.values) { const roleInfo = roleConfig[selectedValue] // 不在配置表内的选项直接跳过 if (!roleInfo) continue if (member.roles.cache.has(roleInfo.id)) { await member.roles.remove(roleInfo.id) replyMsgs.push(`I have removed you from the ${roleInfo.name} role.`) } else { await member.roles.add(roleInfo.id) replyMsgs.push(`I have given you the ${roleInfo.name} role!`) } } // 所有角色处理完后统一返回提示 if (replyMsgs.length) { await menu.reply.send(replyMsgs.join('\n'), true) } })
优化说明
- 用配置映射表统管所有角色的ID和显示名称,修改角色不需要调整业务逻辑
- 遍历所有选中的
menu.values元素,逐个处理角色增删逻辑 - 收集所有操作提示最后统一返回,避免提前
return终止逻辑 - 修复了原代码中server_pings、movie_pings分支提示文案错误的问题
内容的提问来源于stack exchange,提问作者Cmb
相关产品推荐
相关产品推荐

