Discord.js v12 如何为指定消息的第二个反应者添加新建频道查看权限
实现方案
你需要先建立「触发反应的消息ID」和「对应创建的频道ID」的映射关系,用来在第二个用户触发反应时快速找到对应频道修改权限,具体实现逻辑和示例代码如下:
核心逻辑说明
- 用临时存储(测试用Map即可,需要持久化可搭配数据库)绑定触发消息和创建的频道
- 监听反应添加事件时判断当前反应点击人数:
- 第一次点击:正常创建频道,给第一个用户添加查看权限,同时保存消息和频道的映射关系
- 第二次点击:根据映射找到对应频道,给第二个用户追加查看权限
完整示例代码
const { Client, IntentsBitField, PermissionsBitField } = require('discord.js'); const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.GuildMessageReactions, IntentsBitField.Flags.MessageContent ] }); // 消息-频道映射表:key为触发反应的消息ID,value为创建的频道ID const reactionToChannelMap = new Map(); // 替换为你要监听的触发消息ID const TARGET_MESSAGE_ID = '你的触发消息ID'; // 替换为你要放新建频道的父分类ID const CATEGORY_ID = '你的分类ID'; client.on('messageReactionAdd', async (reaction, user) => { // 过滤机器人触发的反应、非目标消息的反应 if (user.bot || reaction.message.id !== TARGET_MESSAGE_ID) return; const reactionCount = reaction.count; const guild = reaction.message.guild; // 第一次点击:创建频道 if (reactionCount === 1) { const newChannel = await guild.channels.create({ name: "Busfahrer", type: 0, // discord.js v14文本频道类型为0,v13版本请替换为"GUILD_TEXT" parent: CATEGORY_ID, permissionOverwrites: [ { id: guild.id, allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.EmbedLinks, PermissionsBitField.Flags.AttachFiles, PermissionsBitField.Flags.ReadMessageHistory], deny: [PermissionsBitField.Flags.ViewChannel], }, // 给第一个点击反应的用户加查看权限 { id: user.id, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ReadMessageHistory] } ] }); // 保存消息和频道的映射关系 reactionToChannelMap.set(reaction.message.id, newChannel.id); } // 第二次点击:给第二个用户追加权限 else if (reactionCount === 2) { const channelId = reactionToChannelMap.get(reaction.message.id); const targetChannel = guild.channels.cache.get(channelId); if (!targetChannel) return; // 修改频道权限,给第二个用户开放查看权限 await targetChannel.permissionOverwrites.edit(user.id, { ViewChannel: true, SendMessages: true, ReadMessageHistory: true }); // 可选:满2人后删除映射,避免后续其他人加反应重复处理 // reactionToChannelMap.delete(reaction.message.id); } }); client.login('你的机器人Token');
注意事项
- 若使用discord.js v13版本,权限枚举可以直接写字符串,例如
"VIEW_CHANNEL" - 请确保机器人已经开通「管理频道」「管理权限」的服务器权限,否则无法创建频道和修改权限
- 重启后需要保留映射关系的话,可以把Map数据存储到本地JSON文件或者SQLite等轻量数据库中
内容的提问来源于stack exchange,提问作者emirate.
相关产品推荐
相关产品推荐

