瀏覽代碼

added random command, fixed `?` bug

help command will be updated soon
Markus-Rost 6 年之前
父節點
當前提交
2d3f50cae3
共有 1 個文件被更改,包括 45 次插入25 次删除
  1. 45 25
      main.js

+ 45 - 25
main.js

@@ -370,10 +370,11 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 	var invoke = title.split(' ')[0].toLowerCase();
 	var invoke = title.split(' ')[0].toLowerCase();
 	var args = title.split(' ').slice(1);
 	var args = title.split(' ').slice(1);
 	
 	
-	if ( invoke == 'page' || invoke == lang.search.page ) msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + args.join('_') );
-	else if ( invoke == 'search' || invoke == lang.search.search ) msg.channel.send( 'https://' + wiki + '.gamepedia.com/Special:Search/' + args.join('_') );
+	if ( title.toLowerCase() == 'random' ) cmd_random(lang, msg, wiki);
+	else if ( invoke == 'page' || invoke == lang.search.page ) msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + args.join('_') );
+	else if ( invoke == 'search' || invoke == lang.search.search ) msg.channel.send( 'https://' + wiki + '.gamepedia.com/Special:Search/' + args.join('_').replace( /\?/g, '%3F' ) );
 	else if ( invoke == 'diff' ) cmd_diff(lang, msg, args, wiki);
 	else if ( invoke == 'diff' ) cmd_diff(lang, msg, args, wiki);
-	else if ( title.includes( '#' ) || title.includes( '?' ) ) msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + title.replace( / /g, '_' ) );
+	else if ( title.includes( '#' ) ) msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + title.replace( / /g, '_' ).replace( /\?/g, '%3F' ) );
 	else if ( invoke == 'user' || invoke == lang.search.user.unknown || invoke == lang.search.user.male || invoke == lang.search.user.female ) cmd_user(lang, msg, args.join('_'), wiki, title.replace( / /g, '_' ));
 	else if ( invoke == 'user' || invoke == lang.search.user.unknown || invoke == lang.search.user.male || invoke == lang.search.user.female ) cmd_user(lang, msg, args.join('_'), wiki, title.replace( / /g, '_' ));
 	else if ( invoke.startsWith('user:') ) cmd_user(lang, msg, title.substr(5), wiki, title.replace( / /g, '_' ));
 	else if ( invoke.startsWith('user:') ) cmd_user(lang, msg, title.substr(5), wiki, title.replace( / /g, '_' ));
 	else if ( invoke.startsWith('userprofile:') ) cmd_user(lang, msg, title.substr(12), wiki, title.replace( / /g, '_' ));
 	else if ( invoke.startsWith('userprofile:') ) cmd_user(lang, msg, title.substr(12), wiki, title.replace( / /g, '_' ));
