random.js 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const htmlparser = require('htmlparser2');
  2. const {MessageEmbed} = require('discord.js');
  3. const logging = require('../../../util/logging.js');
  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 {import('../../../util/wiki.js')} 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' ).then( response => {
  14. var body = response.body;
  15. if ( body && body.warnings ) log_warn(body.warnings);
  16. if ( response.statusCode !== 200 || !body || !body.query || !body.query.pages ) {
  17. if ( wiki.noWiki(response.url, response.statusCode) ) {
  18. console.log( '- This wiki doesn\'t exist!' );
  19. msg.reactEmoji('nowiki');
  20. }
  21. else {
  22. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.error && body.error.info ) );
  23. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random') + '>' + spoiler );
  24. }
  25. if ( reaction ) reaction.removeEmoji();
  26. }
  27. else {
  28. wiki.updateWiki(body.query.general);
  29. logging(wiki, msg.guild?.id, 'random', 'legacy');
  30. var querypage = Object.values(body.query.pages)[0];
  31. var pagelink = wiki.toLink(querypage.title);
  32. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  33. if ( querypage.title === body.query.general.mainpage && body.query.allmessages[0]['*'] ) {
  34. embed.setDescription( body.query.allmessages[0]['*'] );
  35. embed.setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png') );
  36. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  37. if ( reaction ) reaction.removeEmoji();
  38. }
  39. else got.get( wiki.toDescLink(querypage.title), {
  40. responseType: 'text'
  41. } ).then( descresponse => {
  42. var descbody = descresponse.body;
  43. if ( descresponse.statusCode !== 200 || !descbody ) {
  44. console.log( '- ' + descresponse.statusCode + ': Error while getting the description.' );
  45. } else {
  46. var thumbnail = wiki.toLink('Special:FilePath/Wiki-wordmark.png');
  47. var parser = new htmlparser.Parser( {
  48. onopentag: (tagname, attribs) => {
  49. if ( tagname === 'meta' && attribs.property === 'og:description' ) {
  50. var description = attribs.content.escapeFormatting();
  51. if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
  52. embed.setDescription( description );
  53. }
  54. if ( tagname === 'meta' && attribs.property === 'og:image' && querypage.title !== body.query.general.mainpage ) {
  55. thumbnail = attribs.content;
  56. }
  57. }
  58. } );
  59. parser.write( descbody );
  60. parser.end();
  61. embed.setThumbnail( thumbnail );
  62. }
  63. }, error => {
  64. console.log( '- Error while getting the description: ' + error );
  65. } ).finally( () => {
  66. msg.sendChannel( '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  67. if ( reaction ) reaction.removeEmoji();
  68. } );
  69. }
  70. }, error => {
  71. if ( wiki.noWiki(error.message) ) {
  72. console.log( '- This wiki doesn\'t exist!' );
  73. msg.reactEmoji('nowiki');
  74. }
  75. else {
  76. console.log( '- Error while getting the search results: ' + error );
  77. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random') + '>' + spoiler );
  78. }
  79. if ( reaction ) reaction.removeEmoji();
  80. } );
  81. }
  82. module.exports = {
  83. name: 'random',
  84. run: fandom_random
  85. };