Bladeren bron

add page descriptions for UCP

close #72
Markus-Rost 4 jaren geleden
bovenliggende
commit
7886f4b3d4
4 gewijzigde bestanden met toevoegingen van 107 en 13 verwijderingen
  1. 6 6
      cmds/wiki/gamepedia.js
  2. 15 2
      cmds/wiki/gamepedia/random.js
  3. 18 5
      cmds/wiki/gamepedia/user.js
  4. 68 0
      functions/parse_page.js

+ 6 - 6
cmds/wiki/gamepedia.js

@@ -1,5 +1,6 @@
 const htmlparser = require('htmlparser2');
 const htmlparser = require('htmlparser2');
 const {MessageEmbed} = require('discord.js');
 const {MessageEmbed} = require('discord.js');
+const parse_page = require('../../functions/parse_page.js');
 const extract_desc = require('../../util/extract_desc.js');
 const extract_desc = require('../../util/extract_desc.js');
 const {limit: {interwiki: interwikiLimit}, wikiProjects} = require('../../util/default.json');
 const {limit: {interwiki: interwikiLimit}, wikiProjects} = require('../../util/default.json');
 
 
@@ -219,7 +220,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 										else text += '\n\n' + category.join('\n');
 										else text += '\n\n' + category.join('\n');
 									}
 									}
 						
 						
-									msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} );
+									msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : logoToURL(body.query.general) )) );
 								}
 								}
 							}
 							}
 						}, error => {
 						}, error => {
@@ -291,7 +292,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 							else text += '\n\n' + category.join('\n');
 							else text += '\n\n' + category.join('\n');
 						}
 						}
 						
 						
-						msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} );
+						msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : logoToURL(body.query.general) )) );
 						
 						
 						if ( reaction ) reaction.removeEmoji();
 						if ( reaction ) reaction.removeEmoji();
 					}
 					}
@@ -368,7 +369,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 					}, error => {
 					}, error => {
 						console.log( '- Error while getting the main page: ' + error );
 						console.log( '- Error while getting the main page: ' + error );
 					} ).finally( () => {
 					} ).finally( () => {
-						msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
+						msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, '') );
 						
 						
 						if ( reaction ) reaction.removeEmoji();
 						if ( reaction ) reaction.removeEmoji();
 					} );
 					} );
