有没有办法检测特定味精的味精反应?

Is there a way to detect msg reactions on a specific msg?

我正在我的服务器上制作一个新系统,我需要一种方法来检测对某些消息的反应,以便用户对 运行 发送消息或其他功能等功能做出反应...

我尝试使用反应收集器,但我无法处理它,此方法不适用于旧消息。 我需要一些简单的东西来构建我的系统,这样我就可以使用不同的函数,比如 message.channel.sendmessage.guild.createChannel,能够检测消息内容,这个非常重要。

我想你可以使用 RethinkDB 来保存消息。 RethinkDB 是一个实时数据库,是一种检测实时消息的简单方法。

https://www.rethinkdb.com/

反应收集器确实可以处理在客户端登录之前已经发送的消息。但是,必须跟踪和获取这些消息。

示例系统(没有测试,只是一个例子)

messages.json:

[
  {
    "guild": "guildIDhere",
    "channel": "channelIDhere",
    "message": "messageIDhere",
    "filter": "(reaction, user) => reaction.emoji.name === '' && user.id !== client.user.id;",
    "options": { "max": 1 },
    "callback": "collected => console.log(collected);"
  }
]

index.js:

const messages = require('./messages.json'); // Path may vary
const fs = require('fs');

client.on('ready', () => {
  const deleteQueue = [];

  for (let i = 0; i < messages.length; i++) {
    const guild = client.guilds.get(messages[i].guild);
    if (!guild) {
      deleteQueue.push(i);
      continue;
    }

    const channel = guild.channels.get(messages[i].channel);
    if (!channel) {
      deleteQueue.push(i);
      continue;
    }

    const message = channel.fetchMessage(messages[i].message);
    if (!message) {
      deleteQueue.push(i);
      continue;
    }

    message.createReactionCollector(eval(messages[i].filter), messages[i].options)
      .then(eval(messages[i].callback))
      .catch(console.error);

  }

  if (deleteQueue.length > 0) {
    for (let i = 0; i < deleteQueue.length; i++) messages.splice(deleteQueue[i], 1);
    fs.writeFileSync('./message.json', JSON.stringify(messages));
    console.log(`${deleteQueue.length} message(s) are no longer available.`);
  }
});

稍后创建收集器:

message.channel.send('React with :smile:')
  .then(m => {
    const filter = ...;
    const options = ...;
    const callback = ...;
    m.createReactionCollector(filter, options)
      .then(callback)
      .catch(...);

    messages.push({
      guild: message.guild.id,
      channel: message.channel.id,
      message: message.id,
      filter: `${filter}`,
      options: options,
      callback: `${callback}`
    });

    fs.writeFileSync('./messages.json', JSON.stringify(messages));
  })
  .catch(console.error);