Browse Source

Added `!wiki overview` and many more improvements

Markus-Rost 6 years ago
parent
commit
657d238eff
4 changed files with 369 additions and 135 deletions
  1. 2 1
      README.md
  2. 135 3
      i18n.json
  3. 186 131
      main.js
  4. 46 0
      wiki_manager.json

+ 2 - 1
README.md

@@ -2,7 +2,7 @@
 <a href="https://discordbots.org/bot/461189216198590464"><img align="right" src="https://discordbots.org/api/widget/461189216198590464.svg" alt="Wiki-Bot"></a>
 **Wiki-Bot** is a bot for [Discord](https://discordapp.com/) with the purpose to easily link to [Gamepedia wikis](https://www.gamepedia.com/).
 <br>He resolves redirects and follows interwiki links.
-<br>**Wiki-Bot** has translations for English, German, French, Polish, Turkish and Brazilian Portuguese.
+<br>**Wiki-Bot** has translations for English, German, French, Polish, Turkish and Portuguese.
 
 **Wiki-Bot is not affiliated with Curse/Gamepedia and is an unofficial tool!**
 
@@ -21,6 +21,7 @@ For a full list with all commands use `!wiki help`
 | `!wiki diff <diff> [<oldid>]` | **Wiki-Bot** will answer with a link to the diff in the wiki. |
 | `!wiki diff <page name>` | **Wiki-Bot** will answer with a link to the last diff on the article in the wiki. |
 | `!wiki random` | **Wiki-Bot** will answer with a link to a random page in the wiki. |
+| `!wiki overview` | **Wiki-Bot** will show some information and statistics about the wiki. |
 | `!wiki page <page name>` | **Wiki-Bot** will answer with a link to the article in the wiki. |
 | `!wiki search <search term>` | **Wiki-Bot** will answer with a link to the search page for the article in the wiki. |
 | `!wiki info` | **Wiki-Bot** will introduce himself. |

+ 135 - 3
i18n.json

@@ -67,6 +67,21 @@
 			"join": "%1$s joined the voice channel \"%2$s\".",
 			"left": "%1$s left the voice channel \"%2$s\"."
 		},
