javascript - 有没有办法在 Discord.js 中制作频道表情?
问题描述
我正在寻找一种将一个文本通道限制为仅使用表情的方法。因此,如果消息包含文本,它会立即被机器人删除。
代码逻辑示例:
if (message.isEmoteOnly()) {
console.log('Emote-only message detected');
} else {
message.delete();
message.channel.send('Your message has been deleted! This channel is in emote-only mode.');
}
解决方案
检查文本是否为表情符号格式的一种简单、更优雅、更少利用的方法是使用正则表达式。
/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g
要查看它的实际效果并了解每个令牌的作用,请在此处查看。我强烈建议在阅读下面的解释之前这样做。
起初它可能看起来有点令人困惑,所以分解一下它为什么会起作用......
:[^:\s]+:
“正常”表情符号的格式是:name:
. 周围:
匹配冒号,而[^:\s]+
匹配中间的字符。:
(这将表示模板的结束)和换行符(将算作其间不会形成表情符号的字符)被排除在外。<:[^:\s]+:[0-9]+>
自定义表情符号的格式是<:name:id>
. 包围<:
并>
匹配模板的开头和结尾。[^:\s]+
匹配名称。名称和 ID 之间的冒号按字面意思匹配。[0-9]+
匹配里面的数字。我没有使用\d
数字,因为可以匹配归类为此类的其他 Unicode 字符。<a:[^:\s]+:[0-9]+>
动画表情符号的格式是<a:name:id>
.<
和匹配模板的>
开头和结尾。a:
从字面上匹配自己。[^:\s]+
匹配名称。:
在名称和 ID 之间进行字面匹配。[0-9]+
与身份证相符。
现在,将其实现到您的代码中...
// Replace all emojis to leave just the text, if any.
const text = message.content.replace(/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g, '');
// Check if 'text' is not blank to see if there are characters which are not used in emojis.
if (text) {
message.delete()
.catch(console.error);
}
如果您只想在消息中允许一个表情符号,您可以定义字符串的开头和结尾,并删除全局修饰符。
/^(:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>)$/
这将确保这是消息中的唯一内容。
编辑:
要在表情符号之间留出空格,您只需text
在删除表情符号后替换它们即可。在下面的示例中,\s
还包括换行符(如果这不是所需的结果,请将其替换为空格)。
const text = message.content.replace(/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g, '').replace(/\s+/g, '');
下面测试一下。
const str = ':smile: <a:parrot:1234> <:parrot:1234>';
const text = str.replace(/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g, '').replace(/\s+/g, '');
if (text) console.log('Not allowed.');
else console.log('Allowed.');
推荐阅读
- php - 尝试创建货运插件时 Woocommerce 出错
- r - 多个dataseries共享的singledatapoint,连接问题
- mysql - 如何根据单元格值在excel中设置参数化查询
- typescript - 如何防止使用错误的参数类型调用重载函数
- python - 来自大型一维数组的 Python Streamplot
- java - 通过 IDE (inteliJ) 运行 Shell 脚本并接收:适用于 Linux 的 Windows 子系统没有安装的发行版
- javascript - 如何在 4 秒后使用 jquery 激活弹出窗口?
- react-native - 无底部导航栏的单屏应用
- java - 读取实体时更改 DAO/Repository 中的特定值
- javascript - 我们可以创建一个指向组的共享对话框,以便将 url 或信息直接共享到组吗?