Rewrite underway, new database system and database migrated from leveldb to sqlite
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -5,3 +5,7 @@
|
|||||||
/uptime.json
|
/uptime.json
|
||||||
/.vscode/
|
/.vscode/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
info.txt
|
||||||
|
logs.log
|
||||||
|
.env
|
||||||
|
storage/
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -4,7 +4,15 @@
|
|||||||
|
|
||||||
Clone the repo, run `npm install`, run the `index.js` once, then fill the config.json, then rerun the bot.
|
Clone the repo, run `npm install`, run the `index.js` once, then fill the config.json, then rerun the bot.
|
||||||
|
|
||||||
However you can invite my hosted version of the bot [here](https://discordapp.com/api/oauth2/authorize?client_id=463829271933354006&permissions=128&scope=bot) and I recommend doing so.
|
Setting up the enviroment variables is easy
|
||||||
|
Firstly create a .env file with the following fields
|
||||||
|
```
|
||||||
|
BOT_TOKEN
|
||||||
|
BOT_GAME
|
||||||
|
DB_LOCATION
|
||||||
|
```
|
||||||
|
|
||||||
|
However you can propriatery verion [here](https://discordapp.com/api/oauth2/authorize?client_id=463829271933354006&permissions=128&scope=bot) and I recommend doing so.
|
||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
@@ -17,4 +25,4 @@ MIT, see LICENSE
|
|||||||
# Contributors
|
# Contributors
|
||||||
|
|
||||||
- ahoZiorce - Founder, maintainer
|
- ahoZiorce - Founder, maintainer
|
||||||
- Ben (plane000)#8618 <benjaminkyd@gmail.com> - Maintainer, contributor
|
- Ben Kyd <benjaminkyd@gmail.com> (https://benkyd.co.uk) - Maintainer, contributor
|
||||||
|
|||||||
37
index.js
37
index.js
@@ -1,35 +1,2 @@
|
|||||||
const levelup = require('levelup');
|
// pre settup
|
||||||
const leveldown = require('leveldown');
|
require('./src/index.js').main();
|
||||||
const zlib = require('zlib');
|
|
||||||
|
|
||||||
let db = levelup(leveldown('./logoriDB')); // Make that path customizable
|
|
||||||
|
|
||||||
function get(key) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
db.get(key, (err, value) => {
|
|
||||||
if (err) {
|
|
||||||
reject(err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
resolve(value);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function deflateObj(obj) {
|
|
||||||
let text = JSON.stringify(obj);
|
|
||||||
let compressed = zlib.deflateSync(text).toString('base64');
|
|
||||||
return compressed;
|
|
||||||
}
|
|
||||||
|
|
||||||
function inflateObj(str) {
|
|
||||||
let bufferCompressed = new Buffer(str, 'base64');
|
|
||||||
let text = zlib.inflateSync(bufferCompressed).toString();
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
db.createReadStream()
|
|
||||||
.on('data', async (data) => {
|
|
||||||
console.log(Buffer(data.key, 'base64').toString(), " = ", await get(Buffer(data.key, 'base64').toString()));
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -9,10 +9,15 @@
|
|||||||
"author": "Alejandro W. Sior, Ben Kyd <benjaminkyd@gmail.com> (https://benkyd.co.uk)",
|
"author": "Alejandro W. Sior, Ben Kyd <benjaminkyd@gmail.com> (https://benkyd.co.uk)",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"colors": "^1.4.0",
|
||||||
|
"dotenv": "^8.2.0",
|
||||||
"eris": "^0.13.3",
|
"eris": "^0.13.3",
|
||||||
"level": "^6.0.1",
|
"level": "^6.0.1",
|
||||||
"leveldown": "^5.6.0",
|
"leveldown": "^5.6.0",
|
||||||
"levelup": "^4.4.0",
|
"levelup": "^4.4.0",
|
||||||
"zlib-sync": "^0.1.7"
|
"moment": "^2.27.0",
|
||||||
|
"sequelize": "^6.3.3",
|
||||||
|
"sqlite3": "^5.0.0",
|
||||||
|
"zlib-sync": "0.1.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
132
src/database.js
Normal file
132
src/database.js
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
const Logger = require('./logger.js');
|
||||||
|
|
||||||
|
const Sequelize = require('sequelize');
|
||||||
|
|
||||||
|
let Guild;
|
||||||
|
|
||||||
|
module.exports.setup = async function()
|
||||||
|
{
|
||||||
|
Logger.info('Setting up database');
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV == "production")
|
||||||
|
{
|
||||||
|
Logger.database('Setting up production databse');
|
||||||
|
} else {
|
||||||
|
Logger.database('Setting up development databse');
|
||||||
|
}
|
||||||
|
|
||||||
|
const database = new Sequelize({
|
||||||
|
dialect: 'sqlite',
|
||||||
|
storage: process.env.NODE_ENV == "production" ? process.env.DB_LOCATION : process.env.DB_DEV_LOCATION,
|
||||||
|
logging: Logger.database
|
||||||
|
});
|
||||||
|
|
||||||
|
Guild = database.define('guild', {
|
||||||
|
id: {
|
||||||
|
type: Sequelize.STRING,
|
||||||
|
primaryKey: true,
|
||||||
|
unique: true
|
||||||
|
},
|
||||||
|
name: Sequelize.STRING,
|
||||||
|
prefix: Sequelize.STRING,
|
||||||
|
logchannel: Sequelize.STRING,
|
||||||
|
logsettings: Sequelize.JSON, // JSON / Array
|
||||||
|
modcases: Sequelize.INTEGER
|
||||||
|
}, {
|
||||||
|
tableName: 'guild'
|
||||||
|
});
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await database.authenticate();
|
||||||
|
await database.sync();
|
||||||
|
Logger.info('Database connection has been established successfully.');
|
||||||
|
} catch (error) {
|
||||||
|
Logger.panic('Unable to connect to the database:', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.NewGuild = async function(id, name, prefix, logchannel, logsettings, modcases)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
let user = await Guild.create({
|
||||||
|
id: id,
|
||||||
|
name: name,
|
||||||
|
prefix: prefix,
|
||||||
|
logchannel: logchannel,
|
||||||
|
logsettings: logsettings,
|
||||||
|
modcases: modcases
|
||||||
|
});
|
||||||
|
return user;
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error(`An error occured while inserting guild ${id} : ${e}`);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.FetchGuild = async function(id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
let guild = await Guild.findOne({where: {id: id}});
|
||||||
|
return guild == null ? -1 : guild;
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error(`An error occured while fetching guild ${id} : ${e}`);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.UpdateGuildPrefix = async function(id, prefix)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
await Guild.update({prefix: prefix}, {where: {id: id}});
|
||||||
|
return 1;
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error(`An error occured while updating guild id ${id} : ${e}`);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.UpdateGuildLogChannel = async function(id, channel)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
await Guild.update({logchannel: channel}, {where: {id: id}});
|
||||||
|
return 1;
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error(`An error occured while updating guild id ${id} : ${e}`);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.UpdateGuildLogSettings = async function(id, settings)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
await Guild.update({logsettings: settings}, {where: {id: id}});
|
||||||
|
return 1;
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error(`An error occured while updating guild id ${id} : ${e}`);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.IncrementGuildModCases = async function(id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
await Guild.update({modcases: Sequelize.literal('modcases + 1')}, {where: {id: id}});
|
||||||
|
return 1;
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error(`An error occured while updating guild id ${id} : ${e}`);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.DeleteGuild = async function(id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
await Guild.destroy({where: {id: id}});
|
||||||
|
return 1;
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error(`An error occured while deleting guild id ${id} : ${e}`);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
40
src/discord.js
Normal file
40
src/discord.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
const Logger = require('./logger.js');
|
||||||
|
const Database = require('./database.js');
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const Eris = require('eris');
|
||||||
|
|
||||||
|
let bot;
|
||||||
|
|
||||||
|
module.exports.setup = async function()
|
||||||
|
{
|
||||||
|
Logger.info('Setting up discord bot');
|
||||||
|
|
||||||
|
if (!process.env.BOT_TOKEN) Logger.panic('No BOT_TOKEN in .env file!')
|
||||||
|
|
||||||
|
bot = new Eris(process.env.BOT_TOKEN, {allowedMentions: false, restMode: true});
|
||||||
|
|
||||||
|
bot.on('ready', async () => {
|
||||||
|
Logger.info(`Discord logged in as ${bot.user.username}#${bot.user.discriminator}`);
|
||||||
|
|
||||||
|
let typestr = process.env.BOT_GAME_TYPE || 'playing';
|
||||||
|
let game = process.env.BOT_GAME || '*';
|
||||||
|
|
||||||
|
let type;
|
||||||
|
switch (typestr) {
|
||||||
|
case 'playing': type = 0; break;
|
||||||
|
case 'listening': type = 2; break;
|
||||||
|
case 'watching': type = 3; break;
|
||||||
|
default: type = 3; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bot.editStatus('online', {name: game, type: type});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// settup events
|
||||||
|
|
||||||
|
bot.connect();
|
||||||
|
}
|
||||||
|
|
||||||
0
src/discordcommands.js
Normal file
0
src/discordcommands.js
Normal file
0
src/discordevents.js
Normal file
0
src/discordevents.js
Normal file
25
src/index.js
Normal file
25
src/index.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const Logger = require('./logger.js');
|
||||||
|
const Database = require('./database.js');
|
||||||
|
const Discord = require('./discord.js');
|
||||||
|
|
||||||
|
require('dotenv').config()
|
||||||
|
|
||||||
|
module.exports.main = async function()
|
||||||
|
{
|
||||||
|
Logger.SetLevel(Logger.VERBOSE_LOGS);
|
||||||
|
Logger.welcome();
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV == "production")
|
||||||
|
{
|
||||||
|
Logger.info('Starting in production mode');
|
||||||
|
} else {
|
||||||
|
Logger.info('Starting in development mode');
|
||||||
|
}
|
||||||
|
|
||||||
|
await Database.setup();
|
||||||
|
|
||||||
|
await Discord.setup();
|
||||||
|
|
||||||
|
Logger.ready();
|
||||||
|
|
||||||
|
}
|
||||||
112
src/logger.js
Normal file
112
src/logger.js
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
const colours = require('colors/safe');
|
||||||
|
const moment = require('moment');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
let LogLevel = 1;
|
||||||
|
let Dialect = 'SQLITE';
|
||||||
|
let logPath = 'logs.log';
|
||||||
|
let dateFormat = 'DD-MM-YY HH:mm:ss'
|
||||||
|
|
||||||
|
module.exports.init = function(path) {
|
||||||
|
if (path) logPath = path;
|
||||||
|
|
||||||
|
if (!fs.existsSync(logPath)) {
|
||||||
|
fs.writeFileSync(logPath, '');
|
||||||
|
}
|
||||||
|
fs.appendFileSync(logPath, '[SYSTEM STARTING UP] \n');
|
||||||
|
|
||||||
|
console.log(colours.rainbow('Starting up...'));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.SetLevel = function(level) {
|
||||||
|
LogLevel = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.SetDialect = function(dialect) {
|
||||||
|
Dialect = dialect;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.SetDateFormat = function(format) {
|
||||||
|
dateFormat = format;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.VERBOSE_LOGS = 0;
|
||||||
|
module.exports.DEBUG_LOGS = 1;
|
||||||
|
module.exports.INFO_LOGS = 2;
|
||||||
|
module.exports.WARN_LOGS = 3;
|
||||||
|
|
||||||
|
module.exports.welcome = function() {
|
||||||
|
console.log(colours.rainbow(" \
|
||||||
|
__ _ \n \
|
||||||
|
/ / ___ __ _ ___ _ __(_) \n \
|
||||||
|
/ / / _ \\ / _` |/ _ \\| '__| | \n \
|
||||||
|
/ /__| (_) | (_| | (_) | | | | \n \
|
||||||
|
\\____/\\___/ \\__, |\\___/|_| |_| \n \
|
||||||
|
|___/ ` \n \
|
||||||
|
"
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.database = function(message) {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [${Dialect}] ${message} \n`);
|
||||||
|
if (LogLevel > 0) return;
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.magenta(Dialect) + '] ' + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.middleware = function(origin, message) {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [MIDDLEWARE: ${origin}] ${message} \n`);
|
||||||
|
if (LogLevel > 0) return;
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.yellow(`MIDDLEWARE: ${origin}`) + '] ' + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.debug = function(message) {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [DEBUG] ${message} \n`);
|
||||||
|
if (LogLevel > 1) return;
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.cyan('DEBUG') + '] ' + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.ready = function() {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [READY] \n`);
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.rainbow('READY') + ']');
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.info = function(message) {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [INFO] ${message} \n`);
|
||||||
|
if (LogLevel > 2) return;
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.green('INFO') + '] ' + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.warn = function(message) {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [WARN] ${message} \n`);
|
||||||
|
if (LogLevel > 3) return;
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.yellow('WARN') + '] ' + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.error = function(message) {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [ERROR] ${message} \n`);
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.red('ERROR') + '] ' + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.panic = function(message) {
|
||||||
|
let d = moment().format(dateFormat);
|
||||||
|
fs.appendFileSync(logPath, `[${d.toLocaleString()}] [PANIC] ${message} \n`);
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.red('PANIC') + '] ' + message);
|
||||||
|
console.log('[' + d.toLocaleString() + '] ['
|
||||||
|
+ colours.red('PANIC') + '] ABORTING...');
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user