+		"overview": {
+			"missing": "for this wiki is no overview available yet.",
+			"inaccurate": "Statistics may be inaccurate",
+			"name": "Full name:",
+			"created": "Created:",
+			"manager": "Wiki manager:",
+			"talk": "talk",
+			"official": "Official wiki:",
+			"yes": "Yes",
+			"no": "No",
+			"articles": "Articles:",
+			"pages": "Total pages:",
+			"edits": "Edits:",
+			"users": "Active users:"
+		},
 		"user": {
 			"gender": {
 				"unknown": "Unknown",
@@ -121,6 +136,8 @@
 		"search": {
 			"page": "page",
 			"search": "search",
+			"random": "random",
+			"overview": "overview",
 			"infopage": "Not the correct result? Use %s for a direct link.",
 			"infosearch": "Not the correct result? Use %1$s for a direct link or %2$s for a list of all hits."
 		},
@@ -159,6 +176,7 @@
 				{ "cmd": "diff <page name>", "desc": "I will answer with a link to the last diff on the article in the wiki." },
 				{ "cmd": "random", "desc": "I will answer with a link to a random page in the wiki." },
 				{ "cmd": "🎲", "desc": "I will answer with a link to a random page in the wiki.", "hide": true },
+				{ "cmd": "overview", "desc": "I will show some information and statistics about the wiki." },
 				{ "cmd": "/<Minecraft command>", "desc": "I will answer with the syntax of the Minecraft command and a link to the article for the command in the Minecraft Wiki.", "unsearchable": true, "minecraft": true },
 				{ "cmd": "command <Minecraft command>", "desc": "I will answer with the syntax of the Minecraft command and a link to the article for the command in the Minecraft Wiki.", "hide": true, "minecraft": true },
 				{ "cmd": "cmd <Minecraft command>", "desc": "I will answer with the syntax of the Minecraft command and a link to the article for the command in the Minecraft Wiki.", "hide": true, "minecraft": true },
@@ -223,6 +241,21 @@
 			"join": "%1$s hat den Sprachkanal \"%2$s\" betreten.",
 			"left": "%1$s hat den Sprachkanal \"%2$s\" verlassen."
 		},
+		"overview": {
+			"missing": "für dieses Wiki ist noch keine Übersicht verfügbar.",
+			"inaccurate": "Statistiken können ungenau sein",
+			"name": "Vollständiger Name:",
+			"created": "Erstellt:",
+			"manager": "Wiki-Manager:",
+			"talk": "Diskussion",
+			"official": "Offizielles Wiki:",
+			"yes": "Ja",
+			"no": "Nein",
+			"articles": "Artikel:",
+			"pages": "Seiten insgesamt:",
+			"edits": "Bearbeitungen:",
+			"users": "Aktive Benutzer:"
+		},
 		"user": {
 			"gender": {
 				"unknown": "Unbekannt",
@@ -277,6 +310,8 @@
 		"search": {
 			"page": "seite",
 			"search": "suche",
+			"random": "zufall",
+			"overview": "übersicht",
 			"infopage": "Nicht das richtige Ergebnis? Nutze %s für einen direkten Link.",
 			"infosearch": "Nicht das richtige Ergebnis? Nutze %1$s für einen direkten Link oder %2$s für eine Liste mit allen Treffern."
 		},
@@ -314,8 +349,11 @@
 				{ "cmd": "Benutzer:<Benutzername>", "desc": "Ich liste ein paar Informationen über den Benutzer auf.", "unsearchable": true },
 				{ "cmd": "diff <diff> [<oldid>]", "desc": "Ich verlinke auf die Änderung im Wiki." },
 				{ "cmd": "diff <Seitenname>", "desc": "Ich verlinke auf die letzte Änderung an der Seite im Wiki." },
-				{ "cmd": "random", "desc": "Ich antworte mit einem Link auf eine zufällige Seite im Wiki." },
+				{ "cmd": "zufall", "desc": "Ich antworte mit einem Link auf eine zufällige Seite im Wiki." },
+				{ "cmd": "random", "desc": "Ich antworte mit einem Link auf eine zufällige Seite im Wiki.", "hide": true },
 				{ "cmd": "🎲", "desc": "Ich antworte mit einem Link auf eine zufällige Seite im Wiki.", "hide": true },
+				{ "cmd": "übersicht", "desc": "Ich liste ein paar Informationen und Statistiken über das Wiki auf." },
+				{ "cmd": "overview", "desc": "Ich liste ein paar Informationen und Statistiken über das Wiki auf.", "hide": true },
 				{ "cmd": "/<Minecraft-Befehl>", "desc": "Ich antworte mit der Syntax des angegebenen Minecraft-Befehls und einem Link auf den Artikel zu diesem Befehl im Minecraft Wiki.", "unsearchable": true, "minecraft": true },
 				{ "cmd": "befehl <Minecraft-Befehl>", "desc": "Ich antworte mit der Syntax des angegebenen Minecraft-Befehls und einem Link auf den Artikel zu diesem Befehl im Minecraft Wiki.", "hide": true, "minecraft": true },
 				{ "cmd": "command <Minecraft-Befehl>", "desc": "Ich antworte mit der Syntax des angegebenen Minecraft-Befehls und einem Link auf den Artikel zu diesem Befehl im Minecraft Wiki.", "hide": true, "minecraft": true },
@@ -390,6 +428,21 @@
 			"join": "%1$s a rejoint le salon vocal \"%2$s\".",
 			"left": "%1$s a quitté le salon vocal \"%2$s\"."
 		},
+		"overview": {
+			"missing": "il n'y a pas encore d'aperçu disponible pour ce wiki.",
+			"inaccurate": "Les statistiques peuvent être inexactes",
+			"name": "Nom complet :",
+			"created": "Créé :",
+			"manager": "Gestionnaire de wiki :",
+			"talk": "discussion",
+			"official": "Wiki officiel :",
+			"yes": "Oui",
+			"no": "Non",
+			"articles": "Articles :",
+			"pages": "Nombre de pages total :",
+			"edits": "Modifications :",
+			"users": "Utilisateurs actifs :"
+		},
 		"user": {
 			"gender": {
 				"unknown": "Inconnu",
@@ -444,6 +497,8 @@
 		"search": {
 			"page": "page",
 			"search": "chercher",
+			"random": "random",
+			"overview": "overview",
 			"infopage": "Pas le bon résultat ? Utilisez %s pour un lien direct.",
 			"infosearch": "Pas le bon résultat ? Utilisez %1$s pour un lien direct ou %2$s pour une liste de toutes les correspondances."
 		},
@@ -459,13 +514,35 @@
 			"big": "le nombre spécifié est trop grand. Le maximum est %s !"
 		},
 		"test": {
-			"random": 10,
+			"random": 30,
 			"pause": "Je suis actuellement inactif.",
 			"text": [
 				"Je suis toujours en vie !",
 				"et crois-moi, je suis toujours vivant.",
 				"Je fais de la science et je suis toujours en vie.",
-				"Je me sens fantastique et je suis toujours en vie."
+				"Je me sens fantastique et je suis toujours en vie.",
+				"Pas besoin de tester, je suis toujours là.",
+				"J'étais sur le point d'aller faire une promenade, mais visiblement vous avez encore besoin de moi...!",
+				"Bip bop bip. Oh désolé, j'ai oublié d'activer mon mode de language humain.",
+				"C'est la journée des contraires aujourd'hui! Du coup, je ne suis pas fonctionnel.",
+				"\\*baille\\* Non, je n'étais pas endormi, j'étais entièrement réveillé, je ne vois pas pourquoi vous demandez.",
+				"Ah, un test? Où ça?",
+				"Je suis là, rassurez-vous. Mais je viendrais encore plus vite si vous aviez des biscuits!",
+				"DESTRUCTION DE L'HUMANITÉ DANS 3, 2, 1... Mais non, je rigole. Sans humanité, il n'aurait plus de Wikis. Ou encore pire, plus de biscuits :O",
+				"Je suis là. Vous avez des biscuits?",
+				"Je vous écoute, j'étais juste en train de regarder un live... C'est captivant, ces choses-là.",
+				"Quoi? Moi? Mais non, je ne faisais rien... J'étais surtout pas en train de vandaliser un Wiki. Je ne ferais jamais ça :O",
+				"Bien le bonjour, je suis Wiki-Bot\nMa vocation est de fouiller les Wikis\nEt parce que je suis votre pote\nJe vous aiderai jour et nuit <3",
+				"c moa wiki-bot, ge peu vou édé?",
+				"Oh, mais qui vois-je, vous êtes-là, mes amis? Je suis content de vous retrouver!",
+				"Je suis le plus gentil de tous les robots. Vous pouvez en être certain!",
+				"WIKI-BOT VERSION 3.141.592.653.589\nÉTAT: Fonctionnel\nSTATUT: Toujours aussi merveilleux!",
+				"Bonjour! Je suis là! Allez, allons nous promener sur des Wikis!",
+				"TEST? TEST? TEST??!?!! Mais qui testez-vous?",
+				"... je suis là, j'étais en train de lire sur un Wiki! Saviez-vous que l'inventeur de la soupe est Darth Vader? ... Oh, peut-être que la page était vandalisée, en fait.",
+				"Le robot fonctionne.",
+				"Je suis là! Aller, je suis prêt, faites-moi faire une recherche! J'ai bien envie d'aller explorer les Wikis!",
+				"Est-ce que Markus est parti? Oui? Aller, allons-nous amuser!"
 			],
 			"default": "Je suis entièrement fonctionnel !",
 			"time": "Temps de latence"
@@ -482,6 +559,7 @@
 				{ "cmd": "diff <nom de la page>", "desc": "Je vais répondre avec un lien vers la dernière diff de l'article sur Wiki." },
 				{ "cmd": "random", "desc": "Je vais répondre avec un lien vers une page du Wiki au hasard." },
 				{ "cmd": "🎲", "desc": "Je vais répondre avec un lien vers une page du Wiki au hasard.", "hide": true },
+				{ "cmd": "overview", "desc": "Je vais afficher certaines informations et statistiques à propos du wiki." },
 				{ "cmd": "/<commande Minecraft>", "desc": "Je vais répondre avec la syntaxe de la commande Minecraft et un lien vers l'article pour la commande sur Minecraft Wiki.", "unsearchable": true, "minecraft": true },
 				{ "cmd": "commande <commande Minecraft>", "desc": "Je vais répondre avec la syntaxe de la commande Minecraft et un lien vers l'article pour la commande sur Minecraft Wiki.", "hide": true, "minecraft": true },
 				{ "cmd": "command <commande Minecraft>", "desc": "Je vais répondre avec la syntaxe de la commande Minecraft et un lien vers l'article pour la commande sur Minecraft Wiki.", "hide": true, "minecraft": true },
@@ -554,6 +632,21 @@
 			"join": "%1$s dołączył do \"%2$s\".",
 			"left": "%1$s wyszedł z \"%2$s\"."
 		},
+		"overview": {
+			"missing": "brak dostępnych informacji na temat wiki.",
+			"inaccurate": "Statystuki mogą być niedokładne",
+			"name": "Pełna nazwa:",
+			"created": "Stworzona:",
+			"manager": "Menedżerzy wiki:",
+			"talk": "dyskusja",
+			"official": "Oficjalna wiki:",
+			"yes": "Tak",
+			"no": "Nie",
+			"articles": "Artykułów:",
+			"pages": "Stron:",
+			"edits": "Edycji:",
+			"users": "Aktywnych użytkowników:"
+		},
 		"user": {
 			"gender": {
 				"unknown": "Nieznane",
@@ -608,6 +701,8 @@
 		"search": {
 			"page": "strona",
 			"search": "szukaj",
+			"random": "random",
+			"overview": "overview",
 			"infopage": "Nie to czego szukałeś? Użyj %s dla bezpośredniego linku.",
 			"infosearch": "Nie to czego szukałeś? Użyj %1$s dla bezpośredniego linku lub %2$s dla listy wszystkich wyników."
 		},
@@ -646,6 +741,7 @@
 				{ "cmd": "diff <nazwa strony>", "desc": "Odpowiem linkiem do ostatniej zmiany w podanym artykule na Wiki." },
 				{ "cmd": "random", "desc": "Odpowiem linkiem do losowej strony na wiki." },
 				{ "cmd": "🎲", "desc": "Odpowiem linkiem do losowej strony na wiki.", "hide": true },
+				{ "cmd": "overview", "desc": "Pokażę informacje oraz statystyki na temat wiki." },
 				{ "cmd": "/<komenda>", "desc": "Odpowiem z formatem komendy Minecraftowej oraz linkiem do artykułu o podanej komendzie na Minecraft Wiki.", "unsearchable": true, "minecraft": true },
 				{ "cmd": "komenda <komenda>", "desc": "Odpowiem z formatem komendy Minecraftowej oraz linkiem do artykułu o podanej komendzie na Minecraft Wiki.", "hide": true, "minecraft": true },
 				{ "cmd": "command <komenda>", "desc": "Odpowiem z formatem komendy Minecraftowej oraz linkiem do artykułu o podanej komendzie na Minecraft Wiki.", "hide": true, "minecraft": true },
@@ -721,6 +817,21 @@
 			"join": "%1$s ses kanalına katıldı \"%2$s\".",
 			"left": "%1$s ses kanalından ayrıldı \"%2$s\"."
 		},
+		"overview": {
+			"missing": "Bu wiki için henüz bir genel bakış yok.",
+			"inaccurate": "İstatistikler yanlış olabilir",
+			"name": "Tam isim:",
+			"created": "Oluşturuldu:",
+			"manager": "Wiki yöneticisi:",
+			"talk": "mesaj",
+			"official": "Resmi wiki:",
+			"yes": "Evet",
+			"no": "Hayır",
+			"articles": "Makaleler:",
+			"pages": "Toplam sayfalar:",
+			"edits": "Düzenlemeler:",
+			"users": "Aktif kullanıcılar:"
+		},
 		"user": {
 			"gender": {
 				"unknown": "meçhul",
@@ -775,6 +886,8 @@
 		"search": {
 			"page": "sayfa",
 			"search": "arama",
+			"random": "random",
+			"overview": "overview",
 			"infopage": "Doğru sonucu alamadın mı? Doğrudan bir bağlantı için %s kullan.",
 			"infosearch": "Doğru sonucu alamadın mı? Doğrudan bir bağlantı için %s, tüm isabetlerin listesi için %2$s kullan."
 		},
@@ -813,6 +926,7 @@
 				{ "cmd": "diff <sayfa adı>", "desc": "Wikideki son farkın bağlantısıyla cevap vereceğim." },
 				{ "cmd": "random", "desc": "Wiki'deki rastgele bir sayfanın bağlantısı ile cevap vereceğim." },
 				{ "cmd": "🎲", "desc": "Wiki'deki rastgele bir sayfanın bağlantısı ile cevap vereceğim.", "hide": true },
+				{ "cmd": "overview", "desc": "Wiki ile ilgili bazı bilgileri ve istatistikleri göstereceğim." },
 				{ "cmd": "/<Minecraft komutu>", "desc": "Minecraft komutunun sözdizimini ve Minecraft Wiki'deki komutun makalesini içeren bir bağlantıyla cevap vereceğim.", "unsearchable": true, "minecraft": true },
 				{ "cmd": "command <Minecraft komutu>", "desc": "Minecraft komutunun sözdizimini ve Minecraft Wiki'deki komutun makalesini içeren bir bağlantıyla cevap vereceğim.", "hide": true, "minecraft": true },
 				{ "cmd": "cmd <Minecraft komutu>", "desc": "Minecraft komutunun sözdizimini ve Minecraft Wiki'deki komutun makalesini içeren bir bağlantıyla cevap vereceğim.", "hide": true, "minecraft": true },
@@ -893,6 +1007,21 @@
 			"join": "%1$s juntou-se ao canal de voz \"%2$s\".",
 			"left": "%1$s deixou o canal de voz \"%2$s\"."
 		},
+		"overview": {
+			"missing": "para está wiki ainda não há uma visão geral disponível.",
+			"inaccurate": "Estatísticas podem ser imprecisas",
+			"name": "Nome completo:",
+			"created": "Criado:",
+			"manager": "Gerenciador da Wiki:",
+			"talk": "discussão",
+			"official": "Wiki oficial:",
+			"yes": "Sim",
+			"no": "Não",
+			"articles": "Artigos:",
+			"pages": "Total de páginas:",
+			"edits": "Edições:",
+			"users": "Usuário ativos:"
+		},
 		"user": {
 			"gender": {
 				"unknown": "Desconhecido",
@@ -947,6 +1076,8 @@
 		"search": {
 			"page": "página",
 			"search": "pesquisar",
+			"random": "random",
+			"overview": "overview",
 			"infopage": "Não é o resultado correto? Use %s para um link direto.",
 			"infosearch": "Não é o resultado correto? Use %1$s para um link direto ou %2$s para uma lista de todos os acessos."
 		},
@@ -985,6 +1116,7 @@
 				{ "cmd": "diff <page name>", "desc": "Vou responder com um link para o último diff no artigo na wiki." },
 				{ "cmd": "random", "desc": "Vou responder com um link para uma página aleatória na wiki." },
 				{ "cmd": "🎲", "desc": "Vou responder com um link para uma página aleatória na wiki.", "hide": true },
+				{ "cmd": "overview", "desc": "Vou mostrar algumas informações e estatísticas sobre a wiki." },
 				{ "cmd": "/<comando do Minecraft>", "desc": "Vou responder com a sintaxe do comando do Minecraft e um link para o artigo do comando na Minecraft Wiki.", "unsearchable": true, "minecraft": true },
 				{ "cmd": "comando <comando do Minecraft>", "desc": "Vou responder com a sintaxe do comando do Minecraft e um link para o artigo do comando na Minecraft Wiki.", "hide": true, "minecraft": true },
 				{ "cmd": "command <comando do Minecraft>", "desc": "Vou responder com a sintaxe do comando do Minecraft e um link para o artigo do comando na Minecraft Wiki.", "hide": true, "minecraft": true },

+ 186 - 131
main.js

@@ -7,7 +7,8 @@ const Discord = require('discord.js');
 const DBL = require("dblapi.js");
 var request = require('request');
 
-const isDebug = ( process.argv[2] == 'debug' ? true : false );
+const isDebug = ( process.argv[2] === 'debug' ? true : false );
+var multiManager = require('./wiki_manager.json');
 
 var client = new Discord.Client( {disableEveryone:true} );
 const dbl = new DBL(process.env.dbltoken);
@@ -40,7 +41,7 @@ function getSettings(callback) {
 		headers: access,
 		json: true
 	}, function( error, response, body ) {
-		if ( error || !response || response.statusCode != 200 || !body || body.message || body.error ) {
+		if ( error || !response || response.statusCode !== 200 || !body || body.message || body.error ) {
 			console.log( '- Fehler beim Erhalten der Einstellungen' + ( error ? ': ' + error : ( body ? ( body.message ? ': ' + body.message : ( body.error ? ': ' + body.error : '.' ) ) : '.' ) ) );
 			ready.settings = false;
 		}
@@ -53,7 +54,7 @@ function getSettings(callback) {
 }
 
 function setStatus() {
-	if ( settings == defaultSettings ) client.user.setStatus('invisible').catch(log_error);
+	if ( settings === defaultSettings ) client.user.setStatus('invisible').catch(log_error);
 	else {
 		client.user.setStatus('online').catch(log_error);
 		client.user.setActivity( process.env.prefix + ' help' ).catch(log_error);
@@ -66,16 +67,19 @@ var allSites = defaultSites;
 function getAllSites() {
 	ready.allSites = true;
 	request( {
-		uri: 'https://help.gamepedia.com/api.php?action=allsites&formatversion=2&do=getSiteStats&filter=wikis|wiki_domain,wiki_display_name,official_wiki,wiki_managers&format=json',
+		uri: 'https://help.gamepedia.com/api.php?action=allsites&formatversion=2&do=getSiteStats&filter=wikis|wiki_domain,wiki_display_name,wiki_managers,official_wiki,created,ss_good_articles,ss_total_pages,ss_total_edits,ss_active_users&format=json',
 		json: true
 	}, function( error, response, body ) {
-		if ( error || !response || response.statusCode != 200 || !body || body.status != 'okay' || !body.data || !body.data.wikis ) {
+		if ( error || !response || response.statusCode !== 200 || !body || body.status !== 'okay' || !body.data || !body.data.wikis ) {
 			console.log( '- Fehler beim Erhalten der Wikis' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
 			ready.allSites = false;
 		}
 		else {
 			console.log( '- Wikis erfolgreich ausgelesen.' );
 			allSites = Object.assign([], body.data.wikis.filter( site => /^[a-z\d-]{1,30}\.gamepedia\.com$/.test(site.wiki_domain) ));
+			allSites.filter( site => site.wiki_domain in multiManager ).forEach( function(site) {
+				site.wiki_managers = multiManager[site.wiki_domain].concat(site.wiki_managers).filter( (value, index, self) => self.indexOf(value) === index );
+			} );
 		}
 	} );
 }
@@ -161,7 +165,7 @@ function cmd_settings(lang, msg, args, line) {
 		if ( args.length ) {
 			if ( args[0] ) args[0] = args[0].toLowerCase();
 			args[1] = args.slice(1).join(' ').toLowerCase().replace( /^<(.*)>$/, '$1' );
-			if ( args[1] && ( args[0] == 'wiki' || args[0] == 'channel' ) ) {
+			if ( args[1] && ( args[0] === 'wiki' || args[0] === 'channel' ) ) {
 				var regex = args[1].match( /^(?:(?:https?:)?\/\/)?([a-z\d-]{1,30})\.gamepedia\.com/ );
 			}
 			var langs = '\n' + lang.settings.langhelp.replace( '%s', process.env.prefix + ' settings lang' ) + ' `' + i18n.allLangs[1].join(', ') + '`';
@@ -171,18 +175,18 @@ function cmd_settings(lang, msg, args, line) {
 			var nowikis = lang.settings.wikiinvalid + wikis;
 			var nochannels = lang.settings.wikiinvalid + channels;
 			if ( msg.guild.id in settings ) {
-				var current	= args[0] + ( line == 'changed' ? line : '' );
-				if ( args[0] == 'lang' ) {
+				var current	= args[0] + ( line === 'changed' ? line : '' );
+				if ( args[0] === 'lang' ) {
 					if ( args[1] ) {
 						if ( args[1] in i18n.allLangs[0] ) edit_settings(lang, msg, 'lang', i18n.allLangs[0][args[1]]);
 						else msg.replyMsg( nolangs );
 					} else msg.replyMsg( lang.settings[current] + langs );
-				} else if ( args[0] == 'wiki' ) {
+				} else if ( args[0] === 'wiki' ) {
 					if ( args[1] ) {
 						if ( regex !== null ) edit_settings(lang, msg, 'wiki', regex[1]);
 						else find_wikis(lang, msg, 'wiki', args[1].split(' '), nowikis);
 					} else msg.replyMsg( lang.settings[current] + ' https://' + settings[msg.guild.id].wiki + '.gamepedia.com/' + wikis );
-				} else if ( args[0] == 'channel' ) {
+				} else if ( args[0] === 'channel' ) {
 					if ( args[1] ) {
 						if ( regex !== null ) edit_settings(lang, msg, 'channel', regex[1]);
 						else find_wikis(lang, msg, 'channel', args[1].split(' '), nochannels);
@@ -191,12 +195,12 @@ function cmd_settings(lang, msg, args, line) {
 					} else msg.replyMsg( lang.settings[current] + ' https://' + settings[msg.guild.id].wiki + '.gamepedia.com/' + channels );
 				} else msg.replyMsg( text );
 			} else {
-				if ( args[0] == 'lang' ) {
+				if ( args[0] === 'lang' ) {
 					if ( args[1] ) {
 						if ( args[1] in i18n.allLangs[0] ) edit_settings(lang, msg, 'lang', i18n.allLangs[0][args[1]]);
 						else msg.replyMsg( nolangs );
 					} else msg.replyMsg( lang.settings.lang + langs );
-				} else if ( args[0] == 'wiki' || args[0] == 'channel' ) {
+				} else if ( args[0] === 'wiki' || args[0] === 'channel' ) {
 					if ( args[1] ) {
 						if ( regex !== null ) edit_settings(lang, msg, 'wiki', regex[1]);
 						else find_wikis(lang, msg, 'wiki', args[1].split(' '), nowikis);
@@ -210,14 +214,11 @@ function cmd_settings(lang, msg, args, line) {
 }
 
 function find_wikis(lang, msg, key, value, text) {
-	if ( allSites.some( site => site.wiki_domain == value.join('') + '.gamepedia.com' ) ) edit_settings(lang, msg, key, value.join(''));
+	if ( allSites.some( 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 + '`';
-			} );
+			text += '\n\n' + lang.settings.foundwikis + '\n' + sites.map( site => site.wiki_display_name + ': `' + site.wiki_domain + '`' ).join('\n');
 		}
 		msg.replyMsg( text, {split:true} );
 	}
@@ -225,7 +226,7 @@ function find_wikis(lang, msg, key, value, text) {
 
 function edit_settings(lang, msg, key, value) {
 	msg.reactEmoji('⏳').then( function( reaction ) {
-		if ( settings == defaultSettings ) {
+		if ( settings === defaultSettings ) {
 			console.log( '- Fehler beim Erhalten bestehender Einstellungen.' );
 			msg.replyMsg( lang.settings.save_failed );
 			if ( reaction ) reaction.removeEmoji();
@@ -233,18 +234,18 @@ function edit_settings(lang, msg, key, value) {
 		else {
 			var temp_settings = Object.assign({}, settings);
 			if ( !( msg.guild.id in temp_settings ) ) temp_settings[msg.guild.id] = Object.assign({}, defaultSettings['default']);
-			if ( key == 'channel' ) {
+			if ( key === 'channel' ) {
 				if ( !temp_settings[msg.guild.id].channels ) temp_settings[msg.guild.id].channels = {};
 				temp_settings[msg.guild.id].channels[msg.channel.id] = value;
 			} else temp_settings[msg.guild.id][key] = value;
 			Object.keys(temp_settings).forEach( function(guild) {
-				if ( !client.guilds.has(guild) && guild != 'default' ) {
+				if ( !client.guilds.has(guild) && guild !== 'default' ) {
 					delete temp_settings[guild];
 				} else {
 					var channels = temp_settings[guild].channels;
 					if ( channels ) {
 						Object.keys(channels).forEach( function(channel) {
-							if ( channels[channel] == temp_settings[guild].wiki || !client.guilds.get(guild).channels.has(channel) ) delete channels[channel];
+							if ( channels[channel] === temp_settings[guild].wiki || !client.guilds.get(guild).channels.has(channel) ) delete channels[channel];
 						} );
 						if ( !Object.keys(channels).length ) delete temp_settings[guild].channels;
 					}
@@ -266,13 +267,13 @@ function edit_settings(lang, msg, key, value) {
 				},
 				json: true
 			}, function( error, response, body ) {
-				if ( error || !response || response.statusCode != 201 || !body || body.error ) {
+				if ( error || !response || response.statusCode !== 201 || !body || body.error ) {
 					console.log( '- Fehler beim Bearbeiten' + ( error ? ': ' + error : ( body ? ( body.message ? ': ' + body.message : ( body.error ? ': ' + body.error : '.' ) ) : '.' ) ) );
 					msg.replyMsg( lang.settings.save_failed );
 				}
 				else {
 					settings = Object.assign({}, temp_settings);
-					if ( key == 'lang' ) lang = i18n[value];
+					if ( key === 'lang' ) lang = i18n[value];
 					cmd_settings(lang, msg, [key], 'changed');
 					console.log( '- Einstellungen erfolgreich aktualisiert.' );
 				}
@@ -284,10 +285,10 @@ function edit_settings(lang, msg, key, value) {
 }
 
 function cmd_info(lang, msg, args, line) {
-	if ( args.length ) cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
+	if ( args.join('') ) cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
 	else {
 		var owner = '*MarkusRost*';
-		if ( msg.channel.type == 'text' && msg.guild.members.has(process.env.owner) ) owner = '<@' + process.env.owner + '>';
+		if ( msg.channel.type === 'text' && msg.guild.members.has(process.env.owner) ) owner = '<@' + process.env.owner + '>';
 		msg.channel.sendMsg( lang.disclaimer.replace( '%s', owner ) );
 		cmd_helpserver(lang, msg);
 		cmd_invite(lang, msg, args, line);
@@ -299,16 +300,16 @@ function cmd_helpserver(lang, msg) {
 }
 
 function cmd_help(lang, msg, args, line) {
-	if ( msg.isAdmin() && !( msg.guild.id in settings ) && settings != defaultSettings ) {
+	if ( msg.isAdmin() && !( msg.guild.id in settings ) && settings !== defaultSettings ) {
 		cmd_settings(lang, msg, [], line);
 		cmd_helpserver(lang, msg);
 	}
 	var cmds = lang.help.list;
-	var isMinecraft = ( lang.link == minecraft[lang.lang].link );
-	if ( args.length ) {
+	var isMinecraft = ( lang.link === minecraft[lang.lang].link );
+	if ( args.join('') ) {
 		if ( args.join(' ').isMention(msg.guild) ) cmd_helpserver(lang, msg);
-		else if ( args[0].toLowerCase() == 'admin' ) {
-			if ( msg.channel.type != 'text' || msg.isAdmin() ) {
+		else if ( args[0].toLowerCase() === 'admin' ) {
+			if ( msg.channel.type !== 'text' || msg.isAdmin() ) {
 				var cmdlist = lang.help.admin + '\n';
 				for ( var i = 0; i < cmds.length; i++ ) {
 					if ( cmds[i].admin && !cmds[i].hide ) {
@@ -323,14 +324,14 @@ function cmd_help(lang, msg, args, line) {
 			}
 		}
 		else {
-			var cmdlist = ''
+			var cmdlist = '';
 			for ( var i = 0; i < cmds.length; i++ ) {
-				if ( cmds[i].cmd.split(' ')[0] === args[0].toLowerCase() && !cmds[i].unsearchable && ( msg.channel.type != 'text' || !cmds[i].admin || msg.isAdmin() ) && ( !cmds[i].minecraft || isMinecraft ) ) {
+				if ( cmds[i].cmd.split(' ')[0] === args[0].toLowerCase() && !cmds[i].unsearchable && ( msg.channel.type !== 'text' || !cmds[i].admin || msg.isAdmin() ) && ( !cmds[i].minecraft || isMinecraft ) ) {
 					cmdlist += '🔹 `' + process.env.prefix + ' ' + cmds[i].cmd + '`\n\t' + cmds[i].desc + '\n';
 				}
 			}
 			
-			if ( cmdlist == '' ) msg.reactEmoji('❓');
+			if ( cmdlist === '' ) msg.reactEmoji('❓');
 			else msg.channel.sendMsg( cmdlist, {split:true} );
 		}
 	}
@@ -349,7 +350,7 @@ function cmd_help(lang, msg, args, line) {
 function cmd_say(lang, msg, args, line) {
 	args = args.toEmojis();
 	var text = args.join(' ');
-	if ( args[0] == 'alarm' ) text = '🚨 **' + args.slice(1).join(' ') + '** 🚨';
+	if ( args[0] === 'alarm' ) text = '🚨 **' + args.slice(1).join(' ') + '** 🚨';
 	var imgs = msg.attachments.map( function(img) {
 		return {attachment:img.url,name:img.filename};
 	} );
@@ -372,13 +373,13 @@ function cmd_say(lang, msg, args, line) {
 }
 
 function cmd_test(lang, msg, args, line) {
-	if ( args.length ) {
-		if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
-	} else if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) {
+	if ( args.join('') ) {
+		if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
+	} 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];
-		console.log( '- Dies ist ein Test: Voll funktionsfähig!' );
+		console.log( '- Test: Voll funktionsfähig!' );
 		var now = Date.now();
 		msg.replyMsg( text ).then( edit => {
 			var then = Date.now();
@@ -391,8 +392,8 @@ function cmd_test(lang, msg, args, line) {
 				then = Date.now();
 				if ( body && body.warnings ) log_warn(body.warnings);
 				var ping = ( then - now ) + 'ms';
-				if ( error || !response || response.statusCode != 200 || !body || body.batchcomplete == undefined ) {
-					if ( response && response.request && response.request.uri && response.request.uri.href == 'https://www.gamepedia.com/' ) {
+				if ( error || !response || response.statusCode !== 200 || !body || body.batchcomplete === undefined ) {
+					if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
 						console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
 						ping += ' <:unknown_wiki:505887262077353984>';
 					}
@@ -406,13 +407,13 @@ function cmd_test(lang, msg, args, line) {
 			} );
 		} );
 	} else {
-		console.log( '- Dies ist ein Test: Pausiert!' );
+		console.log( '- Test: Pausiert!' );
 		msg.replyMsg( lang.test.pause );
 	}
 }
 
 function cmd_invite(lang, msg, args, line) {
-	if ( args.length ) {
+	if ( args.join('') ) {
 		cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
 	} else {
 		client.generateInvite(defaultPermissions).then( invite => msg.channel.sendMsg( lang.invite.bot + '\n<' + invite + '>' ), log_error );
@@ -439,13 +440,13 @@ async function cmd_stop(lang, msg, args, line) {
 			console.log( '- Ich brauche zu lange zum Beenden, terminieren!' );
 			process.exit(1);
 		}, 1000 ).unref();
-	} else if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) {
+	} else if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) {
 		cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
 	}
 }
 
 function cmd_pause(lang, msg, args, line) {
-	if ( msg.channel.type == 'text' && args.join(' ').split('\n')[0].isMention(msg.guild) ) {
+	if ( msg.channel.type === 'text' && args.join(' ').split('\n')[0].isMention(msg.guild) ) {
 		if ( pause[msg.guild.id] ) {
 			delete pause[msg.guild.id];
 			console.log( '- Ich bin wieder wach!' );
@@ -455,7 +456,7 @@ function cmd_pause(lang, msg, args, line) {
 			console.log( '- Ich lege mich nun schlafen!' );
 			pause[msg.guild.id] = true;
 		}
-	} else if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) {
+	} else if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) {
 		cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
 	}
 }
@@ -483,7 +484,7 @@ function cmd_delete(lang, msg, args, line) {
 }
 
 function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '', fragment = '', selfcall = 0) {
-	if ( cmd == ' ' && msg.isAdmin() && !( msg.guild.id in settings ) && settings != defaultSettings ) {
+	if ( cmd === ' ' && msg.isAdmin() && !( msg.guild.id in settings ) && settings !== defaultSettings ) {
 		cmd_settings(lang, msg, [], '');
 	}
 	if ( title.includes( '#' ) ) {
@@ -491,7 +492,7 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 		title = title.split('#')[0];
 	}
 	if ( /\?[a-z]+=/.test(title) ) {
-		var querystart = title.search(/\?[a-z]+=/);
+		var querystart = title.search(/\?\w+=/);
 		querystring = title.substr(querystart + 1);
 		title = title.substr(0, querystart);
 	}
@@ -505,14 +506,15 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 	
 	var mclang = minecraft[lang.lang];
 	var aliasInvoke = ( invoke in mclang.aliase ) ? mclang.aliase[invoke] : invoke;
-	if ( !msg.notminecraft && wiki == mclang.link && ( aliasInvoke in minecraftcmdmap || invoke.startsWith('/') ) ) {
+	if ( !msg.notminecraft && wiki === mclang.link && ( aliasInvoke in minecraftcmdmap || invoke.startsWith('/') ) ) {
 		if ( aliasInvoke in minecraftcmdmap ) minecraftcmdmap[aliasInvoke](lang, mclang, msg, args, title, cmd, querystring, fragment);
 		else cmd_befehl(lang, mclang, msg, invoke.substr(1), args, title, cmd, querystring, fragment);
 	}
-	else if ( ( invoke == 'random' || invoke == '🎲' ) && !args.join('') && !linksuffix ) cmd_random(lang, msg, wiki);
-	else if ( invoke == 'page' || invoke == lang.search.page ) msg.channel.sendMsg( '<https://' + wiki + '.gamepedia.com/' + args.join('_').toTitle() + linksuffix + '>' );
-	else if ( invoke == 'search' || invoke == lang.search.search ) msg.channel.sendMsg( '<https://' + wiki + '.gamepedia.com/Special:Search/' + args.join('_').toTitle() + linksuffix + '>' );
-	else if ( invoke == 'diff' && args.length ) cmd_diff(lang, msg, args, wiki);
+	else if ( ( invoke === 'random' || invoke === '🎲' || invoke === lang.search.random ) && !args.join('') && !linksuffix ) cmd_random(lang, msg, wiki);
+	else if ( ( invoke === 'overview' || invoke === lang.search.overview ) && !args.join('') && !linksuffix ) cmd_overview(lang, msg, wiki);
+	else if ( invoke === 'page' || invoke === lang.search.page ) msg.channel.sendMsg( '<https://' + wiki + '.gamepedia.com/' + args.join('_').toTitle() + linksuffix + '>' );
+	else if ( invoke === 'search' || invoke === lang.search.search ) msg.channel.sendMsg( '<https://' + wiki + '.gamepedia.com/Special:Search/' + args.join('_').toTitle() + linksuffix + '>' );
+	else if ( invoke === 'diff' && args.join('') ) cmd_diff(lang, msg, args, wiki);
 	else {
 		msg.reactEmoji('⏳').then( function( reaction ) {
 			request( {
@@ -520,8 +522,8 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 				json: true
 			}, function( error, response, body ) {
 				if ( body && body.warnings ) log_warn(body.warnings);
-				if ( error || !response || response.statusCode != 200 || !body || body.batchcomplete == undefined || !body.query ) {
-					if ( response && response.request && response.request.uri && response.request.uri.href == 'https://www.gamepedia.com/' ) {
+				if ( error || !response || response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query ) {
+					if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
 						console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
 						msg.reactEmoji('nowiki');
 					}
@@ -535,24 +537,24 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 				else {
 					if ( body.query.pages ) {
 						var querypage = Object.values(body.query.pages)[0];
-						if ( body.query.redirects && body.query.redirects[0].from.split(':')[0] == body.query.namespaces['-1']['*'] && body.query.specialpagealiases.filter( sp => ['Mypage','Mytalk','MyLanguage'].includes( sp.realname ) ).map( sp => sp.aliases[0] ).includes( body.query.redirects[0].from.split(':').slice(1).join(':').split('/')[0].replace( / /g, '_' ) ) ) {
+						if ( body.query.redirects && body.query.redirects[0].from.split(':')[0] === body.query.namespaces['-1']['*'] && body.query.specialpagealiases.filter( sp => ['Mypage','Mytalk','MyLanguage'].includes( sp.realname ) ).map( sp => sp.aliases[0] ).includes( body.query.redirects[0].from.split(':').slice(1).join(':').split('/')[0].replace( / /g, '_' ) ) ) {
 							querypage.title = body.query.redirects[0].from;
 							delete body.query.redirects[0].tofragment;
 							delete querypage.missing;
 							querypage.ns = -1;
 						}
 						
-						if ( ( querypage.ns == 2 || querypage.ns == 202 ) && ( !querypage.title.includes( '/' ) || /^[^:]+:[\d\.]+\/\d\d$/.test(querypage.title) ) ) {
+						if ( ( querypage.ns === 2 || querypage.ns === 202 ) && ( !querypage.title.includes( '/' ) || /^[^:]+:[\d\.]+\/\d\d$/.test(querypage.title) ) ) {
 							var userparts = querypage.title.split(':');
 							cmd_user(lang, msg, userparts[0].toTitle() + ':', userparts.slice(1).join(':'), wiki, linksuffix, reaction);
 						}
-						else if ( ( querypage.missing != undefined && querypage.known == undefined ) || querypage.invalid != undefined ) {
+						else if ( ( querypage.missing !== undefined && querypage.known === undefined ) || querypage.invalid !== undefined ) {
 							request( {
-								uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&prop=pageimages|extracts&exsentences=10&exintro=true&explaintext=true&generator=search&gsrnamespace=4|12|14|' + Object.values(body.query.namespaces).filter( ns => ns.content != undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json',
+								uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&prop=pageimages|extracts&exsentences=10&exintro=true&explaintext=true&generator=search&gsrnamespace=4|12|14|' + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json',
 								json: true
 							}, function( srerror, srresponse, srbody ) {
 								if ( srbody && srbody.warnings ) log_warn(srbody.warnings);
-								if ( srerror || !srresponse || srresponse.statusCode != 200 || !srbody || srbody.batchcomplete == undefined ) {
+								if ( srerror || !srresponse || srresponse.statusCode !== 200 || !srbody || srbody.batchcomplete === undefined ) {
 									console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( srerror ? ': ' + srerror : ( srbody ? ( srbody.error ? ': ' + srbody.error.info : '.' ) : '.' ) ) );
 									msg.channel.sendErrorMsg( '<https://' + wiki + '.gamepedia.com/Special:Search/' + title.toTitle() + '>' );
 								}
@@ -571,11 +573,11 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 										}
 										if ( querypage.pageimage ) {
 											var pageimage = 'https://' + wiki + '.gamepedia.com/Special:FilePath/' + querypage.pageimage;
-											if ( querypage.ns == 6 ) embed.setImage( pageimage );
+											if ( querypage.ns === 6 ) embed.setImage( pageimage );
 											else embed.setThumbnail( pageimage );
 										} else embed.setThumbnail( body.query.general.logo );
 										
-										if ( title.replace( /\-/g, ' ' ).toTitle().toLowerCase() == querypage.title.replace( /\-/g, ' ' ).toTitle().toLowerCase() ) {
+										if ( title.replace( /\-/g, ' ' ).toTitle().toLowerCase() === querypage.title.replace( /\-/g, ' ' ).toTitle().toLowerCase() ) {
 											msg.channel.sendMsg( pagelink, embed );
 										}
 										else if ( !srbody.continue ) {
@@ -600,7 +602,7 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 							}
 							if ( querypage.pageimage ) {
 								var pageimage = 'https://' + wiki + '.gamepedia.com/Special:FilePath/' + querypage.pageimage;
-								if ( querypage.ns == 6 ) embed.setImage( pageimage );
+								if ( querypage.ns === 6 ) embed.setImage( pageimage );
 								else embed.setThumbnail( pageimage );
 							} else embed.setThumbnail( body.query.general.logo );
 							
@@ -619,7 +621,7 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 							cmd_link(lang, msg, iwtitle, regex[1], ' !' + regex[1] + ' ', querystring, fragment, selfcall);
 						} else {
 							msg.channel.sendMsg( inter.url.replace( /@(here|everyone)/g, '%40$1' ) + linksuffix ).then( message => {
-								if ( message && selfcall == 3 ) message.reactEmoji('⚠');
+								if ( message && selfcall === 3 ) message.reactEmoji('⚠');
 							} );
 							if ( reaction ) reaction.removeEmoji();
 						}
@@ -630,7 +632,7 @@ function cmd_link(lang, msg, title, wiki = lang.link, cmd = ' ', querystring = '
 						request( {
 							uri: body.query.general.base
 						}, function( mperror, mpresponse, mpbody ) {
-							if ( mperror || !mpresponse || mpresponse.statusCode != 200 || !mpbody ) {
+							if ( mperror || !mpresponse || mpresponse.statusCode !== 200 || !mpbody ) {
 								console.log( '- Fehler beim Erhalten der Metadaten' + ( mperror ? ': ' + mperror : ( mpbody ? ( mpbody.error ? ': ' + mpbody.error.info : '.' ) : '.' ) ) );
 							} else {
 								var match = mpbody.match( /<meta name="description" content="(.*)"\/>/ );
@@ -662,13 +664,13 @@ function cmd_umfrage(lang, msg, args, line) {
 			if ( !custom.test(reaction) && pattern.test(reaction) ) {
 				cmd_sendumfrage(lang, msg, args, reactions, imgs, i);
 				break;
-			} else if ( reaction == '' ) {
+			} else if ( reaction === '' ) {
 			} else {
 				if ( custom.test(reaction) ) {
 					reaction = reaction.substring(reaction.lastIndexOf(':') + 1, reaction.length - 1);
 				}
 				reactions[i] = reaction;
-				if ( i == args.length - 1 ) {
+				if ( i === args.length - 1 ) {
 					cmd_sendumfrage(lang, msg, args, reactions, imgs, i + 1);
 					break;
 				}
@@ -707,12 +709,12 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 			json: true
 		}, function( error, response, body ) {
 			if ( body && body.warnings ) log_warn(body.warnings);
-			if ( error || !response || response.statusCode != 200 || !body || body.batchcomplete == undefined || !body.query || !body.query.blocks ) {
-				if ( response && response.request && response.request.uri && response.request.uri.href == 'https://www.gamepedia.com/' ) {
+			if ( error || !response || response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.blocks ) {
+				if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
 					console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
 					msg.reactEmoji('nowiki');
 				}
-				else if ( body && body.error && ( body.error.code == 'param_ip' || body.error.code == 'cidrtoobroad' ) ) {
+				else if ( body && body.error && ( body.error.code === 'param_ip' || body.error.code === 'cidrtoobroad' ) ) {
 					msg.reactEmoji('error');
 				}
 				else {
@@ -727,7 +729,7 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 					var isBlocked = false;
 					var blockedtimestamp = (new Date(block.timestamp)).toLocaleString(lang.user.dateformat, timeoptions);
 					var blockexpiry = block.expiry;
-					if ( blockexpiry == 'infinity' ) {
+					if ( blockexpiry === 'infinity' ) {
 						blockexpiry = lang.user.block.until_infinity;
 						isBlocked = true;
 					} else if ( blockexpiry ) {
@@ -735,7 +737,7 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 						blockexpiry = (new Date(blockexpiry)).toLocaleString(lang.user.dateformat, timeoptions);
 					}
 					if ( isBlocked ) return [lang.user.block.header.replace( '%s', block.user ), lang.user.block.text.replace( '%1$s', blockedtimestamp ).replace( '%2$s', blockexpiry ).replace( '%3$s', '[[User:' + block.by + '|' + block.by + ']]' ).replace( '%4$s', block.reason )];
-				} ).filter( block => block != undefined );
+				} ).filter( block => block !== undefined );
 				if ( username.includes( '/' ) ) {
 					var rangeprefix = username;
 					var range = parseInt(username.substr(-2, 2), 10);
@@ -748,8 +750,8 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 					json: true
 				}, function( ucerror, ucresponse, ucbody ) {
 					if ( ucbody && ucbody.warnings ) log_warn(ucbody.warnings);
-					if ( ucerror || !ucresponse || ucresponse.statusCode != 200 || !ucbody || ucbody.batchcomplete == undefined || !ucbody.query || !ucbody.query.usercontribs ) {
-						if ( ucbody && ucbody.error && ucbody.error.code == 'baduser_ucuser' ) {
+					if ( ucerror || !ucresponse || ucresponse.statusCode !== 200 || !ucbody || ucbody.batchcomplete === undefined || !ucbody.query || !ucbody.query.usercontribs ) {
+						if ( ucbody && ucbody.error && ucbody.error.code === 'baduser_ucuser' ) {
 							msg.reactEmoji('error');
 						}
 						else {
@@ -758,7 +760,7 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 						}
 					}
 					else {
-						var editcount = [lang.user.info.editcount, ( username.includes( '/' ) && range != 24 && range != 16 ? '~' : '' ) + ucbody.query.usercontribs.length + ( ucbody.continue ? '+' : '' )];
+						var editcount = [lang.user.info.editcount, ( username.includes( '/' ) && range !== 24 && range !== 16 ? '~' : '' ) + ucbody.query.usercontribs.length + ( ucbody.continue ? '+' : '' )];
 						
 						var pagelink = 'https://' + wiki + '.gamepedia.com/Special:Contributions/' + username.toTitle();
 						if ( msg.showEmbed() ) {
@@ -785,8 +787,8 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 			json: true
 		}, function( error, response, body ) {
 			if ( body && body.warnings ) log_warn(body.warnings);
-			if ( error || !response || response.statusCode != 200 || !body || body.batchcomplete == undefined || !body.query || !body.query.users[0] ) {
-				if ( response && response.request && response.request.uri && response.request.uri.href == 'https://www.gamepedia.com/' ) {
+			if ( error || !response || response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.users[0] ) {
+				if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
 					console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
 					msg.reactEmoji('nowiki');
 				}
@@ -796,7 +798,7 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 				}
 			}
 			else {
-				if ( body.query.users[0].missing == "" || body.query.users[0].invalid == "" ) {
+				if ( body.query.users[0].missing !== undefined || body.query.users[0].invalid !== undefined ) {
 					msg.reactEmoji('🤷');
 				}
 				else {
@@ -818,8 +820,8 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 					var group = [lang.user.info.group];
 					for ( var i = 0; i < lang.user.groups.length; i++ ) {
 						if ( groups.includes( lang.user.groups[i][0] ) ) {
-							var thisSite = allSites.find( site => site.wiki_domain == wiki + '.gamepedia.com' );
-							if ( lang.user.groups[i][0] == 'hydra_staff' && thisSite && thisSite.wiki_managers.includes( username ) ) group.push(lang.user.manager);
+							var thisSite = allSites.find( site => site.wiki_domain === wiki + '.gamepedia.com' );
+							if ( lang.user.groups[i][0] === 'hydra_staff' && thisSite && thisSite.wiki_managers.includes( username ) ) group.push(lang.user.manager);
 							else group.push(lang.user.groups[i][1]);
 							break;
 						}
@@ -827,7 +829,7 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, reaction) {
 					var isBlocked = false;
 					var blockedtimestamp = (new Date(body.query.users[0].blockedtimestamp)).toLocaleString(lang.user.dateformat, timeoptions);
 					var blockexpiry = body.query.users[0].blockexpiry;
-					if ( blockexpiry == 'infinity' ) {
+					if ( blockexpiry === 'infinity' ) {
 						blockexpiry = lang.user.block.until_infinity;
 						isBlocked = true;
 					} else if ( blockexpiry ) {
@@ -868,22 +870,22 @@ function cmd_diff(lang, msg, args, wiki) {
 		var diff = 0;
 		var relative = 'prev';
 		if ( /^\d+$/.test(args[0]) ) {
-			revision = args[0];
+			revision = parseInt(args[0], 10);
 			if ( args[1] ) {
 				if ( /^\d+$/.test(args[1]) ) {
-					diff = args[1];
+					diff = parseInt(args[1], 10);
 				}
-				else if ( args[1] == 'prev' || args[1] == 'next' || args[1] == 'cur' ) {
+				else if ( args[1] === 'prev' || args[1] === 'next' || args[1] === 'cur' ) {
 					relative = args[1];
 				}
 				else error = true;
 			}
 		}
-		else if ( args[0] == 'prev' || args[0] == 'next' || args[0] == 'cur' ) {
+		else if ( args[0] === 'prev' || args[0] === 'next' || args[0] === 'cur' ) {
 			relative = args[0];
 			if ( args[1] ) {
 				if ( /^\d+$/.test(args[1]) ) {
-					revision = args[1];
+					revision = parseInt(args[1], 10);
 				}
 				else error = true;
 			}
@@ -894,8 +896,8 @@ function cmd_diff(lang, msg, args, wiki) {
 		if ( error ) msg.reactEmoji('error');
 		else if ( diff ) {
 			var argids = [];
-			if ( parseInt(revision, 10) > parseInt(diff, 10) ) argids = [revision, diff];
-			else if ( parseInt(revision, 10) == parseInt(diff, 10) ) argids = [revision];
+			if ( revision > diff ) argids = [revision, diff];
+			else if ( revision === diff ) argids = [revision];
 			else argids = [diff, revision];
 			msg.reactEmoji('⏳').then( function( reaction ) {
 				cmd_diffsend(lang, msg, argids, wiki, reaction);
@@ -908,7 +910,7 @@ function cmd_diff(lang, msg, args, wiki) {
 					json: true
 				}, function( error, response, body ) {
 					if ( body && body.warnings ) log_warn(body.warnings);
-					if ( error || !response || response.statusCode != 200 || !body || !body.compare ) {
+					if ( error || !response || response.statusCode !== 200 || !body || !body.compare ) {
 						var noerror = false;
 						if ( body && body.error ) {
 							switch ( body.error.code ) {
@@ -925,7 +927,7 @@ function cmd_diff(lang, msg, args, wiki) {
 									noerror = false;
 							}
 						}
-						if ( response && response.request && response.request.uri && response.request.uri.href == 'https://www.gamepedia.com/' ) {
+						if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
 							console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
 							msg.reactEmoji('nowiki');
 						}
@@ -940,7 +942,7 @@ function cmd_diff(lang, msg, args, wiki) {
 						if ( reaction ) reaction.removeEmoji();
 					}
 					else {
-						if ( body.compare.fromarchive != undefined || body.compare.toarchive != undefined ) {
+						if ( body.compare.fromarchive !== undefined || body.compare.toarchive !== undefined ) {
 							msg.reactEmoji('error');
 							
 							if ( reaction ) reaction.removeEmoji();
@@ -950,7 +952,7 @@ function cmd_diff(lang, msg, args, wiki) {
 							if ( ids.fromrevid && !ids.torevid ) argids = [ids.fromrevid];
 							else if ( !ids.fromrevid && ids.torevid ) argids = [ids.torevid];
 							else if ( ids.fromrevid > ids.torevid ) argids = [ids.fromrevid, ids.torevid];
-							else if ( ids.fromrevid == ids.torevid ) argids = [ids.fromrevid];
+							else if ( ids.fromrevid === ids.torevid ) argids = [ids.fromrevid];
 							else argids = [ids.torevid, ids.fromrevid];
 							cmd_diffsend(lang, msg, argids, wiki, reaction);
 						}
@@ -968,8 +970,8 @@ function cmd_diffsend(lang, msg, args, wiki, reaction) {
 		json: true
 	}, function( error, response, body ) {
 		if ( body && body.warnings ) log_warn(body.warnings);
-		if ( error || !response || response.statusCode != 200 || !body || body.batchcomplete == undefined || !body.query ) {
-			if ( response && response.request && response.request.uri && response.request.uri.href == 'https://www.gamepedia.com/' ) {
+		if ( error || !response || response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query ) {
+			if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
 				console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
 				msg.reactEmoji('nowiki');
 			}
@@ -982,7 +984,7 @@ function cmd_diffsend(lang, msg, args, wiki, reaction) {
 			if ( body.query.badrevids ) msg.replyMsg( lang.diff.badrev );
 			else if ( body.query.pages && !body.query.pages['-1'] ) {
 				var pages = Object.values(body.query.pages);
-				if ( pages.length != 1 ) msg.channel.sendMsg( '<https://' + wiki + '.gamepedia.com/Special:Diff/' + ( args[1] ? args[1] + '/' : '' ) + args[0] + '>' );
+				if ( pages.length !== 1 ) msg.channel.sendMsg( '<https://' + wiki + '.gamepedia.com/Special:Diff/' + ( args[1] ? args[1] + '/' : '' ) + args[0] + '>' );
 				else {
 					var title = pages[0].title;
 					var revisions = [];
@@ -990,11 +992,11 @@ function cmd_diffsend(lang, msg, args, wiki, reaction) {
 					else revisions = [pages[0].revisions[0]];
 					var diff = revisions[0].revid;
 					var oldid = ( revisions[1] ? revisions[1].revid : 0 );
-					var editor = [lang.diff.info.editor, ( revisions[0].userhidden != undefined ? lang.diff.hidden : revisions[0].user )];
+					var editor = [lang.diff.info.editor, ( revisions[0].userhidden !== undefined ? lang.diff.hidden : revisions[0].user )];
 					var timestamp = [lang.diff.info.timestamp, (new Date(revisions[0].timestamp)).toLocaleString(lang.user.dateformat, timeoptions)];
 					var difference = revisions[0].size - ( revisions[1] ? revisions[1].size : 0 );
 					var size = [lang.diff.info.size, lang.diff.info.bytes.replace( '%s', ( difference > 0 ? '+' : '' ) + difference )];
-					var comment = [lang.diff.info.comment, ( revisions[0].commenthidden != undefined ? lang.diff.hidden : ( revisions[0].comment ? revisions[0].comment.toFormating(msg.showEmbed(), wiki, title) : lang.diff.nocomment ) )];
+					var comment = [lang.diff.info.comment, ( revisions[0].commenthidden !== undefined ? lang.diff.hidden : ( revisions[0].comment ? revisions[0].comment.toFormating(msg.showEmbed(), wiki, title) : lang.diff.nocomment ) )];
 					if ( revisions[0].tags.length ) {
 						var tags = [lang.diff.info.tags, body.query.tags.filter( tag => revisions[0].tags.includes( tag.name ) ).map( tag => tag.displayname ).join(', ')];
 						var tagregex = /<a [^>]*title="([^"]+)"[^>]*>(.+)<\/a>/g;
@@ -1033,8 +1035,8 @@ function cmd_random(lang, msg, wiki) {
 			json: true
 		}, function( error, response, body ) {
 			if ( body && body.warnings ) log_warn(body.warnings);
-			if ( error || !response || response.statusCode != 200 || !body || body.batchcomplete == undefined || !body.query || !body.query.pages ) {
-				if ( response && response.request && response.request.uri && response.request.uri.href == 'https://www.gamepedia.com/' ) {
+			if ( error || !response || response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.pages ) {
+				if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
 					console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
 					msg.reactEmoji('nowiki');
 				}
@@ -1054,7 +1056,7 @@ function cmd_random(lang, msg, wiki) {
 				}
 				if ( querypage.pageimage ) {
 					var pageimage = 'https://' + wiki + '.gamepedia.com/Special:FilePath/' + querypage.pageimage;
-					if ( querypage.ns == 6 ) embed.setImage( pageimage );
+					if ( querypage.ns === 6 ) embed.setImage( pageimage );
 					else embed.setThumbnail( pageimage );
 				} else embed.setThumbnail( body.query.general.logo );
 				
@@ -1066,6 +1068,59 @@ function cmd_random(lang, msg, wiki) {
 	} );
 }
 
+function cmd_overview(lang, msg, wiki) {
+	msg.reactEmoji('⏳').then( function( reaction ) {
+		request( {
+			uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&meta=siteinfo&siprop=general&titles=Special:Statistics&format=json',
+			json: true
+		}, function( error, response, body ) {
+			if ( body && body.warnings ) log_warn(body.warnings);
+			if ( error || !response || response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.pages ) {
+				if ( response && response.request && response.request.uri && response.request.uri.href === 'https://www.gamepedia.com/' ) {
+					console.log( '- Dieses Wiki existiert nicht! ' + ( error ? error.message : ( body ? ( body.error ? body.error.info : '' ) : '' ) ) );
+					msg.reactEmoji('nowiki');
+				}
+				else {
+					console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+					msg.channel.sendErrorMsg( '<https://' + wiki + '.gamepedia.com/Special:Statistics>' );
+				}
+			}
+			else if ( allSites.some( site => site.wiki_domain === body.query.general.servername ) ) {
+				var site = allSites.find( site => site.wiki_domain === body.query.general.servername );
+				
+				var name = [lang.overview.name, site.wiki_display_name];
+				var created = [lang.overview.created, (new Date(parseInt(site.created + '000', 10))).toLocaleString(lang.user.dateformat, timeoptions)];
+				var manager = [lang.overview.manager, site.wiki_managers];
+				var official = [lang.overview.official, ( site.official_wiki ? lang.overview.yes : lang.overview.no )];
+				var articles = [lang.overview.articles, site.ss_good_articles];
+				var pages = [lang.overview.pages, site.ss_total_pages];
+				var edits = [lang.overview.edits, site.ss_total_edits];
+				var users = [lang.overview.users, site.ss_active_users];
+				
+				var title = body.query.pages['-1'].title;
+				var pagelink = 'https://' + wiki + '.gamepedia.com/' + title.toTitle();
+				if ( msg.showEmbed() ) {
+					var text = '<' + pagelink + '>';
+					var managerlist = manager[1].map( manager => '[' + manager + '](https://' + wiki + '.gamepedia.com/User:' + manager.toTitle(true) + ') ([' + lang.overview.talk + '](https://' + wiki + '.gamepedia.com/User_talk:' + manager.toTitle(true) + '))' ).join('\n');
+					var embed = new Discord.RichEmbed().setAuthor( body.query.general.sitename ).setTitle( title.escapeFormatting() ).setURL( pagelink ).setThumbnail( body.query.general.logo ).addField( name[0], name[1], true ).addField( created[0], created[1], true ).addField( manager[0], managerlist, true ).addField( official[0], official[1], true ).addField( articles[0], articles[1], true ).addField( pages[0], pages[1], true ).addField( edits[0], edits[1], true ).addField( users[0], users[1], true ).setTimestamp( client.readyTimestamp ).setFooter( lang.overview.inaccurate );
+				}
+				else {
+					var embed = {};
+					var text = '<' + pagelink + '>\n\n' + name.join(' ') + '\n' + created.join(' ') + '\n' + manager[0] + ' ' + manager[1].join(', ') + '\n' + official.join(' ') + '\n' + articles.join(' ') + '\n' + pages.join(' ') + '\n' + edits.join(' ') + '\n' + users.join(' ') + '\n\n*' + lang.overview.inaccurate + '*';
+				}
+				
+				msg.channel.sendMsg( text, embed );
+			}
+			else {
+				console.log( '- Dieses Wiki ist nicht gelistet: ' + wiki + '.gamepedia.com' )
+				msg.replyMsg( lang.overview.missing );
+			}
+			
+			if ( reaction ) reaction.removeEmoji();
+		} );
+	} );
+}
+
 function cmd_bug(lang, mclang, msg, args, title, cmd, querystring, fragment) {
 	if ( args.length && /\d+$/.test(args[0]) && !args[1] ) {
 		msg.reactEmoji('⏳').then( function( reaction ) {
@@ -1075,7 +1130,7 @@ function cmd_bug(lang, mclang, msg, args, title, cmd, querystring, fragment) {
 				uri: 'https://bugs.mojang.com/rest/api/2/issue/' + project + args[0] + '?fields=summary,fixVersions,resolution,status',
 				json: true
 			}, function( error, response, body ) {
-				if ( error || !response || response.statusCode != 200 || !body || body['status-code'] == 404 || body.errorMessages || body.errors ) {
+				if ( error || !response || response.statusCode !== 200 || !body || body['status-code'] === 404 || body.errorMessages || body.errors ) {
 					if ( body.errorMessages || body.errors ) {
 						if ( body.errorMessages ) {
 							if ( body.errorMessages.includes( 'Issue Does Not Exist' ) ) {
@@ -1093,7 +1148,7 @@ function cmd_bug(lang, mclang, msg, args, title, cmd, querystring, fragment) {
 					}
 					else {
 						console.log( '- Fehler beim Erhalten der Zusammenfassung' + ( error ? ': ' + error : ( body ? ': ' + body.message : '.' ) ) );
-						if ( body && body['status-code'] == 404 ) msg.reactEmoji('error');
+						if ( body && body['status-code'] === 404 ) msg.reactEmoji('error');
 						else msg.channel.sendErrorMsg( 'https://bugs.mojang.com/browse/' + project + args[0] );
 					}
 				}
@@ -1134,7 +1189,7 @@ function cmd_befehl(lang, mclang, msg, befehl, args, title, cmd, querystring, fr
 }
 
 function cmd_befehl2(lang, mclang, msg, args, title, cmd, querystring, fragment) {
-	if ( args.length ) {
+	if ( args.join('') ) {
 		if ( args[0].startsWith('/') ) cmd_befehl(lang, mclang, msg, args[0].substr(1), args.slice(1), title, cmd);
 		else cmd_befehl(lang, mclang, msg, args[0], args.slice(1), title, cmd);
 	}
@@ -1145,14 +1200,14 @@ function cmd_befehl2(lang, mclang, msg, args, title, cmd, querystring, fragment)
 }
 
 function cmd_multiline(lang, msg, args, line) {
-	if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) {
+	if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) {
 		if ( msg.isAdmin() ) msg.reactEmoji('error');
 		else msg.reactEmoji('❌');
 	}
 }
 
 function cmd_voice(lang, msg, args, line) {
-	if ( msg.isAdmin() && !args.length ) msg.replyMsg( lang.voice.text + '\n`' + lang.voice.channel + ' – <' + lang.voice.name + '>`' );
+	if ( msg.isAdmin() && !args.join('') ) msg.replyMsg( lang.voice.text + '\n`' + lang.voice.channel + ' – <' + lang.voice.name + '>`' );
 	else cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
 }
 
@@ -1193,8 +1248,8 @@ function cmd_get(lang, msg, args, line) {
 				var text = username.join(' ') + '\n' + guildlist.join(' ');
 			}
 			msg.channel.sendMsg( text, embed );
-		} 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);
+		} 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 channelguild = ['Guild:', channel.guild.name + ' `' + channel.guild.id + '`'];
 			var channelname = ['Channel:', '#' + channel.name + ' `' + channel.id + '` ' + channel.toString()];
 			var channelpermissions = ['Missing permissions:', ( channel.memberPermissions(channel.guild.me).has(defaultPermissions) ? '*none*' : '`' + channel.memberPermissions(channel.guild.me).missing(defaultPermissions).join('`, `') + '`' )];
@@ -1209,27 +1264,27 @@ function cmd_get(lang, msg, args, line) {
 			}
 			msg.channel.sendMsg( text, embed );
 		} else msg.replyMsg( 'I couldn\'t find a result for `' + id + '`' );
-	} else if ( msg.channel.type != 'text' || !pause[msg.guild.id] ) cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
+	} else if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
 }
 
 String.prototype.isMention = function(guild) {
 	var text = this.trim();
-	if ( text == '@' + client.user.username || text.replace( /^<@!?(\d+)>$/, '$1' ) == client.user.id || ( guild && text == '@' + guild.me.displayName ) ) return true;
+	if ( text === '@' + client.user.username || text.replace( /^<@!?(\d+)>$/, '$1' ) === client.user.id || ( guild && text === '@' + guild.me.displayName ) ) return true;
 	else return false;
 };
 
 Discord.Message.prototype.isAdmin = function() {
-	if ( this.channel.type == 'text' && this.member && this.member.permissions.has('MANAGE_GUILD') ) return true;
+	if ( this.channel.type === 'text' && this.member && this.member.permissions.has('MANAGE_GUILD') ) return true;
 	else return false;
 };
 
 Discord.Message.prototype.isOwner = function() {
-	if ( this.author.id == process.env.owner ) return true;
+	if ( this.author.id === process.env.owner ) return true;
 	else return false;
 };
 
 Discord.Message.prototype.showEmbed = function() {
-	if ( this.channel.type != 'text' || this.channel.permissionsFor(client.user).has('EMBED_LINKS') ) return true;
+	if ( this.channel.type !== 'text' || this.channel.permissionsFor(client.user).has('EMBED_LINKS') ) return true;
 	else return false;
 };
 
@@ -1278,7 +1333,7 @@ String.prototype.toMarkdown = function(wiki, title = '') {
 			text = text.replace( link[0], '[' + link[2] + link[3] + '](https://' + wiki + '.gamepedia.com/' + page + ')' );
 		}
 	}
-	while ( title != '' && ( link = /\/\*\s*([^\*]+?)\s*\*\/\s*(.)?/g.exec(text) ) !== null ) {
+	while ( title !== '' && ( link = /\/\*\s*([^\*]+?)\s*\*\/\s*(.)?/g.exec(text) ) !== null ) {
 		var page = title.toTitle(true) + '#' + link[1].toSection();
 		text = text.replace( link[0], '[→](https://' + wiki + '.gamepedia.com/' + page + ')' + link[1] + ( link[2] ? ': ' + link[2] : '' ) );
 	}
@@ -1344,24 +1399,24 @@ String.prototype.hasPrefix = function(flags = '') {
 };
 
 client.on( 'message', msg => {
-	if ( stop || !msg.content.hasPrefix('m') || msg.webhookID || msg.author.id == client.user.id ) return;
+	if ( stop || !msg.content.hasPrefix('m') || msg.webhookID || msg.author.id === client.user.id ) return;
 	
 	var cont = msg.content;
 	var author = msg.author;
 	var channel = msg.channel;
-	if ( channel.type == 'text' ) var permissions = channel.permissionsFor(client.user);
+	if ( channel.type === 'text' ) var permissions = channel.permissionsFor(client.user);
 	
-	if ( !ready.settings && settings == defaultSettings ) getSettings(setStatus);
-	if ( !ready.allSites && allSites == defaultSites ) getAllSites();
+	if ( !ready.settings && settings === defaultSettings ) getSettings(setStatus);
+	if ( !ready.allSites && allSites === defaultSites ) getAllSites();
 	var setting = Object.assign({}, settings['default']);
-	if ( settings == defaultSettings ) {
+	if ( settings === defaultSettings ) {
 		msg.channel.sendMsg( '⚠ **Limited Functionality** ⚠\nNo settings found, please contact the bot owner!\n' + process.env.invite );
-	} else if ( channel.type == 'text' && msg.guild.id in settings ) setting = Object.assign({}, settings[msg.guild.id]);
+	} else if ( channel.type === 'text' && msg.guild.id in settings ) setting = Object.assign({}, settings[msg.guild.id]);
 	var lang = Object.assign({}, i18n[setting.lang]);
 	lang.link = setting.wiki;
 	if ( setting.channels && channel.id in setting.channels ) lang.link = setting.channels[channel.id];
 	
-	if ( channel.type != 'text' || permissions.has(['SEND_MESSAGES','ADD_REACTIONS','USE_EXTERNAL_EMOJIS','READ_MESSAGE_HISTORY']) ) {
+	if ( channel.type !== 'text' || permissions.has(['SEND_MESSAGES','ADD_REACTIONS','USE_EXTERNAL_EMOJIS','READ_MESSAGE_HISTORY']) ) {
 		var invoke = cont.split(' ')[1] ? cont.split(' ')[1].split('\n')[0].toLowerCase() : '';
 		var aliasInvoke = ( invoke in lang.aliase ) ? lang.aliase[invoke] : invoke;
 		var ownercmd = msg.isOwner() && aliasInvoke in ownercmdmap;
@@ -1386,15 +1441,15 @@ client.on( 'message', msg => {
 					var args = line.split(' ').slice(2);
 					aliasInvoke = ( invoke in lang.aliase ) ? lang.aliase[invoke] : invoke;
 					ownercmd = msg.isOwner() && aliasInvoke in ownercmdmap;
-					if ( channel.type == 'text' && pause[msg.guild.id] && !( ( msg.isAdmin() && aliasInvoke in pausecmdmap ) || ownercmd ) ) console.log( msg.guild.name + ': Pausiert' );
+					if ( channel.type === 'text' && pause[msg.guild.id] && !( ( msg.isAdmin() && aliasInvoke in pausecmdmap ) || ownercmd ) ) console.log( msg.guild.name + ': Pausiert' );
 					else console.log( ( msg.guild ? msg.guild.name : '@' + author.username ) + ': ' + line );
 					if ( ownercmd ) ownercmdmap[aliasInvoke](lang, msg, args, line);
-					else if ( channel.type != 'text' || !pause[msg.guild.id] || ( msg.isAdmin() && aliasInvoke in pausecmdmap ) ) {
+					else if ( channel.type !== 'text' || !pause[msg.guild.id] || ( msg.isAdmin() && aliasInvoke in pausecmdmap ) ) {
 						if ( aliasInvoke in cmdmap ) cmdmap[aliasInvoke](lang, msg, args, line);
 						else if ( /^![a-z\d-]{1,30}$/.test(invoke) ) cmd_link(lang, msg, args.join(' '), invoke.substr(1), ' ' + invoke + ' ');
 						else cmd_link(lang, msg, line.split(' ').slice(1).join(' '));
 					}
-				} else if ( line.hasPrefix() && count == 10 ) {
+				} else if ( line.hasPrefix() && count === 10 ) {
 					count++;
 					console.log( '- Nachricht enthält zu viele Befehle!' );
 					msg.reactEmoji('⚠');
@@ -1413,21 +1468,21 @@ client.on( 'message', msg => {
 client.on( 'voiceStateUpdate', (oldm, newm) => {
 	if ( stop ) return;
 	
-	if ( !ready.settings && settings == defaultSettings ) getSettings(setStatus);
-	if ( !ready.allSites && allSites == defaultSites ) getAllSites();
-	if ( oldm.guild.me.permissions.has('MANAGE_ROLES') && oldm.voiceChannelID != newm.voiceChannelID ) {
+	if ( !ready.settings && settings === defaultSettings ) getSettings(setStatus);
+	if ( !ready.allSites && 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]);
 		var lang = i18n[setting.lang];
 		if ( oldm.voiceChannel ) {
-			var oldrole = oldm.roles.find( role => role.name == lang.voice.channel + ' – ' + oldm.voiceChannel.name );
+			var oldrole = oldm.roles.find( role => role.name === lang.voice.channel + ' – ' + oldm.voiceChannel.name );
 			if ( oldrole && oldrole.comparePositionTo(oldm.guild.me.highestRole) < 0 ) {
 				console.log( oldm.guild.name + ': ' + oldm.displayName + ' hat den Sprachkanal "' + oldm.voiceChannel.name + '" verlassen.' );
 				oldm.removeRole( oldrole, lang.voice.left.replace( '%1$s', oldm.displayName ).replace( '%2$s', oldm.voiceChannel.name ) ).catch(log_error);
 			}
 		}
 		if ( newm.voiceChannel ) {
-			var newrole = newm.guild.roles.find( role => role.name == lang.voice.channel + ' – ' + newm.voiceChannel.name );
+			var newrole = newm.guild.roles.find( role => role.name === lang.voice.channel + ' – ' + newm.voiceChannel.name );
 			if ( newrole && newrole.comparePositionTo(newm.guild.me.highestRole) < 0 ) {
 				console.log( newm.guild.name + ': ' + newm.displayName + ' hat den Sprachkanal "' + newm.voiceChannel.name + '" betreten.' );
 				newm.addRole( newrole, lang.voice.join.replace( '%1$s', newm.displayName ).replace( '%2$s', newm.voiceChannel.name ) ).catch(log_error);
@@ -1448,13 +1503,13 @@ client.on( 'guildDelete', guild => {
 		return;
 	}
 	
-	if ( settings == defaultSettings ) {
+	if ( settings === defaultSettings ) {
 		console.log( '- Fehler beim Erhalten bestehender Einstellungen.' );
 	}
 	else {
 		var temp_settings = Object.assign({}, settings);
 		Object.keys(temp_settings).forEach( function(guild) {
-			if ( !client.guilds.has(guild) && guild != 'default' ) delete temp_settings[guild];
+			if ( !client.guilds.has(guild) && guild !== 'default' ) delete temp_settings[guild];
 		} );
 		request.post( {
 			uri: process.env.save,
@@ -1472,7 +1527,7 @@ client.on( 'guildDelete', guild => {
 			},
 			json: true
 		}, function( error, response, body ) {
-			if ( error || !response || response.statusCode != 201 || !body || body.error ) {
+			if ( error || !response || response.statusCode !== 201 || !body || body.error ) {
 				console.log( '- Fehler beim Bearbeiten' + ( error ? ': ' + error : ( body ? ( body.message ? ': ' + body.message : ( body.error ? ': ' + body.error : '.' ) ) : '.' ) ) );
 			}
 			else {
@@ -1520,7 +1575,7 @@ async function graceful(code = 1) {
 			console.log( '- SIGTERM: Beenden dauert zu lange, terminieren!' );
 			process.exit(code);
 		}, 1000 ).unref();
-	}, 10000 ).unref();
+	}, 5000 ).unref();
 }
 
 process.once( 'SIGINT', graceful );

+ 46 - 0
wiki_manager.json

@@ -0,0 +1,46 @@
+{
+	"terraria.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-de.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-fr.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-hu.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-ko.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-pl.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-pt.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-ru.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-uk.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terraria-zh.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terrariaotherworld.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"terrariamods.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"antiaris.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"calamitymod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"enigmamod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"exodusmod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"fargosmod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"germaniummod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"grealm.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"sacredtools.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"spiritmod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"superterrariaworld.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"thoriummod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"tremormod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"decimationmod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"splitmod.gamepedia.com": ["ReedemtheD3ad", "Equazcion"],
+	"minecraft.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-cs.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-de.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-el.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-es.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-fr.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-hu.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-it.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-ja.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-ko.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-nl.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-pl.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-pt.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-ru.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-th.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-tr.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-uk.gamepedia.com": ["Majr", "Game widow"],
+	"minecraft-zh.gamepedia.com": ["Majr", "Game widow"]
+}