random.js 3.5 KB

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