Browse Source

perfect wiki detection

Markus-Rost 4 years ago
parent
commit
4e7295ca4f
3 changed files with 37 additions and 8 deletions
  1. 1 1
      cmds/patreon.js
  2. 24 5
      cmds/rcscript.js
  3. 12 2
      cmds/settings.js

+ 1 - 1
cmds/patreon.js

@@ -10,7 +10,7 @@ var db = require('../util/database.js');
  * @param {String} wiki - The wiki for the message.
  * @param {String} wiki - The wiki for the message.
  */
  */
 function cmd_patreon(lang, msg, args, line, wiki) {
 function cmd_patreon(lang, msg, args, line, wiki) {
-	if ( msg.channel.id !== process.env.channel || !args.join('') ) {
+	if ( !( process.env.channel.split('|').includes( msg.channel.id ) && args.join('') ) ) {
 		if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) this.LINK(lang, msg, line, wiki);
 		if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) this.LINK(lang, msg, line, wiki);
 		return;
 		return;
 	}
 	}

+ 24 - 5
cmds/rcscript.js

@@ -1,3 +1,4 @@
+const cheerio = require('cheerio');
 const {limit: {rcgcdw: rcgcdwLimit}, defaultSettings, wikiProjects} = require('../util/default.json');
 const {limit: {rcgcdw: rcgcdwLimit}, defaultSettings, wikiProjects} = require('../util/default.json');
 const Lang = require('../util/i18n.js');
 const Lang = require('../util/i18n.js');
 const allLangs = Lang.allLangs(true);
 const allLangs = Lang.allLangs(true);
