random.js 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const {MessageEmbed} = require('discord.js');
  2. const fandom_random = require('./fandom/random.js').run;
  3. const parse_page = require('../../functions/parse_page.js');
  4. const logging = require('../../util/logging.js');
  5. const {parse_infobox, htmlToDiscord} = require('../../util/functions.js');
  6. const extract_desc = require('../../util/extract_desc.js');
  7. /**
  8. * Sends a random Gamepedia page.
  9. * @param {import('../../util/i18n.js')} lang - The user language.
  10. * @param {import('discord.js').Message} msg - The Discord message.
  11. * @param {import('../../util/wiki.js')} wiki - The wiki for the page.
  12. * @param {import('discord.js').MessageReaction} reaction - The reaction on the message.
  13. * @param {String} spoiler - If the response is in a spoiler.
  14. */
  15. function gamepedia_random(lang, msg, wiki, reaction, spoiler) {
  16. got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&prop=info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=random&grnnamespace=0&format=json' ).then( response => {
  17. var body = response.body;
  18. if ( body && body.warnings ) log_warn(body.warnings);
  19. if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.pages ) {
  20. if ( wiki.noWiki(response.url, response.statusCode) ) {
  21. console.log( '- This wiki doesn\'t exist!' );
  22. msg.reactEmoji('nowiki');
  23. }
  24. else if ( body?.query?.general?.generator === 'MediaWiki 1.19.24' && wiki.isFandom(false) ) {
  25. return fandom_random(lang, msg, wiki, reaction, spoiler);
  26. }
  27. else {
  28. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.error && body.error.info ) );
  29. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random') + '>' + spoiler );
  30. }
  31. if ( reaction ) reaction.removeEmoji();
  32. return;
  33. }
  34. wiki.updateWiki(body.query.general);
  35. logging(wiki, msg.guild?.id, 'random');
  36. var querypage = Object.values(body.query.pages)[0];
  37. var pagelink = wiki.toLink(querypage.title);
  38. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  39. if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
  40. var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
  41. if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
  42. embed.setTitle( displaytitle );
  43. }
  44. if ( querypage.pageprops && querypage.pageprops.description ) {
  45. var description = htmlToDiscord( querypage.pageprops.description );
  46. if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
  47. embed.backupDescription = description;
  48. }
  49. else if ( querypage.extract ) {
  50. var extract = extract_desc(querypage.extract);
  51. embed.backupDescription = extract[0];
  52. }
  53. if ( querypage.title === body.query.general.mainpage ) {
  54. embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  55. }
  56. else if ( querypage.pageimage && querypage.original ) {
  57. embed.setThumbnail( querypage.original.source );
  58. }
  59. else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
  60. embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
  61. }
  62. else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
  63. if ( !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
  64. try {
  65. var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
  66. parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href, pagelink);
  67. }
  68. catch ( error ) {
  69. console.log( '- Failed to parse the infobox: ' + error );
  70. }
  71. }
  72. parse_page(msg, '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, embed, wiki, reaction, querypage, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ));
  73. }, error => {
  74. if ( wiki.noWiki(error.message) ) {
  75. console.log( '- This wiki doesn\'t exist!' );
  76. msg.reactEmoji('nowiki');
  77. }
  78. else {
  79. console.log( '- Error while getting the search results: ' + error );
  80. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random') + '>' + spoiler );
  81. }
  82. if ( reaction ) reaction.removeEmoji();
  83. } );
  84. }
  85. module.exports = {
  86. name: 'random',
  87. run: gamepedia_random
  88. };