正确的解决方案是使用数据库。你可以以 mysql 为例。
并使用 guild.id 和 user.id 作为 SELECT 的键。
mysql 的一些示例:
创建数据库
CREATE DATABASE myBase
use myBase
CREATE TABLE `users` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`guildId` varchar(255),
`userId` varchar(255),
`lvl` int
);
创建一个连接数据库的池
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit: 15,
host: 'localhost',
user: 'root',
password: 'password',
database: 'myBase',
});
module.exports = pool;
使用选择创建文件,创建和更新 mysql DATA。
const pool = require('./pool');
const get = (guildId, userId) => {
return new Promise((resolve, reject) => {
pool.query(`SELECT * FROM users WHERE userId = ${userId} && guildId = ${guildId}`, (err, rows) => {
if (err) throw err;
if (rows.length === 0) {
resolve(create(guildId, userId));
} else if (rows) {
resolve(rows[0]);
} else {
reject(err);
}
});
});
};
const create = (guildId, userId) => {
return new Promise((resolve, reject) => {
let data = {
guildId: guildId,
userId: userId,
lvl: 1,
};
pool.query('INSERT INTO users SET ?', data, (err, result) => {
resolve(get(guildId, userId));
});
});
};
const update = (guildId, userId, data) => {
return new Promise((resolve, reject) => {
get(guildId, userId).then(user => {
pool.query(`UPDATE users SET ? WHERE _id = ${user.id}`, data, (err, result) => {
if (err) throw err;
resolve(get(guildId, userId));
});
});
});
};
module.exports.get = get
module.exports.create = create
module.exports.update = update
在 bot 中使用的一些示例。
const Discord = require('discord.js');
const client = new Discord.Client();
const prefix = '?';
const token = require('./token.json').token;
const mysqlUser = require('./mysqlUser');
client.on('ready', () => {
console.log(`Bot is ready`);
});
client.on('message', (message) => {
/* s *Check for message starts with prefix */
if (!message.content.startsWith(prefix)) return;
/* split message to array */
let args = message.content.substring(prefix.length).split(' ');
/* get command */
let command = args.shift();
if (command === 'lvl') {
mysqlUser.get(message.guild.id, message.author.id).then((user) => {
message.channel.send(`${message.author} your lvl is ${user.lvl}`);
});
}
});
client.login(token);