search.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. const {MessageEmbed, Util} = require('discord.js');
  2. /**
  3. * Searches a Fandom 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 {import('../../../util/wiki.js')} 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 fandom_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});
  18. var embed = new MessageEmbed().setAuthor( query.general.sitename ).setTitle( '`' + searchterm + '`' ).setURL( pagelink );
  19. if ( !searchterm.trim() ) {
  20. pagelink = wiki.toLink('Special:Search');
  21. embed.setTitle( 'Special:Search' ).setURL( pagelink );
  22. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  23. if ( reaction ) reaction.removeEmoji();
  24. return;
  25. }
  26. var description = [];
  27. got.get( wiki + 'api/v1/Search/List?minArticleQuality=0&namespaces=4,12,14,' + Object.values(query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join(',') + '&limit=10&query=' + encodeURIComponent( searchterm ) + '&format=json&cache=' + Date.now() ).then( response => {
  28. var body = response.body;
  29. if ( response.statusCode !== 200 || !body || body.exception || !body.items ) {
  30. if ( !( body && body.exception && body.exception.code === 404 ) ) {
  31. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.exception && body.exception.details ) );
  32. }
  33. return;
  34. }
  35. body.items.forEach( result => {
  36. description.push( '• [' + result.title + '](' + wiki.toLink(result.title, '', '', true) + ')' );
  37. } );
  38. embed.setFooter( lang.get('search.results', body.total) );
  39. }, error => {
  40. console.log( '- Error while getting the search results.' + error );
  41. } ).finally( () => {
  42. embed.setDescription( Util.splitMessage( description.join('\n') )[0] );
  43. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  44. if ( reaction ) reaction.removeEmoji();
  45. } );
  46. }
  47. module.exports = {
  48. name: 'search',
  49. run: fandom_search
  50. };