@@ -385,7 +386,7 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 		msg.react('⏳').then( function( reaction ) {
 		msg.react('⏳').then( function( reaction ) {
 			hourglass = reaction;
 			hourglass = reaction;
 			request( {
 			request( {
-				uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&format=json&meta=siteinfo&siprop=general|interwikimap&redirects=true&titles=' + encodeURI( title ),
+				uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&format=json&meta=siteinfo&siprop=general&iwurl=true&redirects=true&titles=' + encodeURI( title ),
 				json: true
 				json: true
 			}, function( error, response, body ) {
 			}, function( error, response, body ) {
 				if ( error || !response || !body || !body.query ) {
 				if ( error || !response || !body || !body.query ) {
@@ -395,7 +396,7 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 					}
 					}
 					else {
 					else {
 						console.log( 'Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
 						console.log( 'Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
-						msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + title.replace( / /g, '_' ) ).then( message => message.react('440871715938238494') );
+						msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + title.replace( / /g, '_' ).replace( /\?/g, '%3F' ) ).then( message => message.react('440871715938238494') );
 					}
 					}
 				}
 				}
 				else {
 				else {
@@ -407,44 +408,36 @@ function cmd_link(lang, msg, title, wiki, cmd) {
 							}, function( srerror, srresponse, srbody ) {
 							}, function( srerror, srresponse, srbody ) {
 								if ( srerror || !srresponse || !srbody || !srbody.query || ( !srbody.query.search[0] && srbody.query.searchinfo.totalhits != 0 ) ) {
 								if ( srerror || !srresponse || !srbody || !srbody.query || ( !srbody.query.search[0] && srbody.query.searchinfo.totalhits != 0 ) ) {
 									console.log( 'Fehler beim Erhalten der Suchergebnisse' + ( srerror ? ': ' + srerror.message : ( srbody ? ( srbody.error ? ': ' + srbody.error.info : '.' ) : '.' ) ) );
 									console.log( 'Fehler beim Erhalten der Suchergebnisse' + ( srerror ? ': ' + srerror.message : ( srbody ? ( srbody.error ? ': ' + srbody.error.info : '.' ) : '.' ) ) );
-									msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + title.replace( / /g, '_' ) ).then( message => message.react('440871715938238494') );
+									msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + title.replace( / /g, '_' ).replace( /\?/g, '%3F' ) ).then( message => message.react('440871715938238494') );
 								}
 								}
 								else {
 								else {
 									if ( srbody.query.searchinfo.totalhits == 0 ) {
 									if ( srbody.query.searchinfo.totalhits == 0 ) {
 										msg.react('🤷');
 										msg.react('🤷');
 									}
 									}
 									else if ( srbody.query.searchinfo.totalhits == 1 ) {
 									else if ( srbody.query.searchinfo.totalhits == 1 ) {
-										msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + srbody.query.search[0].title.replace( / /g, '_' ) + '\n' + lang.search.infopage.replace( '%s', '`' + process.env.prefix + cmd + lang.search.page + ' ' + title + '`' ) );
+										msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + srbody.query.search[0].title.replace( / /g, '_' ).replace( /\?/g, '%3F' ) + '\n' + lang.search.infopage.replace( '%s', '`' + process.env.prefix + cmd + lang.search.page + ' ' + title + '`' ) );
 									}
 									}
 									else {
 									else {
-										msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + srbody.query.search[0].title.replace( / /g, '_' ) + '\n' + lang.search.infosearch.replace( '%1$s', '`' + process.env.prefix + cmd + lang.search.page + ' ' + title + '`' ).replace( '%2$s', '`' + process.env.prefix + cmd + lang.search.search + ' ' + title + '`' ) );
+										msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + srbody.query.search[0].title.replace( / /g, '_' ).replace( /\?/g, '%3F' ) + '\n' + lang.search.infosearch.replace( '%1$s', '`' + process.env.prefix + cmd + lang.search.page + ' ' + title + '`' ).replace( '%2$s', '`' + process.env.prefix + cmd + lang.search.search + ' ' + title + '`' ) );
 									}
 									}
 								}
 								}
 							} );
 							} );
 						}
 						}
 						else {
 						else {
-							msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + Object.values(body.query.pages)[0].title.replace( / /g, '_' ) + ( body.query.redirects && body.query.redirects[0].tofragment ? '#' + encodeURI( body.query.redirects[0].tofragment.replace( / /g, '_' ) ) : '' ) );
+							msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + Object.values(body.query.pages)[0].title.replace( / /g, '_' ).replace( /\?/g, '%3F' ) + ( body.query.redirects && body.query.redirects[0].tofragment ? '#' + encodeURIComponent( body.query.redirects[0].tofragment.replace( / /g, '_' ) ).replace( /\%/g, '.' ) : '' ) );
 						}
 						}
 					}
 					}
 					else if ( body.query.interwiki ) {
 					else if ( body.query.interwiki ) {
 						var inter = body.query.interwiki[0];
 						var inter = body.query.interwiki[0];
 						var intertitle = inter.title.substr(inter.iw.length+1);
 						var intertitle = inter.title.substr(inter.iw.length+1);
-						var regex = /^(?:https?:)?\/\/(.*)\.gamepedia\.com\//
-						var entry = body.query.interwikimap;
-						for ( var i = 0; i < entry.length; i++ ) {
-							if ( entry[i].prefix == inter.iw ) {
-								if ( regex.test(entry[i].url) ) {
-									var iwtitle = entry[i].url.replace( '$1', intertitle ).replace( regex.exec(entry[i].url)[0], '' );
-									var link = regex.exec(entry[i].url)[1];
-									cmd_link(lang, msg, iwtitle, link, ' !' + link + ' ');
-								}
-								else msg.channel.send( entry[i].url.replace( '$1', intertitle.replace( / /g, '_' ) ) );
-								break;
-							}
-						}
+						var regex = /^(?:https?:)?\/\/(.*)\.gamepedia\.com\//.exec(inter.url);
+						if ( regex != null ) {
+							var iwtitle = decodeURIComponent( inter.url.replace( regex[0], '' ) ).replace( /\_/g, ' ' ).replace( intertitle.replace( /\_/g, ' ' ), intertitle );
+							cmd_link(lang, msg, iwtitle, regex[1], ' !' + regex[1] + ' ');
+						} else msg.channel.send( inter.url );
 					}
 					}
 					else {
 					else {
-						msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + body.query.general.mainpage.replace( / /g, '_' ) );
+						msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + body.query.general.mainpage.replace( / /g, '_' ).replace( /\?/g, '%3F' ) );
 					}
 					}
 				}
 				}
 				
 				
