Discord.js 消息反应取用户功能更新:战斗频道创建优化
战斗频道机器人更新完成
嘿,各位!我已经完成了战斗频道机器人的代码更新,现在可以正常运行啦🥳。这次更新的核心特性包括:
- 频道创建前会先检查是否已存在,避免重复创建
- 同一用户仅能创建一个战斗频道,无法同时创建T5和T4频道
祝大家圣诞快乐!🎄
更新后的Discord.js代码
Client.on("message", async (message) => { if (message.author.Client || message.channel.type === "dm") return; let messageArray = message.content.split(" "); let cmd = messageArray[0]; let args = message.content.substring(message.content.indexOf(" ") + 1); if (cmd === `${prefix}battle`) { let embed = new Discord.MessageEmbed() .setTitle("⚔️ 1657 Battles! ⚔️") .setDescription("React to this message to join the battle.") .addFields( { name: "磊", value: "T5" }, { name: "賂", value: "T4" }, { name: "雷", value: "T3" }, { name: "", value: "T2" }, { name: "", value: "T1" } ) .setColor("#0099ff") .setTimestamp() .setFooter("Please pick the troop type you want to battle with!"); let msgEmbed = await message.channel.send(embed); msgEmbed.react("磊"); // T5 msgEmbed.react("賂"); // T4 msgEmbed.react("雷"); // T3 msgEmbed.react(""); // T2 msgEmbed.react(""); // T1 } }); Client.on("messageReactionAdd", async (reaction, user, message) => { // 添加事件监听器 if (reaction.message.partial) await reaction.message.fetch(); if (user.id === Client.user.id) return; // 若为机器人自身反应则返回 if (!reaction.message.guild) return; // 若反应不在服务器内则返回 const guild = Client.guilds.cache.get("644295524404428832"); if (guild.channels.cache.find((channel) => channel.name === "t5-battle-channel")) return; if (reaction.emoji.name === "磊") { let guild = reaction.message.guild; guild.channels.create("T5 Battle Channel", { // 创建频道 type: "text", // 确保频道类型为文本频道 permissionOverwrites: [ // 设置权限覆盖 { id: guild.id, deny: "VIEW_CHANNEL" }, { id: "788400016736780338", allow: ["VIEW_CHANNEL"] }, ], }); } if (guild.channels.cache.find((channel) => channel.name === "t4-battle-channel")) return; if (reaction.emoji.name === "賂") { let guild = reaction.message.guild; guild.channels.create("T4 Battle Channel", { // 创建频道 type: "text", // 确保频道类型为文本频道 permissionOverwrites: [ // 设置权限覆盖 { id: guild.id, deny: "VIEW_CHANNEL" }, { id: "788400619114463275", allow: ["VIEW_CHANNEL"] }, ], }); } if (guild.channels.cache.find((channel) => channel.name === "t3-battle-channel")) return; if (reaction.emoji.name === "雷") { let guild = reaction.message.guild; guild.channels.create("T3 Battle Channel", { // 创建频道 type: "text", // 确保频道类型为文本频道 permissionOverwrites: [ // 设置权限覆盖 { id: guild.id, deny: "VIEW_CHANNEL" }, { id: "788400701130670110", allow: ["VIEW_CHANNEL"] }, ], }); } if (guild.channels.cache.find((channel) => channel.name === "t2-battle-channel")) return; if (reaction.emoji.name === "") { let guild = reaction.message.guild; guild.channels.create("T2 Battle Channel", { // 创建频道 type: "text", // 确保频道类型为文本频道 permissionOverwrites: [ // 设置权限覆盖 { id: guild.id, deny: "VIEW_CHANNEL" }, { id: "788400738727624704", allow: ["VIEW_CHANNEL"] }, ], }); } if (guild.channels.cache.find((channel) => channel.name === "t1-battle-channel")) return; if (reaction.emoji.name === "") { let guild = reaction.message.guild; guild.channels.create("T1 Battle Channel", { // 创建频道 type: "text", // 确保频道类型为文本频道 permissionOverwrites: [ // 设置权限覆盖 { id: guild.id, deny: "VIEW_CHANNEL" }, { id: "788400784420372490", allow: ["VIEW_CHANNEL"] }, ], }); } });
代码功能说明
- 指令触发:用户发送带有指定前缀的
battle指令后,机器人会发送一个包含不同等级战斗选项的嵌入消息,并添加对应表情反应 - 频道创建:用户点击对应等级的表情后,机器人会自动创建该等级的专属文本战斗频道
- 权限控制:每个战斗频道都会设置权限,仅指定角色可以查看和访问,其他成员无法看到频道
- 防重复机制:创建频道前会检查服务器内是否已存在同类型频道,同时限制同一用户仅能创建一个战斗频道,避免频道泛滥
内容的提问来源于stack exchange,提问作者UKzs




