Ver Fonte

Add snippets for code pages

Markus-Rost há 4 anos atrás
pai
commit
78cc0eb385
5 ficheiros alterados com 88 adições e 14 exclusões
  1. 2 2
      cmds/wiki/diff.js
  2. 6 6
      cmds/wiki/general.js
  3. 2 2
      cmds/wiki/random.js
  4. 2 2
      cmds/wiki/user.js
  5. 76 2
      functions/parse_page.js

+ 2 - 2
cmds/wiki/diff.js

@@ -247,8 +247,8 @@ function gamepedia_diff_send(lang, msg, args, wiki, reaction, spoiler, compare)
 						if ( compare[0].length ) embed.addField( lang.get('diff.info.removed'), compare[0], true );
 						if ( compare[1].length ) embed.addField( lang.get('diff.info.added'), compare[1], true );
 					}
-					else if ( revisions[0]['*'] ) {
-						var content = revisions[0]['*'].escapeFormatting();
+					else if ( ( revisions[0]?.slots?.main || revisions[0] )['*'] ) {
+						var content = ( revisions[0]?.slots?.main || revisions[0] )['*'].escapeFormatting();
 						if ( content.trim().length ) {
 							if ( content.length <= 1000 ) content = '**' + content + '**';
 							else {

+ 6 - 6
cmds/wiki/general.js

@@ -88,7 +88,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 		return fn.diff(lang, msg, args, wiki, reaction, spoiler);
 	}
 	var noRedirect = ( querystring.getAll('redirect').pop() === 'no' || ( querystring.has('action') && querystring.getAll('action').pop() !== 'view' ) );
-	got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general|namespaces|specialpagealiases&iwurl=true' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=pageimages|categoryinfo|pageprops|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&converttitles=true&titles=%1F' + encodeURIComponent( title.replace( /\x1F/g, '\ufffd' ) ) + '&format=json' ).then( response => {
+	got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general|namespaces|specialpagealiases&iwurl=true' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&converttitles=true&titles=%1F' + encodeURIComponent( ( aliasInvoke === 'search' ? full_title.split(' ').slice(1).join(' ') : title ).replace( /\x1F/g, '\ufffd' ) ) + '&format=json' ).then( response => {
 		var body = response.body;
 		if ( body && body.warnings ) log_warn(body.warnings);
 		if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query ) {
@@ -187,7 +187,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 				if ( reaction ) reaction.removeEmoji();
 			}
 			else if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) {
-				got.get( wiki + 'api.php?action=query&prop=pageimages|categoryinfo|pageprops|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrnamespace=4|12|14|' + querypage.ns + '|' + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( srresponse => {
+				got.get( wiki + 'api.php?action=query&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrnamespace=4|12|14|' + querypage.ns + '|' + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( srresponse => {
 					var srbody = srresponse.body;
 					if ( srbody && srbody.warnings ) log_warn(srbody.warnings);
 					if ( srresponse.statusCode !== 200 || !srbody || srbody.batchcomplete === undefined ) {
@@ -276,7 +276,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 								}
 							}
 				
-							msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), fragment) );
+							msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), fragment) );
 						}
 					}
 				}, error => {
@@ -368,7 +368,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 					}
 				}
 				
-				msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' )) );
+				msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' )) );
 				
 				if ( reaction ) reaction.removeEmoji();
 			}
@@ -422,7 +422,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 			logging(wiki, 'general');
 			var pagelink = wiki.toLink(body.query.general.mainpage, querystring, fragment);
 			var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( body.query.general.mainpage.escapeFormatting() ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
-			got.get( wiki + 'api.php?action=query' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=pageprops|extracts&ppprop=description|displaytitle|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&titles=' + encodeURIComponent( body.query.general.mainpage ) + '&format=json' ).then( mpresponse => {
+			got.get( wiki + 'api.php?action=query' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=info|pageprops|extracts&ppprop=description|displaytitle|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&titles=' + encodeURIComponent( body.query.general.mainpage ) + '&format=json' ).then( mpresponse => {
 				var mpbody = mpresponse.body;
 				if ( mpbody && mpbody.warnings ) log_warn(body.warnings);
 				if ( mpresponse.statusCode !== 200 || !mpbody || mpbody.batchcomplete === undefined || !mpbody.query ) {
@@ -460,7 +460,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 			}, error => {
 				console.log( '- Error while getting the main page: ' + error );
 			} ).finally( () => {
-				msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, body.query.general.mainpage, embed, wiki, '', fragment) );
+				msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, '', fragment) );
 				
 				if ( reaction ) reaction.removeEmoji();
 			} );

+ 2 - 2
cmds/wiki/random.js

@@ -14,7 +14,7 @@ const extract_desc = require('../../util/extract_desc.js');
  * @param {String} spoiler - If the response is in a spoiler.
  */
 function gamepedia_random(lang, msg, wiki, reaction, spoiler) {
-	got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&prop=pageimages|pageprops|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=random&grnnamespace=0&format=json' ).then( response => {
+	got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&prop=info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=random&grnnamespace=0&format=json' ).then( response => {
 		var body = response.body;
 		if ( body && body.warnings ) log_warn(body.warnings);
 		if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.pages ) {
@@ -71,7 +71,7 @@ function gamepedia_random(lang, msg, wiki, reaction, spoiler) {
 			}
 		}
 		
