search.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. const {MessageEmbed, Util} = require('discord.js');
  2. function fandom_search(lang, msg, searchterm, wiki, query, reaction, spoiler) {
  3. if ( searchterm.length > 250 ) {
  4. searchterm = searchterm.substring(0, 250);
  5. msg.reactEmoji('⚠️');
  6. }
  7. var pagelink = wiki.toLink('Special:Search', 'search=' + searchterm.toSearch(), '', query.general);
  8. var embed = new MessageEmbed().setAuthor( query.general.sitename ).setTitle( '`' + searchterm + '`' ).setURL( pagelink );
  9. if ( !searchterm.trim() ) {
  10. pagelink = wiki.toLink('Special:Search', '', '', query.general);
  11. embed.setTitle( 'Special:Search' ).setURL( pagelink );
  12. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  13. if ( reaction ) reaction.removeEmoji();
  14. return;
  15. }
  16. var description = [];
  17. 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', {
  18. responseType: 'json'
  19. } ).then( response => {
  20. var body = response.body;
  21. if ( response.statusCode !== 200 || !body || body.exception || !body.items ) {
  22. if ( !( body && body.exception && body.exception.code === 404 ) ) {
  23. console.log( '- ' + response.statusCode + ': Error while getting the search results: ' + ( body && body.exception && body.exception.details ) );
  24. }
  25. return;
  26. }
  27. body.items.forEach( result => {
  28. description.push( '• [' + result.title + '](' + wiki.toLink(result.title, '', '', query.general, true) + ')' );
  29. } );
  30. let count = lang.get('search.results');
  31. embed.setFooter( ( count[body.total] || count['*' + body.total % 100] || count['*' + body.total % 10] || lang.get('search.results.default') ).replaceSave( '%s', body.total ) );
  32. }, error => {
  33. console.log( '- Error while getting the search results.' + error );
  34. } ).finally( () => {
  35. embed.setDescription( Util.splitMessage( description.join('\n') )[0] );
  36. msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
  37. if ( reaction ) reaction.removeEmoji();
  38. } );
  39. }
  40. module.exports = {
  41. name: 'search',
  42. run: fandom_search
  43. };