51 lines
1.4 KiB
Ruby
51 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module DiscourseAi
|
||
|
module Discord::Bot
|
||
|
class PersonaReplier < Base
|
||
|
def initialize(body)
|
||
|
@persona =
|
||
|
AiPersona
|
||
|
.all_personas
|
||
|
.find { |persona| persona.id == SiteSetting.ai_discord_search_persona.to_i }
|
||
|
.new
|
||
|
@bot = DiscourseAi::AiBot::Bot.as(Discourse.system_user, persona: @persona, model: nil)
|
||
|
super(body)
|
||
|
end
|
||
|
|
||
|
def handle_interaction!
|
||
|
last_update_sent_at = Time.now - 1
|
||
|
reply = +""
|
||
|
full_reply =
|
||
|
@bot.reply(
|
||
|
{ conversation_context: [{ type: :user, content: @query }], skip_tool_details: true },
|
||
|
) do |partial, _cancel, _something|
|
||
|
reply << partial
|
||
|
next if reply.blank?
|
||
|
|
||
|
if @reply_response.nil?
|
||
|
create_reply(wrap_links(reply.dup))
|
||
|
elsif @last_update_response.nil?
|
||
|
update_reply(wrap_links(reply.dup))
|
||
|
elsif Time.now - last_update_sent_at > 1
|
||
|
update_reply(wrap_links(reply.dup))
|
||
|
last_update_sent_at = Time.now
|
||
|
end
|
||
|
end
|
||
|
|
||
|
discord_reply = wrap_links(full_reply.last.first)
|
||
|
|
||
|
if @reply_response.nil?
|
||
|
create_reply(discord_reply)
|
||
|
else
|
||
|
update_reply(discord_reply)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def wrap_links(text)
|
||
|
text.gsub(%r{(?<url>https?://[^\s]+)}, "<\\k<url>>")
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|