首页 > 解决方案 > 有没有办法在 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.');
}

标签: javascriptnode.jsdiscord.js

解决方案


检查文本是否为表情符号格式的一种简单、更优雅、更少利用的方法是使用正则表达式

/:[^:\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.');


推荐阅读