random.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. const htmlparser = require('htmlparser2');
  2. const {MessageEmbed} = require('discord.js');
  3. const gamepedia_random = require('../gamepedia/random.js').run;
  4. /**
  5. * Sends a random Fandom page.
  6. * @param {import('../../../util/i18n.js')} lang - The user language.
  7. * @param {import('discord.js').Message} msg - The Discord message.
  8. * @param {String} wiki - The wiki for the page.
  9. * @param {import('discord.js').MessageReaction} reaction - The reaction on the message.
  10. * @param {String} spoiler - If the response is in a spoiler.
  11. */
  12. function fandom_random(lang, msg, wiki, reaction, spoiler) {
  13. got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=description&siprop=general&generator=random&grnnamespace=0&format=json', {
  14. responseType: 'json'
  15. } ).then( response => {
  16. var body = response.body;
  17. if ( body && body.warnings ) log_warn(body.warnings);
  18. if ( response.statusCode !== 200 || !body || !body.query || !body.query.pages ) {
  19. if ( wiki.noWiki(response.url) || response.statusCode === 410 ) {
  20. console.log( '- This wiki doesn\'t exist!' );
  21. msg.reactEmoji('nowiki');
  22. }
  23. else {
  24. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.error && body.error.info ) );
  25. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random') + '>' + spoiler );
  26. }
  27. if ( reaction ) reaction.removeEmoji();
  28. }
  29. else if ( body.query.general.generator.startsWith( 'MediaWiki 1.3' ) ) {
  30. return gamepedia_random(lang, msg, wiki, reaction, spoiler);
  31. }
  32. else {
  33. var querypage = Object.values(body.query.pages)[0];
  34. var pagelink = wiki.toLink(querypage.title, '', '', body.query.general);
  35. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  36. if ( querypage.title === body.query.general.mainpage && body.query.allmessages[0]['*'] ) {
  37. embed.setDescription( body.query.allmessages[0]['*'] );
  38. embed.setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general) );
  39. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  40. if ( reaction ) reaction.removeEmoji();
  41. }
  42. else got.get( wiki.toDescLink(querypage.title) ).then( descresponse => {
  43. var descbody = descresponse.body;
  44. if ( descresponse.statusCode !== 200 || !descbody ) {
  45. console.log( '- ' + descresponse.statusCode + ': Error while getting the description.' );
  46. } else {
  47. var thumbnail = wiki.toLink('Special:FilePath/Wiki-wordmark.png', '', '', body.query.general);
  48. var parser = new htmlparser.Parser( {
  49. onopentag: (tagname, attribs) => {
  50. if ( tagname === 'meta' && attribs.property === 'og:description' ) {
  51. var description = attribs.content.escapeFormatting();
  52. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  53. embed.setDescription( description );
  54. }
  55. if ( tagname === 'meta' && attribs.property === 'og:image' && querypage.title !== body.query.general.mainpage ) {
  56. thumbnail = attribs.content;
  57. }
  58. }
  59. }, {decodeEntities:true} );
  60. parser.write( descbody );
  61. parser.end();
  62. embed.setThumbnail( thumbnail );
  63. }
  64. }, error => {
  65. console.log( '- Error while getting the description: ' + error );
  66. } ).finally( () => {
  67. msg.sendChannel( '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  68. if ( reaction ) reaction.removeEmoji();
  69. } );
  70. }
  71. }, error => {
  72. if ( wiki.noWiki(error.message) ) {
  73. console.log( '- This wiki doesn\'t exist!' );
  74. msg.reactEmoji('nowiki');
  75. }
  76. else {
  77. console.log( '- Error while getting the search results: ' + error );
  78. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random') + '>' + spoiler );
  79. }
  80. if ( reaction ) reaction.removeEmoji();
  81. } );
  82. }
  83. module.exports = {
  84. name: 'random',
  85. run: fandom_random
  86. };