mirror of
https://github.com/Hessenuk/DiscordTickets.git
synced 2025-09-02 00:31:27 +03:00
Start making
Start on the basic structure, database stuff
This commit is contained in:
75
src/index.js
75
src/index.js
@@ -1,22 +1,87 @@
|
||||
/**
|
||||
* DiscordTickets
|
||||
* Copyright (C) 2021 Isaac Saunders
|
||||
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
*
|
||||
* @name @eartharoid/discordtickets
|
||||
* @description An open-source & self-hosted Discord bot for ticket management.
|
||||
* @copyright 2021 Isaac Saunders
|
||||
* @license GNU-GPLv3
|
||||
*/
|
||||
*/
|
||||
|
||||
const node_version = Number(process.versions.node.split('.')[0]);
|
||||
if (node_version < 14) return console.log(`Error: DiscordTickets does not work on Node v${node_version}. Please upgrade to v14 or above.`);
|
||||
const { version } = require('../package.json');
|
||||
|
||||
const fs = require('fs');
|
||||
const { path } = require('./utils/fs');
|
||||
if (!fs.existsSync(path('./.env'))) return console.log('Please make a copy of \'example.env\' called \'.env\'');
|
||||
if (!fs.existsSync(path('./user/config.js'))) return console.log('Please make a copy of \'example.config.js\' called \'config.js\'');
|
||||
|
||||
require('dotenv').config();
|
||||
|
||||
const config = require('../user/config');
|
||||
|
||||
const Logger = require('leekslazylogger');
|
||||
const log = new Logger({
|
||||
name: 'DiscordTickets by eartharoid',
|
||||
debug: config.debug,
|
||||
logToFile: config.logs.enabled,
|
||||
keepFor: config.logs.keep_for
|
||||
});
|
||||
|
||||
|
||||
const terminalLink = require('terminal-link');
|
||||
log.report = error => {
|
||||
let report = [
|
||||
'<< Issue report >>',
|
||||
'Please include this information if you ask for help about the following error!',
|
||||
`Support server: ${terminalLink('go.eartharoid.me/discord', 'https://go.eartharoid.me/discord')}`,
|
||||
`Node.JS version: ${process.versions.node.split('.')}`,
|
||||
`Bot version: ${version}`,
|
||||
`Platform: ${process.platform}`
|
||||
];
|
||||
log.warn(report.join('\n'));
|
||||
if (error) log.error(error);
|
||||
};
|
||||
|
||||
const { Client } = require('discord.js');
|
||||
class Bot extends Client {
|
||||
constructor() {
|
||||
super({
|
||||
autoReconnect: true,
|
||||
});
|
||||
|
||||
Object.assign(this, {
|
||||
config,
|
||||
db: require('./modules/database')(log),
|
||||
log,
|
||||
});
|
||||
|
||||
this.log.info('Connecting to Discord API');
|
||||
|
||||
this.login();
|
||||
}
|
||||
}
|
||||
|
||||
new Bot();
|
||||
|
||||
process.on('unhandledRejection', error => {
|
||||
log.report();
|
||||
log.warn('An error was not caught');
|
||||
if (error instanceof Error) log.warn(`Uncaught ${error.name}: ${error}`);
|
||||
log.error(error);
|
||||
});
|
||||
|
||||
|
71
src/modules/database.js
Normal file
71
src/modules/database.js
Normal file
@@ -0,0 +1,71 @@
|
||||
const Keyv = require('keyv');
|
||||
|
||||
const { homepage } = require('../../package.json');
|
||||
const { path } = require('../utils/fs');
|
||||
|
||||
const types = {
|
||||
sqlite: 'sqlite',
|
||||
mysql: 'mysql',
|
||||
mongo: 'mongo',
|
||||
mongodb: 'mongo',
|
||||
postgre: 'postgres',
|
||||
postgres: 'postgres',
|
||||
postgresql: 'postgres',
|
||||
};
|
||||
|
||||
const supported = Object.keys(types);
|
||||
|
||||
module.exports = (log) => {
|
||||
|
||||
let type = (process.env.DB_TYPE || 'sqlite').toLowerCase();
|
||||
|
||||
if (!supported.includes(type)) {
|
||||
log.report('Invalid database type');
|
||||
throw new Error('DB_TYPE is not valid type');
|
||||
}
|
||||
|
||||
try {
|
||||
require(`@keyv/${types[type]}`);
|
||||
} catch {
|
||||
log.report('Specified database type is not installed');
|
||||
throw new Error(`"@keyv/${types[type]}" is not installed, please install is manually`);
|
||||
}
|
||||
|
||||
const {
|
||||
DB_HOST,
|
||||
DB_USER,
|
||||
DB_PASS,
|
||||
DB_NAME
|
||||
} = process.env;
|
||||
let database;
|
||||
|
||||
switch (type) {
|
||||
case 'mysql':
|
||||
database = `mysql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}`;
|
||||
break;
|
||||
case 'mongo':
|
||||
case 'mongodb':
|
||||
database = `mongodb://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}`;
|
||||
break;
|
||||
case 'postgre':
|
||||
case 'postgres':
|
||||
case 'postgresql':
|
||||
database = `postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}`;
|
||||
break;
|
||||
default: // sqlite
|
||||
database = `sqlite://${path('./user/database.sqlite')}`;
|
||||
break;
|
||||
}
|
||||
|
||||
return {
|
||||
servers: new Keyv(database, {
|
||||
namespace: 'servers'
|
||||
}),
|
||||
tickets: new Keyv(database, {
|
||||
namespace: 'tickets'
|
||||
}),
|
||||
messages: new Keyv(database, {
|
||||
namespace: 'messages'
|
||||
})
|
||||
};
|
||||
};
|
5
src/utils/fs.js
Normal file
5
src/utils/fs.js
Normal file
@@ -0,0 +1,5 @@
|
||||
const { join } = require('path');
|
||||
|
||||
module.exports = {
|
||||
path: path => join(__dirname, '../../', path),
|
||||
};
|
Reference in New Issue
Block a user