search.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const {MessageEmbed, Util} = require('discord.js');
  2. /**
  3. * Searches a Gamepedia wiki.
  4. * @param {import('../../../util/i18n.js')} lang - The user language.
  5. * @param {import('discord.js').Message} msg - The Discord message.
  6. * @param {String} searchterm - The searchterm.
  7. * @param {String} wiki - The wiki for the search.
  8. * @param {Object} query - The siteinfo from the wiki.
  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 gamepedia_search(lang, msg, searchterm, wiki, query, reaction, spoiler) {
  13. if ( searchterm.length > 250 ) {
  14. searchterm = searchterm.substring(0, 250);
  15. msg.reactEmoji('⚠️');
  16. }
  17. var pagelink = wiki.toLink('Special:Search', 'search=' + searchterm.toSearch() + '&fulltext=1', '', query.general);
  18. var embed = new MessageEmbed().setAuthor( query.general.sitename ).setTitle( '`' + searchterm + '`' ).setURL( pagelink );
  19. if ( !searchterm.trim() ) {
  20. pagelink = wiki.toLink('Special:Search', '', '', query.general);
  21. embed.setTitle( 'Special:Search' ).setURL( pagelink );
  22. }
  23. var description = [];
  24. got.get( wiki + 'api.php?action=query&titles=Special:Search&list=search&srinfo=totalhits&srprop=redirecttitle|sectiontitle&srnamespace=4|12|14|' + Object.values(query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&srlimit=10&srsearch=' + encodeURIComponent( ( searchterm || ' ' ) ) + '&format=json', {
  25. responseType: 'json'
  26. } ).then( response => {
  27. var body = response.body;
  28. if ( body && body.warnings ) log_warn(body.warnings);
  29. if ( response.statusCode !== 200 || !body || !body.query || !body.query.search || body.batchcomplete === undefined ) {
  30. return console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.error && body.error.info ) );
  31. }
  32. if ( body.query.pages && body.query.pages['-1'] && body.query.pages['-1'].title ) {
  33. if ( searchterm.trim() ) {
  34. pagelink = wiki.toLink(body.query.pages['-1'].title, 'search=' + searchterm.toSearch() + '&fulltext=1', '', query.general);
  35. embed.setURL( pagelink );
  36. }
  37. else {
  38. pagelink = wiki.toLink(body.query.pages['-1'].title, '', '', query.general);
  39. embed.setTitle( body.query.pages['-1'].title ).setURL( pagelink );
  40. }
  41. }
  42. if ( searchterm.trim() ) {
  43. body.query.search.forEach( result => {
  44. description.push( '• [' + result.title + '](' + wiki.toLink(result.title, '', '', query.general, true) + ')' + ( result.sectiontitle ? ' § [' + result.sectiontitle + '](' + wiki.toLink(result.title, '', result.sectiontitle, query.general, true) + ')' : '' ) + ( result.redirecttitle ? ' (⤷ [' + result.redirecttitle + '](' + wiki.toLink(result.redirecttitle, '', '', query.general, true) + '))' : '' ) );
  45. } );
  46. if ( body.query.searchinfo ) {
  47. embed.setFooter( lang.get('search.results', body.query.searchinfo.totalhits) );
  48. }
  49. }
  50. }, error => {
  51. console.log( '- Error while getting the search results.' + error );
  52. } ).finally( () => {
  53. embed.setDescription( Util.splitMessage( description.join('\n') )[0] );
  54. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  55. if ( reaction ) reaction.removeEmoji();
  56. } );
  57. }
  58. module.exports = {
  59. name: 'search',
  60. run: gamepedia_search
  61. };