2023-05-20 03:45:54 -04:00
|
|
|
#frozen_string_literal: true
|
|
|
|
|
|
|
|
module DiscourseAi::AiBot::Commands
|
|
|
|
class GoogleCommand < Command
|
|
|
|
class << self
|
|
|
|
def name
|
|
|
|
"google"
|
|
|
|
end
|
|
|
|
|
|
|
|
def desc
|
2023-06-19 18:45:31 -04:00
|
|
|
"Will search using Google - global internet search (supports all Google search operators)"
|
|
|
|
end
|
|
|
|
|
|
|
|
def parameters
|
|
|
|
[
|
|
|
|
Parameter.new(
|
|
|
|
name: "query",
|
|
|
|
description: "The search query",
|
|
|
|
type: "string",
|
|
|
|
required: true,
|
|
|
|
),
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
def custom_system_message
|
|
|
|
"You were trained on OLD data, lean on search to get up to date information from the web"
|
2023-05-20 03:45:54 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def result_name
|
|
|
|
"results"
|
|
|
|
end
|
|
|
|
|
|
|
|
def description_args
|
|
|
|
{
|
|
|
|
count: @last_num_results || 0,
|
|
|
|
query: @last_query || "",
|
|
|
|
url: "https://google.com/search?q=#{CGI.escape(@last_query || "")}",
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def process(search_string)
|
2023-06-19 18:45:31 -04:00
|
|
|
search_string = JSON.parse(search_string)["query"]
|
|
|
|
|
2023-05-20 03:45:54 -04:00
|
|
|
@last_query = search_string
|
|
|
|
api_key = SiteSetting.ai_google_custom_search_api_key
|
|
|
|
cx = SiteSetting.ai_google_custom_search_cx
|
|
|
|
query = CGI.escape(search_string)
|
|
|
|
uri =
|
|
|
|
URI("https://www.googleapis.com/customsearch/v1?key=#{api_key}&cx=#{cx}&q=#{query}&num=10")
|
|
|
|
body = Net::HTTP.get(uri)
|
|
|
|
|
2023-06-19 18:45:31 -04:00
|
|
|
parse_search_json(body)
|
2023-05-20 03:45:54 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def parse_search_json(json_data)
|
|
|
|
parsed = JSON.parse(json_data)
|
|
|
|
results = parsed["items"]
|
|
|
|
|
|
|
|
@last_num_results = parsed.dig("searchInformation", "totalResults").to_i
|
|
|
|
|
2023-05-21 22:09:14 -04:00
|
|
|
format_results(results) do |result|
|
|
|
|
{
|
2023-05-20 03:45:54 -04:00
|
|
|
title: result["title"],
|
|
|
|
link: result["link"],
|
|
|
|
snippet: result["snippet"],
|
|
|
|
displayLink: result["displayLink"],
|
|
|
|
formattedUrl: result["formattedUrl"],
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|