Browse Source

multiple improvements

Markus-Rost 6 years ago
parent
commit
1ece9728e6
1 changed files with 96 additions and 59 deletions
  1. 96 59
      main.js

+ 96 - 59
main.js

@@ -11,6 +11,7 @@ var i18n = JSON.parse(fs.readFileSync('i18n.json', 'utf8').trim());
 var minecraft = JSON.parse(fs.readFileSync('minecraft.json', 'utf8').trim());
 
 var pause = {};
+var defaultPermissions = new Discord.Permissions(268954688).toArray();
 
 var defaultSettings = {
 	"default": {
@@ -26,7 +27,7 @@ function getSettings(callback) {
 		json: true
 	}, function( error, response, body ) {
 		if ( error || !response || !body || body.error ) {
-			console.log( '- Fehler beim Erhalten der Einstellungen' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error : '.' ) : '.' ) ) );
+			console.log( '- Fehler beim Erhalten der Einstellungen' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error : '.' ) : '.' ) ) );
 		}
 		else {
 			console.log( '- Einstellungen erfolgreich ausgelesen.' );
@@ -38,13 +39,34 @@ function getSettings(callback) {
 
 function setStatus() {
 	if ( settings == defaultSettings ) client.user.setStatus('invisible');
-	else client.user.setStatus('online');
+	else {
+		client.user.setStatus('online');
+		client.user.setActivity( process.env.prefix + ' help' );
+	}
+}
+
+var defaultSites = [];
+var allSites = defaultSites;
+
+function getAllSites() {
+	request( {
+		uri: 'https://help.gamepedia.com/api.php?action=allsites&format=json&formatversion=2&do=getSiteStats&filter=wikis|wiki_domain,wiki_display_name,official_wiki,wiki_managers',
+		json: true
+	}, function( error, response, body ) {
+		if ( error || !response || !body || body.status != 'okay' || !body.data || !body.data.wikis ) {
+			console.log( '- Fehler beim Erhalten der Wikis' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+		}
+		else {
+			console.log( '- Wikis erfolgreich ausgelesen.' );
+			allSites = Object.assign([], body.data.wikis.filter( site => /^[a-z\d-]+\.gamepedia\.com$/.test(site.wiki_domain) ));
+		}
+	} );
 }
 
 client.on('ready', () => {
 	getSettings(setStatus);
+	getAllSites();
 	console.log( '- Erfolgreich als ' + client.user.username + ' angemeldet!' );
-	client.user.setActivity( process.env.prefix + ' help' );
 } );
 
 dbl.on('posted', () => {
@@ -63,7 +85,7 @@ dbl.on('posted', () => {
 } );
 
 dbl.on('error', error => {
-	console.log( '--- DBL-ERROR: ' + new Date(Date.now()).toLocaleTimeString('de-DE', { timeZone: 'Europe/Berlin' }) + ' ---\n- ' + error.name + ': ' + error.message );
+	console.log( '--- DBL-ERROR: ' + new Date(Date.now()).toLocaleTimeString('de-DE', { timeZone: 'Europe/Berlin' }) + ' ---\n- ' + error );
 } );
 
 
@@ -109,26 +131,25 @@ var minecraftcmdmap = {
 function cmd_settings(lang, msg, args, line) {
 	if ( admin(msg) ) {
 		if ( msg.guild.id in settings ) {
-			var text = lang.settings.current.replace( '%s', '- `' + process.env.prefix + ' settings lang`' ) + ' https://' + settings[msg.guild.id].wiki + '.gamepedia.com/ - `' + process.env.prefix + ' settings wiki`';
+			var text = lang.settings.current.replace( '%1$s', '- `' + process.env.prefix + ' settings lang`' ).replace( '%2$s', 'https://' + settings[msg.guild.id].wiki + '.gamepedia.com/ - `' + process.env.prefix + ' settings wiki`' ) + ' - `' + process.env.prefix + ' settings channel`\n';
 			if ( settings[msg.guild.id].channels ) {
-				text += '\n' + lang.settings.currentchannel + ' - `' + process.env.prefix + ' settings channel`';
 				Object.keys(settings[msg.guild.id].channels).forEach( function(channel) {
-					text += '\n<#' + channel + '>: <https://' + settings[msg.guild.id].channels[channel] + '.gamepedia.com/>';
+					text += '<#' + channel + '>: <https://' + settings[msg.guild.id].channels[channel] + '.gamepedia.com/>\n';
 				} );
-			}
+			} else text += lang.settings.nochannels;
 		} else {
 			var text = lang.settings.missing.replace( '%1$s', '`' + process.env.prefix + ' settings lang`' ).replace( '%2$s', '`' + process.env.prefix + ' settings wiki`' );
 		}
 		if ( args.length ) {
 			if ( args[0] ) args[0] = args[0].toLowerCase();
-			if ( args[1] ) args[1] = args[1].toLowerCase();
+			if ( args[1] ) args[1] = args.slice(1).join(' ').toLowerCase();
 			var langs = '\n' + lang.settings.langhelp.replace( '%s', process.env.prefix + ' settings lang' ) + ' `' + i18n.allLangs[1].join(', ') + '`';
 			var wikis = '\n' + lang.settings.wikihelp.replace( '%s', process.env.prefix + ' settings wiki' );
 			var channels = '\n' + lang.settings.wikihelp.replace( '%s', process.env.prefix + ' settings channel' );
 			var nolangs = lang.settings.langinvalid + langs;
 			var nowikis = lang.settings.wikiinvalid + wikis;
 			var nochannels = lang.settings.wikiinvalid + channels;
-			var regex = /^(?:(?:https?:)?\/\/)?([a-z\d-]{1,30})(?:\.gamepedia\.com|$)/
+			var regex = /^(?:(?:https?:)?\/\/)?([a-z\d-]{1,30})\.gamepedia\.com/
 			if ( msg.guild.id in settings ) {
 				var current	= args[0] + ( line == 'changed' ? line : '' );
 				if ( args[0] == 'lang' ) {
@@ -139,12 +160,12 @@ function cmd_settings(lang, msg, args, line) {
 				} else if ( args[0] == 'wiki' ) {
 					if ( args[1] ) {
 						if ( regex.test(args[1]) ) edit_settings(lang, msg, 'wiki', regex.exec(args[1])[1]);
-						else msg.reply( nowikis );
+						else find_wikis(lang, msg, 'wiki', args[1].split(' '), nowikis);
 					} else msg.reply( lang.settings[current] + ' https://' + settings[msg.guild.id].wiki + '.gamepedia.com/' + wikis );
 				} else if ( args[0] == 'channel' ) {
 					if ( args[1] ) {
 						if ( regex.test(args[1]) ) edit_settings(lang, msg, 'channel', regex.exec(args[1])[1]);
-						else msg.reply( nochannels );
+						else find_wikis(lang, msg, 'channel', args[1].split(' '), nochannels);
 					} else if ( settings[msg.guild.id].channels && msg.channel.id in settings[msg.guild.id].channels ) {
 						msg.reply( lang.settings[current] + ' https://' + settings[msg.guild.id].channels[msg.channel.id] + '.gamepedia.com/' + channels );
 					} else msg.reply( lang.settings[current] + ' https://' + settings[msg.guild.id].wiki + '.gamepedia.com/' + channels );
@@ -155,10 +176,10 @@ function cmd_settings(lang, msg, args, line) {
 						if ( args[1] in i18n.allLangs[0] ) edit_settings(lang, msg, 'lang', i18n.allLangs[0][args[1]]);
 						else msg.reply( nolangs );
 					} else msg.reply( lang.settings.lang + langs );
-				} else if ( args[0] == 'wiki' ) {
+				} else if ( args[0] == 'wiki' || args[0] == 'channel' ) {
 					if ( args[1] ) {
 						if ( regex.test(args[1]) ) edit_settings(lang, msg, 'wiki', regex.exec(args[1])[1]);
-						else msg.reply( nowikis );
+						else find_wikis(lang, msg, 'wiki', args[1].split(' '), nowikis);
 					} else msg.reply( lang.settings.wikimissing + wikis );
 				} else msg.reply( text );
 			}
@@ -168,14 +189,26 @@ function cmd_settings(lang, msg, args, line) {
 	}
 }
 
+function find_wikis(lang, msg, key, value, text) {
+	if ( allSites.find( site => site.wiki_domain == value.join('') + '.gamepedia.com' ) ) edit_settings(lang, msg, key, value.join(''));
+	else {
+		var sites = allSites.filter( site => site.wiki_display_name.toLowerCase().includes( value.join(' ') ) );
+		if ( 0 < sites.length && sites.length < 21 ) {
+			text += '\n\n' + lang.settings.foundwikis;
+			sites.forEach( function(site) {
+				text += '\n' + site.wiki_display_name + ': `' + site.wiki_domain + '`';
+			} );
+		}
+		msg.reply( text, {split:true} );
+	}
+}
+
 function edit_settings(lang, msg, key, value) {
-	var hourglass;
 	msg.reactEmoji('⏳').then( function( reaction ) {
-		hourglass = reaction;
 		if ( settings == defaultSettings ) {
 			console.log( '- Fehler beim Erhalten bestehender Einstellungen.' );
 			msg.reply( lang.settings.save_failed );
-			if ( hourglass != undefined ) hourglass.remove();
+			reaction.removeEmoji();
 		}
 		else {
 			var temp_settings = Object.assign({}, settings);
@@ -213,7 +246,7 @@ function edit_settings(lang, msg, key, value) {
 				json: true
 			}, function( error, response, body ) {
 				if ( error || !response || response.statusCode != 201 || !body || body.error ) {
-					console.log( '- Fehler beim Bearbeiten' + ( error ? ': ' + error.message : ( body ? ( body.message ? ': ' + body.message : ( body.error ? ': ' + body.error : '.' ) ) : '.' ) ) );
+					console.log( '- Fehler beim Bearbeiten' + ( error ? ': ' + error : ( body ? ( body.message ? ': ' + body.message : ( body.error ? ': ' + body.error : '.' ) ) : '.' ) ) );
 					msg.reply( lang.settings.save_failed );
 				}
 				else {
@@ -223,7 +256,7 @@ function edit_settings(lang, msg, key, value) {
 					console.log( '- Einstellungen erfolgreich aktualisiert.' );
 				}
 				
-				if ( hourglass != undefined ) hourglass.remove();
+				reaction.removeEmoji();
 			} );
 		}
 	} );
@@ -304,11 +337,11 @@ function cmd_say(lang, msg, args, line) {
 			try {
 				text = eval( '`' + text + '`' );
 			} catch ( error ) {
-				console.log( '- ' + error.name + ': ' + error.message );
+				console.log( '- ' + error );
 			}
 		}
 		if ( text || imgs[0] ) {
-			msg.channel.send( text, {disableEveryone:!msg.member.hasPermission(['MENTION_EVERYONE']),files:imgs} ).then( message => msg.delete().catch( error => console.log( '- ' + error.name + ': ' + error.message ) ), error => msg.reactEmoji('error') );
+			msg.channel.send( text, {disableEveryone:!msg.member.hasPermission(['MENTION_EVERYONE']),files:imgs} ).then( message => msg.delete().catch( error => console.log( '- ' + error ) ), error => msg.reactEmoji('error') );
 		}
 	} else {
 		msg.reactEmoji('❌');
@@ -316,7 +349,9 @@ function cmd_say(lang, msg, args, line) {
 }
 
 function cmd_test(lang, msg, args, line) {
-	if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) {
+	if ( args.length ) {
+		cmd_link(lang, msg, line.split(' ').slice(1).join(' '), lang.link, ' ');
+	} else if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) {
 		var text = lang.test.default;
 		var x = Math.floor(Math.random() * lang.test.random);
 		if ( x < lang.test.text.length ) text = lang.test.text[x];
@@ -332,7 +367,7 @@ function cmd_invite(lang, msg, args, line) {
 	if ( args.length ) {
 		cmd_link(lang, msg, line.split(' ').slice(1).join(' '), lang.link, ' ');
 	} else {
-		client.generateInvite(268954688).then( invite => msg.channel.send( lang.invite.bot + '\n<' + invite + '>' ) );
+		client.generateInvite(defaultPermissions).then( invite => msg.channel.send( lang.invite.bot + '\n<' + invite + '>' ) );
 	}
 }
 
@@ -341,11 +376,11 @@ function cmd_eval(lang, msg, args, line) {
 		try {
 			var text = eval( args.join(' ') );
 		} catch ( error ) {
-			var text = error.name + ': ' + error.message;
+			var text = error.toString();
 		}
 		console.log( text );
 		if ( text == '[object Promise]' ) msg.reactEmoji('✅');
-		else msg.channel.send( '```js\n' + text + '\n```', {split:{prepend:'```js\n',append:'\n```'}} ).catch( err => msg.channel.send( '```js\n' + err.name + ': ' + err.message + '\n```', {split:{prepend:'```js\n',append:'\n```'}} ) );
+		else msg.channel.send( '```js\n' + text + '\n```', {split:{prepend:'```js\n',append:'\n```'}} ).catch( err => console.log( '- ' + err ) );
 	} else if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) {
 		msg.reactEmoji('❌');
 	}
@@ -400,6 +435,10 @@ function cmd_delete(lang, msg, args, line) {
 
 function cmd_link(lang, msg, title, wiki, cmd) {
 	if ( cmd == ' ' && admin(msg) && !( msg.guild.id in settings ) ) cmd_settings(lang, msg, [], '');
+	if ( title != title.substr(0, 300) ) {
+		title = title.substr(0, 300);
+		msg.reactEmoji('⚠');
+	}
 	var invoke = title.split(' ')[0].toLowerCase();
 	var args = title.split(' ').slice(1);
 	
@@ -421,9 +460,7 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 	else if ( invoke.startsWith(lang.search.user.male + ':') ) cmd_user(lang, msg, title.substr(lang.search.user.male.length + 1).toTitle(), wiki, title.toTitle());
 	else if ( invoke.startsWith(lang.search.user.female + ':') ) cmd_user(lang, msg, title.substr(lang.search.user.female.length + 1).toTitle(), wiki, title.toTitle());
 	else {
-		var hourglass;
 		msg.reactEmoji('⏳').then( function( reaction ) {
-			hourglass = reaction;
 			request( {
 				uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&format=json&meta=siteinfo&siprop=general&iwurl=true&redirects=true&titles=' + encodeURI( title ),
 				json: true
@@ -434,8 +471,8 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 						msg.reactEmoji('nowiki');
 					}
 					else {
-						console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
-						msg.channel.send( 'https://' + wiki + '.gamepedia.com/Special:Search/' + title.toTitle() ).then( message => message.reactEmoji('error') );
+						console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+						msg.channel.send( '<https://' + wiki + '.gamepedia.com/Special:Search/' + title.toTitle() + '>' ).then( message => message.reactEmoji('error') );
 					}
 				}
 				else {
@@ -446,8 +483,8 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 								json: true
 							}, function( srerror, srresponse, srbody ) {
 								if ( srerror || !srresponse || !srbody || !srbody.query || ( !srbody.query.search[0] && srbody.query.searchinfo.totalhits != 0 ) ) {
-									console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( srerror ? ': ' + srerror.message : ( srbody ? ( srbody.error ? ': ' + srbody.error.info : '.' ) : '.' ) ) );
-									msg.channel.send( 'https://' + wiki + '.gamepedia.com/Special:Search/' + title.toTitle() ).then( message => message.reactEmoji('error') );
+									console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( srerror ? ': ' + srerror : ( srbody ? ( srbody.error ? ': ' + srbody.error.info : '.' ) : '.' ) ) );
+									msg.channel.send( '<https://' + wiki + '.gamepedia.com/Special:Search/' + title.toTitle() + '>' ).then( message => message.reactEmoji('error') );
 								}
 								else {
 									if ( srbody.query.searchinfo.totalhits == 0 ) {
@@ -480,7 +517,7 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 					}
 				}
 				
-				if ( hourglass != undefined ) hourglass.remove();
+				reaction.removeEmoji();
 			} );
 		} );
 	}
@@ -527,7 +564,7 @@ function cmd_umfrage(lang, msg, args, line) {
 
 function cmd_sendumfrage(lang, msg, args, reactions, imgs, i) {
 	msg.channel.send( lang.poll.title + args.slice(i).join(' '), {disableEveryone:!msg.member.hasPermission(['MENTION_EVERYONE']),files:imgs} ).then( poll => {
-		msg.delete().catch( error => console.log( '- ' + error.name + ': ' + error.message ) );
+		msg.delete().catch( error => console.log( '- ' + error ) );
 		if ( reactions.length ) {
 			reactions.forEach( function(entry) {
 				poll.react(entry).catch( error => poll.reactEmoji('error') );
@@ -543,9 +580,7 @@ function cmd_user(lang, msg, username, wiki, title) {
 	if ( !username || username.includes( '/' ) || username.toLowerCase().startsWith('talk:') || username.toLowerCase().startsWith(lang.user.talk) ) {
 		msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + title );
 	} else {
-		var hourglass;
 		msg.reactEmoji('⏳').then( function( reaction ) {
-			hourglass = reaction;
 			request( {
 				uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&format=json&list=users&usprop=blockinfo|groups|editcount|registration|gender&ususers=' + encodeURI( username ),
 				json: true
@@ -556,7 +591,7 @@ function cmd_user(lang, msg, username, wiki, title) {
 						msg.reactEmoji('nowiki');
 					}
 					else {
-						console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+						console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
 						msg.channel.send( '<https://' + wiki + '.gamepedia.com/User:' + username + '>' ).then( message => message.reactEmoji('error') );
 					}
 				}
@@ -591,8 +626,10 @@ function cmd_user(lang, msg, username, wiki, title) {
 						var groups = body.query.users[0].groups;
 						var group = '';
 						for ( var i = 0; i < lang.user.group.length; i++ ) {
-							if ( groups.includes(lang.user.group[i][0]) ) {
-								group = lang.user.group[i][1];
+							if ( groups.includes( lang.user.group[i][0] ) ) {
+								var thisSite = allSites.find( site => site.wiki_domain == wiki + '.gamepedia.com' );
+								if ( lang.user.group[i][0] == 'hydra_staff' && thisSite && thisSite.wiki_managers.includes( username.replace( /\_/g, ' ' ) ) ) group = lang.user.manager;
+								else group = lang.user.group[i][1];
 								break;
 							}
 						}
@@ -613,7 +650,7 @@ function cmd_user(lang, msg, username, wiki, title) {
 					}
 				}
 				
-				if ( hourglass != undefined ) hourglass.remove();
+				reaction.removeEmoji();
 			} );
 		} );
 	}
@@ -658,9 +695,7 @@ function cmd_diff(lang, msg, args, wiki) {
 			cmd_diffsend(lang, msg, argids, wiki);
 		}
 		else {
-			var hourglass;
 			msg.reactEmoji('⏳').then( function( reaction ) {
-				hourglass = reaction;
 				request( {
 					uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&format=json&prop=revisions&rvprop=' + ( title ? '&titles=' + title : '&revids=' + revision ) + '&rvdiffto=' + diff,
 					json: true
@@ -671,7 +706,7 @@ function cmd_diff(lang, msg, args, wiki) {
 							msg.reactEmoji('nowiki');
 						}
 						else {
-							console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+							console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
 							msg.channel.send( '<https://' + wiki + '.gamepedia.com/' + title + '?diff=' + diff + ( title ? '' : '&oldid=' + revision ) + '>' ).then( message => message.reactEmoji('error') );
 						}
 					}
@@ -692,7 +727,7 @@ function cmd_diff(lang, msg, args, wiki) {
 						else msg.reactEmoji('error');
 					}
 					
-					if ( hourglass != undefined ) hourglass.remove();
+					reaction.removeEmoji();
 				} );
 			} );
 		}
@@ -711,7 +746,7 @@ function cmd_diffsend(lang, msg, args, wiki) {
 				msg.reactEmoji('nowiki');
 			}
 			else {
-				console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+				console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
 				msg.channel.send( '<https://' + wiki + '.gamepedia.com/?diff=' + args[0] + ( args[1] ? '&oldid=' + args[1] : '' ) + '>' ).then( message => message.reactEmoji('error') );
 			}
 		}
@@ -762,9 +797,7 @@ function cmd_diffsend(lang, msg, args, wiki) {
 }
 
 function cmd_random(lang, msg, wiki) {
-	var hourglass;
 	msg.reactEmoji('⏳').then( function( reaction ) {
-		hourglass = reaction;
 		request( {
 			uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&format=json&list=random&rnnamespace=0',
 			json: true
@@ -775,24 +808,22 @@ function cmd_random(lang, msg, wiki) {
 					msg.reactEmoji('nowiki');
 				}
 				else {
-					console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
-					msg.channel.send( 'https://' + wiki + '.gamepedia.com/Special:Random' ).then( message => message.reactEmoji('error') );
+					console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+					msg.channel.send( '<https://' + wiki + '.gamepedia.com/Special:Random>' ).then( message => message.reactEmoji('error') );
 				}
 			}
 			else {
 				msg.channel.send( '🎲 https://' + wiki + '.gamepedia.com/' + body.query.random[0].title.toTitle() );
 			}
 			
-			if ( hourglass != undefined ) hourglass.remove();
+			reaction.removeEmoji();
 		} );
 	} );
 }
 
 function cmd_bug(lang, mclang, msg, args, title, cmd) {
 	if ( args.length && /\d+$/.test(args[0]) && !args[1] ) {
-		var hourglass;
 		msg.reactEmoji('⏳').then( function( reaction ) {
-			hourglass = reaction;
 			var project = '';
 			if ( /^\d+$/.test(args[0]) ) project = 'MC-';
 			request( {
@@ -800,7 +831,7 @@ function cmd_bug(lang, mclang, msg, args, title, cmd) {
 				json: true
 			}, function( error, response, body ) {
 				if ( error || !response || !body || body['status-code'] == 404 ) {
-					console.log( '- Fehler beim Erhalten der Zusammenfassung' + ( error ? ': ' + error.message : ( body ? ': ' + body.message : '.' ) ) );
+					console.log( '- Fehler beim Erhalten der Zusammenfassung' + ( error ? ': ' + error : ( body ? ': ' + body.message : '.' ) ) );
 					if ( body && body['status-code'] == 404 ) msg.reactEmoji('error');
 					else msg.channel.send( 'https://bugs.mojang.com/browse/' + project + args[0] ).then( message => message.reactEmoji('error') );
 				}
@@ -821,7 +852,7 @@ function cmd_bug(lang, mclang, msg, args, title, cmd) {
 					}
 				}
 				
-				if ( hourglass != undefined ) hourglass.remove();
+				reaction.removeEmoji();
 			} );
 		} );
 	}
@@ -871,7 +902,7 @@ function cmd_get(lang, msg, args, line) {
 	if ( msg.author.id == process.env.owner && /^\d+$/.test(id) ) {
 		if ( client.guilds.has(id) ) {
 			var guild = client.guilds.get(id);
-			var permissions = ( guild.me.permissions.has(268954688) ? '*none*' : '`' + guild.me.permissions.missing(new Discord.Permissions(268954688).toArray()).join('`, `') + '`' );
+			var permissions = ( guild.me.permissions.has(defaultPermissions) ? '*none*' : '`' + guild.me.permissions.missing(defaultPermissions).join('`, `') + '`' );
 			var guildsettings = ( guild.id in settings ? '```json\n' + JSON.stringify( settings[guild.id], null, '\t' ) + '\n```' : '*default*' );
 			msg.channel.send( 'Guild: ' + guild.name + ' `' + guild.id + '`\nOwner: ' + guild.owner.user.tag + ' `' + guild.ownerID + '` ' + guild.owner.toString() + '\nMissing permissions: ' + permissions + '\nSettings: ' + guildsettings, {split:true} );
 		} else if ( client.guilds.some( guild => guild.members.has(id) ) ) {
@@ -884,7 +915,7 @@ function cmd_get(lang, msg, args, line) {
 			msg.channel.send( text, {split:true} );
 		} else if ( client.guilds.some( guild => guild.channels.filter( chat => chat.type == 'text' ).has(id) ) ) {
 			var channel = client.guilds.find( guild => guild.channels.filter( chat => chat.type == 'text' ).has(id) ).channels.get(id);
-			var permissions = ( channel.memberPermissions(channel.guild.me).has(268954688) ? '*none*' : '`' + channel.memberPermissions(channel.guild.me).missing(new Discord.Permissions(268954688).toArray()).join('`, `') + '`' );
+			var permissions = ( channel.memberPermissions(channel.guild.me).has(defaultPermissions) ? '*none*' : '`' + channel.memberPermissions(channel.guild.me).missing(defaultPermissions).join('`, `') + '`' );
 			var wiki = ( channel.guild.id in settings ? ( settings[channel.guild.id].channels && channel.id in settings[channel.guild.id].channels ? settings[channel.guild.id].channels[channel.id] : settings[channel.guild.id].wiki ) : settings['default'].wiki );
 			msg.channel.send( 'Guild: ' + channel.guild.name + ' `' + channel.guild.id + '`\nChannel: #' + channel.name + ' `' + channel.id + '` ' + channel.toString() + '\nMissing permissions: ' + permissions + '\nDefault Wiki: `' + wiki + '`', {split:true} );
 		} else msg.reply( 'I couldn\'t find a result for `' + id + '`' );
@@ -892,6 +923,7 @@ function cmd_get(lang, msg, args, line) {
 }
 
 function mention(msg, arg) {
+	arg = arg.trim();
 	if ( arg == '@' + client.user.username || ( msg.channel.type == 'text' && arg == '@' + msg.guild.me.displayName ) ) return true;
 	else return false;
 }
@@ -950,9 +982,12 @@ Object.prototype.reactEmoji = function(name) {
 		default:
 			emoji = name;
 	}
-	return this.react(emoji).catch( error => console.log( '- ' + error.name + ': ' + error.message ) );
+	return this.react(emoji).catch( error => console.log( '- ' + error ) );
 };
 
+Object.prototype.removeEmoji = function() {
+	return this.remove().catch( error => console.log( '- ' + error ) );
+};
 
 function prefix(text) {
 	if ( text.toLowerCase().startsWith( process.env.prefix + ' ' ) || text.toLowerCase() == process.env.prefix ) return true;
@@ -964,9 +999,10 @@ client.on('message', msg => {
 	var author = msg.author;
 	var channel = msg.channel;
 	if ( channel.type == 'text' ) var permissions = channel.permissionsFor(client.user);
-	else var permissions = new Discord.Permissions(0);
+	
 	if ( cont.toLowerCase().includes( process.env.prefix ) && !msg.webhookID && author.id != client.user.id ) {
 		if ( settings == defaultSettings ) getSettings(setStatus);
+		if ( allSites == defaultSites ) getAllSites();
 		var setting = Object.assign({}, settings['default']);
 		if ( channel.type == 'text' && msg.guild.id in settings ) setting = Object.assign({}, settings[msg.guild.id]);
 		var lang = i18n[setting.lang];
@@ -1018,6 +1054,7 @@ client.on('message', msg => {
 
 client.on('voiceStateUpdate', (oldm, newm) => {
 	if ( settings == defaultSettings ) getSettings(setStatus);
+	if ( allSites == defaultSites ) getAllSites();
 	if ( oldm.guild.me.permissions.has('MANAGE_ROLES') && oldm.voiceChannelID != newm.voiceChannelID ) {
 		var setting = Object.assign({}, settings['default']);
 		if ( oldm.guild.id in settings ) setting = Object.assign({}, settings[oldm.guild.id]);
@@ -1076,7 +1113,7 @@ client.on('guildDelete', guild => {
 			json: true
 		}, function( error, response, body ) {
 			if ( error || !response || response.statusCode != 201 || !body || body.error ) {
-				console.log( '- Fehler beim Bearbeiten' + ( error ? ': ' + error.message : ( body ? ( body.message ? ': ' + body.message : ( body.error ? ': ' + body.error : '.' ) ) : '.' ) ) );
+				console.log( '- Fehler beim Bearbeiten' + ( error ? ': ' + error : ( body ? ( body.message ? ': ' + body.message : ( body.error ? ': ' + body.error : '.' ) ) : '.' ) ) );
 			}
 			else {
 				settings = Object.assign({}, temp_settings);
@@ -1091,5 +1128,5 @@ client.login(process.env.token);
 
 
 client.on('error', error => {
-	console.log( '--- ERROR: ' + new Date(Date.now()).toLocaleTimeString('de-DE', { timeZone: 'Europe/Berlin' }) + ' ---\n- ' + error.name + ': ' + error.message );
+	console.log( '--- ERROR: ' + new Date(Date.now()).toLocaleTimeString('de-DE', { timeZone: 'Europe/Berlin' }) + ' ---\n- ' + error );
 });