带有 quick.db 的 discord.js 手动调平系统
Posted
技术标签:
【中文标题】带有 quick.db 的 discord.js 手动调平系统【英文标题】:discord.js manual levelling system with quick.db 【发布时间】:2021-11-13 20:25:24 【问题描述】:我正在尝试为我的服务器配置一个练级系统,当管理员使用 >givexp 时为用户提供 XP,当用户达到新级别时发送消息,当管理员使用 >resetxp 时重置用户的 XP 和级别,并在使用 >level 时显示用户的等级和 XP(当前等级的当前 XP 超过 XP 到下一级)。
但是,用户在第一次获得 XP 时并没有获得 XP(如果我使用 >givexp @user#1234 50,然后使用 >givexp @user#1234 20,他们的总 XP 将为 20)。
在最后一次奖励后达到 100 XP 或以上的 0 级用户在获得更多 XP 之前不会获得 1 级。
givexp.js:
const Discord = require("discord.js");
const db = require("quick.db")
const adm = " "; //ids here
module.exports =
name: "givexp"
module.exports.ex = async(message, args) =>
let guild = message;
const user = message.mentions.users.first();
if (message.author.id === adm)
if (!user)
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setTitle("Invalid Syntax").setDescription(`The format for [givexp] is \`>givexp @user#1234 [amount]\``));
else
// xp requirements for each level
const levels =
0: 100,
1: 125,
2: 150,
3: 175,
4: 200,
5: 225
;
// total xp requirements
const xpreqs =
0: 100,
1: 225,
2: 350,
3: 475,
4: 600,
5: 725
const giveAmount = args.slice(1).join(" ");
let xp = db.get(`xp_$message.guild.id_$user.id`);
let level = db.get(`level_$message.guild.id_$user.id`);
let totalxp = db.get(`totalxp_$message.guild.id_$user.id`);
if (xp === null) db.set(`xp_$message.guild.id_$user.id`, 0);
if (totalxp === null) db.set(`totalxp_$message.guild.id_$user.id`, 0);
if (level === null) db.set(`level_$message.guild.id_$user.id`, 0);
if (giveAmount)
await db.add(`totalxp_$message.guild.id_$user.id`, parseInt(giveAmount));
user.send(new Discord.MessageEmbed().setColor("D9B3FF").setDescription(`You were awarded **$giveAmountXP** by $message.author.tag`));
await message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setDescription(`$user.tag has been awarded **$giveAmountXP** by $message.author.tag`));
console.log(`$message.author.tag awarded $user.tag $giveAmountXP.`);
if (totalxp >= xpreqs[level])
await db.set(`xp_$message.guild.id_$user.id`, totalxp - xpreqs[level]);
await db.add(`level_$message.guild.id_$user.id`, 1);
level = db.get(`level_$message.guild.id_$user.id`);
await message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setTitle("Level Up!").setDescription(`<@$user.id> has reached Level $level!`))
else if (totalxp < xpreqs[level])
await db.add(`xp_$message.guild.id_$user.id`, parseInt(giveAmount));
else
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setTitle("Invalid Syntax").setDescription(`The format for [givexp] is \`>givexp @user#1234 [amount]\``));
else
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setDescription(`<@$message.author.id>, you do not have permission to give users XP.`));
;
level.js
const Discord = require("discord.js");
const db = require("quick.db")
module.exports =
name: "level"
module.exports.ex = async(message, args) =>
let guild = message;
const user = message.mentions.members.first() || message.author;
const levels =
0: 100,
1: 125,
2: 150,
3: 175,
4: 200,
5: 225
;
let xp = db.get(`xp_$message.guild.id_$user.id`);
let level = db.get(`level_$message.guild.id_$user.id`);
let xpreq = levels[level];
if (xp === null)
xp = 0;
if (level === null)
level = 0;
message.channel.send(new Discord.MessageEmbed().setColor("D9B3FF").setAuthor(user.username, message.guild.iconURL()).setThumbnail(user.avatarURL()).setDescription(`**LEVEL: **$level\n**XP: **$xp/$xpreq`));
console.log(`$message.author.tag used [level] in $guild.name`);
;
【问题讨论】:
【参考方案1】:这是因为如果值为空,就像你检查它。您永远不会重新定义 level
变量的值。您只需在 quick.db 上将级别设置为 0,而不是实际变量。
if (level === null) db.set(`level_$message.guild.id_$user.id`, 0);
// this is the issue, "if level is null, set db level_$message.guild.id to 0"
您还需要将值设置为 level
变量,以便稍后在代码中检查调平要求
if (totalxp >= xpreqs[level])
// You are basically checking if (totalxp >= xpreqs[null])
这就是您的用户在第二次添加 XP 后获得所需级别的原因,因为那时您的 level
变量已经有价值。
【讨论】:
以上是关于带有 quick.db 的 discord.js 手动调平系统的主要内容,如果未能解决你的问题,请参考以下文章
Discord.js 错误:它正在删除整个数组。 Quick.db 和 discord.js
有没有办法使用 quick.db 制作 discord.js 日志系统