-		msg.sendChannel( '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href )) );
+		msg.sendChannel( '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href )) );
 	}, error => {
 		if ( wiki.noWiki(error.message) ) {
 			console.log( '- This wiki doesn\'t exist!' );

+ 2 - 2
cmds/wiki/user.js

@@ -73,7 +73,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						}
 					}
 					
-					msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, '', fragment) );
+					msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, '', fragment) );
 				}
 			}
 			else {
@@ -240,7 +240,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 					}
 				}
 				
-				msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, new URL(body.query.general.logo, wiki).href, fragment) );
+				msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, new URL(body.query.general.logo, wiki).href, fragment) );
 			}
 			
 			if ( reaction ) reaction.removeEmoji();

+ 76 - 2
functions/parse_page.js

@@ -2,6 +2,19 @@ const cheerio = require('cheerio');
 const {toSection} = require('../util/wiki.js');
 const {htmlToPlain, htmlToDiscord, limitLength} = require('../util/functions.js');
 
+const contentModels = {
+	Scribunto: 'lua',
+	javascript: 'js',
+	json: 'json',
+	css: 'css'
+};
+
+const contentFormats = {
+	'application/json': 'json',
+	'text/javascript': 'js',
+	'text/css': 'css'
+};
+
 const infoboxList = [
 	'.infobox',
 	'.portable-infobox',
@@ -36,17 +49,78 @@ const keepMainPageTag = [
 /**
  * Parses a wiki page to get it's description.
  * @param {import('discord.js').Message} msg - The Discord message.
- * @param {String} title - The title of the page.
+ * @param {Object} querypage - The details of the page.
+ * @param {String} querypage.title - The title of the page.
+ * @param {String} querypage.contentmodel - The content model of the page.
  * @param {import('discord.js').MessageEmbed} embed - The embed for the page.
  * @param {import('../util/wiki.js')} wiki - The wiki for the page.
  * @param {String} thumbnail - The default thumbnail for the wiki.
  * @param {String} [fragment] - The section title to embed.
  */
-function parse_page(msg, title, embed, wiki, thumbnail, fragment = '') {
+function parse_page(msg, {title, contentmodel}, embed, wiki, thumbnail, fragment = '') {
 	if ( !msg || ( embed.description && embed.thumbnail?.url !== thumbnail && !embed.brokenInfobox && !fragment ) ) {
 		return;
 	}
 	var change = false;
+	if ( contentmodel !== 'wikitext' ) {
+		return got.get( wiki + 'api.php?action=query&prop=revisions&rvprop=content&rvslots=main&converttitles=true&titles=%1F' + encodeURIComponent( title ) + '&format=json' ).then( response => {
+			var body = response.body;
+			if ( body && body.warnings ) log_warn(body.warnings);
+			var revision = Object.values(( body?.query?.pages || {} ))?.[0]?.revisions?.[0];
+			revision = ( revision?.slots?.main || revision );
+			if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !revision?.['*'] ) {
+				console.log( '- ' + response.statusCode + ': Error while getting the page content: ' + ( body && body.error && body.error.info ) );
+				if ( embed.backupField && embed.length < 4750 && embed.fields.length < 25 ) {
+					embed.spliceFields( 0, 0, embed.backupField );
+					change = true;
+				}
+				if ( embed.backupDescription && embed.length < 5000 ) {
+					embed.setDescription( embed.backupDescription );
+					change = true;
+				}
+				return;
+			}
+			if ( !embed.description && embed.length < 5000 ) {
+				var description = revision['*'];
+				var regex = /^L(\d+)(?:-L?(\d+))?$/.exec(fragment);
+				if ( regex ) {
+					let descArray = description.split('\n').slice(regex[1] - 1, ( regex[2] || regex[1] ));
+					if ( descArray.length ) {
+						description = descArray.join('\n').replace( /^\n+/, '' ).replace( /\n+$/, '' );
+						if ( description ) {
+							if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
+							description = '```' + ( contentModels[revision.contentmodel] || contentFormats[revision.contentformat] || '' ) + '\n' + description + '\n```';
+							embed.setDescription( description );
+							change = true;
+						}
+					}
+				}
+				else if ( description.trim() ) {
+					description = description.replace( /^\n+/, '' ).replace( /\n+$/, '' );
+					if ( description.length > 500 ) description = description.substring(0, 500) + '\u2026';
+					description = '```' + ( contentModels[revision.contentmodel] || contentFormats[revision.contentformat] || '' ) + '\n' + description + '\n```';
+					embed.setDescription( description );
+					change = true;
+				}
+				else if ( embed.backupDescription ) {
+					embed.setDescription( embed.backupDescription );
+					change = true;
+				}
+			}
+		}, error => {
+			console.log( '- Error while getting the page content: ' + error );
+			if ( embed.backupField && embed.length < 4750 && embed.fields.length < 25 ) {
+				embed.spliceFields( 0, 0, embed.backupField );
+				change = true;
+			}
+			if ( embed.backupDescription && embed.length < 5000 ) {
+				embed.setDescription( embed.backupDescription );
+				change = true;
+			}
+		} ).finally( () => {
+			if ( change ) msg.edit( msg.content, {embed,allowedMentions:{parse:[]}} ).catch(log_error);
+		} );
+	}
 	got.get( wiki + 'api.php?action=parse&prop=text|images' + ( fragment ? '' : '&section=0' ) + '&disablelimitreport=true&disableeditsection=true&disabletoc=true&sectionpreview=true&page=' + encodeURIComponent( title ) + '&format=json' ).then( response => {
 		if ( response.statusCode !== 200 || !response?.body?.parse?.text ) {
 			console.log( '- ' + response.statusCode + ': Error while parsing the page: ' + response?.body?.error?.info );