You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js v12 如何为指定消息的第二个反应者添加新建频道查看权限

实现方案

你需要先建立「触发反应的消息ID」和「对应创建的频道ID」的映射关系,用来在第二个用户触发反应时快速找到对应频道修改权限,具体实现逻辑和示例代码如下:


核心逻辑说明

  1. 用临时存储(测试用Map即可,需要持久化可搭配数据库)绑定触发消息和创建的频道
  2. 监听反应添加事件时判断当前反应点击人数:
    • 第一次点击:正常创建频道,给第一个用户添加查看权限,同时保存消息和频道的映射关系
    • 第二次点击:根据映射找到对应频道,给第二个用户追加查看权限

完整示例代码

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:06:01