Ver código fonte

finish readonly notice

Markus-Rost 4 anos atrás
pai
commit
92f1bc18a1
9 arquivos alterados com 101 adições e 56 exclusões
  1. 3 0
      cmds/patreon.js
  2. 8 0
      cmds/rcscript.js
  3. 4 0
      cmds/settings.js
  4. 4 0
      cmds/verification.js
  5. 1 0
      cmds/voice.js
  6. 1 1
      dashboard/index.html
  7. 76 51
      dashboard/index.js
  8. 2 2
      main.js
  9. 2 2
      util/database.js

+ 3 - 0
cmds/patreon.js

@@ -29,6 +29,7 @@ function cmd_patreon(lang, msg, args, line, wiki) {
 			}
 			if ( !row ) return msg.replyMsg( 'you can\'t have any server.', {}, true );
 			if ( row.count <= row.guilds ) return msg.replyMsg( 'you already reached your maximal server count.', {}, true );
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			db.run( 'UPDATE discord SET patreon = ? WHERE guild = ? AND channel IS NULL', [msg.author.id, args[1]], function (error) {
 				if ( error ) {
 					console.log( '- Error while updating the guild: ' + error );
@@ -63,6 +64,7 @@ function cmd_patreon(lang, msg, args, line, wiki) {
 				return dberror;
 			}
 			if ( !row ) return msg.replyMsg( 'you didn\'t enable the patreon features for "' + guild + '"!', {}, true );
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			db.run( 'UPDATE discord SET lang = ?, inline = ?, prefix = ?, patreon = NULL WHERE guild = ?', [row.lang, row.inline, process.env.prefix, args[1]], function (error) {
 				if ( error ) {
 					console.log( '- Error while updating the guild: ' + error );
@@ -170,6 +172,7 @@ function cmd_patreon(lang, msg, args, line, wiki) {
 		var guilds = ( row && row.guilds ? row.guilds.split(',') : [] );
 		if ( args[2].startsWith( '+' ) || args[2].startsWith( '-' ) ) count += value;
 		else count = value;
+		if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 		if ( count <= 0 ) return db.run( 'DELETE FROM patreons WHERE patreon = ?', [args[1]], function (error) {
 			if ( error ) {
 				console.log( '- Error while deleting the patreon: ' + error );

+ 8 - 0
cmds/rcscript.js

@@ -56,6 +56,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				return msg.replyMsg( lang.get('rcscript.noadmin') );
 			}
 			if ( rows.length >= limit ) return msg.replyMsg( lang.get('rcscript.max_entries'), {}, true );
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 
 			var wikiinvalid = lang.get('settings.wikiinvalid') + '\n`' + prefix + 'rcscript add ' + lang.get('rcscript.new_wiki') + '`\n' + lang.get('rcscript.help_wiki');
 			var input = args.slice(1).join(' ').toLowerCase().trim().replace( /^<\s*(.*?)\s*>$/, '$1' );
@@ -192,6 +193,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 			let cmd = prefix + 'rcscript' + ( rows.length === 1 ? '' : ' ' + selected_row.configid );
 
 			if ( args[0] === 'delete' && !args[1] ) {
+				if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 				return msg.client.fetchWebhook(...selected_row.webhook.split('/')).then( webhook => {
 					var channel = msg.guild.channels.cache.get(webhook.channelID);
 					if ( !channel || !channel.permissionsFor(msg.member).has('MANAGE_WEBHOOKS') ) {
@@ -229,6 +231,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				if ( !args[1] ) {
 					return msg.replyMsg( lang.get('rcscript.current_wiki') + ' <' + selected_row.wiki + '>\n`' + cmd + ' wiki ' + lang.get('rcscript.new_wiki') + '`\n' + lang.get('rcscript.help_wiki'), {}, true );
 				}
+				if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 
 				var wikiinvalid = lang.get('settings.wikiinvalid') + '\n`' + cmd + ' wiki ' + lang.get('rcscript.new_wiki') + '`\n' + lang.get('rcscript.help_wiki');
 				var wikinew = input_to_wiki(args[1].replace( /^(?:https?:)?\/\//, 'https://' ));
@@ -334,6 +337,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				if ( !args[1] ) {
 					return msg.replyMsg( lang.get('rcscript.current_lang') + ' `' + allLangs.names[selected_row.lang] + '`\n`' + cmd + ' lang ' + lang.get('rcscript.new_lang') + '`\n' + lang.get('rcscript.help_lang') + ' `' + Object.values(allLangs.names).join('`, `') + '`', {files:( msg.uploadFiles() ? [`./RcGcDb/locale/widgets/${selected_row.lang}.png`] : [] )}, true );
 				}
+				if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 				if ( !( args[1] in allLangs.map ) ) {
 					return msg.replyMsg( lang.get('settings.langinvalid') + '\n`' + cmd + ' lang ' + lang.get('rcscript.new_lang') + '`\n' + lang.get('rcscript.help_lang') + ' `' + Object.values(allLangs.names).join('`, `') + '`', {}, true );
 				}
@@ -355,6 +359,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				if ( !args[1] || !display_types.includes( args[1] ) ) {
 					return msg.replyMsg( lang.get('rcscript.current_display') + ' `' + display_types[selected_row.display] + '`\n`' + cmd + ' display (' + display.join('|') + ')`\n' + display.map( display_type => '`' + display_type + '`: ' + lang.get('rcscript.help_display_' + display_type) ).join('\n'), {}, true );
 				}
+				if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 				if ( !display.includes( args[1] ) ) {
 					return msg.replyMsg( lang.get('general.patreon') + '\n<' + process.env.patreon + '>', {}, true );
 				}
@@ -373,6 +378,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				} );
 			}
 			if ( selected_row.wiki.isFandom() && args[0] === 'feeds' ) {
+				if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 				if ( args[1] === 'only' ) {
 					if ( selected_row.rcid === -1 ) {
 						msg.client.fetchWebhook(...selected_row.webhook.split('/')).then( webhook => {
@@ -571,6 +577,7 @@ function blocklist(msg, args) {
 	var prefix = ( patreons[msg?.guild?.id] || process.env.prefix );
 	if ( args[0] === 'add' ) {
 		if ( !args[1] ) return msg.replyMsg( '`' + prefix + 'rcscript block add <wiki> [<reason>]`', {}, true );
+		if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 		let input = args[1].toLowerCase().replace( /^<(.*?)>$/, '$1' );
 		let wiki = input_to_wiki(input.replace( /^(?:https?:)?\/\//, 'https://' ));
 		if ( !wiki ) return msg.replyMsg( '`' + prefix + 'rcscript block add <wiki> [<reason>]`', {}, true );
@@ -611,6 +618,7 @@ function blocklist(msg, args) {
 		let input = args.slice(1).join(' ').toLowerCase().trim().replace( /^<\s*(.*?)\s*>$/, '$1' );
 		let wiki = input_to_wiki(input.replace( /^(?:https?:)?\/\//, 'https://' ));
 		if ( !wiki ) return msg.replyMsg( '`' + prefix + 'rcscript block remove <wiki>`', {}, true );
+		if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 		return db.run( 'DELETE FROM blocklist WHERE wiki = ?', [wiki.href], function (error) {
 			if ( error ) {
 				console.log( '- Error while removing from the blocklist: ' + error );

+ 4 - 0
cmds/settings.js

@@ -76,6 +76,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 				if ( !rows.length ) return msg.replyMsg( lang.get('settings.wikimissing') + wikihelp, {}, true );
 				else return msg.replyMsg( lang.get('settings.' + prelang) + ' ' + ( channel || guild ).wiki + wikihelp, {}, true );
 			}
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			var isForced = false;
 			if ( /^<?(?:https?:)?\/\//.test(args[1]) ) {
 				args[1] = args[1].replace( /^<?(?:https?:)?\/\//, 'https://' );
@@ -219,6 +220,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 			if ( !args[1] ) {
 				return msg.replyMsg( lang.get('settings.' + prelang) + ' `' + allLangs.names[( channel || guild ).lang] + '`' + langhelp, {files:( msg.uploadFiles() ? [`./i18n/widgets/${( channel || guild ).lang}.png`] : [] )}, true );
 			}
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			if ( !( args[1] in allLangs.map ) ) {
 				return msg.replyMsg( lang.get('settings.langinvalid') + langhelp, {}, true );
 			}
@@ -276,6 +278,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 			if ( !args[1].trim() ) {
 				return msg.replyMsg( lang.get('settings.prefix') + ' `' + prefix + '`' + prefixhelp, {}, true );
 			}
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			if ( args[1].includes( '`' ) || args[1].length > 100 ) {
 				return msg.replyMsg( lang.get('settings.prefixinvalid') + prefixhelp, {}, true );
 			}
@@ -306,6 +309,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 			if ( args[1] !== 'toggle' ) {
 				return msg.replyMsg( lang.get('settings.' + toggle + '.' + prelang) + inlinehelp, {}, true );
 			}
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			var value = ( ( channel || guild ).inline ? null : 1 );
 			var sql = 'UPDATE discord SET inline = ? WHERE guild = ?';
 			var sqlargs = [value, msg.guild.id];

+ 4 - 0
cmds/verification.js

@@ -31,6 +31,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 		if ( args[0] && args[0].toLowerCase() === 'add' ) {
 			var limit = verificationLimit[( msg.guild.id in patreons ? 'patreon' : 'default' )];
 			if ( rows.length >= limit ) return msg.replyMsg( lang.get('verification.max_entries'), {}, true );
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			var roles = args.slice(1).join(' ').split('|').map( role => role.replace( /^\s*<?\s*(.*?)\s*>?\s*$/, '$1' ) ).filter( role => role.length );
 			if ( !roles.length ) return msg.replyMsg( lang.get('verification.no_role') + '\n`' + prefix + 'verification add ' + lang.get('verification.new_role') + '`', {}, true );
 			if ( roles.length > 10 ) return msg.replyMsg( lang.get('verification.role_max'), {}, true );
@@ -73,6 +74,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 		var row = rows.find( row => row.configid.toString() === args[0] );
 		if ( args[1] ) args[1] = args[1].toLowerCase();
 		if ( args[1] === 'delete' && !args.slice(2).join('') ) {
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			return db.run( 'DELETE FROM verification WHERE guild = ? AND configid = ?', [msg.guild.id, row.configid], function (dberror) {
 				if ( dberror ) {
 					console.log( '- Error while removing the verification: ' + dberror );
@@ -88,6 +90,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 				console.log( msg.guild.id + ': Missing permissions - MANAGE_NICKNAMES' );
 				return msg.replyMsg( lang.get('general.missingperm') + ' `MANAGE_NICKNAMES`' );
 			}
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			return db.run( 'UPDATE verification SET rename = ? WHERE guild = ? AND configid = ?', [( row.rename ? 0 : 1 ), msg.guild.id, row.configid], function (dberror) {
 				if ( dberror ) {
 					console.log( '- Error while updating the verification: ' + dberror );
@@ -100,6 +103,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 			} );
 		}
 		if ( args[2] ) {
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			args[2] = args.slice(2).join(' ').replace( /^\s*<?\s*(.*?)\s*>?\s*$/, '$1' );
 			if ( args[1] === 'channel' ) {
 				var channels = args[2].replace( /\s*>?\s*\|\s*<?\s*/g, '|' ).split('|').filter( channel => channel.length );

+ 1 - 0
cmds/voice.js

@@ -18,6 +18,7 @@ function cmd_voice(lang, msg, args, line, wiki) {
 		}
 		args[1] = args.slice(1).join(' ').trim()
 		if ( args[0].toLowerCase() === 'toggle' && !args[1] ) {
+			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly'), {}, true );
 			var value = ( msg.guild.id in voice ? null : 1 );
 			return db.run( 'UPDATE discord SET voice = ? WHERE guild = ? AND channel IS NULL', [value, msg.guild.id], function (dberror) {
 				if ( dberror ) {

+ 1 - 1
dashboard/index.html

@@ -193,7 +193,7 @@
 		</a>
 		<a id="logout" href="/logout" alt="Logout">
 			<img class="avatar" src="https://cdn.discordapp.com/avatars/461189216198590464/f69cdc197791aed829882b64f9760dbb.png?size=64" alt="Logout" width="32" height="32">
-			<span>MarkusRost #1234</span>
+			<span>Wiki-Bot #2998</span>
 		</a>
 	</div>
 	<div class="sidebar">

+ 76 - 51
dashboard/index.js

@@ -90,9 +90,9 @@ var settingsData = new Map();
 
 const server = http.createServer((req, res) => {
 	if ( req.method !== 'GET' ) {
-		let notice = '<img width="400" src="https://http.cat/418"><br><strong>' + http.STATUS_CODES[418] + '</strong>';
-		res.writeHead(418, {'Content-Length': notice.length});
-		res.write( notice );
+		let body = '<img width="400" src="https://http.cat/418"><br><strong>' + http.STATUS_CODES[418] + '</strong>';
+		res.writeHead(418, {'Content-Length': body.length});
+		res.write( body );
 		return res.end();
 	}
 
@@ -127,27 +127,28 @@ const server = http.createServer((req, res) => {
 			permissions: defaultPermissions, state
 		} ));
 		let responseCode = 200;
+		let notice = '';
 		if ( reqURL.searchParams.get('action') === 'failed' ) {
 			responseCode = 400;
-			$('replace#notice').replaceWith(`<div class="notice">
-				<b>Login failed!</b>
-				<div>An error occurred while logging you in, please try again.</div>
-			</div>`);
+			notice = createNotice($, {
+				title: 'Login failed!',
+				text: 'An error occurred while logging you in, please try again.'
+			});
 		}
 		if ( reqURL.searchParams.get('action') === 'unauthorized' ) {
 			responseCode = 401;
-			$('replace#notice').replaceWith(`<div class="notice">
-				<b>Not logged in!</b>
-				<div>Please login before you can change any settings.</div>
-			</div>`);
+			notice = createNotice($, {
+				title: 'Not logged in!',
+				text: 'Please login before you can change any settings.'
+			});
 		}
 		if ( reqURL.searchParams.get('action') === 'logout' ) {
-			$('replace#notice').replaceWith(`<div class="notice">
-				<b>Successfully logged out!</b>
-				<div>You have been successfully logged out. To change any settings you need to login again.</div>
-			</div>`);
+			notice = createNotice($, {
+				title: 'Successfully logged out!',
+				text: 'You have been successfully logged out. To change any settings you need to login again.'
+			});
 		}
-		$('replace#notice').replaceWith('');
+		$('replace#notice').replaceWith(notice);
 		state = crypto.randomBytes(16).toString("hex");
 		while ( settingsData.has(state) ) {
 			state = crypto.randomBytes(16).toString("hex");
@@ -157,12 +158,12 @@ const server = http.createServer((req, res) => {
 			prompt: 'none', state
 		} );
 		$('replace#text').replaceWith(`<a href="${url}">Login</a>`);
-		let notice = $.html();
+		let body = $.html();
 		res.writeHead(responseCode, {
 			'Set-Cookie': [`wikibot="${state}"; HttpOnly`],
-			'Content-Length': notice.length
+			'Content-Length': body.length
 		});
-		res.write( notice );
+		res.write( body );
 		return res.end();
 	}
 
@@ -312,7 +313,14 @@ const server = http.createServer((req, res) => {
 	}
 
 	var $ = cheerio.load(files.index);
-	$('replace#notice').replaceWith('');
+	let notice = '';
+	if ( process.env.READONLY ) {
+		notice = createNotice($, {
+			title: 'Read-only database!',
+			text: 'You can currently only view your settings but not change them.'
+		});
+	}
+	$('replace#notice').replaceWith(notice);
 	$('.navbar #logout img').attr('src', settings.user.avatar);
 	$('.navbar #logout span').text(`${settings.user.username} #${settings.user.discriminator}`);
 	$('.guild#invite a').attr('href', oauth.generateAuthUrl( {
@@ -320,65 +328,67 @@ const server = http.createServer((req, res) => {
 		permissions: defaultPermissions, state
 	} ));
 	$('.guild#refresh a').attr('href', '/refresh?return=' + reqURL.pathname);
-	let guilds = '';
+	let guilds = $('<div>');
 	if ( settings.guilds.isMember.size ) {
-		guilds += `<div class="guild">
-			<div class="separator"></div>
-		</div>`;
+		$('<div class="guild">').append(
+			$('<div class="separator">')
+		).appendTo(guilds);
 		settings.guilds.isMember.forEach( guild => {
-			guilds += `<div class="guild" id="${guild.id}">
-				<div class="bar"></div>
-				<a href="/guild/${guild.id}" alt="${guild.name}">` + ( guild.icon ? 
-					`<img class="avatar" src="${guild.icon}" alt="${guild.acronym}" width="48" height="48">`
-					: `<div class="avatar noicon">${guild.acronym}</div>` ) + 
-				`</a>
-			</div>`;
+			$('<div class="guild">').attr('id', guild.id).append(
+				$('<div class="bar">'),
+				$('<a>').attr('href', `/guild/${guild.id}`).attr('alt', guild.name).append(
+					( guild.icon ? 
+						$('<img class="avatar" width="48" height="48">').attr('src', guild.icon).attr('alt', guild.name)
+					 : $('<div class="avatar noicon">').text(guild.acronym) )
+				)
+			).appendTo(guilds);
 		} );
 	}
 	if ( settings.guilds.notMember.size ) {
-		guilds += `<div class="guild">
-			<div class="separator"></div>
-		</div>`;
+		$('<div class="guild">').append(
+			$('<div class="separator">')
+		).appendTo(guilds);
 		settings.guilds.notMember.forEach( guild => {
-			guilds += `<div class="guild" id="${guild.id}">
-				<div class="bar"></div>
-				<a href="/guild/${guild.id}" alt="${guild.name}">` + ( guild.icon ? 
-					`<img class="avatar" src="${guild.icon}" alt="${guild.acronym}" width="48" height="48">`
-					: `<div class="avatar noicon">${guild.acronym}</div>` ) + 
-				`</a>
-			</div>`;
+			$('<div class="guild">').attr('id', guild.id).append(
+				$('<div class="bar">'),
+				$('<a>').attr('href', `/guild/${guild.id}`).attr('alt', guild.name).append(
+					( guild.icon ? 
+						$('<img class="avatar" width="48" height="48">').attr('src', guild.icon).attr('alt', guild.name)
+					 : $('<div class="avatar noicon">').text(guild.acronym) )
+				)
+			).appendTo(guilds);
 		} );
 	}
-	$('replace#guilds').replaceWith(guilds);
+	$('replace#guilds').replaceWith(guilds.children());
 
 	if ( reqURL.pathname.startsWith( '/guild/' ) ) {
 		let id = reqURL.pathname.replace( '/guild/', '' );
 		if ( settings.guilds.isMember.has(id) ) {
-			$('.guild#' + id).addClass('selected');
+			$(`.guild#${id}`).addClass('selected');
 			let guild = settings.guilds.isMember.get(id);
-			$('head title').text(guild.name + ' – ' + $('head title').text());
+			$('head title').text(`${guild.name} – ` + $('head title').text());
 			res.setHeader('Set-Cookie', [`guild="${id}"; HttpOnly; Path=/`]);
 			$('replace#text').replaceWith(`${guild.permissions}`);
 		}
 		if ( settings.guilds.notMember.has(id) ) {
-			$('.guild#' + id).addClass('selected');
+			$(`.guild#${id}`).addClass('selected');
 			let guild = settings.guilds.notMember.get(id);
-			$('head title').text(guild.name + ' – ' + $('head title').text());
+			$('head title').text(`${guild.name} – ` + $('head title').text());
 			res.setHeader('Set-Cookie', [`guild="${id}"; HttpOnly; Path=/`]);
 			let url = oauth.generateAuthUrl( {
 				scope: ['identify', 'guilds', 'bot'],
 				permissions: defaultPermissions,
 				guild_id: id, state
 			} );
-			$('replace#text').replaceWith(`<a href="${url}">${guild.permissions}</a>`);
+			$('replace#text').replaceWith($('<a>').attr('href', url).text(guild.permissions));
 		}
 		$('replace#text').replaceWith('You are missing the <code>MANAGE_GUILD</code> permission.');
 	}
 
 	$('replace#text').replaceWith('Keks');
-	let notice = $.html();
-	res.writeHead(200, {'Content-Length': notice.length});
-	res.write( notice );
+	let body = $.html();
+	res.writeHead(200, {'Content-Length': body.length});
+	res.write( body );
 	return res.end();
 });
 
@@ -386,6 +396,21 @@ server.listen(8080, 'localhost', () => {
 	console.log( '- Dashboard: Server running at http://localhost:8080/' );
 });
 
+/**
+ * Create a red notice
+ * @param {CheerioStatic} $ - The cheerio static
+ * @param {{title: String, text: String}[]} notices - The notices to create
+ * @returns {Cheerio}
+ */
+function createNotice($, ...notices) {
+	return notices.map( notice => {
+		return $('<div class="notice">').append(
+			$('<b>').text(notice.title),
+			$('<div>').text(notice.text)
+		);
+	} );
+}
+
 const permissions = {
 	ADMINISTRATOR: 1 << 3,
 	MANAGE_CHANNELS: 1 << 4,
@@ -401,7 +426,7 @@ const permissions = {
 /**
  * Check if a permission is included in the BitField
  * @param {String|Number} all - BitField of multiple permissions
- * @param {String?} permission - Name of the permission to check for
+ * @param {String} permission - Name of the permission to check for
  * @param {Boolean} [admin] - If administrator permission can overwrite
  * @returns {Boolean}
  */

+ 2 - 2
main.js

@@ -2,7 +2,7 @@ require('dotenv').config();
 const child_process = require('child_process');
 
 const isDebug = ( process.argv[2] === 'debug' );
-process.env.READONLY = ( process.argv[2] === 'readonly' );
+if ( process.argv[2] === 'readonly' ) process.env.READONLY = true;
 const got = require('got').extend( {
 	throwHttpErrors: false,
 	timeout: 30000,
@@ -57,7 +57,7 @@ manager.spawn().then( shards => {
 		for ( let [key, value] of Object.entries(botList) ) {
 			if ( !value ) delete botList[key];
 		}
-		if ( Object.keys(botlist).length ) {
+		if ( Object.keys(botList).length ) {
 			setInterval( postStats, 10800000, botList, shards.size ).unref();
 		}
 	}

+ 2 - 2
util/database.js

@@ -34,7 +34,7 @@ function getSettings(trysettings = 1) {
 						console.log( '- ' + shardId + ': Error while creating the patreons table: ' + error );
 						return error;
 					}
-					console.log( '- Created the patreons table.' );
+					console.log( '- ' + shardId + ': Created the patreons table.' );
 					db.run( 'CREATE INDEX idx_patreons_patreon ON patreons(patreon)', [], function (idxerror) {
 						if ( idxerror ) {
 							console.log( '- ' + shardId + ': Error while creating the patreons index: ' + idxerror );
@@ -48,7 +48,7 @@ function getSettings(trysettings = 1) {
 						console.log( '- ' + shardId + ': Error while creating the discord table: ' + error );
 						return error;
 					}
-					console.log( '- Created the discord table.' );
+					console.log( '- ' + shardId + ': Created the discord table.' );
 					db.run( 'CREATE TRIGGER unique_discord_guild BEFORE INSERT ON discord WHEN NEW.channel IS NULL BEGIN SELECT CASE WHEN (SELECT 1 FROM discord WHERE guild = NEW.guild AND channel IS NULL) IS NOT NULL THEN RAISE(ABORT, "UNIQUE constraint failed: discord.guild, discord.channel") END; END;', [], function (tgerror) {
 						if ( tgerror ) {
 							console.log( '- ' + shardId + ': Error while creating the discord guild trigger: ' + tgerror );