【问题标题】:Discord.js | Detect if message contains an Emoji不和谐.js |检测消息是否包含表情符号
【发布时间】:2021-08-11 23:36:27
【问题描述】:

我正在为我的机器人编写投票功能,我可以通过与机器人聊天来创建投票。机器人创建的“民意调查”只是其他用户可以对投票做出反应的基本信息。我正在努力寻找一种方法来告诉机器人每个可能的答案我想要哪个表情符号。我现在的想法是为每个可能的答案写一条消息给机器人,其中包含一个表情符号和答案(“:white_check_mark:是”)。经过数小时的尝试和搜索,我没有找到任何方法来检查消息的第一部分是否是表情符号。我发现了很多关于搜索“:”,“

编辑: 我基本上只需要一种检查消息是否包含表情符号的方法。但是,我被要求附上我的代码,这几乎可以让您了解我的工作方式。我需要检查消息是否以表情符号开头,因为它必须这样才能让机器人知道他需要对消息做出反应的表情符号,而且他显然无法对不是表情符号的东西做出反应。

谢谢 诺亚

【问题讨论】:

  • 考虑编辑您的问题,以包含您创建的适用代码,但仍无法实现您的目标。
  • 你能展示一下你到目前为止所做的尝试吗?
  • @JohnH 我编辑了我的帖子,我希望我的目标变得清晰,如果你仍然需要我可以提供的代码,但我不确定如何以最好的方式呈现它,以便您完全理解代码背后的想法,或者更确切地说需要一些时间来解释它。正如我所说,我基本上需要一种识别表情符号的方法。如果我提供了足够的信息,请告诉我
  • @user15517071 我尝试了多种方法,但基本上这些都是我认为的变化:我已经在消息中搜索了“:”,“
  • 这是我第一次发布有关编程的问题,我还在学习,所以如果我遗漏了重要信息,我很抱歉,但请随意提问,我会尽力回答所有问题我知道。感谢您的帮助。

标签: javascript discord.js


【解决方案1】:

我建议执行以下操作:首先,我将为您的命令创建基本的消息处理。如果您还没有完成,请查看discord.js 指南。

client.on("message", (message) => {
  if (!message.content.startsWith("!poll")) return;
});

请注意,出于上述简单原因,我并不担心机器人消息或 DM 之类的事情。 现在关于表情符号识别。通常,discord.js 或 Discord 实际上确实为您提供了 Unicode 格式的表情符号,并且 NOT 标记在两个冒号之间,就像在 Discord 用户应用程序中一样。这意味着您必须以不同的方式拆分message.content。我在下面的 sn-p 中这样做的方式可能不适用于动画表情符号。不幸的是,我无法测试它,因为我没有 Discord Nitro。但是,您可以自己扩展match If 条件。 This 相关问题对您正在尝试做的事情非常有用。

根据我自己的经验,编写一个匹配所有数千个表情符号的RegEx 变得非常困难。因此我建议使用一个名为emoji-regex的 NPM 包

请注意,我创建了一个示例消息对象,以便您查看我们正在处理的内容。

npm i emoji-regex

const emojiRegex = require('emoji-regex/RGI_Emoji.js');

const message = {
  content: "!poll ? ?",
};

const re = emojiRegex();
let match;
let emojis = [];
while ((match = re.exec(message.content)) != null) {
  emojis.push(match[0]);
}

console.log(emojis);

最后让我们把它们放在一起:

const Discord = require("discord.js");
const client = new Discord.Client();
const emojiRegex = require("emoji-regex/RGI_Emoji.js");

client.on("message", async (message) => {
  if (!message.content.startsWith("!poll")) return;
  console.log(message.content);

  const re = emojiRegex();
  let match;
  let emojis = [];
  while ((match = re.exec(message.content)) != null) {
    emojis.push(match[0]);
  }

  const sent = await message.channel.send("This is my poll!");
  emojis.forEach(async (e) => {
    await sent.react(e);
  });
});

client.login("your-awesome-token-goes-here-:D");

不要忘记让 client.on("message", async () => ...-callback 和 .forEach(...-callback 异步,因为我在上面的示例中使用了 Asynchronous JavaScript

现在,如果您想创建您的反应收集器,我再次建议您遵循 discord.js Collectors 指南。

【讨论】:

  • 您好,谢谢您的回答!可悲的是,它似乎对我不起作用。我的测试命令代码如下所示:try { let re = /\:.*?\:/gi; let match; let emojis = []; while ((match = re.exec(message.content)) != null) { emojis.push(match[0]); } console.log(emojis[0]); } catch (error) { message.channel.send(":octagonal_sign: **Fehler!** Bitte melde diesen Fehler beim Support!"); console.error(error); } 我基本上只是为此复制了您的工作,但是当我使用该命令时,表情符号 [...]
  • [...] 未找到。我会告诉你我的意思。 prnt.sc/13bkwz9 prnt.sc/13bky10 prnt.sc/13bkyz2(控制台日志)我的不和谐消息中的表情符号根本无法识别。也许我误会了你,但我认为我所做的一切都是按照描述的方式进行的。
  • 发现我的错误。让我快速编辑我的答案:D
  • 我实际上对 Unicode 的事情完全错了。 Discord 实际上为您提供 Unicode 格式的表情符号。我可以发誓这是另一种方式。好吧,傲慢的我以为我可以在不运行我的代码的情况下回答这个问题。
  • 非常感谢!代码现在可以工作了,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-07-18
  • 2021-08-04
  • 2021-12-04
  • 2020-11-25
  • 1970-01-01
  • 2021-07-23
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多