random.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. const htmlparser = require('htmlparser2');
  2. const {MessageEmbed} = require('discord.js');
  3. const extract_desc = require('../../../util/extract_desc.js');
  4. function gamepedia_random(lang, msg, wiki, reaction, spoiler) {
  5. got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&prop=pageimages|pageprops|extracts&piprop=original|name&ppprop=description|displaytitle&explaintext=true&exsectionformat=raw&exlimit=1&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.batchcomplete === undefined || !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. }
  20. else {
  21. var querypage = Object.values(body.query.pages)[0];
  22. var pagelink = wiki.toLink(querypage.title, '', '', body.query.general);
  23. var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
  24. if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
  25. var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
  26. if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
  27. embed.setTitle( displaytitle );
  28. }
  29. if ( querypage.pageprops && querypage.pageprops.description ) {
  30. var description = htmlToPlain( querypage.pageprops.description );
  31. if ( description.length > 2000 ) description = description.substring(0, 2000) + '\u2026';
  32. embed.setDescription( description );
  33. }
  34. else if ( querypage.extract ) {
  35. var extract = extract_desc(querypage.extract);
  36. embed.setDescription( extract[0] );
  37. }
  38. if ( querypage.pageimage && querypage.original && querypage.title !== body.query.general.mainpage ) {
  39. embed.setThumbnail( querypage.original.source );
  40. }
  41. else embed.setThumbnail( ( body.query.general.logo.startsWith( '//' ) ? 'https:' : '' ) + body.query.general.logo );
  42. msg.sendChannel( '🎲 ' + spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  43. }
  44. }, error => {
  45. if ( wiki.noWiki(error.message) ) {
  46. console.log( '- This wiki doesn\'t exist!' );
  47. msg.reactEmoji('nowiki');
  48. }
  49. else {
  50. console.log( '- Error while getting the search results: ' + error );
  51. msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Random') + '>' + spoiler );
  52. }
  53. } ).finally( () => {
  54. if ( reaction ) reaction.removeEmoji();
  55. } );
  56. }
  57. function htmlToPlain(html) {
  58. var text = '';
  59. var parser = new htmlparser.Parser( {
  60. ontext: (htmltext) => {
  61. text += htmltext.escapeFormatting();
  62. }
  63. }, {decodeEntities:true} );
  64. parser.write( html );
  65. parser.end();
  66. return text;
  67. };
  68. function htmlToDiscord(html) {
  69. var text = '';
  70. var parser = new htmlparser.Parser( {
  71. onopentag: (tagname, attribs) => {
  72. switch (tagname) {
  73. case 'b':
  74. text += '**';
  75. break;
  76. case 'i':
  77. text += '*';
  78. break;
  79. case 's':
  80. text += '~~';
  81. break;
  82. case 'u':
  83. text += '__';
  84. break;
  85. }
  86. },
  87. ontext: (htmltext) => {
  88. text += htmltext.escapeFormatting();
  89. },
  90. onclosetag: (tagname) => {
  91. switch (tagname) {
  92. case 'b':
  93. text += '**';
  94. break;
  95. case 'i':
  96. text += '*';
  97. break;
  98. case 's':
  99. text += '~~';
  100. break;
  101. case 'u':
  102. text += '__';
  103. break;
  104. }
  105. }
  106. }, {decodeEntities:true} );
  107. parser.write( html );
  108. parser.end();
  109. return text;
  110. };
  111. module.exports = {
  112. name: 'random',
  113. run: gamepedia_random
  114. };