我正在寻找一种方法来将一个文本 channel 限制为仅使用表情。因此,如果消息包含文本,它会立即被机器人删除。
代码逻辑示例:
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.');
}
最佳答案
检查文本是否采用表情符号格式的一种简单、更优雅、更少利用的方法是使用 Regular Expression。 .
/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g
要查看实际效果并了解每个标记的作用,请查看 here .我强烈建议在阅读下面的解释之前这样做。
一开始看起来有点困惑,所以分解一下它为什么有效......
:[^:\s]+:
强>
“正常”表情符号的格式是:name:
强>。周边:
匹配冒号 while[^:\s]+
匹配中间的字符。:
(这表示模板结束)和换行符(这算作中间的字符不会形成表情符号)被排除在外。<:[^:\s]+:[0-9]+>
强>
自定义表情符号的格式为<:name:id>
强>。周边<:
和>
匹配模板的开头和结尾。[^:\s]+
匹配名称。名称和 ID 之间的冒号按字面匹配。[0-9]+
匹配里面的数字。 我没有使用\d
用于数字,因为可以匹配分类为此类的其他 Unicode 字符。<a:[^:\s]+:[0-9]+>
强>
动画表情符号的格式是<a:name:id>
强>。<
和>
匹配模板的开头和结尾。a:
从字面上匹配自己。[^:\s]+
匹配名称。:
在名称和 ID 之间进行字面匹配。[0-9]+
匹配 ID。
现在,将它实现到您的代码中......
// 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.');
关于javascript - 有没有办法在 Discord.js 中使 channel 只显示表情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56766490/