@@ -654,7 +647,7 @@ function cmd_diff(lang, msg, args, wiki) {
 			}
 			}
 			else error = true;
 			else error = true;
 		}
 		}
-		else title = args.join('_');
+		else title = args.join('_').replace( /\?/g, '%3F' );
 		
 		
 		if ( error ) msg.react('440871715938238494');
 		if ( error ) msg.react('440871715938238494');
 		else if ( /^\d+$/.test(diff) ) {
 		else if ( /^\d+$/.test(diff) ) {
@@ -728,7 +721,7 @@ function cmd_diffsend(lang, msg, args, wiki) {
 				var pages = Object.values(body.query.pages);
 				var pages = Object.values(body.query.pages);
 				if ( pages.length != 1 ) msg.channel.send( '<https://' + wiki + '.gamepedia.com/?diff=' + args[0] + ( args[1] ? '&oldid=' + args[1] : '' ) + '>' );
 				if ( pages.length != 1 ) msg.channel.send( '<https://' + wiki + '.gamepedia.com/?diff=' + args[0] + ( args[1] ? '&oldid=' + args[1] : '' ) + '>' );
 				else {
 				else {
-					var title = pages[0].title.replace( / /g, '_' );
+					var title = pages[0].title.replace( / /g, '_' ).replace( /\?/g, '%3F' );
 					var revisions = [];
 					var revisions = [];
 					if ( pages[0].revisions[1] ) revisions = [pages[0].revisions[1], pages[0].revisions[0]];
 					if ( pages[0].revisions[1] ) revisions = [pages[0].revisions[1], pages[0].revisions[0]];
 					else revisions = [pages[0].revisions[0]];
 					else revisions = [pages[0].revisions[0]];
@@ -766,6 +759,33 @@ function cmd_diffsend(lang, msg, args, wiki) {
 	} );
 	} );
 }
 }
 
 
+function cmd_random(lang, msg, wiki) {
+	var hourglass;
+	msg.react('⏳').then( function( reaction ) {
+		hourglass = reaction;
+		request( {
+			uri: 'https://' + wiki + '.gamepedia.com/api.php?action=query&format=json&list=random&rnnamespace=0',
+			json: true
+		}, function( error, response, body ) {
+			if ( error || !response || !body || !body.query || !body.query.random[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.react('440871715938238494');
+				}
+				else {
+					console.log( 'Fehler beim Erhalten der Suchergebnisse' + ( error ? ': ' + error.message : ( body ? ( body.error ? ': ' + body.error.info : '.' ) : '.' ) ) );
+					msg.channel.send( 'https://' + wiki + '.gamepedia.com/Special:Random' ).then( message => message.react('440871715938238494') );
+				}
+			}
+			else {
+				msg.channel.send( 'https://' + wiki + '.gamepedia.com/' + body.query.random[0].title.replace( / /g, '_' ).replace( /\?/g, '%3F' ) );
+			}
+			
+			if ( hourglass != undefined ) hourglass.remove();
+		} );
+	} );
+}
+
 function cmd_multiline(lang, msg, args, line) {
 function cmd_multiline(lang, msg, args, line) {
 	msg.react('440871715938238494');
 	msg.react('440871715938238494');
 }
 }