mirror of
				https://github.com/discourse/discourse-ai.git
				synced 2025-10-31 14:38:37 +00:00 
			
		
		
		
	
		
			
	
	
		
			86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|  | #frozen_string_literal: true | ||
|  | 
 | ||
|  | module DiscourseAi::AiBot::Commands | ||
|  |   class SearchSettingsCommand < Command | ||
|  |     class << self | ||
|  |       def name | ||
|  |         "search_settings" | ||
|  |       end | ||
|  | 
 | ||
|  |       def desc | ||
|  |         "Will search through site settings and return top 20 results" | ||
|  |       end | ||
|  | 
 | ||
|  |       def parameters | ||
|  |         [ | ||
|  |           Parameter.new( | ||
|  |             name: "query", | ||
|  |             description: | ||
|  |               "comma delimited list of settings to search for (e.g. 'setting_1,setting_2')", | ||
|  |             type: "string", | ||
|  |             required: true, | ||
|  |           ), | ||
|  |         ] | ||
|  |       end | ||
|  |     end | ||
|  | 
 | ||
|  |     def result_name | ||
|  |       "results" | ||
|  |     end | ||
|  | 
 | ||
|  |     def description_args | ||
|  |       { count: @last_num_results || 0, query: @last_query || "" } | ||
|  |     end | ||
|  | 
 | ||
|  |     INCLUDE_DESCRIPTIONS_MAX_LENGTH = 10
 | ||
|  |     MAX_RESULTS = 200
 | ||
|  | 
 | ||
|  |     def process(query:) | ||
|  |       @last_query = query | ||
|  |       @last_num_results = 0
 | ||
|  | 
 | ||
|  |       terms = query.split(",").map(&:strip).map(&:downcase).reject(&:blank?) | ||
|  | 
 | ||
|  |       found = | ||
|  |         SiteSetting.all_settings.filter do |setting| | ||
|  |           name = setting[:setting].to_s.downcase | ||
|  |           description = setting[:description].to_s.downcase | ||
|  |           plugin = setting[:plugin].to_s.downcase | ||
|  | 
 | ||
|  |           search_string = "#{name} #{description} #{plugin}" | ||
|  | 
 | ||
|  |           terms.any? { |term| search_string.include?(term) } | ||
|  |         end | ||
|  | 
 | ||
|  |       if found.blank? | ||
|  |         { | ||
|  |           args: { | ||
|  |             query: query, | ||
|  |           }, | ||
|  |           rows: [], | ||
|  |           instruction: "no settings matched #{query}, expand your search", | ||
|  |         } | ||
|  |       else | ||
|  |         include_descriptions = false | ||
|  | 
 | ||
|  |         if found.length > MAX_RESULTS | ||
|  |           found = found[0..MAX_RESULTS] | ||
|  |         elsif found.length < INCLUDE_DESCRIPTIONS_MAX_LENGTH | ||
|  |           include_descriptions = true | ||
|  |         end | ||
|  | 
 | ||
|  |         @last_num_results = found.length | ||
|  | 
 | ||
|  |         format_results(found, args: { query: query }) do |setting| | ||
|  |           result = { name: setting[:setting] } | ||
|  |           if include_descriptions | ||
|  |             result[:description] = setting[:description] | ||
|  |             result[:plugin] = setting[:plugin] | ||
|  |           end | ||
|  |           result | ||
|  |         end | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | end |