您如何存储数据,以便在重新启动机器人时它不会重置



我正在执行一个经济命令,但每次重新启动机器人时,它都会重置余额。我不知道如何存储数据,所以你能帮我吗

此外,我是编码和编码一个不和谐的机器人的新手,所以你能在婴儿步骤中解释吗

这是我的代码:

const Discord = require('discord.js');
const fs = require("fs");
bot.on('message', async message => {
if (message.content.startsWith("!bal")) {
let user = message.mentions.users.first() || message.author
let money = db.fetch(`money_${user.id}`)
if (money === null) money = 0
message.channel.send(`${user} you have ${money} coins`)
}
let timeout = 86400000
let amount = 1000
if (message.content === "!daily") {
let daily = await db.fetch(`daily_${message.author.id}`);
if (daily != null && timeout - (Date.now() - daily) > 0) {
let time = ss(timeout - (Date.now() - daily));
message.channel.send(`You already collected your daily reward, you can come back in **${time.hours}h ${time.minutes}m ${time.seconds}s**`)
}else {
embed = new Discord.MessageEmbed()
.setAuthor(`Daily`, message.author.displayAvatarURL)
.setColor("GREEN")
.setDescription(`**Daily Rewards**`)
.addField('Collected', amount)
message.channel.send(embed)
db.add(`money_${message.author.id}`, amount)
db.add(`daily_${message.author.id}`, Date.now())
}
}
let timeoutworked = 3600000
let worked = await db.fetch(`worked_${message.author.id}`)
if (message.content === "!work"){
if (worked != null && timeoutworked - (Date.now() - worked) > 0) {
let time = ss(timeout - (Date.now() - worked));
message.channel.send(`You have already worked, please come back in **${time.hours} ${time.minutes}m ${time.seconds}s**`)
}else{
let amountearned = Math.floor(Math.random() * 1000) + 1
let jobs = ["Developer", "Chef", "Doctor", "Cashier"]
let job = jobs[Math.floor(Math.random() * jobs.length)]
let embed = new Discord.MessageEmbed()
.setAuthor(`${message.author.tag}, it payed off`, message.author.displayAvatarURL())
.setDescription(`${message.author.tag}, you worked as a ${job} and earned ${amountearned} coins`)
message.channel.send(embed)
db.add(`money_${message.author.id}`, amountearned)
db.set(`worked_${message.author.id}`, Date.now())
}
}})

此外,我使用Heroku来托管我的机器人

您可以使用本地存储在浏览器中存储数据

//Store data in LocalStorage
localStorage.setItem("title", "Hello World");             // (Key / Value)
//Get data
console.log(localStorage.getItem("title"));
//Set Objects
var user= {
nombre: "Ava",
apellido: "Lovelace",
edad: 28
};
localStorage.setItem("user", JSON.stringify(user));     // (Key / Value)
//Get Objeto
var userJS = JSON.parse(localStorage.getItem("user"));
console.log(userJS);
//Remove item
localStorage.removeItem("user");
//Clean all localStorage
localStorage.clear();

请记住,您只能在localStorage中存储字符串数据类型,因此可以使用JSON.stringfy(obj(将对象转换为字符串,使用JSON.parse(str(将JSON字符串转换为对象。

看起来好像启用了数据库的强制刷新,即在每次重新启动bot时删除所有现有表并创建新表。检查定义架构和创建数据库的代码。

例如,在sequelize中,您可以执行以下操作来定义模式并创建表:

var User = sequelize.define('user',{
// schema
});
User.sync({force: true}); // creating the table

请注意在创建表时如何传递{force:true}。这个命令告诉sequelize每次执行代码时都要删除具有该名称的现有表并创建新表。

我使用sequelize作为一个例子,部分原因是你没有提到你正在使用的数据库,另一部分原因是我使用sequilize。请在您正在使用的数据库中查看有关此类行为的任何文档。

编辑:

Quick.db是一个持久数据库,我没有发现任何证据表明每次运行代码时都会强制刷新数据库。无论如何,它应该是持久的。

所以问题可能出在heroku短暂的文件系统上。他们直接建议不要在这里和这里使用像sqlite3这样的基于文件的数据库。显然,每隔24小时左右,项目目录中的所有文件都会被最新部署的文件所替换。

解决方案是使用postgresql插件,该插件对于有限的使用是免费的。

这就是我所能找到的。希望能有所帮助。

相关内容

最新更新