gamepedia.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. const {MessageEmbed} = require('discord.js');
  2. const parse_page = require('../../functions/parse_page.js');
  3. const {htmlToPlain, htmlToDiscord} = require('../../util/functions.js');
  4. const extract_desc = require('../../util/extract_desc.js');
  5. const {limit: {interwiki: interwikiLimit}, wikiProjects} = require('../../util/default.json');
  6. const Wiki = require('../../util/wiki.js');
  7. const fs = require('fs');
  8. var fn = {
  9. special_page: require('../../functions/special_page.js'),
  10. discussion: require('../../functions/discussion.js')
  11. };
  12. fs.readdir( './cmds/wiki/gamepedia', (error, files) => {
  13. if ( error ) return error;
  14. files.filter( file => file.endsWith('.js') ).forEach( file => {
  15. var command = require('./gamepedia/' + file);
  16. fn[command.name] = command.run;
  17. } );
  18. } );
  19. var minecraft = {};
  20. fs.readdir( './cmds/minecraft', (error, files) => {
  21. if ( error ) return error;
  22. files.filter( file => file.endsWith('.js') ).forEach( file => {
  23. var command = require('../minecraft/' + file);
  24. minecraft[command.name] = command.run;
  25. } );
  26. } );
  27. /**
  28. * Checks a Gamepedia wiki.
  29. * @param {import('../../util/i18n.js')} lang - The user language.
  30. * @param {import('discord.js').Message} msg - The Discord message.
  31. * @param {String} title - The page title.
  32. * @param {Wiki} wiki - The wiki for the page.
  33. * @param {String} cmd - The command at this point.
  34. * @param {import('discord.js').MessageReaction} reaction - The reaction on the message.
  35. * @param {String} [spoiler] - If the response is in a spoiler.
  36. * @param {URLSearchParams} [querystring] - The querystring for the link.
  37. * @param {String} [fragment] - The section for the link.
  38. * @param {String} [interwiki] - The fallback interwiki link.
  39. * @param {Number} [selfcall] - The amount of followed interwiki links.
  40. */
  41. function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '', querystring = new URLSearchParams(), fragment = '', interwiki = '', selfcall = 0) {
  42. var full_title = title;
  43. if ( title.includes( '#' ) ) {
  44. fragment = title.split('#').slice(1).join('#');
  45. title = title.split('#')[0];
  46. }
  47. if ( /\?\w+=/.test(title) ) {
  48. let querystart = title.search(/\?\w+=/);
  49. querystring = new URLSearchParams(querystring + '&' + title.substring(querystart + 1));
  50. title = title.substring(0, querystart);
  51. }
  52. if ( title.length > 250 ) {
  53. title = title.substring(0, 250);
  54. msg.reactEmoji('⚠️');
  55. }
  56. var invoke = title.split(' ')[0].toLowerCase();
  57. var aliasInvoke = ( lang.aliases[invoke] || invoke );
  58. var args = title.split(' ').slice(1);
  59. if ( !msg.notMinecraft && wiki.href === lang.get('minecraft.link') && ( aliasInvoke in minecraft || invoke.startsWith( '/' ) ) ) {
  60. minecraft.WIKI = this;
  61. if ( aliasInvoke in minecraft ) minecraft[aliasInvoke](lang, msg, args, title, cmd, querystring, fragment, reaction, spoiler);
  62. else minecraft.SYNTAX(lang, msg, invoke.substring(1), args, title, cmd, querystring, fragment, reaction, spoiler);
  63. return;
  64. }
  65. if ( aliasInvoke === 'random' && !args.join('') && !querystring.toString() && !fragment ) {
  66. return fn.random(lang, msg, wiki, reaction, spoiler);
  67. }
  68. if ( aliasInvoke === 'overview' && !args.join('') && !querystring.toString() && !fragment ) {
  69. return fn.overview(lang, msg, wiki, reaction, spoiler);
  70. }
  71. if ( aliasInvoke === 'test' && !args.join('') && !querystring.toString() && !fragment ) {
  72. this.test(lang, msg, args, '', wiki);
  73. if ( reaction ) reaction.removeEmoji();
  74. return;
  75. }
  76. if ( aliasInvoke === 'page' ) {
  77. msg.sendChannel( spoiler + '<' + wiki.toLink(args.join('_'), querystring, fragment) + '>' + spoiler );
  78. if ( reaction ) reaction.removeEmoji();
  79. return;
  80. }
  81. if ( aliasInvoke === 'diff' && args.join('') && !querystring.toString() && !fragment ) {
  82. return fn.diff(lang, msg, args, wiki, reaction, spoiler);
  83. }
  84. var noRedirect = ( querystring.getAll('redirect').pop() === 'no' || ( querystring.has('action') && querystring.getAll('action').pop() !== 'view' ) );
  85. 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&explaintext=true&exsectionformat=raw&exlimit=1&converttitles=true&titles=%1F' + encodeURIComponent( title.replace( /\x1F/g, '\ufffd' ) ) + '&format=json' ).then( response => {
  86. var body = response.body;
  87. if ( body && body.warnings ) log_warn(body.warnings);
  88. if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query ) {
  89. if ( interwiki ) msg.sendChannel( spoiler + ' ' + interwiki + ' ' + spoiler );
  90. else if ( wiki.noWiki(response.url) || response.statusCode === 410 ) {
  91. console.log( '- This wiki doesn\'t exist!' );
  92. msg.reactEmoji('nowiki');
  93. }
  94. else {
  95. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.error && body.error.info ) );
  96. msg.sendChannelError( spoiler + '<' + wiki.toLink( ( querystring.toString() || fragment || !title ? title : 'Special:Search' ), ( querystring.toString() || fragment || !title ? querystring : {search:title} ), fragment) + '>' + spoiler );
  97. }
  98. if ( reaction ) reaction.removeEmoji();
  99. return;
  100. }
  101. wiki.updateWiki(body.query.general);
  102. if ( aliasInvoke === 'search' ) {
  103. return fn.search(lang, msg, full_title.split(' ').slice(1).join(' '), wiki, body.query, reaction, spoiler);
  104. }
  105. if ( aliasInvoke === 'discussion' && wiki.isFandom() && !querystring.toString() && !fragment ) {
  106. return fn.discussion(lang, msg, wiki, args.join(' '), body.query, reaction, spoiler);
  107. }
  108. if ( body.query.pages ) {
  109. var querypages = Object.values(body.query.pages);
  110. var querypage = querypages[0];
  111. if ( body.query.redirects && body.query.redirects[0].from.split(':')[0] === body.query.namespaces['-1']['*'] && body.query.specialpagealiases.filter( sp => ['Mypage','Mytalk','MyLanguage'].includes( sp.realname ) ).map( sp => sp.aliases[0] ).includes( body.query.redirects[0].from.split(':').slice(1).join(':').split('/')[0].replace( / /g, '_' ) ) ) {
  112. querypage.title = body.query.redirects[0].from;
  113. delete body.query.redirects[0].tofragment;
  114. delete querypage.missing;
  115. querypage.ns = -1;
  116. querypage.special = '';
  117. }
  118. var contribs = body.query.namespaces['-1']['*'] + ':' + body.query.specialpagealiases.find( sp => sp.realname === 'Contributions' ).aliases[0] + '/';
  119. if ( ( querypage.ns === 2 || querypage.ns === 202 || querypage.ns === 1200 ) && ( !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) ) ) {
  120. var userparts = querypage.title.split(':');
  121. querypage.noRedirect = noRedirect;
  122. fn.user(lang, msg, userparts[0] + ':', userparts.slice(1).join(':'), wiki, querystring, fragment, querypage, contribs, reaction, spoiler);
  123. }
  124. else if ( querypage.ns === -1 && querypage.title.startsWith( contribs ) && querypage.title.length > contribs.length ) {
  125. var username = querypage.title.split('/').slice(1).join('/');
  126. got.get( wiki + 'api.php?action=query&titles=User:' + encodeURIComponent( username ) + '&format=json' ).then( uresponse => {
  127. var ubody = uresponse.body;
  128. if ( uresponse.statusCode !== 200 || !ubody || ubody.batchcomplete === undefined || !ubody.query ) {
  129. console.log( '- ' + uresponse.statusCode + ': Error while getting the user: ' + ( ubody && ubody.error && ubody.error.info ) );
  130. msg.sendChannelError( spoiler + '<' + wiki.toLink(contribs + username, querystring, fragment) + '>' + spoiler );
  131. if ( reaction ) reaction.removeEmoji();
  132. }
  133. else {
  134. querypage = Object.values(ubody.query.pages)[0];
  135. if ( querypage.ns === 2 ) {
  136. username = querypage.title.split(':').slice(1).join(':');
  137. querypage.title = contribs + username;
  138. delete querypage.missing;
  139. querypage.ns = -1;
  140. querypage.special = '';
  141. querypage.noRedirect = noRedirect;
  142. fn.user(lang, msg, contribs, username, wiki, querystring, fragment, querypage, contribs, reaction, spoiler);
  143. }
  144. else {
  145. msg.reactEmoji('error');
  146. if ( reaction ) reaction.removeEmoji();
  147. }
  148. }
  149. }, error => {
  150. console.log( '- Error while getting the user: ' + error );
  151. msg.sendChannelError( spoiler + '<' + wiki.toLink(contribs + username, querystring, fragment) + '>' + spoiler );
  152. if ( reaction ) reaction.removeEmoji();
  153. } );
  154. }
  155. else if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) {
  156. got.get( wiki + 'api.php?action=query&prop=pageimages|categoryinfo|pageprops|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrnamespace=4|12|14|' + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( srresponse => {
  157. var srbody = srresponse.body;
  158. if ( srbody && srbody.warnings ) log_warn(srbody.warnings);
  159. if ( srresponse.statusCode !== 200 || !srbody || srbody.batchcomplete === undefined ) {
  160. console.log( '- ' + srresponse.statusCode + ': Error while getting the search results: ' + ( srbody && srbody.error && srbody.error.info ) );
  161. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', {search:title}) + '>' + spoiler );
  162. }
  163. else {
  164. if ( !srbody.query ) {
  165. msg.reactEmoji('🤷');
  166. }
  167. else {
  168. querypage = Object.values(srbody.query.pages)[0];
  169. var pagelink = wiki.toLink(querypage.title, querystring, fragment);
  170. var text = '';
  171. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  172. if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
  173. var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
  174. if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
  175. embed.setTitle( displaytitle );
  176. }
  177. if ( querypage.extract ) {
  178. var extract = extract_desc(querypage.extract, fragment);
  179. embed.setDescription( extract[0] );
  180. if ( extract[2].length ) embed.addField( extract[1], extract[2] );
  181. }
  182. if ( querypage.pageprops && querypage.pageprops.description ) {
  183. var description = htmlToPlain( querypage.pageprops.description );
  184. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  185. embed.setDescription( description );
  186. }
  187. if ( querypage.ns === 6 ) {
  188. var pageimage = ( querypage?.original?.source || wiki.toLink('Special:FilePath/' + querypage.title, {version:Date.now()}) );
  189. if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
  190. else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
  191. }
  192. else if ( querypage.title === body.query.general.mainpage ) {
  193. embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  194. }
  195. else if ( querypage.pageimage && querypage.original ) {
  196. embed.setThumbnail( querypage.original.source );
  197. }
  198. else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
  199. embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
  200. }
  201. else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  202. var prefix = ( msg.channel.isGuild() && patreons[msg.guild.id] || process.env.prefix );
  203. var linksuffix = ( querystring.toString() ? '?' + querystring : '' ) + ( fragment ? '#' + fragment : '' );
  204. if ( title.replace( /[_-]/g, ' ' ).toLowerCase() === querypage.title.replace( /-/g, ' ' ).toLowerCase() ) {
  205. text = '';
  206. }
  207. else if ( !srbody.continue ) {
  208. text = '\n' + lang.get('search.infopage', '`' + prefix + cmd + ( lang.localNames.page || 'page' ) + ' ' + title + linksuffix + '`');
  209. }
  210. else {
  211. text = '\n' + lang.get('search.infosearch', '`' + prefix + cmd + ( lang.localNames.page || 'page' ) + ' ' + title + linksuffix + '`', '`' + prefix + cmd + ( lang.localNames.search || 'search' ) + ' ' + title + linksuffix + '`');
  212. }
  213. if ( querypage.categoryinfo ) {
  214. var category = [lang.get('search.category.content')];
  215. if ( querypage.categoryinfo.size === 0 ) {
  216. category.push(lang.get('search.category.empty'));
  217. }
  218. if ( querypage.categoryinfo.pages > 0 ) {
  219. category.push(lang.get('search.category.pages', querypage.categoryinfo.pages));
  220. }
  221. if ( querypage.categoryinfo.files > 0 ) {
  222. category.push(lang.get('search.category.files', querypage.categoryinfo.files));
  223. }
  224. if ( querypage.categoryinfo.subcats > 0 ) {
  225. category.push(lang.get('search.category.subcats', querypage.categoryinfo.subcats));
  226. }
  227. if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
  228. else text += '\n\n' + category.join('\n');
  229. }
  230. 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 )) );
  231. }
  232. }
  233. }, error => {
  234. console.log( '- Error while getting the search results: ' + error );
  235. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', {search:title}) + '>' + spoiler );
  236. } ).finally( () => {
  237. if ( reaction ) reaction.removeEmoji();
  238. } );
  239. }
  240. else if ( querypage.ns === -1 ) {
  241. var pagelink = wiki.toLink(querypage.title, querystring, fragment);
  242. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
  243. var specialpage = body.query.specialpagealiases.find( sp => body.query.namespaces['-1']['*'] + ':' + sp.aliases[0].replace( /\_/g, ' ' ) === querypage.title.split('/')[0] );
  244. specialpage = ( specialpage ? specialpage.realname : querypage.title.replace( body.query.namespaces['-1']['*'] + ':', '' ).split('/')[0] ).toLowerCase();
  245. fn.special_page(lang, msg, querypage.title, specialpage, embed, wiki, reaction, spoiler);
  246. }
  247. else if ( querypage.ns === -2 ) {
  248. var filepath = body.query.specialpagealiases.find( sp => sp.realname === 'Filepath' );
  249. var pagelink = wiki.toLink(body.query.namespaces['-1']['*'] + ':' + ( filepath?.aliases?.[0] || 'FilePath' ) + querypage.title.replace( body.query.namespaces['-2']['*'] + ':', '/' ), querystring, fragment);
  250. 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) + ')' );
  251. if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pagelink );
  252. else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pagelink,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
  253. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  254. if ( reaction ) reaction.removeEmoji();
  255. }
  256. else {
  257. var pagelink = wiki.toLink(querypage.title, querystring, ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ));
  258. var text = '';
  259. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  260. if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
  261. var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
  262. if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
  263. embed.setTitle( displaytitle );
  264. }
  265. if ( querypage.extract ) {
  266. var extract = extract_desc(querypage.extract, ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ));
  267. embed.setDescription( extract[0] );
  268. if ( extract[2].length ) embed.addField( extract[1], extract[2] );
  269. }
  270. if ( querypage.pageprops && querypage.pageprops.description ) {
  271. var description = htmlToPlain( querypage.pageprops.description );
  272. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  273. embed.setDescription( description );
  274. }
  275. if ( querypage.ns === 6 ) {
  276. var pageimage = ( querypage?.original?.source || wiki.toLink('Special:FilePath/' + querypage.title, {version:Date.now()}) );
  277. if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
  278. else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
  279. }
  280. else if ( querypage.title === body.query.general.mainpage ) {
  281. embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  282. }
  283. else if ( querypage.pageimage && querypage.original ) {
  284. embed.setThumbnail( querypage.original.source );
  285. }
  286. else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
  287. embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
  288. }
  289. else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  290. if ( querypage.categoryinfo ) {
  291. var category = [lang.get('search.category.content')];
  292. if ( querypage.categoryinfo.size === 0 ) {
  293. category.push(lang.get('search.category.empty'));
  294. }
  295. if ( querypage.categoryinfo.pages > 0 ) {
  296. category.push(lang.get('search.category.pages', querypage.categoryinfo.pages));
  297. }
  298. if ( querypage.categoryinfo.files > 0 ) {
  299. category.push(lang.get('search.category.files', querypage.categoryinfo.files));
  300. }
  301. if ( querypage.categoryinfo.subcats > 0 ) {
  302. category.push(lang.get('search.category.subcats', querypage.categoryinfo.subcats));
  303. }
  304. if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
  305. else text += '\n\n' + category.join('\n');
  306. }
  307. 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 )) );
  308. if ( reaction ) reaction.removeEmoji();
  309. }
  310. }
  311. else if ( body.query.interwiki ) {
  312. if ( msg.channel.isGuild() && pause[msg.guild.id] ) {
  313. if ( reaction ) reaction.removeEmoji();
  314. console.log( '- Aborted, paused.' );
  315. return;
  316. }
  317. var iw = new URL(body.query.interwiki[0].url.replace( /\\/g, '%5C' ).replace( /@(here|everyone)/g, '%40$1' ), wiki);
  318. querystring.forEach( (value, name) => {
  319. iw.searchParams.append(name, value);
  320. } );
  321. if ( fragment ) iw.hash = Wiki.toSection(fragment);
  322. else fragment = iw.hash.substring(1);
  323. var maxselfcall = interwikiLimit[( msg?.guild?.id in patreons ? 'patreon' : 'default' )];
  324. if ( selfcall < maxselfcall && ['http:','https:'].includes( iw.protocol ) ) {
  325. selfcall++;
  326. if ( iw.hostname.endsWith( '.gamepedia.com' ) ) {
  327. let iwtitle = decodeURIComponent( iw.pathname.substring(1) ).replace( /_/g, ' ' );
  328. cmd = '!' + iw.hostname.replace( '.gamepedia.com', ' ' );
  329. if ( cmd !== '!www ' ) return this.gamepedia(lang, msg, iwtitle, new Wiki(iw.origin), cmd, reaction, spoiler, iw.searchParams, fragment, iw.href, selfcall);
  330. }
  331. if ( iw.hostname.endsWith( '.fandom.com' ) || iw.hostname.endsWith( '.wikia.org' ) ) {
  332. let regex = iw.pathname.match( /^(\/(?!wiki\/)[a-z-]{2,12})?(?:\/wiki\/|\/?$)/ );
  333. if ( regex ) {
  334. let path = ( regex[1] || '' );
  335. let iwtitle = decodeURIComponent( iw.pathname.replace( regex[0], '' ) ).replace( /_/g, ' ' );
  336. cmd = ( iw.hostname.endsWith( '.wikia.org' ) ? '??' : '?' ) + ( path ? path.substring(1) + '.' : '' ) + iw.hostname.replace( /\.(?:fandom\.com|wikia\.org)/, ' ' );
  337. return this.fandom(lang, msg, iwtitle, new Wiki(iw.origin + path + '/'), cmd, reaction, spoiler, iw.searchParams, fragment, iw.href, selfcall);
  338. }
  339. }
  340. let project = wikiProjects.find( project => iw.hostname.endsWith( project.name ) );
  341. if ( project ) {
  342. let regex = ( iw.host + iw.pathname ).match( new RegExp( '^' + project.regex + '(?:' + project.articlePath + '|/?$)' ) );
  343. if ( regex ) {
  344. let iwtitle = decodeURIComponent( ( iw.host + iw.pathname ).replace( regex[0], '' ) ).replace( /_/g, ' ' );
  345. cmd = '!!' + regex[1] + ' ';
  346. return this.gamepedia(lang, msg, iwtitle, new Wiki('https://' + regex[1] + project.scriptPath), cmd, reaction, spoiler, iw.searchParams, fragment, iw.href, selfcall);
  347. }
  348. }
  349. }
  350. msg.sendChannel( spoiler + ' ' + iw + ' ' + spoiler ).then( message => {
  351. if ( message && selfcall === maxselfcall ) message.reactEmoji('⚠️');
  352. } );
  353. if ( reaction ) reaction.removeEmoji();
  354. }
  355. else {
  356. var pagelink = wiki.toLink(body.query.general.mainpage, querystring, fragment);
  357. 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 );
  358. got.get( wiki + 'api.php?action=query' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=pageprops|extracts&ppprop=description|displaytitle&explaintext=true&exsectionformat=raw&exlimit=1&titles=' + encodeURIComponent( body.query.general.mainpage ) + '&format=json' ).then( mpresponse => {
  359. var mpbody = mpresponse.body;
  360. if ( mpbody && mpbody.warnings ) log_warn(body.warnings);
  361. if ( mpresponse.statusCode !== 200 || !mpbody || mpbody.batchcomplete === undefined || !mpbody.query ) {
  362. console.log( '- ' + mpresponse.statusCode + ': Error while getting the main page: ' + ( mpbody && mpbody.error && mpbody.error.info ) );
  363. } else {
  364. var querypage = Object.values(mpbody.query.pages)[0];
  365. if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
  366. var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
  367. if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
  368. embed.setTitle( displaytitle );
  369. }
  370. if ( querypage.extract ) {
  371. var extract = extract_desc(querypage.extract, fragment);
  372. embed.setDescription( extract[0] );
  373. if ( extract[2].length ) embed.addField( extract[1], extract[2] );
  374. }
  375. if ( querypage.pageprops && querypage.pageprops.description ) {
  376. var description = htmlToPlain( querypage.pageprops.description );
  377. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  378. embed.setDescription( description );
  379. }
  380. }
  381. }, error => {
  382. console.log( '- Error while getting the main page: ' + error );
  383. } ).finally( () => {
  384. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, body.query.general.mainpage, embed, wiki, '') );
  385. if ( reaction ) reaction.removeEmoji();
  386. } );
  387. }
  388. }, error => {
  389. if ( interwiki ) msg.sendChannel( spoiler + ' ' + interwiki + ' ' + spoiler );
  390. else if ( wiki.noWiki(error.message) ) {
  391. console.log( '- This wiki doesn\'t exist!' );
  392. msg.reactEmoji('nowiki');
  393. }
  394. else {
  395. console.log( '- Error while getting the search results: ' + error );
  396. msg.sendChannelError( spoiler + '<' + wiki.toLink( ( querystring.toString() || fragment || !title ? title : 'Special:Search' ), ( querystring.toString() || fragment || !title ? querystring : {search:title} ), fragment) + '>' + spoiler );
  397. }
  398. if ( reaction ) reaction.removeEmoji();
  399. } );
  400. }
  401. module.exports = gamepedia_check_wiki;