Преглед на файлове

better error messages for settings

Markus-Rost преди 4 години
родител
ревизия
3d6cb864c0
променени са 3 файла, в които са добавени 32 реда и са изтрити 11 реда
  1. 24 7
      cmds/settings.js
  2. 3 0
      i18n/en.json
  3. 5 4
      util/newMessage.js

+ 24 - 7
cmds/settings.js

@@ -89,12 +89,19 @@ function cmd_settings(lang, msg, args, line, wiki) {
 				return msg.replyMsg( text, {split:true}, true );
 				return msg.replyMsg( text, {split:true}, true );
 			}
 			}
 			return msg.reactEmoji('⏳', true).then( reaction => {
 			return msg.reactEmoji('⏳', true).then( reaction => {
-				got.get( wikinew + 'api.php?&action=query&meta=siteinfo&siprop=general|extensions&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 = new Wiki(api.split('api.php?')[0], wikinew);
-							return got.get( wikinew + 'api.php?action=query&meta=siteinfo&siprop=general|extensions&format=json' );
+				got.get( wikinew + 'api.php?&action=query&meta=siteinfo&siprop=general|extensions&format=json', {
+					responseType: 'text'
+				} ).then( response => {
+					try {
+						response.body = JSON.parse(response.body);
+					}
+					catch (error) {
+						if ( response.statusCode === 404 && typeof response.body === 'string' ) {
+							let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+							if ( api ) {
+								wikinew = new Wiki(api.split('api.php?')[0], wikinew);
+								return got.get( wikinew + 'api.php?action=query&meta=siteinfo&siprop=general|extensions&format=json' );
+							}
 						}
 						}
 					}
 					}
 					return response;
 					return response;
@@ -103,6 +110,9 @@ function cmd_settings(lang, msg, args, line, wiki) {
 					if ( response.statusCode !== 200 || body?.batchcomplete === undefined || !body?.query?.general || !body?.query?.extensions ) {
 					if ( response.statusCode !== 200 || body?.batchcomplete === undefined || !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 );
 						if ( reaction ) reaction.removeEmoji();
 						if ( reaction ) reaction.removeEmoji();
+						if ( body?.error?.info === 'You need read permission to use this module.' ) {
+							return msg.replyMsg( lang.get('settings.wikiinvalid_private') + wikihelp, {}, true );
+						}
 						msg.reactEmoji('nowiki', true);
 						msg.reactEmoji('nowiki', true);
 						return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
 						return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
 					}
 					}
@@ -181,8 +191,15 @@ function cmd_settings(lang, msg, args, line, wiki) {
 						} );
 						} );
 					} );
 					} );
 				}, ferror => {
 				}, ferror => {
-					console.log( '- Error while testing the wiki: ' + ferror );
 					if ( reaction ) reaction.removeEmoji();
 					if ( reaction ) reaction.removeEmoji();
+					if ( ferror.message?.startsWith( 'connect ECONNREFUSED ' ) || ferror.message?.startsWith( 'Hostname/IP does not match certificate\'s altnames: ' ) || ferror.message === 'certificate has expired' ) {
+						console.log( '- Error while testing the wiki: No HTTPS' );
+						return msg.replyMsg( lang.get('settings.wikiinvalid_http') + wikihelp, {}, true );
+					}
+					console.log( '- Error while testing the wiki: ' + ferror );
+					if ( ferror.message === `Timeout awaiting 'request' for ${got.defaults.options.timeout.request}ms` ) {
+						return msg.replyMsg( lang.get('settings.wikiinvalid_timeout') + wikihelp, {}, true );
+					}
 					msg.reactEmoji('nowiki', true);
 					msg.reactEmoji('nowiki', true);
 					return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
 					return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
 				} );
 				} );

+ 3 - 0
i18n/en.json

@@ -630,6 +630,9 @@
         "wikichanged": "you changed the default wiki for this server to:",
         "wikichanged": "you changed the default wiki for this server to:",
         "wikihelp": "Use `$1 <link>` to change the default wiki.\nLink to a MediaWiki site like `https://<wiki>.gamepedia.com/` or `https://<wiki>.fandom.com/`",
         "wikihelp": "Use `$1 <link>` to change the default wiki.\nLink to a MediaWiki site like `https://<wiki>.gamepedia.com/` or `https://<wiki>.fandom.com/`",
         "wikiinvalid": "please provide a valid link to a MediaWiki site, like a Gamepedia or Fandom wiki!",
         "wikiinvalid": "please provide a valid link to a MediaWiki site, like a Gamepedia or Fandom wiki!",
