Browse Source

Support for IPv6

Markus-Rost 6 years ago
parent
commit
86fd25dafc
1 changed files with 89 additions and 16 deletions
  1. 89 16
      main.js

+ 89 - 16
main.js

@@ -548,16 +548,45 @@ function check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '', queryst
 						delete body.query.redirects[0].tofragment;
 						delete querypage.missing;
 						querypage.ns = -1;
+						querypage.special = '';
 					}
 					
 					var contribs = body.query.namespaces['-1']['*'] + ':' + body.query.specialpagealiases.find( sp => sp.realname === 'Contributions' ).aliases[0] + '/';
-					if ( ( querypage.ns === 2 || querypage.ns === 202 ) && ( !querypage.title.includes( '/' ) || /^[^:]+:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d\d$/.test(querypage.title) ) ) {
+					if ( ( querypage.ns === 2 || querypage.ns === 202 ) && ( !querypage.title.includes( '/' ) || /^[^:]+:(?:(?:\d{1,3}\.){3}\d{1,3}\/\d{2}|(?:[\dA-F]{1,4}:){7}[\dA-F]{1,4}\/\d{2,3})$/.test(querypage.title) ) ) {
 						var userparts = querypage.title.split(':');
-						cmd_user(lang, msg, userparts[0].toTitle() + ':', userparts.slice(1).join(':'), wiki, linksuffix, noRedirect, contribs.toTitle(), reaction, spoiler);
+						querypage.noRedirect = noRedirect;
+						cmd_user(lang, msg, userparts[0].toTitle() + ':', userparts.slice(1).join(':'), wiki, linksuffix, querypage, contribs.toTitle(), reaction, spoiler);
 					}
 					else if ( querypage.ns === -1 && querypage.title.startsWith(contribs) && querypage.title.length > contribs.length ) {
-						var userparts = querypage.title.split('/');
-						cmd_user(lang, msg, userparts[0].toTitle() + '/', userparts.slice(1).join('/'), wiki, linksuffix, noRedirect, contribs.toTitle(), reaction, spoiler);
+						var username = querypage.title.split('/').slice(1).join('/');
+						request( {
+							uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&titles=User:' + encodeURIComponent( username ) + '&format=json',
+							json: true
+						}, function( uerror, uresponse, ubody ) {
+							if ( uerror || !uresponse || uresponse.statusCode !== 200 || !ubody || ubody.batchcomplete === undefined ) {
+								console.log( '- Fehler beim Erhalten der Benutzer' + ( uerror ? ': ' + uerror : ( ubody ? ( ubody.error ? ': ' + ubody.error.info : '.' ) : '.' ) ) );
+								msg.sendChannelError( spoiler + '<https://' + wiki + '.gamepedia.com/' + ( contribs + username ).toTitle() + linksuffix + '>' + spoiler );
+								
+								if ( reaction ) reaction.removeEmoji();
+							}
+							else {
+								querypage = Object.values(ubody.query.pages)[0];
+								if ( querypage.ns === 2 ) {
+									username = querypage.title.split(':').slice(1).join(':');
+									querypage.title = contribs + username;
+									delete querypage.missing;
+									querypage.ns = -1;
+									querypage.special = '';
+									querypage.noRedirect = noRedirect;
+									cmd_user(lang, msg, contribs.toTitle(), username, wiki, linksuffix, querypage, contribs.toTitle(), reaction, spoiler);
+								}
+								else {
+									msg.reactEmoji('error');
+									
+									if ( reaction ) reaction.removeEmoji();
+								}
+							}
+						} );
 					}
 					else if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) {
 						request( {
@@ -774,8 +803,8 @@ function cmd_sendumfrage(lang, msg, text, reactions, imgs) {
 	} );
 }
 
-function cmd_user(lang, msg, namespace, username, wiki, linksuffix, noRedirect, contribs, reaction, spoiler) {
-	if ( /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:\/\d\d)?$/.test(username) ) {
+function cmd_user(lang, msg, namespace, username, wiki, linksuffix, querypage, contribs, reaction, spoiler) {
+	if ( /^(?:(?:\d{1,3}\.){3}\d{1,3}(?:\/\d{2})?|(?:[\dA-F]{1,4}:){7}[\dA-F]{1,4}(?:\/\d{2,3})?)$/.test(username) ) {
 		request( {
 			uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&meta=siteinfo&siprop=general&list=blocks&bkprop=user|by|timestamp|expiry|reason&bkip=' + encodeURIComponent( username ) + '&format=json',
 			json: true
@@ -787,17 +816,32 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, noRedirect,
 					msg.reactEmoji('nowiki');
 				}
 				else if ( body && body.error && ( body.error.code === 'param_ip' || body.error.code === 'cidrtoobroad' ) ) {
-					msg.reactEmoji('error');
+					if ( querypage.missing !== undefined || querypage.ns === -1 ) msg.reactEmoji('error');
+					else {
+						var pagelink = 'https://' + wiki + '.gamepedia.com/' + querypage.title.toTitle() + linksuffix;
+						var embed = new Discord.RichEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
+						if ( querypage.extract ) {
+							var extract = querypage.extract.escapeFormatting();
+							if ( extract.length > 2000 ) extract = extract.substr(0, 2000) + '\u2026';
+							embed.setDescription( extract );
+						}
+						if ( querypage.pageimage ) {
+							var pageimage = 'https://' + wiki + '.gamepedia.com/Special:FilePath/' + querypage.pageimage;
+							embed.setThumbnail( pageimage );
+						} else embed.setThumbnail( body.query.general.logo );
+						
+						msg.sendChannel( spoiler + pagelink + spoiler, embed );
+					}
 				}
 				else {
 					console.log( '- Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
-					msg.sendChannelError( spoiler + '<https://' + wiki + '.gamepedia.com/' + ( noRedirect ? namespace : contribs ) + username.toTitle() + linksuffix + '>' + spoiler );
+					msg.sendChannelError( spoiler + '<https://' + wiki + '.gamepedia.com/' + ( querypage.noRedirect ? namespace : contribs ) + username.toTitle() + linksuffix + '>' + spoiler );
 				}
 				
 				if ( reaction ) reaction.removeEmoji();
 			}
 			else {
-				if ( !noRedirect ) namespace = contribs;
+				if ( !querypage.noRedirect || ( querypage.missing === undefined && querypage.ns !== -1 ) ) namespace = contribs;
 				var blocks = body.query.blocks.map( function(block) {
 					var isBlocked = false;
 					var blockedtimestamp = (new Date(block.timestamp)).toLocaleString(lang.user.dateformat, timeoptions);
@@ -813,15 +857,29 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, noRedirect,
 				} ).filter( block => block !== undefined );
 				if ( username.includes( '/' ) ) {
 					var rangeprefix = username;
-					var range = parseInt(username.substr(-2, 2), 10);
-					if ( range >= 32 ) username = username.replace( /^(.+)\/\d\d$/, '$1' );
-					else if ( range >= 24 ) rangeprefix = username.replace( /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.).+$/, '$1' );
-					else if ( range >= 16 ) rangeprefix = username.replace( /^(\d{1,3}\.\d{1,3}\.).+$/, '$1' );
+					if ( username.includes( ':' ) ) {
+						var range = parseInt(username.replace( /^.+\/(\d{2,3})$/, '$1' ), 10);
+						if ( range === 128 ) username = username.replace( /^(.+)\/\d{2,3}$/, '$1' );
+						else if ( range >= 112 ) rangeprefix = username.replace( /^((?:[\dA-F]{1,4}:){7}).+$/, '$1' );
+						else if ( range >= 96 ) rangeprefix = username.replace( /^((?:[\dA-F]{1,4}:){6}).+$/, '$1' );
+						else if ( range >= 80 ) rangeprefix = username.replace( /^((?:[\dA-F]{1,4}:){5}).+$/, '$1' );
+						else if ( range >= 64 ) rangeprefix = username.replace( /^((?:[\dA-F]{1,4}:){4}).+$/, '$1' );
+						else if ( range >= 48 ) rangeprefix = username.replace( /^((?:[\dA-F]{1,4}:){3}).+$/, '$1' );
+						else if ( range >= 32 ) rangeprefix = username.replace( /^((?:[\dA-F]{1,4}:){2}).+$/, '$1' );
+						else if ( range >= 19 ) rangeprefix = username.replace( /^((?:[\dA-F]{1,4}:){1}).+$/, '$1' );
+					}
+					else {
+						var range = parseInt(username.substr(-2, 2), 10);
+						if ( range === 32 ) username = username.replace( /^(.+)\/\d{2}$/, '$1' );
+						else if ( range >= 24 ) rangeprefix = username.replace( /^((?:\d{1,3}\.){3}).+$/, '$1' );
+						else if ( range >= 16 ) rangeprefix = username.replace( /^((?:\d{1,3}\.){2}).+$/, '$1' );
+					}
 				}
 				request( {
-					uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&list=usercontribs&ucprop=' + ( username.includes( '/' ) ? '&ucuserprefix=' + encodeURIComponent( rangeprefix ) : '&ucuser=' + encodeURIComponent( username ) ) + '&format=json',
+					uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&list=usercontribs&ucprop=&uclimit=50' + ( username.includes( '/' ) ? '&ucuserprefix=' + encodeURIComponent( rangeprefix ) : '&ucuser=' + encodeURIComponent( username ) ) + '&format=json',
 					json: true
 				}, function( ucerror, ucresponse, ucbody ) {
+					if ( rangeprefix && !username.includes( '/' ) ) username = rangeprefix;
 					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' ) {
@@ -833,7 +891,7 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, noRedirect,
 						}
 					}
 					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( '/' ) && ( ( username.includes( ':' ) && range % 16 ) || range % 8 ) ? '~' : '' ) + ucbody.query.usercontribs.length + ( ucbody.continue ? '+' : '' )];
 						
 						var pagelink = 'https://' + wiki + '.gamepedia.com/' + namespace + username.toTitle() + linksuffix;
 						if ( msg.showEmbed() ) {
@@ -872,7 +930,22 @@ function cmd_user(lang, msg, namespace, username, wiki, linksuffix, noRedirect,
 			}
 			else {
 				if ( body.query.users[0].missing !== undefined || body.query.users[0].invalid !== undefined ) {
-					msg.reactEmoji('🤷');
+					if ( querypage.missing !== undefined || querypage.ns === -1 ) msg.reactEmoji('🤷');
+					else {
+						var pagelink = 'https://' + wiki + '.gamepedia.com/' + querypage.title.toTitle() + linksuffix;
+						var embed = new Discord.RichEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
+						if ( querypage.extract ) {
+							var extract = querypage.extract.escapeFormatting();
+							if ( extract.length > 2000 ) extract = extract.substr(0, 2000) + '\u2026';
+							embed.setDescription( extract );
+						}
+						if ( querypage.pageimage ) {
+							var pageimage = 'https://' + wiki + '.gamepedia.com/Special:FilePath/' + querypage.pageimage;
+							embed.setThumbnail( pageimage );
+						} else embed.setThumbnail( body.query.general.logo );
+						
+						msg.sendChannel( spoiler + pagelink + spoiler, embed );
+					}
 				}
 				else {
 					username = body.query.users[0].name;