@@ -398,9 +399,8 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
  * @returns {String}
  * @returns {String}
  */
  */
 function logoToURL({logo, server: serverURL}) {
 function logoToURL({logo, server: serverURL}) {
-	if ( /^(?:https?:)?\/\//.test(logo) ) logo = logo.replace( /^(?:https?:)?\/\//, 'https://' );
-	else logo = serverURL + ( logo.startsWith( '/' ) ? '' : '/' ) + logo;
-	return logo;
+	if ( !/^(?:https?:)?\/\//.test(logo) ) logo = serverURL + ( logo.startsWith( '/' ) ? '' : '/' ) + logo;
+	return logo.replace( /^(?:https?:)?\/\//, 'https://' );
 }
 }
 
 
 /**
 /**

+ 15 - 2
cmds/wiki/gamepedia/random.js

@@ -1,5 +1,6 @@
 const htmlparser = require('htmlparser2');
 const htmlparser = require('htmlparser2');
 const {MessageEmbed} = require('discord.js');
 const {MessageEmbed} = require('discord.js');
+const parse_page = require('../../../functions/parse_page.js');
 const extract_desc = require('../../../util/extract_desc.js');
 const extract_desc = require('../../../util/extract_desc.js');
 
 
 /**
 /**
@@ -45,9 +46,9 @@ function gamepedia_random(lang, msg, wiki, reaction, spoiler) {
 			if ( querypage.pageimage && querypage.original && querypage.title !== body.query.general.mainpage ) {
 			if ( querypage.pageimage && querypage.original && querypage.title !== body.query.general.mainpage ) {
 				embed.setThumbnail( querypage.original.source );
 				embed.setThumbnail( querypage.original.source );
 			}
 			}
-			else embed.setThumbnail( ( /^(?:https?:)?\/\//.test(body.query.general.logo) ? body.query.general.logo.replace( /^(?:https?:)?\/\//, 'https://' ) : body.query.general.server + ( body.query.general.logo.startsWith( '/' ) ? '' : '/' ) + body.query.general.logo ) );
+			else embed.setThumbnail( logoToURL(body.query.general) );
 			
 			
-			msg.sendChannel( '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, {embed} );
+			msg.sendChannel( '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : logoToURL(body.query.general) )) );
 		}
 		}
 	}, error => {
 	}, error => {
 		if ( wiki.noWiki(error.message) ) {
 		if ( wiki.noWiki(error.message) ) {
@@ -63,6 +64,18 @@ function gamepedia_random(lang, msg, wiki, reaction, spoiler) {
 	} );
 	} );
 }
 }
 
 
+/**
+ * Turns the siteinfo logo into an URL.
+ * @param {Object} arg - The siteinfo from the wiki.
+ * @param {String} arg.logo - The logo from the wiki.
+ * @param {String} arg.server - The server URL from the wiki.
+ * @returns {String}
+ */
+function logoToURL({logo, server: serverURL}) {
+	if ( !/^(?:https?:)?\/\//.test(logo) ) logo = serverURL + ( logo.startsWith( '/' ) ? '' : '/' ) + logo;
+	return logo.replace( /^(?:https?:)?\/\//, 'https://' );
+}
+
 /**
 /**
  * Change HTML text to plain text.
  * Change HTML text to plain text.
  * @param {String} html - The text in HTML.
  * @param {String} html - The text in HTML.

+ 18 - 5
cmds/wiki/gamepedia/user.js

@@ -1,6 +1,7 @@
 const htmlparser = require('htmlparser2');
 const htmlparser = require('htmlparser2');
 const {MessageEmbed} = require('discord.js');
 const {MessageEmbed} = require('discord.js');
 const global_block = require('../../../functions/global_block.js');
 const global_block = require('../../../functions/global_block.js');
+const parse_page = require('../../../functions/parse_page.js');
 const extract_desc = require('../../../util/extract_desc.js');
 const extract_desc = require('../../../util/extract_desc.js');
 const {timeoptions, usergroups} = require('../../../util/default.json');
 const {timeoptions, usergroups} = require('../../../util/default.json');
 
 
@@ -33,7 +34,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 					if ( querypage.missing !== undefined || querypage.ns === -1 ) msg.reactEmoji('error');
 					if ( querypage.missing !== undefined || querypage.ns === -1 ) msg.reactEmoji('error');
 					else {
 					else {
 						var pagelink = wiki.toLink(querypage.title, querystring.toTitle(), fragment);
 						var pagelink = wiki.toLink(querypage.title, querystring.toTitle(), fragment);
-						var embed = new MessageEmbed().setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
+						var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
 						if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
 						if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
 							var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
 							var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
 							if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
 							if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
@@ -52,9 +53,9 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						if ( querypage.pageimage && querypage.original ) {
 						if ( querypage.pageimage && querypage.original ) {
 							var pageimage = querypage.original.source;
 							var pageimage = querypage.original.source;
 							embed.setThumbnail( pageimage );
 							embed.setThumbnail( pageimage );
-						}
+						} else embed.setThumbnail( logoToURL(body.query.general) );
 						
 						
-						msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
+						msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : logoToURL(body.query.general) )) );
 					}
 					}
 				}
 				}
 				else {
 				else {
@@ -206,9 +207,9 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						if ( querypage.pageimage && querypage.original ) {
 						if ( querypage.pageimage && querypage.original ) {
 							var pageimage = querypage.original.source;
 							var pageimage = querypage.original.source;
 							embed.setThumbnail( pageimage );
 							embed.setThumbnail( pageimage );
-						} else embed.setThumbnail( ( /^(?:https?:)?\/\//.test(body.query.general.logo) ? body.query.general.logo.replace( /^(?:https?:)?\/\//, 'https://' ) : body.query.general.server + ( body.query.general.logo.startsWith( '/' ) ? '' : '/' ) + body.query.general.logo ) );
+						} else embed.setThumbnail( logoToURL(body.query.general) );
 						
 						
-						msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
+						msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : logoToURL(body.query.general) )) );
 					}
 					}
 					
 					
 					if ( reaction ) reaction.removeEmoji();
 					if ( reaction ) reaction.removeEmoji();
@@ -431,6 +432,18 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 	}
 	}
 }
 }
 
 
+/**
+ * Turns the siteinfo logo into an URL.
+ * @param {Object} arg - The siteinfo from the wiki.
+ * @param {String} arg.logo - The logo from the wiki.
+ * @param {String} arg.server - The server URL from the wiki.
+ * @returns {String}
+ */
+function logoToURL({logo, server: serverURL}) {
+	if ( !/^(?:https?:)?\/\//.test(logo) ) logo = serverURL + ( logo.startsWith( '/' ) ? '' : '/' ) + logo;
+	return logo.replace( /^(?:https?:)?\/\//, 'https://' );
+}
+
 /**
 /**
  * Change HTML text to plain text.
  * Change HTML text to plain text.
  * @param {String} html - The text in HTML.
  * @param {String} html - The text in HTML.

+ 68 - 0
functions/parse_page.js

@@ -0,0 +1,68 @@
+const cheerio = require('cheerio');
+
+const removeClasses = [
+	'table',
+	'div',
+	'script',
+	'input',
+	'style',
+	'ul.gallery',
+	'.mw-editsection',
+	'sup.reference',
+	'ol.references',
+	'.error',
+	'.nomobile',
+	'.noprint',
+	'.noexcerpt',
+	'.sortkey'
+];
+
+/**
+ * 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 {import('discord.js').MessageEmbed} embed - The embed for the page.
+ * @param {String} wiki - The wiki for the page.
+ * @param {String} thumbnail - The default thumbnail for the wiki.
+ */
+function parse_page(msg, title, embed, wiki, thumbnail) {
+	if ( !msg || ( embed.description && embed.thumbnail?.url !== thumbnail ) ) return;
+	got.get(wiki + 'api.php?action=parse&prop=text|images|parsewarnings&section=0&disablelimitreport=true&disableeditsection=true&disabletoc=true&page=' + encodeURIComponent( title ) + '&format=json').then( response => {
+		if ( response?.body?.parse?.parsewarnings?.length ) log_warn(response.body.parse.parsewarnings);
+		if ( response.statusCode !== 200 || !response?.body?.parse?.text ) {
+			console.log( '- ' + response.statusCode + ': Error while parsing the page: ' + response?.body?.error?.info );
+			return;
+		}
+		var change = false;
+		var $ = cheerio.load(response.body.parse.text['*']);
+		if ( embed.thumbnail?.url === thumbnail ) {
+			var image = response.body.parse.images.find( pageimage => ( /\.(?:png|jpg|jpeg|gif)$/.test(pageimage.toLowerCase()) && pageimage.toLowerCase().includes( title.toLowerCase().replace( / /g, '_' ) ) ) );
+			if ( !image ) {
+				thumbnail = $('img').first().prop('src');
+				if ( thumbnail && !/^(?:https?:)?\/\//.test(thumbnail) ) image = response.body.parse.images.find( pageimage => ( /\.(?:png|jpg|jpeg|gif)$/.test(pageimage.toLowerCase()) ) );
+			}
+			if ( image ) thumbnail = wiki.toLink('Special:FilePath/' + image);
+			if ( thumbnail ) {
+				embed.setThumbnail( thumbnail.replace( /^(?:https?:)?\/\//, 'https://' ) );
+				change = true;
+			}
+		}
+		if ( !embed.description ) {
+			$('h1, h2, h3, h4, h5, h6').nextAll().remove();
+			$('h1, h2, h3, h4, h5, h6').remove();
+			$(removeClasses.join(', '), $('.mw-parser-output')).remove();
+			var description = $.text().trim().escapeFormatting();
+			if ( description ) {
+				if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
+				embed.setDescription( description );
+				change = true;
+			}
+		}
+		
+		if ( change ) msg.edit( msg.content, {embed,allowedMentions:{parse:[]}} ).catch(log_error);
+	}, error => {
+		console.log( '- Error while parsing the page: ' + error );
+	} );
+}
+
+module.exports = parse_page;