fandom.js 27 KB

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