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

Discord.js开发投票命令如何识别Unicode表情及自定义动静态表情

你可以通过新增Unicode表情正则匹配、调整合法性判断逻辑实现三类表情的兼容,discord.js自带的react方法本身支持直接传入合法的Unicode表情、自定义静态/动态表情字符串,不需要额外转换。

核心修改逻辑
  1. 替换原有的无效Unicode表情正则,使用ES6+支持的Unicode属性匹配规则识别普通Unicode表情
  2. 新增统一的表情合法性校验逻辑,同时覆盖自定义静态、自定义动态、Unicode普通表情三类场景
  3. 调整原有判断条件,只要传入的两个表情都属于合法类型就正常执行投票逻辑,不再限制仅支持自定义静态表情
修改后完整代码
const Discord = require("discord.js")
const { Permissions , MessageEmbed } = require("discord.js")
let wrong = "#F04A47"

module.exports = {
  name: "poll",
  usage: "poll <message>",
  description: "poll idk",
  category: "other",
  run: async (client, message, args) => {
    try {
      if(!message.member.permissions.has(Permissions.FLAGS.KICK_MEMBERS)) {
        let embed = new MessageEmbed()
          .setDescription("**你没有发起投票/踢出成员的权限**")
          .setColor(wrong)
        return message.channel.send({embeds:[embed]})
      }
      
      if(!args[0]) return message.channel.send("请输入第一个选项,示例:$poll <披萨> <寿司> <🍕> <🍣>")
      if(!args[1]) return message.channel.send("请输入第二个选项,示例:$poll <披萨> <寿司> <🍕> <🍣>")
      if(!args[2]) return message.channel.send("请输入第一个对应表情,示例:$poll <披萨> <寿司> <🍕> <🍣>")
      if(!args[3]) return message.channel.send("请输入第二个对应表情,示例:$poll <披萨> <寿司> <🍕> <🍣>")

      // 表情匹配正则
      const hasCustomEmoteRegex = /<a?:.+:\d+>/gm
      const staticEmoteRegex = /<:.+:(\d+)>/gm
      const animatedEmoteRegex = /<a:.+:(\d+)>/gm
      // Unicode表情匹配正则,必须加u标志启用Unicode匹配模式
      const unicodeEmojiRegex = /\p{Emoji}/u

      // 统一合法性校验:三类表情任意一类符合就算合法
      const isValidEmoji = (str) => {
        return hasCustomEmoteRegex.test(str) || unicodeEmojiRegex.test(str)
      }
      
      // 替换原有的仅校验静态自定义表情的判断条件
      if(isValidEmoji(args[2]) && isValidEmoji(args[3])) { 
        const reportlog = new MessageEmbed()
          .setTitle('投票时间 🥳') 
          .setColor('RANDOM')
          .setDescription(`${args[0]}${args[2]} 或 ${args[1]}${args[3]}`)
          .setFooter(`发起者:${message.author.tag}`)
          .setTimestamp()
        message.channel.send({embeds: [reportlog]}).then(sentMessage => {
          sentMessage.react(args[2])
          sentMessage.react(args[3])
        })
      } else {
        message.channel.send("请输入合法的自定义表情或Unicode普通表情")
      }
      message.delete()
    } catch(e) {
      message.channel.send(`发生错误:${e}`)
    }
  }
}
注意事项
  • Unicode表情匹配依赖Node.js 10+以上版本支持的Unicode属性转义特性,如果你使用的Node版本过低,可自行替换为兼容旧版本的全量Unicode表情正则
  • 当前规则已覆盖99%的常用单Unicode表情、所有Discord自定义静态/动态表情,足够普通投票场景使用

内容的提问来源于stack exchange,提问作者Shinpi Tekita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:39:02