#javascript #discord #bots #discord.js
#javascript #Discord #боты #discord.js
Вопрос:
Я работаю над командой экономии, но каждый раз, когда я перезапускаю бота, он сбрасывает баланс. Я не знаю, как хранить данные, поэтому вы можете мне помочь
Также я новичок в кодировании и настройке бота discord, поэтому не могли бы вы объяснить пошагово
Вот мой код:
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 amp;amp; 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 amp;amp; 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 для размещения своего бота
Ответ №1:
вы можете использовать локальное хранилище для хранения данных в браузере
//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 в объект.
Ответ №2:
Похоже, что принудительное обновление базы данных включено, т. Е. удаляйте все существующие таблицы и создавайте новые таблицы при каждой перезагрузке бота. Проверьте код, в котором вы определяете схему и создаете базу данных.
Например, в sequelize вы делаете следующее, чтобы определить схему и создать таблицу:
var User = sequelize.define('user',{
// schema
});
User.sync({force: true}); // creating the table
Обратите внимание, как {force: true} передается при создании таблицы. Это говорит sequelize удалять существующие таблицы с таким именем и создавать новые при каждом выполнении этого кода.
Я использовал sequelize в качестве примера отчасти потому, что вы не упомянули, какую базу данных вы используете, а отчасти потому, что я использую sequelize. Проверьте наличие любой документации по такому поведению в используемой вами базе данных.
Редактировать:
Quick.db — это постоянная база данных, и я не нашел никаких доказательств принудительного обновления базы данных при каждом запуске кода. Во что бы то ни стало, он должен быть постоянным.
Таким образом, проблема, вероятно, в эфемерной файловой системе heroku. Они прямо предлагают не использовать файловые базы данных, такие как sqlite3 здесь и здесь. По-видимому, каждые 24 часа или около того все файлы в каталоге проекта заменяются файлами из последнего развертывания.
Решение заключается в использовании дополнения postgresql, которое является бесплатным для ограниченного использования.
Это все, что я смог найти. Надеюсь, это поможет.
Комментарии:
1. Я использую quick.db, пожалуйста, помогите