random.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { MessageEmbed } from 'discord.js';
  2. import parse_page from '../../functions/parse_page.js';
  3. import logging from '../../util/logging.js';
  4. import { got, toMarkdown, htmlToDiscord, escapeFormatting } from '../../util/functions.js';
  5. import extract_desc from '../../util/extract_desc.js';
  6. /**
  7. * Sends a random Gamepedia page.
  8. * @param {import('../../util/i18n.js').default} lang - The user language.
  9. * @param {import('discord.js').Message} msg - The Discord message.
  10. * @param {import('../../util/wiki.js').default} wiki - The wiki for the page.
  11. * @param {import('discord.js').MessageReaction} reaction - The reaction on the message.
  12. * @param {String} spoiler - If the response is in a spoiler.
  13. * @param {Boolean} noEmbed - If the response should be without an embed.
  14. * @param {String[]} [namespace] - The namespace to get a random page of.
  15. * @param {URLSearchParams} [querystring] - The querystring for the link.
  16. * @param {String} [fragment] - The section for the link.
  17. */
  18. export default function gamepedia_random(lang, msg, wiki, reaction, spoiler, noEmbed, namespace = ['0', '*'], querystring = new URLSearchParams(), fragment = '') {
  19. var uselang = ( querystring.getAll('variant').pop() || querystring.getAll('uselang').pop() || lang.lang );
  20. got.get( wiki + 'api.php?uselang=' + uselang + '&action=query&meta=allmessages|siteinfo&amenableparser=true&amtitle=Special:Random&ammessages=randompage|randompage-nopages&amargs=%1F' + encodeURIComponent( namespace[1] ) + '%1F' + namespace[0].split('|').length + '&siprop=general&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|disambiguation|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&converttitles=true&generator=random&grnfilterredir=nonredirects&grnlimit=1&grnnamespace=' + encodeURIComponent( namespace[0] ) + '&format=json' ).then( response => {
  21. var body = response.body;
  22. if ( body && body.warnings ) log_warning(body.warnings);
  23. if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.general ) {
  24. if ( wiki.noWiki(response.url, response.statusCode) ) {
  25. console.log( '- This wiki doesn\'t exist!' );
  26. msg.reactEmoji('nowiki');
  27. }
  28. else {
  29. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.error && body.error.info ) );
  30. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random', querystring, fragment) + '>' + spoiler );
  31. }
  32. if ( reaction ) reaction.removeEmoji();
  33. return;
  34. }
  35. wiki.updateWiki(body.query.general);
  36. logging(wiki, msg.guildId, 'random');
  37. if ( !body.query.pages ) {
  38. var title = 'Special:Random';
  39. if ( namespace[0] !== '0' && namespace[0].split('|').length === 1 ) title += '/' + namespace[1];
  40. var pagelink = wiki.toLink(title, querystring, fragment);
  41. var embed = null;
  42. if ( msg.showEmbed() && !noEmbed ) {
  43. embed = new MessageEmbed().setAuthor( {name: body.query.general.sitename} ).setTitle( escapeFormatting(title) ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
  44. if ( body.query.allmessages?.[0]?.['*']?.trim?.() ) {
  45. let displaytitle = escapeFormatting(body.query.allmessages[0]['*'].trim());
  46. if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
  47. embed.setTitle( displaytitle );
  48. }
  49. if ( body.query.allmessages?.[1]?.['*']?.trim?.() ) {
  50. var description = toMarkdown(body.query.allmessages[1]['*'], wiki, title, true);
  51. if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
  52. embed.setDescription( description );
  53. }
  54. }
  55. msg.sendChannel( {content: spoiler + '<' + pagelink + '>' + spoiler, embeds: [embed]} );
  56. if ( reaction ) reaction.removeEmoji();
  57. return;
  58. }
  59. var querypage = Object.values(body.query.pages)[0];
  60. var pagelink = wiki.toLink(querypage.title, querystring, fragment);
  61. var text = '';
  62. var embed = new MessageEmbed().setAuthor( {name: body.query.general.sitename} ).setTitle( escapeFormatting(querypage.title) ).setURL( pagelink );
  63. if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
  64. var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
  65. if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
  66. embed.setTitle( displaytitle );
  67. }
  68. if ( querypage.extract ) {
  69. var extract = extract_desc(querypage.extract, fragment);
  70. embed.backupDescription = extract[0];
  71. if ( extract[1].length && extract[2].length ) {
  72. embed.backupField = {name: extract[1], value: extract[2]};
  73. }
  74. }
  75. if ( querypage.pageprops && querypage.pageprops.description ) {
  76. var description = htmlToDiscord( querypage.pageprops.description );
  77. if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
  78. embed.backupDescription = description;
  79. }
  80. if ( querypage.ns === 6 ) {
  81. var pageimage = ( querypage?.original?.source || wiki.toLink('Special:FilePath/' + querypage.title, {version:Date.now()}) );
  82. if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
  83. }
  84. else if ( querypage.title === body.query.general.mainpage ) {
  85. embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  86. }
  87. else if ( querypage.pageimage && querypage.original ) {
  88. embed.setThumbnail( querypage.original.source );
  89. }
  90. else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
  91. embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
  92. }
  93. else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  94. if ( querypage.categoryinfo ) {
  95. var category = [lang.get('search.category.content')];
  96. if ( querypage.categoryinfo.size === 0 ) {
  97. category.push(lang.get('search.category.empty'));
  98. }
  99. if ( querypage.categoryinfo.pages > 0 ) {
  100. category.push(lang.get('search.category.pages', querypage.categoryinfo.pages.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.pages));
  101. }
  102. if ( querypage.categoryinfo.files > 0 ) {
  103. category.push(lang.get('search.category.files', querypage.categoryinfo.files.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.files));
  104. }
  105. if ( querypage.categoryinfo.subcats > 0 ) {
  106. category.push(lang.get('search.category.subcats', querypage.categoryinfo.subcats.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.subcats));
  107. }
  108. if ( msg.showEmbed() && !noEmbed ) embed.addField( category[0], category.slice(1).join('\n') );
  109. else text += '\n\n' + category.join('\n');
  110. }
  111. return parse_page(lang, msg, '🎲 ' + spoiler + '<' + pagelink + '>' + text + spoiler, ( noEmbed ? null : embed ), wiki, reaction, querypage, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), fragment, pagelink);
  112. }, error => {
  113. if ( wiki.noWiki(error.message) ) {
  114. console.log( '- This wiki doesn\'t exist!' );
  115. msg.reactEmoji('nowiki');
  116. }
  117. else {
  118. console.log( '- Error while getting the search results: ' + error );
  119. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random', querystring, fragment) + '>' + spoiler );
  120. }
  121. if ( reaction ) reaction.removeEmoji();
  122. } );
  123. }