我正在执行经济命令,但每次重新启动机器人时,都会重置余额。 我不知道如何存储数据,所以您能帮我吗
我也是编码和编码不和谐机器人的新手,所以请您在婴儿步骤中进行解释
这是我的代码:
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托管我的机器人
答案 0 :(得分:0)
您可以使用本地存储在浏览器中存储数据
//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.stringify(obj)将对象转换为字符串,并使用JSON.parse(str)将json字符串转换为对象。
答案 1 :(得分:0)
似乎已启用数据库的强制刷新,即在机器人每次重新启动时删除所有现有表并创建新表。检查定义架构和创建数据库的代码。
例如,在序列化中,您需要执行以下操作来定义架构并创建表:
var User = sequelize.define('user',{
// schema
});
User.sync({force: true}); // creating the table
请注意在创建表时如何传递{force:true}。这告诉sequelize删除具有该名称的现有表,并在每次执行代码时创建一个新表。
我以sequelize为例,部分是因为您没有提及正在使用的数据库,部分是因为我使用了sequelize。在正在使用的数据库中检查有关此类行为的任何文档。
编辑:
Quick.db是一个持久数据库,每次运行代码时我都没有发现强制刷新数据库的任何证据。无论如何,它应该是持久的。
所以问题可能出在heroku的临时文件系统上。他们直接建议不要使用基于文件的数据库,例如sqlite3 here和here。显然,每24小时左右,项目目录中的所有文件就会被最新部署中的文件替换。
解决方案是使用postgresql附加组件,该附加组件在有限的使用范围内免费提供。
这就是我能找到的全部。希望对您有所帮助。