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

时间:2020-08-28 02:42:21

标签: javascript discord bots discord.js

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

我也是编码和编码不和谐机器人的新手,所以请您在婴儿步骤中进行解释

这是我的代码:

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托管我的机器人

2 个答案:

答案 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 herehere。显然,每24小时左右,项目目录中的所有文件就会被最新部署中的文件替换。

解决方案是使用postgresql附加组件,该附加组件在有限的使用范围内免费提供。

这就是我能找到的全部。希望对您有所帮助。