@@ -62,9 +63,18 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				wikinew = input_to_wiki(wikinew.replace( /^(?:https?:)?\/\//, 'https://' ));
 				wikinew = input_to_wiki(wikinew.replace( /^(?:https?:)?\/\//, 'https://' ));
 				if ( !wikinew ) return msg.replyMsg( wikiinvalid, {}, true );
 				if ( !wikinew ) return msg.replyMsg( wikiinvalid, {}, true );
 			}
 			}
-			return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general|extensions&titles=Special:RecentChanges&format=json' ).then( response => {
+			return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' ).then( response => {
+				if ( response.statusCode === 404 && typeof response.body === 'string' ) {
+					let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+					if ( api ) {
+						wikinew = api.replace( /^(?:https?:)?\/\//, 'https://' ).split('api.php?')[0];
+						return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );
+					}
+				}
+				return response;
+			} ).then( response => {
 				var body = response.body;
 				var body = response.body;
-				if ( response.statusCode !== 200 || !body?.query?.allmessages || !body?.query?.general || !body?.query?.extensions || !body?.query?.pages?.['-1'] ) {
+				if ( response.statusCode !== 200 || !body?.query?.allmessages || !body?.query?.general || !body?.query?.pages?.['-1'] ) {
 					console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
 					console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
 					if ( reaction ) reaction.removeEmoji();
 					if ( reaction ) reaction.removeEmoji();
 					msg.reactEmoji('nowiki', true);
 					msg.reactEmoji('nowiki', true);
@@ -222,9 +232,18 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				var wikiinvalid = lang.get('settings.wikiinvalid') + '\n`' + cmd + ' wiki ' + lang.get('rcscript.new_wiki') + '`\n' + lang.get('rcscript.help_wiki');
 				var wikiinvalid = lang.get('settings.wikiinvalid') + '\n`' + cmd + ' wiki ' + lang.get('rcscript.new_wiki') + '`\n' + lang.get('rcscript.help_wiki');
 				var wikinew = input_to_wiki(args[1].replace( /^(?:https?:)?\/\//, 'https://' ));
 				var wikinew = input_to_wiki(args[1].replace( /^(?:https?:)?\/\//, 'https://' ));
 				if ( !wikinew ) return msg.replyMsg( wikiinvalid, {}, true );
 				if ( !wikinew ) return msg.replyMsg( wikiinvalid, {}, true );
-				return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general|extensions&titles=Special:RecentChanges&format=json' ).then( response => {
+				return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' ).then( response => {
+					if ( response.statusCode === 404 && typeof response.body === 'string' ) {
+						let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+						if ( api ) {
+							wikinew = api.replace( /^(?:https?:)?\/\//, 'https://' ).split('api.php?')[0];
+							return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );
+						}
+					}
+					return response;
+				} ).then( response => {
 					var body = response.body;
 					var body = response.body;
-					if ( response.statusCode !== 200 || !body?.query?.allmessages || !body?.query?.general || !body?.query?.extensions || !body?.query?.pages?.['-1'] ) {
+					if ( response.statusCode !== 200 || !body?.query?.allmessages || !body?.query?.general || !body?.query?.pages?.['-1'] ) {
 						console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
 						console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
 						if ( reaction ) reaction.removeEmoji();
 						if ( reaction ) reaction.removeEmoji();
 						msg.reactEmoji('nowiki', true);
 						msg.reactEmoji('nowiki', true);
@@ -639,7 +658,7 @@ function input_to_wiki(input) {
 			regex = input.match( new RegExp( project.regex + `(?:${project.articlePath}|${project.scriptPath}|/?$)` ) );
 			regex = input.match( new RegExp( project.regex + `(?:${project.articlePath}|${project.scriptPath}|/?$)` ) );
 			if ( regex ) return 'https://' + regex[1] + project.scriptPath;
 			if ( regex ) return 'https://' + regex[1] + project.scriptPath;
 		}
 		}
-		let wiki = input.replace( /\/(?:api|index)\.php(?:|\?.*)$/, '/' );
+		let wiki = input.replace( /\/(?:api|load|index)\.php(?:|\?.*)$/, '/' );
 		if ( !wiki.endsWith( '/' ) ) wiki += '/';
 		if ( !wiki.endsWith( '/' ) ) wiki += '/';
 		return wiki;
 		return wiki;
 	}
 	}

+ 12 - 2
cmds/settings.js

@@ -1,3 +1,4 @@
+const cheerio = require('cheerio');
 const {MessageEmbed} = require('discord.js');
 const {MessageEmbed} = require('discord.js');
 const {defaultSettings, wikiProjects} = require('../util/default.json');
 const {defaultSettings, wikiProjects} = require('../util/default.json');
 const Lang = require('../util/i18n.js');
 const Lang = require('../util/i18n.js');
@@ -95,7 +96,16 @@ function cmd_settings(lang, msg, args, line, wiki) {
 				if ( site ) wikinew = 'https://' + ( site.wiki_crossover || site.wiki_domain ) + '/';
 				if ( site ) wikinew = 'https://' + ( site.wiki_crossover || site.wiki_domain ) + '/';
 			}
 			}
 			return msg.reactEmoji('⏳', true).then( reaction => {
 			return msg.reactEmoji('⏳', true).then( reaction => {
-				got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-GamepediaNotice|custom-FandomMergeNotice&amenableparser=true&siprop=general|extensions&format=json' ).then( response => {
+				got.get( wikinew + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-GamepediaNotice|custom-FandomMergeNotice&amenableparser=true&siprop=general|extensions&format=json' ).then( response => {
+					if ( !isForced && response.statusCode === 404 && typeof response.body === 'string' ) {
+						let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+						if ( api ) {
+							wikinew = api.replace( /^(?:https?:)?\/\//, 'https://' ).split('api.php?')[0];
+							return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-GamepediaNotice|custom-FandomMergeNotice&amenableparser=true&siprop=general|extensions&format=json' );
+						}
+					}
+					return response;
+				} ).then( response => {
 					var body = response.body;
 					var body = response.body;
 					if ( response.statusCode !== 200 || !body?.query?.allmessages || !body?.query?.general || !body?.query?.extensions ) {
 					if ( response.statusCode !== 200 || !body?.query?.allmessages || !body?.query?.general || !body?.query?.extensions ) {
 						console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
 						console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
@@ -353,7 +363,7 @@ function input_to_wiki(input) {
 			regex = input.match( new RegExp( project.regex + `(?:${project.articlePath}|${project.scriptPath}|/?$)` ) );
 			regex = input.match( new RegExp( project.regex + `(?:${project.articlePath}|${project.scriptPath}|/?$)` ) );
 			if ( regex ) return 'https://' + regex[1] + project.scriptPath;
 			if ( regex ) return 'https://' + regex[1] + project.scriptPath;
 		}
 		}
-		let wiki = input.replace( /\/(?:api|index)\.php(?:|\?.*)$/, '/' );
+		let wiki = input.replace( /\/(?:api|load|index)\.php(?:|\?.*)$/, '/' );
 		if ( !wiki.endsWith( '/' ) ) wiki += '/';
 		if ( !wiki.endsWith( '/' ) ) wiki += '/';
 		return wiki;
 		return wiki;
 	}
 	}