第一个人总是加分
Points always get added to the first person
const Discord = require('discord.js');
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'))
const userUsed = new Set();
var client = new Discord.Client();
const Enmap = require("enmap");
client.points = new Enmap({
name: "points"
});
//-----------TABLE--------------
client.on('ready', () => {
console.log(`Logged in as ${client.user.username}...`)
console.log(`Bot has started, with ${client.users.size} users, in ${client.channels.size} channels of ${client.guilds.size} guilds.`);
});
//-------------MESSAGE STARTS----------------
client.on("message", (message) => {
const user = message.mentions.users.first();
const key = `${message.guild.id}-${message.author.id}`;
let command = message.content.split(" ")[0];
command = command.slice(config.prefix.length);
// ---------------COMMANDS--------------------------------------------------
if (!message.content.startsWith(config.prefix)) return;
if (command === "loben") {
if (userUsed.has(message.author.id)) return;
else {
let Mas = message.guild.roles.find(Mas => Mas.name === "Master");
if (message.member.roles.has(Mas.id)) {
if (user) {
const member = message.guild.member(user);
if (member) {
let Pad = member.guild.roles.find(Pad => Pad.name === "Padawan");
if (member.roles.has(Pad.id))
client.points.ensure(key, {
user: message.mentions.users.first().id,
guild: message.guild.id,
points: 0,
level: 1,
lastSeen: new Date()
});
client.points.inc(key, "points");
message.reply(`${user}, ist dem Master einen Schritt näher.`)
}
}
userUsed.add(message.author.id);
setTimeout(() => {
(userUsed.delete(message.author.id));
}, 1000 * 10);
}
}
}
这是我正在处理的命令。
我的问题是当我使用它时
第一次,提到的用户得到一个点,它应该如何。为了
示例:+loben @Tom123
,汤姆得 1 分
如果我再次使用该命令并提及其他用户(例如,
卢克)不是卢克明白了,但汤姆明白了。所以汤姆有 2 分和
卢克 none.
我不知道为什么...
假设有 3 个用户:
- 太鼓
- Tom123
- 卢克
Daikota 使用命令 +loben @Tom123
。
会发生什么?
const key = `${message.guild.id}-${message.author.id}`;
这一行,message.author.id
是大哥田的id。为简单起见,假设 key
的计算结果为 "Daikota"
。那么:
client.points.ensure(key, {
user: message.mentions.users.first().id,
guild: message.guild.id,
points: 0,
level: 1,
lastSeen: new Date()
});
client.points.inc(key, "points");
根据 enmap documentation,enmap.ensure(key, defaultvalue)
确保密钥存在于 Enmap 中。如果它不存在,enmap.ensure
会创建它并将其值设置为您传递给该方法的默认值。在我们的示例中,它将是这样的:
{
"Daikota": {
user: "Tom123",
points: 0,
// etc
}
}
然后使用 client.points.inc(key, "points");
确保它获得 "Daikota"
的 points
并将其增加 1。在此操作之后我们的 Enmap 看起来像这样:
{
"Daikota": {
user: "Tom123",
points: 1,
// etc
}
}
下一步
Daikota 使用命令 +loben @Luke
再说一次,message.author.id
是太鼓田。 enmap.ensure
将获取我们的 "Daikota"
密钥并发现它已经在我们的 Enmap 中,因此它不会创建新的。然后在 client.points.inc(key, "points");
行之后,我们的 Enmap 可能看起来像这样:
{
"Daikota": {
user: "Tom123",
points: 2,
// etc
}
}
这似乎是你所描述的。
解决方案
在您的案例中,使用提到的用户 ID 而不是消息的作者 ID 作为 Enmap 的键。
const Discord = require('discord.js');
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'))
const userUsed = new Set();
var client = new Discord.Client();
const Enmap = require("enmap");
client.points = new Enmap({
name: "points"
});
//-----------TABLE--------------
client.on('ready', () => {
console.log(`Logged in as ${client.user.username}...`)
console.log(`Bot has started, with ${client.users.size} users, in ${client.channels.size} channels of ${client.guilds.size} guilds.`);
});
//-------------MESSAGE STARTS----------------
client.on("message", (message) => {
const user = message.mentions.users.first();
const key = `${message.guild.id}-${message.author.id}`;
let command = message.content.split(" ")[0];
command = command.slice(config.prefix.length);
// ---------------COMMANDS--------------------------------------------------
if (!message.content.startsWith(config.prefix)) return;
if (command === "loben") {
if (userUsed.has(message.author.id)) return;
else {
let Mas = message.guild.roles.find(Mas => Mas.name === "Master");
if (message.member.roles.has(Mas.id)) {
if (user) {
const member = message.guild.member(user);
if (member) {
let Pad = member.guild.roles.find(Pad => Pad.name === "Padawan");
if (member.roles.has(Pad.id))
client.points.ensure(key, {
user: message.mentions.users.first().id,
guild: message.guild.id,
points: 0,
level: 1,
lastSeen: new Date()
});
client.points.inc(key, "points");
message.reply(`${user}, ist dem Master einen Schritt näher.`)
}
}
userUsed.add(message.author.id);
setTimeout(() => {
(userUsed.delete(message.author.id));
}, 1000 * 10);
}
}
}
这是我正在处理的命令。
我的问题是当我使用它时
第一次,提到的用户得到一个点,它应该如何。为了
示例:+loben @Tom123
,汤姆得 1 分
如果我再次使用该命令并提及其他用户(例如, 卢克)不是卢克明白了,但汤姆明白了。所以汤姆有 2 分和 卢克 none.
我不知道为什么...
假设有 3 个用户:
- 太鼓
- Tom123
- 卢克
Daikota 使用命令 +loben @Tom123
。
会发生什么?
const key = `${message.guild.id}-${message.author.id}`;
这一行,message.author.id
是大哥田的id。为简单起见,假设 key
的计算结果为 "Daikota"
。那么:
client.points.ensure(key, {
user: message.mentions.users.first().id,
guild: message.guild.id,
points: 0,
level: 1,
lastSeen: new Date()
});
client.points.inc(key, "points");
根据 enmap documentation,enmap.ensure(key, defaultvalue)
确保密钥存在于 Enmap 中。如果它不存在,enmap.ensure
会创建它并将其值设置为您传递给该方法的默认值。在我们的示例中,它将是这样的:
{
"Daikota": {
user: "Tom123",
points: 0,
// etc
}
}
然后使用 client.points.inc(key, "points");
确保它获得 "Daikota"
的 points
并将其增加 1。在此操作之后我们的 Enmap 看起来像这样:
{
"Daikota": {
user: "Tom123",
points: 1,
// etc
}
}
下一步
Daikota 使用命令 +loben @Luke
再说一次,message.author.id
是太鼓田。 enmap.ensure
将获取我们的 "Daikota"
密钥并发现它已经在我们的 Enmap 中,因此它不会创建新的。然后在 client.points.inc(key, "points");
行之后,我们的 Enmap 可能看起来像这样:
{
"Daikota": {
user: "Tom123",
points: 2,
// etc
}
}
这似乎是你所描述的。
解决方案
在您的案例中,使用提到的用户 ID 而不是消息的作者 ID 作为 Enmap 的键。