+        "wikiinvalid_http": "the provided link doesn't have a valid HTTPS certificate! For security reasons only wikis using HTTPS are supported.\nIf you are a site administrator, you can get a certificate from a certificate authority like *Let’s Encrypt*:\n<https://letsencrypt.org/getting-started/>",
+        "wikiinvalid_private": "the provided wiki is private! Only public wikis that can be read by everyone are supported.",
+        "wikiinvalid_timeout": "the provided link took too long to respond!",
         "wikimissing": "no default wiki is set for this server yet!"
         "wikimissing": "no default wiki is set for this server yet!"
     },
     },
     "test": {
     "test": {

+ 5 - 4
util/newMessage.js

@@ -113,6 +113,7 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 			if ( line.startsWith( '>>> ' ) ) breakInline = true;
 			if ( line.startsWith( '>>> ' ) ) breakInline = true;
 			if ( line.startsWith( '> ' ) || breakInline ) return;
 			if ( line.startsWith( '> ' ) || breakInline ) return;
 			if ( line.hasPrefix(prefix) || !( line.includes( '[[' ) || line.includes( '{{' ) ) ) return;
 			if ( line.hasPrefix(prefix) || !( line.includes( '[[' ) || line.includes( '{{' ) ) ) return;
+			line = line.replace( /(?:%[\dA-F]{2})+/g, partialURIdecode );
 			if ( line.includes( '[[' ) && line.includes( ']]' ) && linkcount <= linkmaxcount ) {
 			if ( line.includes( '[[' ) && line.includes( ']]' ) && linkcount <= linkmaxcount ) {
 				let regex = new RegExp( '(?<!\\\\)(|\\|\\|)\\[\\[([^' + "<>\\[\\]\\|{}\\x01-\\x1F\\x7F" + ']+)(?<!\\\\)\\]\\]\\1', 'g' );
 				let regex = new RegExp( '(?<!\\\\)(|\\|\\|)\\[\\[([^' + "<>\\[\\]\\|{}\\x01-\\x1F\\x7F" + ']+)(?<!\\\\)\\]\\]\\1', 'g' );
 				let entry = null;
 				let entry = null;
@@ -120,8 +121,8 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 					if ( linkcount < linkmaxcount ) {
 					if ( linkcount < linkmaxcount ) {
 						linkcount++;
 						linkcount++;
 						console.log( ( channel.isGuild() ? msg.guild.id : '@' + author.id ) + ': ' + entry[0] );
 						console.log( ( channel.isGuild() ? msg.guild.id : '@' + author.id ) + ': ' + entry[0] );
-						let title = entry[2].split('#')[0].replace( /(?:%[\dA-F]{2})+/g, partialURIdecode );
-						let section = ( entry[2].includes( '#' ) ? entry[2].split('#').slice(1).join('#').replace( /(?:%[\dA-F]{2})+/g, partialURIdecode ) : '' );
+						let title = entry[2].split('#')[0];
+						let section = entry[2].split('#').slice(1).join('#');
 						links.push({title,section,spoiler:entry[1]});
 						links.push({title,section,spoiler:entry[1]});
 					}
 					}
 					else if ( linkcount === linkmaxcount ) {
 					else if ( linkcount === linkmaxcount ) {
@@ -140,8 +141,8 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 					if ( count < maxcount ) {
 					if ( count < maxcount ) {
 						count++;
 						count++;
 						console.log( ( channel.isGuild() ? msg.guild.id : '@' + author.id ) + ': ' + entry[0] );
 						console.log( ( channel.isGuild() ? msg.guild.id : '@' + author.id ) + ': ' + entry[0] );
-						let title = entry[2].split('#')[0].replace( /(?:%[\dA-F]{2})+/g, partialURIdecode );
-						let section = ( entry[2].includes( '#' ) ? entry[2].split('#').slice(1).join('#').replace( /(?:%[\dA-F]{2})+/g, partialURIdecode ) : '' );
+						let title = entry[2].split('#')[0];
+						let section = entry[2].split('#').slice(1).join('#');
 						embeds.push({title,section,spoiler:entry[1]});
 						embeds.push({title,section,spoiler:entry[1]});
 					}
 					}
 					else if ( count === maxcount ) {
 					else if ( count === maxcount ) {