fandom.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. const htmlparser = require('htmlparser2');
  2. const {MessageEmbed} = require('discord.js');
  3. const fs = require('fs');
  4. var fn = {
  5. special_page: require('../../functions/special_page.js'),
  6. discussion: require('../../functions/discussion.js')
  7. };
  8. fs.readdir( './cmds/wiki/fandom', (error, files) => {
  9. if ( error ) return error;
  10. files.filter( file => file.endsWith('.js') ).forEach( file => {
  11. var command = require('./fandom/' + file);
  12. fn[command.name] = command.run;
  13. } );
  14. } );
  15. function fandom_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '', querystring = '', fragment = '', selfcall = 0) {
  16. var full_title = title;
  17. if ( title.includes( '#' ) ) {
  18. fragment = title.split('#').slice(1).join('#');
  19. title = title.split('#')[0];
  20. }
  21. if ( /\?\w+=/.test(title) ) {
  22. var querystart = title.search(/\?\w+=/);
  23. querystring = title.substring(querystart + 1) + ( querystring ? '&' + querystring : '' );
  24. title = title.substring(0, querystart);
  25. }
  26. if ( title.length > 250 ) {
  27. title = title.substring(0, 250);
  28. msg.reactEmoji('⚠️');
  29. }
  30. var invoke = title.split(' ')[0].toLowerCase();
  31. var aliasInvoke = ( lang.aliases[invoke] || invoke );
  32. var args = title.split(' ').slice(1);
  33. if ( aliasInvoke === 'random' && !args.join('') && !querystring && !fragment ) fn.random(lang, msg, wiki, reaction, spoiler);
  34. else if ( aliasInvoke === 'overview' && !args.join('') && !querystring && !fragment ) fn.overview(lang, msg, wiki, reaction, spoiler);
  35. else if ( aliasInvoke === 'page' ) {
  36. msg.sendChannel( spoiler + '<' + wiki.toLink(args.join('_'), querystring.toTitle(), fragment) + '>' + spoiler );
  37. if ( reaction ) reaction.removeEmoji();
  38. }
  39. else if ( aliasInvoke === 'diff' && args.join('') && !querystring && !fragment ) fn.diff(lang, msg, args, wiki, reaction, spoiler);
  40. else {
  41. var noRedirect = ( /(?:^|&)redirect=no(?:&|$)/.test(querystring) || /(?:^|&)action=(?!view(?:&|$))/.test(querystring) );
  42. got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=description&amenableparser=true&siprop=general|namespaces|specialpagealiases|wikidesc&iwurl=true' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=imageinfo|categoryinfo&titles=' + encodeURIComponent( title ) + '&format=json', {
  43. responseType: 'json'
  44. } ).then( response => {
  45. var body = response.body;
  46. if ( body && body.warnings ) log_warn(body.warnings);
  47. if ( response.statusCode !== 200 || !body || !body.query ) {
  48. if ( wiki.noWiki(response.url) || response.statusCode === 410 ) {
  49. console.log( '- This wiki doesn\'t exist!' );
  50. msg.reactEmoji('nowiki');
  51. }
  52. else {
  53. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.error && body.error.info ) );
  54. msg.sendChannelError( spoiler + '<' + wiki.toLink(( querystring || fragment || !title ? title : 'Special:Search' ), ( querystring || fragment || !title ? querystring.toTitle() : 'search=' + title.toSearch() ), fragment) + '>' + spoiler );
  55. }
  56. if ( reaction ) reaction.removeEmoji();
  57. }
  58. else if ( body.query.general.generator.startsWith( 'MediaWiki 1.3' ) ) {
  59. return this.gamepedia(lang, msg, title, wiki, cmd, reaction, spoiler, querystring, fragment, selfcall);
  60. }
  61. else if ( aliasInvoke === 'search' ) {
  62. fn.search(lang, msg, full_title.split(' ').slice(1).join(' '), wiki, body.query, reaction, spoiler);
  63. }
  64. else if ( aliasInvoke === 'discussion' && !querystring && !fragment ) {
  65. fn.discussion(lang, msg, wiki, args.join(' '), body.query, reaction, spoiler);
  66. }
  67. else {
  68. if ( body.query.pages ) {
  69. var querypages = Object.values(body.query.pages);
  70. var querypage = querypages[0];
  71. 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, '_' ) ) ) {
  72. querypage.title = body.query.redirects[0].from;
  73. delete body.query.redirects[0].tofragment;
  74. delete querypage.missing;
  75. querypage.ns = -1;
  76. querypage.special = '';
  77. }
  78. if ( querypages.length !== 1 ) querypage = {
  79. title: title,
  80. invalidreason: 'The requested page title contains invalid characters: "|".',
  81. invalid: ''
  82. }
  83. var contribs = body.query.namespaces['-1']['*'] + ':' + body.query.specialpagealiases.find( sp => sp.realname === 'Contributions' ).aliases[0] + '/';
  84. if ( querypage.ns === 2 && ( !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) ) ) {
  85. var userparts = querypage.title.split(':');
  86. querypage.noRedirect = noRedirect;
  87. fn.user(lang, msg, userparts[0].toTitle() + ':', userparts.slice(1).join(':'), wiki, querystring, fragment, querypage, contribs.toTitle(), reaction, spoiler);
  88. }
  89. else if ( querypage.ns === -1 && querypage.title.startsWith( contribs ) && querypage.title.length > contribs.length ) {
  90. var username = querypage.title.split('/').slice(1).join('/');
  91. got.get( wiki + 'api.php?action=query&titles=User:' + encodeURIComponent( username ) + '&format=json', {
  92. responseType: 'json'
  93. } ).then( uresponse => {
  94. var ubody = uresponse.body;
  95. if ( uresponse.statusCode !== 200 || !ubody || !ubody.query ) {
  96. console.log( '- ' + uresponse.statusCode + ': Error while getting the user: ' + ( ubody && ubody.error && ubody.error.info ) );
  97. msg.sendChannelError( spoiler + '<' + wiki.toLink(contribs + username, querystring.toTitle(), fragment, body.query.general) + '>' + spoiler );
  98. if ( reaction ) reaction.removeEmoji();
  99. }
  100. else {
  101. querypage = Object.values(ubody.query.pages)[0];
  102. if ( querypage.ns === 2 ) {
  103. username = querypage.title.split(':').slice(1).join(':');
  104. querypage.title = contribs + username;
  105. delete querypage.missing;
  106. querypage.ns = -1;
  107. querypage.special = '';
  108. querypage.noRedirect = noRedirect;
  109. fn.user(lang, msg, contribs.toTitle(), username, wiki, querystring, fragment, querypage, contribs.toTitle(), reaction, spoiler);
  110. }
  111. else {
  112. msg.reactEmoji('error');
  113. if ( reaction ) reaction.removeEmoji();
  114. }
  115. }
  116. }, error => {
  117. console.log( '- Error while getting the user: ' + error );
  118. msg.sendChannelError( spoiler + '<' + wiki.toLink(contribs + username, querystring.toTitle(), fragment, body.query.general) + '>' + spoiler );
  119. if ( reaction ) reaction.removeEmoji();
  120. } );
  121. }
  122. else if ( querypage.ns === 1201 && querypage.missing !== undefined ) {
  123. var thread = querypage.title.split(':');
  124. got.get( wiki + 'api.php?action=query&prop=revisions&rvprop=user&rvdir=newer&rvlimit=1&pageids=' + thread.slice(1).join(':') + '&format=json', {
  125. responseType: 'json'
  126. } ).then( thresponse => {
  127. var thbody = thresponse.body;
  128. if ( thresponse.statusCode !== 200 || !thbody || !thbody.query || !thbody.query.pages ) {
  129. console.log( '- ' + thresponse.statusCode + ': Error while getting the thread: ' + ( thbody && thbody.error && thbody.error.info ) );
  130. msg.sendChannelError( spoiler + '<' + wiki.toLink(querypage.title, querystring.toTitle(), fragment, body.query.general) + '>' + spoiler );
  131. if ( reaction ) reaction.removeEmoji();
  132. }
  133. else {
  134. querypage = thbody.query.pages[thread.slice(1).join(':')];
  135. if ( querypage.missing !== undefined ) {
  136. msg.reactEmoji('🤷');
  137. if ( reaction ) reaction.removeEmoji();
  138. }
  139. else {
  140. var pagelink = wiki.toLink(thread.join(':'), querystring.toTitle(), fragment, body.query.general);
  141. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( thread.join(':').escapeFormatting() ).setURL( pagelink ).setFooter( querypage.revisions[0].user );
  142. got.get( wiki.toDescLink(querypage.title) ).then( descresponse => {
  143. var descbody = descresponse.body;
  144. if ( descresponse.statusCode !== 200 || !descbody ) {
  145. console.log( '- ' + descresponse.statusCode + ': Error while getting the description.' );
  146. } else {
  147. var thumbnail = wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general);
  148. var parser = new htmlparser.Parser( {
  149. onopentag: (tagname, attribs) => {
  150. if ( tagname === 'meta' && attribs.property === 'og:description' ) {
  151. var description = attribs.content.escapeFormatting();
  152. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  153. embed.setDescription( description );
  154. }
  155. if ( tagname === 'meta' && attribs.property === 'og:image' ) {
  156. thumbnail = attribs.content;
  157. }
  158. }
  159. }, {decodeEntities:true} );
  160. parser.write( descbody );
  161. parser.end();
  162. embed.setThumbnail( thumbnail );
  163. }
  164. }, error => {
  165. console.log( '- Error while getting the description: ' + error );
  166. } ).finally( () => {
  167. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  168. if ( reaction ) reaction.removeEmoji();
  169. } );
  170. }
  171. }
  172. }, error => {
  173. console.log( '- Error while getting the thread: ' + error );
  174. msg.sendChannelError( spoiler + '<' + wiki.toLink(querypage.title, querystring.toTitle(), fragment, body.query.general) + '>' + spoiler );
  175. if ( reaction ) reaction.removeEmoji();
  176. } );
  177. }
  178. else if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) {
  179. got.get( wiki + 'api/v1/Search/List?minArticleQuality=0&namespaces=4,12,14,' + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join(',') + '&limit=1&query=' + encodeURIComponent( title ) + '&format=json', {
  180. responseType: 'json'
  181. } ).then( wsresponse => {
  182. var wsbody = wsresponse.body;
  183. if ( wsresponse.statusCode !== 200 || !wsbody || wsbody.exception || !wsbody.total || !wsbody.items || !wsbody.items.length ) {
  184. if ( wsbody && ( !wsbody.total || ( wsbody.items && !wsbody.items.length ) || ( wsbody.exception && wsbody.exception.code === 404 ) ) ) msg.reactEmoji('🤷');
  185. else {
  186. console.log( '- ' + wsresponse.statusCode + ': Error while getting the search results: ' + ( wsbody && wsbody.exception && wsbody.exception.details ) );
  187. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', 'search=' + title.toSearch(), '', body.query.general) + '>' + spoiler );
  188. }
  189. if ( reaction ) reaction.removeEmoji();
  190. }
  191. else {
  192. querypage = wsbody.items[0];
  193. if ( querypage.ns && !querypage.title.startsWith( body.query.namespaces[querypage.ns]['*'] + ':' ) ) {
  194. querypage.title = body.query.namespaces[querypage.ns]['*'] + ':' + querypage.title;
  195. }
  196. var text = '';
  197. var prefix = ( msg.channel.type === 'text' && patreons[msg.guild.id] || process.env.prefix );
  198. var linksuffix = ( querystring ? '?' + querystring : '' ) + ( fragment ? '#' + fragment : '' );
  199. if ( title.replace( /\-/g, ' ' ).toTitle().toLowerCase() === querypage.title.replace( /\-/g, ' ' ).toTitle().toLowerCase() ) {
  200. text = '';
  201. }
  202. else if ( wsbody.total === 1 ) {
  203. text = '\n' + lang.search.infopage.replaceSave( '%s', '`' + prefix + cmd + lang.search.page + ' ' + title + linksuffix + '`' );
  204. }
  205. else {
  206. text = '\n' + lang.search.infosearch.replaceSave( '%1$s', '`' + prefix + cmd + lang.search.page + ' ' + title + linksuffix + '`' ).replaceSave( '%2$s', '`' + prefix + cmd + lang.search.search + ' ' + title + linksuffix + '`' );
  207. }
  208. got.get( wiki + 'api.php?action=query&prop=imageinfo|categoryinfo&titles=' + encodeURIComponent( querypage.title ) + '&format=json', {
  209. responseType: 'json'
  210. } ).then( srresponse => {
  211. var srbody = srresponse.body;
  212. if ( srbody && srbody.warnings ) log_warn(srbody.warnings);
  213. if ( srresponse.statusCode !== 200 || !srbody || !srbody.query || !srbody.query.pages ) {
  214. console.log( '- ' + srresponse.statusCode + ': Error while getting the search results: ' + ( srbody && srbody.error && srbody.error.info ) );
  215. msg.sendChannelError( spoiler + '<' + wiki.toLink(querypage.title, querystring.toTitle(), fragment, body.query.general) + '>' + spoiler );
  216. if ( reaction ) reaction.removeEmoji();
  217. }
  218. else {
  219. querypage = Object.values(srbody.query.pages)[0];
  220. var pagelink = wiki.toLink(querypage.title, querystring.toTitle(), fragment, body.query.general);
  221. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  222. if ( querypage.imageinfo ) {
  223. var filename = querypage.title.replace( body.query.namespaces['6']['*'] + ':', '' );
  224. var pageimage = wiki.toLink('Special:FilePath/' + filename, 'v=' + Date.now(), '', body.query.general);
  225. if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
  226. else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + filename}] );
  227. }
  228. if ( querypage.categoryinfo ) {
  229. var langCat = lang.search.category;
  230. var category = [langCat.content];
  231. if ( querypage.categoryinfo.size === 0 ) category.push(langCat.empty);
  232. if ( querypage.categoryinfo.pages > 0 ) {
  233. var pages = querypage.categoryinfo.pages;
  234. category.push(( langCat.pages[pages] || langCat.pages['*' + pages % 100] || langCat.pages['*' + pages % 10] || langCat.pages.default ).replaceSave( '%s', pages ));
  235. }
  236. if ( querypage.categoryinfo.files > 0 ) {
  237. var files = querypage.categoryinfo.files;
  238. category.push(( langCat.files[files] || langCat.files['*' + files % 100] || langCat.files['*' + files % 10] || langCat.files.default ).replaceSave( '%s', files ));
  239. }
  240. if ( querypage.categoryinfo.subcats > 0 ) {
  241. var subcats = querypage.categoryinfo.subcats;
  242. category.push(( langCat.subcats[subcats] || langCat.subcats['*' + subcats % 100] || langCat.subcats['*' + subcats % 10] || langCat.subcats.default ).replaceSave( '%s', subcats ));
  243. }
  244. if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
  245. else text += '\n\n' + category.join('\n');
  246. }
  247. if ( querypage.title === body.query.general.mainpage && body.query.allmessages[0]['*'] ) {
  248. embed.setDescription( body.query.allmessages[0]['*'] );
  249. embed.setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general) );
  250. msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} );
  251. if ( reaction ) reaction.removeEmoji();
  252. }
  253. else got.get( wiki.toDescLink(querypage.title) ).then( descresponse => {
  254. var descbody = descresponse.body;
  255. if ( descresponse.statusCode !== 200 || !descbody ) {
  256. console.log( '- ' + descresponse.statusCode + ': Error while getting the description.' );
  257. } else {
  258. var thumbnail = wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general);
  259. var parser = new htmlparser.Parser( {
  260. onopentag: (tagname, attribs) => {
  261. if ( tagname === 'meta' && attribs.property === 'og:description' ) {
  262. var description = attribs.content.escapeFormatting();
  263. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  264. embed.setDescription( description );
  265. }
  266. if ( tagname === 'meta' && attribs.property === 'og:image' && querypage.title !== body.query.general.mainpage ) {
  267. thumbnail = attribs.content;
  268. }
  269. }
  270. }, {decodeEntities:true} );
  271. parser.write( descbody );
  272. parser.end();
  273. if ( !querypage.imageinfo ) embed.setThumbnail( thumbnail );
  274. }
  275. }, error => {
  276. console.log( '- Error while getting the description: ' + error );
  277. } ).finally( () => {
  278. msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} );
  279. if ( reaction ) reaction.removeEmoji();
  280. } );
  281. }
  282. }, error => {
  283. console.log( '- Error while getting the search results: ' + error );
  284. msg.sendChannelError( spoiler + '<' + wiki.toLink(querypage.title, querystring.toTitle(), fragment, body.query.general) + '>' + spoiler );
  285. if ( reaction ) reaction.removeEmoji();
  286. } );
  287. }
  288. }, error => {
  289. console.log( '- Error while getting the search results: ' + error );
  290. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', 'search=' + title.toSearch(), '', body.query.general) + '>' + spoiler );
  291. if ( reaction ) reaction.removeEmoji();
  292. } );
  293. }
  294. else if ( querypage.ns === -1 ) {
  295. var pagelink = wiki.toLink(querypage.title, querystring.toTitle(), fragment, body.query.general);
  296. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general) );
  297. var specialpage = body.query.specialpagealiases.find( sp => body.query.namespaces['-1']['*'] + ':' + sp.aliases[0].replace( /\_/g, ' ' ) === querypage.title.split('/')[0] );
  298. specialpage = ( specialpage ? specialpage.realname : querypage.title.replace( body.query.namespaces['-1']['*'] + ':', '' ).split('/')[0] ).toLowerCase();
  299. fn.special_page(lang, msg, querypage.title, specialpage, embed, wiki, reaction, spoiler);
  300. }
  301. else {
  302. var pagelink = wiki.toLink(querypage.title, querystring.toTitle(), ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment || '' ) ), body.query.general);
  303. var text = '';
  304. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  305. if ( querypage.imageinfo ) {
  306. var filename = querypage.title.replace( body.query.namespaces['6']['*'] + ':', '' );
  307. var pageimage = wiki.toLink('Special:FilePath/' + filename, 'v=' + Date.now(), '', body.query.general);
  308. if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
  309. else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + filename}] );
  310. }
  311. if ( querypage.categoryinfo ) {
  312. var langCat = lang.search.category;
  313. var category = [langCat.content];
  314. if ( querypage.categoryinfo.size === 0 ) category.push(langCat.empty);
  315. if ( querypage.categoryinfo.pages > 0 ) {
  316. var pages = querypage.categoryinfo.pages;
  317. category.push(( langCat.pages[pages] || langCat.pages['*' + pages % 100] || langCat.pages['*' + pages % 10] || langCat.pages.default ).replaceSave( '%s', pages ));
  318. }
  319. if ( querypage.categoryinfo.files > 0 ) {
  320. var files = querypage.categoryinfo.files;
  321. category.push(( langCat.files[files] || langCat.files['*' + files % 100] || langCat.files['*' + files % 10] || langCat.files.default ).replaceSave( '%s', files ));
  322. }
  323. if ( querypage.categoryinfo.subcats > 0 ) {
  324. var subcats = querypage.categoryinfo.subcats;
  325. category.push(( langCat.subcats[subcats] || langCat.subcats['*' + subcats % 100] || langCat.subcats['*' + subcats % 10] || langCat.subcats.default ).replaceSave( '%s', subcats ));
  326. }
  327. if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
  328. else text += '\n\n' + category.join('\n');
  329. }
  330. if ( querypage.title === body.query.general.mainpage && body.query.allmessages[0]['*'] ) {
  331. embed.setDescription( body.query.allmessages[0]['*'] );
  332. embed.setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general) );
  333. msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} );
  334. if ( reaction ) reaction.removeEmoji();
  335. }
  336. else got.get( wiki.toDescLink(querypage.title) ).then( descresponse => {
  337. var descbody = descresponse.body;
  338. if ( descresponse.statusCode !== 200 || !descbody ) {
  339. console.log( '- ' + descresponse.statusCode + ': Error while getting the description.' );
  340. } else {
  341. var thumbnail = wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general);
  342. var parser = new htmlparser.Parser( {
  343. onopentag: (tagname, attribs) => {
  344. if ( tagname === 'meta' && attribs.property === 'og:description' ) {
  345. var description = attribs.content.escapeFormatting();
  346. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  347. embed.setDescription( description );
  348. }
  349. if ( tagname === 'meta' && attribs.property === 'og:image' && querypage.title !== body.query.general.mainpage ) {
  350. thumbnail = attribs.content;
  351. }
  352. }
  353. }, {decodeEntities:true} );
  354. parser.write( descbody );
  355. parser.end();
  356. if ( !querypage.imageinfo ) embed.setThumbnail( thumbnail );
  357. }
  358. }, error => {
  359. console.log( '- Error while getting the description: ' + error );
  360. } ).finally( () => {
  361. msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} );
  362. if ( reaction ) reaction.removeEmoji();
  363. } );
  364. }
  365. }
  366. else if ( body.query.interwiki ) {
  367. var inter = body.query.interwiki[0];
  368. var intertitle = inter.title.substring(inter.iw.length + 1);
  369. var regex = inter.url.match( /^(?:https?:)?\/\/(([a-z\d-]{1,50})\.(?:fandom\.com|wikia\.org)(?:(?!\/wiki\/)\/([a-z-]{1,8}))?)(?:\/wiki\/|\/?$)/ );
  370. var maxselfcall = ( msg.channel.type === 'text' && msg.guild.id in patreons ? 10 : 5 );
  371. if ( regex !== null && selfcall < maxselfcall ) {
  372. if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) {
  373. var iwtitle = decodeURIComponent( inter.url.replace( regex[0], '' ) ).replace( /\_/g, ' ' ).replaceSave( intertitle.replace( /\_/g, ' ' ), intertitle );
  374. selfcall++;
  375. this.fandom(lang, msg, iwtitle, 'https://' + regex[1] + '/', ' ?' + ( regex[3] ? regex[3] + '.' : '' ) + regex[2] + ' ', reaction, spoiler, querystring, fragment, selfcall);
  376. } else {
  377. if ( reaction ) reaction.removeEmoji();
  378. console.log( '- Aborted, paused.' );
  379. }
  380. } else {
  381. regex = inter.url.match( /^(?:https?:)?\/\/([a-z\d-]{1,50})\.gamepedia\.com(?:\/|$)/ );
  382. if ( regex !== null && selfcall < maxselfcall ) {
  383. if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) {
  384. var iwtitle = decodeURIComponent( inter.url.replace( regex[0], '' ) ).replace( /\_/g, ' ' ).replaceSave( intertitle.replace( /\_/g, ' ' ), intertitle );
  385. selfcall++;
  386. this.gamepedia(lang, msg, iwtitle, 'https://' + regex[1] + '.gamepedia.com/', ' !' + regex[1] + ' ', reaction, spoiler, querystring, fragment, selfcall);
  387. } else {
  388. if ( reaction ) reaction.removeEmoji();
  389. console.log( '- Aborted, paused.' );
  390. }
  391. } else {
  392. regex = inter.url.match( /^(?:https?:)?\/\/([a-z\d-]{1,50}\.(?:wikipedia|mediawiki|wiktionary|wikimedia|wikibooks|wikisource|wikidata|wikiversity|wikiquote|wikinews|wikivoyage)\.org)(?:\/wiki\/|\/?$)/ );
  393. if ( regex !== null && selfcall < maxselfcall ) {
  394. if ( msg.channel.type !== 'text' || !pause[msg.guild.id] ) {
  395. var iwtitle = decodeURIComponent( inter.url.replace( regex[0], '' ) ).replace( /\_/g, ' ' ).replaceSave( intertitle.replace( /\_/g, ' ' ), intertitle );
  396. selfcall++;
  397. this.gamepedia(lang, msg, iwtitle, 'https://' + regex[1] + '/w/', cmd + inter.iw + ':', reaction, spoiler, querystring, fragment, selfcall);
  398. } else {
  399. if ( reaction ) reaction.removeEmoji();
  400. console.log( '- Aborted, paused.' );
  401. }
  402. } else {
  403. if ( fragment ) fragment = '#' + fragment.toSection();
  404. if ( inter.url.includes( '#' ) ) {
  405. if ( !fragment ) fragment = '#' + inter.url.split('#').slice(1).join('#');
  406. inter.url = inter.url.split('#')[0];
  407. }
  408. if ( querystring ) inter.url += ( inter.url.includes( '?' ) ? '&' : '?' ) + querystring.toTitle();
  409. msg.sendChannel( spoiler + ' ' + inter.url.replace( /@(here|everyone)/g, '%40$1' ) + fragment + ' ' + spoiler ).then( message => {
  410. if ( message && selfcall === maxselfcall ) message.reactEmoji('⚠️');
  411. } );
  412. if ( reaction ) reaction.removeEmoji();
  413. }
  414. }
  415. }
  416. }
  417. else if ( body.query.redirects ) {
  418. var pagelink = wiki.toLink(body.query.redirects[0].to, querystring.toTitle(), ( fragment || body.query.redirects[0].tofragment || '' ) );
  419. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( body.query.redirects[0].to.escapeFormatting() ).setURL( pagelink ).setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general) );
  420. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  421. if ( reaction ) reaction.removeEmoji();;
  422. }
  423. else {
  424. var pagelink = wiki.toLink(body.query.general.mainpage, querystring.toTitle(), fragment, body.query.general);
  425. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( body.query.general.mainpage.escapeFormatting() ).setURL( pagelink ).setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general) );
  426. if ( body.query.allmessages[0]['*'] ) {
  427. embed.setDescription( body.query.allmessages[0]['*'] );
  428. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  429. if ( reaction ) reaction.removeEmoji();
  430. }
  431. else got.get( wiki.toDescLink(body.query.general.mainpage) ).then( descresponse => {
  432. var descbody = descresponse.body;
  433. if ( descresponse.statusCode !== 200 || !descbody ) {
  434. console.log( '- ' + descresponse.statusCode + ': Error while getting the description.' );
  435. } else {
  436. var parser = new htmlparser.Parser( {
  437. onopentag: (tagname, attribs) => {
  438. if ( tagname === 'meta' && attribs.property === 'og:description' ) {
  439. var description = attribs.content.escapeFormatting();
  440. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  441. embed.setDescription( description );
  442. }
  443. }
  444. }, {decodeEntities:true} );
  445. parser.write( descbody );
  446. parser.end();
  447. }
  448. }, error => {
  449. console.log( '- Error while getting the description: ' + error );
  450. } ).finally( () => {
  451. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  452. if ( reaction ) reaction.removeEmoji();
  453. } );
  454. }
  455. }
  456. }, error => {
  457. if ( wiki.noWiki(error.message) ) {
  458. console.log( '- This wiki doesn\'t exist!' );
  459. msg.reactEmoji('nowiki');
  460. }
  461. else {
  462. console.log( '- Error while getting the search results: ' + error );
  463. msg.sendChannelError( spoiler + '<' + wiki.toLink(( querystring || fragment || !title ? title : 'Special:Search' ), ( querystring || fragment || !title ? querystring.toTitle() : 'search=' + title.toSearch() ), fragment) + '>' + spoiler );
  464. }
  465. if ( reaction ) reaction.removeEmoji();
  466. } );
  467. }
  468. }
  469. module.exports = fandom_check_wiki;