我正在尝试使用Discord.js制作具有AFK功能的Discord机器人。当用户发送消息时,它将检查他们是否为AFK,并发送DM产品以在他们做出反应时关闭AFK。我正在尝试更新到v12。它在更新之前一直在工作,现在似乎拒绝听取任何反应。它将对消息作出反应,但是任何时候我都不会将其记录在控制台中。
import pandas as pd
# test data
data = {'Name': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'A', 'B', 'C'],
'Data': ['green', 'blue', 'yellow', 'green', 'green', 'green', 'red', 'violet', 'red', 'white', 3, 3, 3]}
# create dataframe
df = pd.DataFrame(data)
# convert the Data column to str type
df.Data = df.Data.astype('str')
# groupby name and apply the function
dfg = df.groupby('Name', as_index=False)['Data'].apply(lambda x: ';'.join(sorted(set(x))))
# display(dfg)
Name Data
0 A 3;blue;green;yellow
1 B 3;green;red
2 C 3;red;violet;white
它不会引发任何错误,它会在设置反应收集器之后运行代码,我在message.author.send(noLongerAFKMessage).then(async function(msg) {
try {
await msg.react('✅');
await msg.react('❌');
const reactionFilter = (reaction, user) => {
return reaction.emoji.name === '✅' || reaction.emoji.name === '❌';
};
// Use reaction filter to remove to remove the user from the database rather than an event
const collector = msg.createReactionCollector(reactionFilter, {
time: 15000
});
collector.on('collect', (reaction, ReactionCollector) => {
console.log(`Collected ${reaction.emoji.name} from ${reaction.users.last().tag}`);
});
collector.on('end', _ => {
msg.delete().catch(() => console.log('Tried deleting afk message that was already deleted'));
});
} catch (err) {
console.error(err);
}
});
上使用了console.log,看起来一切正常,甚至在收集器结束时删除了消息!我还没有找到这样的东西,我对发生的事情感到非常困惑。
答案 0 :(得分:0)
问题似乎出在 collect 事件处理程序上:
collector.on('collect', (reaction, ReactionCollector) => {
console.log(`Collected ${reaction.emoji.name} from ${reaction.users.last().tag}`);
});
有2个问题:
collect 事件现在在Discord.js v12中传递了一个 MessageReaction 和 User 对象,而不是元素和收集器对象,例如Discord.js v11中的对象。这意味着您需要将参数从(reaction, ReactionCollector)
更改为(reaction, user)
。
reaction.users
不再返回Discord.js集合,而是返回ReactionUserManager
,您必须访问该集合的cache
属性以获得Discord.Collection()
。这意味着您需要将reaction.users.last().tag
更改为reaction.users.cache.last().tag
。另外,由于现在已传递 User 对象,因此您可以改用user.tag
。
这是修改后的代码:
collector.on('collect', (reaction, user) => {
console.log(`Collected ${reaction.emoji.name} from ${user.tag}`);
});