Discord.js开发投票命令如何识别Unicode表情及自定义动静态表情
你可以通过新增Unicode表情正则匹配、调整合法性判断逻辑实现三类表情的兼容,discord.js自带的react方法本身支持直接传入合法的Unicode表情、自定义静态/动态表情字符串,不需要额外转换。
核心修改逻辑
- 替换原有的无效Unicode表情正则,使用ES6+支持的Unicode属性匹配规则识别普通Unicode表情
- 新增统一的表情合法性校验逻辑,同时覆盖自定义静态、自定义动态、Unicode普通表情三类场景
- 调整原有判断条件,只要传入的两个表情都属于合法类型就正常执行投票逻辑,不再限制仅支持自定义静态表情
修改后完整代码
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
相关产品推荐
相关产品推荐

