首页 > 解决方案 > 第一人称总是加分

问题描述

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 分

如果我再次使用该命令并提及其他用户(例如 Luke),Luke 不明白这一点,但 Tom 明白了。所以汤姆有2分而卢克没有。

我不知道为什么...

标签: javascriptdiscord.js

解决方案


假设有 3 个用户:

  1. 大幸田
  2. 汤姆123
  3. 卢克

Daikota 使用 command +loben @Tom123

怎么了?

const key = `${message.guild.id}-${message.author.id}`;

在这条线上,message.author.id是 Daikota 的 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 文档enmap.ensure(key, defaultvalue)确保密钥存在于 Enmap 中。如果它不存在,enmap.ensure则创建它并将其值设置为您传递给该方法的默认值。在我们的示例中,它将是这样的:

{
  "Daikota": {
    user: "Tom123",
    points: 0,
    // etc
  }
}

然后使用client.points.inc(key, "points");确保它得到points"Daikota"增加 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 的键。


推荐阅读