Я создаю дискорд-бот и столкнулся с проблемой запуска базы данных.
У меня есть две базы данных: одна для хранения статистики (работает нормально), другая для конфигурации. Всякий раз, когда я запускаю нужную команду и пытаюсь прочитать данные из базы данных конфигурации, она по какой-то причине пытается прочитать из статистики. Я просмотрел код и не могу найти проблему. Когда команда запускается, я получаю это в журнале:
SQLITE_ERROR: нет такого столбца: stats.guild_id
Вот два файла. Один предназначен для основного скрипта бота, другой - запускаемый командный скрипт.
Основной скрипт:
const bot = new Discord.Client({disableEveryone: true});
const fs = require("fs");
const localconfig = JSON.parse(fs.readFileSync("./local-config.json", "utf8"));
const wordbanks = JSON.parse(fs.readFileSync("./modules/wordbanks.json", "utf8"));
const antilang = require("./modules/anti-lang.js");
const Sequelize = require("sequelize");
const seqStats = new Sequelize('database', 'user', 'password', {
host: 'localhost',
dialect: 'sqlite',
logging: false,
storage: './db/stats.sqlite',
});
const seqConfig = new Sequelize('database', 'user', 'password', {
host: 'localhost',
dialect: 'sqlite',
logging: false,
storage: './db/configs.sqlite',
});
const Stats = seqStats.define('stats', {
id: {
type: Sequelize.STRING,
unique: true,
primaryKey: true,
},
username: Sequelize.STRING,
xp_bal: {
type: Sequelize.INTEGER,
defaultValue: 0,
allowNull: false,
},
money_bal: {
type: Sequelize.INTEGER,
defaultValue: 0,
allowNull: false,
},
warn_bal: {
type: Sequelize.INTEGER,
defaultValue: 0,
allowNull: false,
},
mute_bal: {
type: Sequelize.INTEGER,
defaultValue: 0,
allowNull: false,
},
kick_bal: {
type: Sequelize.INTEGER,
defaultValue: 0,
allowNull: false,
},
ban_bal: {
type: Sequelize.INTEGER,
defaultValue: 0,
allowNull: false,
},
}, {
timestamps: false,
});
const Configs = seqConfig.define('configs', {
server_id: {
type: Sequelize.INTEGER,
unique: true,
primaryKey: true,
},
guild_id: {
type: Sequelize.STRING,
unique: true,
allowNull: false,
},
prefix: {
type: Sequelize.STRING,
defaultValue: "$",
allowNull: false,
},
configs_active: {
type: Sequelize.STRING,
defaultValue: "NO",
allowNull: false,
},
stats_active :{
type: Sequelize.STRING,
defaultValue: "NO",
allowNull: false,
},
defaultRole: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
modLogsChannel: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
economyLogsChannel: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
welcomeChannel: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
chatLogsChannel: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
todoChannel: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
suggestionsChannel: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
bugReportsChannel: {
type: Sequelize.STRING,
defaultValue: "NONE",
allowNull: false,
},
}, {
timestamps: false,
});
bot.on("ready", async () => {
antilang(bot);
Stats.sync();
Configs.sync();
console.log(`${bot.user.username} is online!`);
});
//==============Command Files Section================
bot.commands = new Discord.Collection();
bot.aka = new Discord.Collection();
fs.readdir("./commands", (err, files) => {
if (err) console.log(err)
let jsfile = files.filter(f => f.split(".").pop() === "js")
if (jsfile.length <= 0) {
return console.log("[LOGS] Couldn't Find Commands!");
}
jsfile.forEach((f, i) => {
let pull = require(`./commands/${f}`);
bot.commands.set(pull.config.name, pull);
pull.config.aka.forEach(aka => {
bot.aka.set(aka, pull.config.name)
});
});
});
//==============Bot Joins Guild Section================
bot.on("guildCreate", async (guild) => {
console.log("Joined new guild: " + guild.name + " with ID: " + guild.id + ".");
const configs = await Configs.findOne({where: { server_id: guild.id } });
if (!configs){
Configs.create({
server_id: guild.id,
guild_id: `${guild.id}`,
});
console.log(`No records found for ${guild.name}(${guild.id}). Created new entry.`);
}
});
//==============Bot Leaves Guild Section================
bot.on("guildDelete", async (guild) => {
console.log("Left guild: " + guild.name + " with ID: " + guild.id + ".");
});
//==============Member Joins Guild Section================
bot.on("guildMemberAdd", async (member) => {
console.log(`New member ${member.user.username} has joined guild ${member.guild.name}.`);
const configs = await Configs.findOne({where: { server_id: member.guild.id } });
const configs_active = configs.get("configs_active");
if(configs_active == "YES"){
const defaultRole = configs.get("defaultRole");
let defRole = member.guild.roles.cache.find(r => r.name === defaultRole);
member.roles.add(defRole);
const guild_id = configs.get("guild_id");
const welcomeChannel = configs.get("welcomeChannel");
if(welcomeChannel == "NONE"){
return;
} else {
bot.guilds.resolve(guild_id).channels.resolve(welcomeChannel).send(`A member has joined: ${member.user.username} :partying_face:`);
}
}
const stats = await Stats.findOne({ where: { id: member.id } });
if (!stats) {
Stats.create({
id: member.id,
username: member.user.username,
});
console.log(`No records found for ${member.user.username}(${member.user.id}). Created new entry.`);
}
});
//==============Member Leaves Guild Section================
bot.on("guildMemberRemove", async (member) => {
if(member.id != bot.user.id){
console.log("Member " + member.user.username + " has left the guild.");
const configs = await Configs.findOne({where: { server_id: member.guild.id } });
const configs_active = configs.get("configs_active");
if(configs_active == "YES"){
const guild_id = configs.get("guild_id");
const welcomeChannel = configs.get("welcomeChannel");
if(welcomeChannel == "NONE"){
return;
} else {
bot.guilds.resolve(localconfig.logsguild).channels.resolve(localconfig.welcomeChannel).send(`A member has left: ${member.user.username} :disappointed_relieved:`);
}
}
} else {
return;
}
});
//==============onMessage Section================
bot.on("message", async message => {
if(message.author.bot){
return;
} else if (message.channel.type === "dm") {
return message.channel.send("Please only speak to me in servers that I'm in.\nI'm not made to be your personal servant!");
} else if (message.mentions.has(bot.user)){
let index = Math.floor(Math.random() * wordbanks.tagreplies.length);
message.channel.send(wordbanks.tagreplies[index]);
}
let xpAmount = Math.floor(Math.random() * (15 - 1) + 1);
let moneyAmount = Math.floor(Math.random() * (15 - 1) + 1);
const stats = await Stats.findOne({ where: { id: message.author.id } });
if (!stats) {
console.log(`Can't find any database records for ${message.author.username}(${message.author.id}).`)
} else {
const money_bal = stats.get("money_bal");
const xp_bal = stats.get("xp_bal");
if(xp_bal == "Infinity"){
console.log(`${message.author.username} has infinite xp.`);
const editMoney = await Stats.update({ money_bal: money_bal + moneyAmount }, { where: { id: message.author.id } });
} else if(money_bal == "Infinity"){
console.log(`${message.author.username} has infinite money.`);
const editXP = await Stats.update({ xp_bal: xp_bal + xpAmount }, { where: { id: message.author.id } });
} else if(money_bal == "Infinity" && xp_bal == "Infinity"){
console.log(`${message.author.username} has infinite money & xp.`);
} else {
const editMoney = await Stats.update({ money_bal: money_bal + moneyAmount }, { where: { id: message.author.id } });
const editXP = await Stats.update({ xp_bal: xp_bal + xpAmount }, { where: { id: message.author.id } });
}
}
bot.emit('checkLang', message, Stats, Configs);
//==============Command Call Section================
let prefix = localconfig.prefix;
if (message.author.bot || message.channel.type === "dm") return;
if (!message.content.startsWith(prefix)) return;
let args = message.content.slice(prefix.length).split(' ');
let cmd = args.shift().toLowerCase();
let commandfile = bot.commands.get(cmd.slice(0)) || bot.commands.get(bot.aka.get(cmd.slice(0)))
if (commandfile) commandfile.run(bot, message, args, Stats, Configs)
});
bot.login(localconfig.logintoken);
Командный скрипт:
const Discord = require("discord.js");
const Sequelize = require("sequelize");
module.exports.run = async (bot, message, args, Configs) => {
const configs = await Configs.findOne({where: { guild_id: message.guild.id } });
const configs_active = configs.get("configs_active");
const stats_active = configs.get("stats_active");
const prefix = configs.get("prefix");
const defRole = configs.get("defaultRole");
const modLogsChannel = configs.get("modLogsChannel");
const economyLogsChannel = configs.get("economyLogsChannel");
const welcomeChannel = configs.get("welcomeChannel");
const chatLogsChannel = configs.get("chatLogsChannel");
const todoChannel = configs.get("todoChannel");
const suggestionsChannel = configs.get("suggestionsChannel");
const bugReportsChannel = configs.get("bugReportsChannel");
let testEmbed = new Discord.MessageEmbed()
.setTitle("BOT TEST")
.setDescription("Config Test For Bot")
.addField("Configs Active:", configs_active)
.addField("Stats Active:", stats_active)
.addField("Prefix:", prefix)
.addField("Default Role:", defRole)
.addField("ModLogs ID:", modLogsChannel)
.addField("Economy ID:", economyLogsChannel)
.addField("Welcome ID:", welcomeChannel)
.addField("ChatLogs ID", chatLogsChannel)
.addField("TODO ID:", todoChannel)
.addField("Suggestions ID:", suggestionsChannel)
.addField("Bug Reports ID:", bugReportsChannel)
message.channel.send({embed: testEmbed});
}
module.exports.config = {
name: "test",
aka: ["testing"],
usage: "$test",
description: "Test",
accessableby: "Anyone"
}
Заранее спасибо за помощь !