有没有办法检测特定味精的味精反应?
Is there a way to detect msg reactions on a specific msg?
我正在我的服务器上制作一个新系统,我需要一种方法来检测对某些消息的反应,以便用户对 运行 发送消息或其他功能等功能做出反应...
我尝试使用反应收集器,但我无法处理它,此方法不适用于旧消息。
我需要一些简单的东西来构建我的系统,这样我就可以使用不同的函数,比如 message.channel.send
或 message.guild.createChannel
,能够检测消息内容,这个非常重要。
我想你可以使用 RethinkDB 来保存消息。
RethinkDB 是一个实时数据库,是一种检测实时消息的简单方法。
反应收集器确实可以处理在客户端登录之前已经发送的消息。但是,必须跟踪和获取这些消息。
示例系统(没有测试,只是一个例子)
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);
我正在我的服务器上制作一个新系统,我需要一种方法来检测对某些消息的反应,以便用户对 运行 发送消息或其他功能等功能做出反应...
我尝试使用反应收集器,但我无法处理它,此方法不适用于旧消息。
我需要一些简单的东西来构建我的系统,这样我就可以使用不同的函数,比如 message.channel.send
或 message.guild.createChannel
,能够检测消息内容,这个非常重要。
我想你可以使用 RethinkDB 来保存消息。 RethinkDB 是一个实时数据库,是一种检测实时消息的简单方法。
反应收集器确实可以处理在客户端登录之前已经发送的消息。但是,必须跟踪和获取这些消息。
示例系统(没有测试,只是一个例子)
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);