Bläddra i källkod

Rework Minecraft commands

Markus-Rost 4 år sedan
förälder
incheckning
c68ee34756
7 ändrade filer med 76 tillägg och 35 borttagningar
  1. 3 2
      cmds/help.js
  2. 3 5
      cmds/minecraft/bug.js
  3. 5 8
      cmds/minecraft/command.js
  4. 15 0
      cmds/minecraft/commands.json
  5. 39 8
      cmds/minecraft/syntax.js
  6. 11 10
      cmds/wiki/general.js
  7. 0 2
      i18n/en.json

+ 3 - 2
cmds/help.js

@@ -1,4 +1,5 @@
 const help_server = require('../functions/helpserver.js');
+const {wikis: mcw} = require('./minecraft/commands.json');
 
 const helpmap = {
 	linkHelp: ['default', 'inline.link', 'inline.template', 'gamepedia', 'fandom', 'wikia'],
@@ -80,7 +81,7 @@ const restrictions = {
 function cmd_help(lang, msg, args, line, wiki) {
 	if ( msg.channel.isGuild() && pause[msg.guild.id] && ( args.join('') || !msg.isAdmin() ) ) return;
 	if ( msg.isAdmin() && msg.defaultSettings ) help_server(lang, msg);
-	var isMinecraft = ( wiki.href === lang.get('minecraft.link') );
+	var isMinecraft = mcw.hasOwnProperty(wiki.href);
 	var maxLength = ( ['hi', 'bn'].includes( lang.lang ) ? 480 : 2000 );
 	if ( args.join('') ) {
 		if ( args.join(' ').isMention(msg.guild) ) {
@@ -102,7 +103,7 @@ function cmd_help(lang, msg, args, line, wiki) {
 			}
 		}
 		else if ( cmd === 'minecraft' ) {
-			var cmdlist = '<' + lang.get('minecraft.link') + '>\n';
+			var cmdlist = '<' + ( isMinecraft ? wiki : 'https://minecraft.gamepedia.com/' ) + '>\n';
 			cmdlist += formathelp(helplist.minecraft, msg, lang);
 			msg.sendChannel( cmdlist, {split:{char:'\n🔹',prepend:'🔹',maxLength}} );
 		}

+ 3 - 5
cmds/minecraft/bug.js

@@ -1,19 +1,17 @@
 const {MessageEmbed} = require('discord.js');
-const Wiki = require('../../util/wiki.js');
 
 /**
  * Sends a Minecraft issue.
  * @param {import('../../util/i18n.js')} lang - The user language.
  * @param {import('discord.js').Message} msg - The Discord message.
+ * @param {import('../../util/wiki.js')} wiki - The wiki.
  * @param {String[]} args - The command arguments.
  * @param {String} title - The page title.
  * @param {String} cmd - The command at this point.
- * @param {URLSearchParams} querystring - The querystring for the link.
- * @param {String} fragment - The section for the link.
  * @param {import('discord.js').MessageReaction} reaction - The reaction on the message.
  * @param {String} spoiler - If the response is in a spoiler.
  */
-function minecraft_bug(lang, msg, args, title, cmd, querystring, fragment, reaction, spoiler) {
+function minecraft_bug(lang, msg, wiki, args, title, cmd, reaction, spoiler) {
 	var invoke = args[0];
 	args = args.slice(1);
 	if ( invoke && /\d+$/.test(invoke) && !args.length ) {
@@ -135,7 +133,7 @@ function minecraft_bug(lang, msg, args, title, cmd, querystring, fragment, react
 	}
 	else {
 		msg.notMinecraft = true;
-		this.WIKI.general(lang, msg, title, new Wiki(lang.get('minecraft.link')), cmd, reaction, spoiler, querystring, fragment);
+		this.WIKI.general(lang, msg, title, wiki, cmd, reaction, spoiler);
 	}
 }
 

+ 5 - 8
cmds/minecraft/command.js

@@ -1,25 +1,22 @@
-const Wiki = require('../../util/wiki.js');
-
 /**
  * Processes Minecraft commands.
  * @param {import('../../util/i18n.js')} lang - The user language.
  * @param {import('discord.js').Message} msg - The Discord message.
+ * @param {import('../../util/wiki.js')} wiki - The wiki.
  * @param {String[]} args - The command arguments.
  * @param {String} title - The page title.
  * @param {String} cmd - The command at this point.
- * @param {URLSearchParams} querystring - The querystring for the link.
- * @param {String} fragment - The section for the link.
  * @param {import('discord.js').MessageReaction} reaction - The reaction on the message.
  * @param {String} spoiler - If the response is in a spoiler.
  */
-function minecraft_command(lang, msg, args, title, cmd, querystring, fragment, reaction, spoiler) {
+function minecraft_command(lang, msg, wiki, args, title, cmd, reaction, spoiler) {
 	if ( args.join('') ) {
-		if ( args[0].startsWith( '/' ) ) this.SYNTAX(lang, msg, args[0].substring(1), args.slice(1), title, cmd, querystring, fragment, reaction, spoiler);
-		else this.SYNTAX(lang, msg, args[0], args.slice(1), title, cmd, querystring, fragment, reaction, spoiler);
+		if ( args[0].startsWith( '/' ) ) this.SYNTAX(lang, msg, wiki, args[0].substring(1), args.slice(1), title, cmd, reaction, spoiler);
+		else this.SYNTAX(lang, msg, wiki, args[0], args.slice(1), title, cmd, reaction, spoiler);
 	}
 	else {
 		msg.notMinecraft = true;
-		this.WIKI.general(lang, msg, title, new Wiki(lang.get('minecraft.link')), cmd, reaction, spoiler, querystring, fragment);
+		this.WIKI.general(lang, msg, title, wiki, cmd, reaction, spoiler);
 	}
 }
 

+ 15 - 0
cmds/minecraft/commands.json

@@ -1,4 +1,19 @@
 {
+	"wikis": {
+		"https://minecraft.gamepedia.com/": "Commands/",
+		"https://minecraft-de.gamepedia.com/": "Befehl/",
+		"https://minecraft-es.gamepedia.com/": "Comandos/",
+		"https://minecraft-fr.gamepedia.com/": "Commandes",
+		"https://minecraft-it.gamepedia.com/": "Comandi/",
+		"https://minecraft-ja.gamepedia.com/": "コマンド/",
+		"https://minecraft-ko.gamepedia.com/": "명령어",
+		"https://minecraft-nl.gamepedia.com/": "Opdrachten/",
+		"https://minecraft-pl.gamepedia.com/": "Komendy/",
+		"https://minecraft-pt.gamepedia.com/": "Comandos/",
+		"https://minecraft-ru.gamepedia.com/": "Команды консоли/",
+		"https://minecraft-uk.gamepedia.com/": "Команди консолі/",
+		"https://minecraft-zh.gamepedia.com/": "命令/"
+	},
 	"aliases": {
 		"connect": "wsserver",
 		"tell": "msg",

+ 39 - 8
cmds/minecraft/syntax.js

@@ -5,19 +5,18 @@ const commands = require('./commands.json');
  * Sends a Minecraft command.
  * @param {import('../../util/i18n.js')} lang - The user language.
  * @param {import('discord.js').Message} msg - The Discord message.
+ * @param {import('../../util/wiki.js')} wiki - The wiki.
  * @param {String} mccmd - The Minecraft command argument.
  * @param {String[]} args - The command arguments.
  * @param {String} title - The page title.
  * @param {String} cmd - The command at this point.
- * @param {URLSearchParams} querystring - The querystring for the link.
- * @param {String} fragment - The section for the link.
  * @param {import('discord.js').MessageReaction} reaction - The reaction on the message.
  * @param {String} spoiler - If the response is in a spoiler.
  */
-function minecraft_syntax(lang, msg, mccmd, args, title, cmd, querystring, fragment, reaction, spoiler) {
+function minecraft_syntax(lang, msg, wiki, mccmd, args, title, cmd, reaction, spoiler) {
 	mccmd = mccmd.toLowerCase();
 	var aliasCmd = ( commands.aliases[mccmd] || mccmd );
-	
+	var cmdpage = commands.wikis[wiki.href];
 	if ( commands.list.hasOwnProperty(aliasCmd) ) {
 		var cmdSyntaxMap = commands.list[aliasCmd].map( command => {
 			var cmdargs = command.split(' ');
@@ -35,13 +34,45 @@ function minecraft_syntax(lang, msg, mccmd, args, title, cmd, querystring, fragm
 		var matchCount = Math.max(...cmdSyntaxMap.filter( command => command[0] === lastIndex ).map( command => command[1] ));
 		var regex = new RegExp('/' + aliasCmd, 'g');
 		var cmdSyntax = commands.list[aliasCmd].filter( (command, i) => ( lastIndex === -1 || cmdSyntaxMap[i][0] === lastIndex ) && cmdSyntaxMap[i][1] === matchCount ).join('\n').replaceSave( regex, '/' + mccmd );
-		msg.sendChannel( spoiler + '```md\n' + cmdSyntax + '```<' + lang.get('minecraft.link') + lang.get('minecraft.cmdpage') + aliasCmd + '>' + spoiler, {split:{maxLength:2000,prepend:spoiler + '```md\n',append:'```' + spoiler}} );
-		if ( reaction ) reaction.removeEmoji();
+		got.get( wiki + ( cmdpage.endsWith( '/' ) ? 'api.php?action=query&redirects=true&converttitles=true&titles=%1F' + encodeURIComponent( cmdpage + aliasCmd ) : 'api.php?action=parse&redirects=true&prop=sections&page=' + encodeURIComponent( cmdpage ) ) + '&format=json' ).then( response => {
+			var body = response.body;
+			if ( body && body.warnings ) log_warn(body.warnings);
+			if ( response.statusCode !== 200 || !( body?.query?.pages || body?.parse?.sections?.length ) ) {
+				console.log( '- ' + response.statusCode + ': Error while getting the command page: ' + ( body && body.error && body.error.info ) );
+			}
+			else if ( cmdpage.endsWith( '/' ) ) {
+				if ( body.query.pages['-1'] ) {
+					wiki = new Wiki('https://minecraft.gamepedia.com/');
+					cmdpage = 'Commands/';
+				}
+				else {
+					cmdpage = Object.values(body.query.pages)[0].title;
+					aliasCmd = ( body.query.redirects?.[0]?.tofragment || '' );
+				}
+			}
+			else {
+				cmdpage = body.parse.title;
+				if ( !body.parse.sections.some( section => section.anchor === aliasCmd ) ) {
+					if ( body.parse.sections.some( section => section.anchor === mccmd ) ) {
+						aliasCmd = mccmd;
+					}
+					else {
+						wiki = new Wiki('https://minecraft.gamepedia.com/');
+						cmdpage = 'Commands/';
+					}
+				}
+			}
+		}, error => {
+			console.log( '- Error while getting the command page: ' + error );
+		} ).finally( () => {
+			msg.sendChannel( spoiler + '```md\n' + cmdSyntax + '```<' + wiki.toLink(( cmdpage.endsWith( '/' ) ? cmdpage + aliasCmd : cmdpage ), '', ( cmdpage.endsWith( '/' ) ? '' : aliasCmd )) + '>' + spoiler, {split:{maxLength:2000,prepend:spoiler + '```md\n',append:'```' + spoiler}} );
+
+			if ( reaction ) reaction.removeEmoji();
+		} );
 	}
 	else {
-		msg.reactEmoji('❓');
 		msg.notMinecraft = true;
-		this.WIKI.general(lang, msg, title, new Wiki(lang.get('minecraft.link')), cmd, reaction, spoiler, querystring, fragment);
+		this.WIKI.general(lang, msg, title, wiki, cmd, reaction, spoiler);
 	}
 }
 

+ 11 - 10
cmds/wiki/general.js

@@ -6,6 +6,7 @@ const {parse_infobox, htmlToPlain, htmlToDiscord, partialURIdecode} = require('.
 const extract_desc = require('../../util/extract_desc.js');
 const {limit: {interwiki: interwikiLimit}, wikiProjects} = require('../../util/default.json');
 const Wiki = require('../../util/wiki.js');
+const {wikis: mcw} = require('../minecraft/commands.json');
 
 const fs = require('fs');
 var fn = {
@@ -45,7 +46,7 @@ fs.readdir( './cmds/minecraft', (error, files) => {
 function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '', querystring = new URLSearchParams(), fragment = '', interwiki = '', selfcall = 0) {
 	var full_title = title;
 	if ( title.includes( '#' ) ) {
-		fragment = title.split('#').slice(1).join('#').replace( /(?:%[\dA-F]{2})+/g, partialURIdecode );
+		fragment = title.split('#').slice(1).join('#').trim().replace( /(?:%[\dA-F]{2})+/g, partialURIdecode );
 		title = title.split('#')[0];
 	}
 	if ( /\?\w+=/.test(title) ) {
@@ -62,13 +63,6 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 	var aliasInvoke = ( lang.aliases[invoke] || invoke );
 	var args = title.split(' ').slice(1);
 	
-	if ( !msg.notMinecraft && wiki.href === lang.get('minecraft.link') && ( minecraft.hasOwnProperty(aliasInvoke) || invoke.startsWith( '/' ) ) ) {
-		logging(wiki, msg.guild?.id, 'minecraft', ( minecraft.hasOwnProperty(aliasInvoke) ? aliasInvoke : 'command' ));
-		minecraft.WIKI = this;
-		if ( minecraft.hasOwnProperty(aliasInvoke) ) minecraft[aliasInvoke](lang, msg, args, title, cmd, querystring, fragment, reaction, spoiler);
-		else minecraft.SYNTAX(lang, msg, invoke.substring(1), args, title, cmd, querystring, fragment, reaction, spoiler);
-		return;
-	}
 	if ( aliasInvoke === 'random' && !args.join('') && !querystring.toString() && !fragment ) {
 		return fn.random(lang, msg, wiki, reaction, spoiler);
 	}
@@ -121,6 +115,13 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 			logging(wiki, msg.guild?.id, 'discussion');
 			return fn.discussion(lang, msg, wiki, args.join(' '), body.query.general.sitename, reaction, spoiler);
 		}
+		if ( !msg.notMinecraft && mcw.hasOwnProperty(wiki.href) && ( minecraft.hasOwnProperty(aliasInvoke) || invoke.startsWith( '/' ) ) && !querystring.toString() && !fragment ) {
+			logging(wiki, msg.guild?.id, 'minecraft', ( minecraft.hasOwnProperty(aliasInvoke) ? aliasInvoke : 'command' ));
+			minecraft.WIKI = this;
+			if ( minecraft.hasOwnProperty(aliasInvoke) ) minecraft[aliasInvoke](lang, msg, wiki, args, title, cmd, reaction, spoiler);
+			else minecraft.SYNTAX(lang, msg, wiki, invoke.substring(1), args, title, cmd, reaction, spoiler);
+			return;
+		}
 		if ( body.query.pages ) {
 			var querypages = Object.values(body.query.pages);
 			var querypage = querypages[0];
@@ -292,7 +293,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 			} );
 			if ( querypage.ns === -1 ) {
 				var pagelink = wiki.toLink(querypage.title, querystring, fragment);
-				var embed =  new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
+				var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
 				var specialpage = body.query.specialpagealiases.find( sp => body.query.namespaces['-1']['*'] + ':' + sp.aliases[0].replace( /\_/g, ' ' ) === querypage.title.split('/')[0] );
 				specialpage = ( specialpage ? specialpage.realname : querypage.title.replace( body.query.namespaces['-1']['*'] + ':', '' ).split('/')[0] ).toLowerCase();
 				return fn.special_page(lang, msg, querypage.title, specialpage, embed, wiki, reaction, spoiler);
@@ -301,7 +302,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 				logging(wiki, msg.guild?.id, 'general', 'media');
 				var filepath = body.query.specialpagealiases.find( sp => sp.realname === 'Filepath' );
 				var pagelink = wiki.toLink(body.query.namespaces['-1']['*'] + ':' + ( filepath?.aliases?.[0] || 'FilePath' ) + querypage.title.replace( body.query.namespaces['-2']['*'] + ':', '/' ), querystring, fragment);
-				var embed =  new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setDescription( '[' + lang.get('search.media') + '](' + wiki.toLink(querypage.title, '', '', true) + ')' );
+				var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setDescription( '[' + lang.get('search.media') + '](' + wiki.toLink(querypage.title, '', '', true) + ')' );
 				if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pagelink );
 				else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pagelink,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
 				

+ 0 - 2
i18n/en.json

@@ -390,7 +390,6 @@
         "bot": "Use this link to invite me to another server:"
     },
     "minecraft": {
-        "cmdpage": "Commands/",
         "fixed": "Fixed {{PLURAL:$1|Version|Versions}}:",
         "issue_link": {
             "Blocks": {
@@ -414,7 +413,6 @@
                 "outward": "relates to $1"
             }
         },
-        "link": "https://minecraft.gamepedia.com/",
         "more": "And $1 more.",
         "private": "**Private Issue**",
         "status": {