100 lines
3.0 KiB
Ruby
100 lines
3.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscourseAi
|
|
module GuardianExtensions
|
|
def can_see_summary?(target)
|
|
return false if !SiteSetting.ai_summarization_enabled
|
|
|
|
if target.class == Topic && target.private_message?
|
|
allowed =
|
|
SiteSetting.ai_pm_summarization_allowed_groups_map.any? do |group_id|
|
|
user.group_ids.include?(group_id)
|
|
end
|
|
|
|
return false if !allowed
|
|
end
|
|
|
|
has_cached_summary =
|
|
AiSummary.exists?(target: target, summary_type: AiSummary.summary_types[:complete])
|
|
return has_cached_summary if user.nil?
|
|
|
|
has_cached_summary || can_request_summary?
|
|
end
|
|
|
|
def can_see_gists?
|
|
return false if !SiteSetting.ai_summarization_enabled
|
|
return false if SiteSetting.ai_summarize_max_hot_topics_gists_per_batch.zero?
|
|
return false if anonymous?
|
|
return false if SiteSetting.ai_hot_topic_gists_allowed_groups_map.empty?
|
|
|
|
SiteSetting.ai_hot_topic_gists_allowed_groups_map.any? do |group_id|
|
|
user.group_ids.include?(group_id)
|
|
end
|
|
end
|
|
|
|
def can_request_summary?
|
|
return false if anonymous?
|
|
|
|
user_group_ids = user.group_ids
|
|
SiteSetting.ai_custom_summarization_allowed_groups_map.any? do |group_id|
|
|
user_group_ids.include?(group_id)
|
|
end
|
|
end
|
|
|
|
def can_debug_ai_bot_conversation?(target)
|
|
return false if anonymous?
|
|
|
|
return false if !can_see?(target)
|
|
|
|
if !SiteSetting.discourse_ai_enabled || !SiteSetting.ai_bot_enabled ||
|
|
!SiteSetting.ai_bot_debugging_allowed_groups_map.any?
|
|
return false
|
|
end
|
|
|
|
user.in_any_groups?(SiteSetting.ai_bot_debugging_allowed_groups_map)
|
|
end
|
|
|
|
def can_share_ai_bot_conversation?(target)
|
|
return false if anonymous?
|
|
|
|
if !SiteSetting.discourse_ai_enabled || !SiteSetting.ai_bot_enabled ||
|
|
!SiteSetting.ai_bot_public_sharing_allowed_groups_map.any?
|
|
return false
|
|
end
|
|
|
|
return false if !user.in_any_groups?(SiteSetting.ai_bot_public_sharing_allowed_groups_map)
|
|
|
|
# In future we may add other valid targets for AI conversation sharing,
|
|
# for now we only support topics.
|
|
if target.is_a?(Topic)
|
|
return false if !target.private_message?
|
|
return false if target.topic_allowed_groups.exists?
|
|
allowed_user_ids = target.topic_allowed_users.pluck(:user_id)
|
|
|
|
# not in PM
|
|
return false if !allowed_user_ids.include?(user.id)
|
|
|
|
# other people in PM
|
|
return false if allowed_user_ids.any? { |id| id > 0 && id != user.id }
|
|
|
|
# no bot in the PM
|
|
bot_ids = DiscourseAi::AiBot::EntryPoint.all_bot_ids
|
|
return false if allowed_user_ids.none? { |id| bot_ids.include?(id) }
|
|
|
|
# other content in PM
|
|
return false if target.posts.where("user_id > 0 and user_id <> ?", user.id).exists?
|
|
else
|
|
return false
|
|
end
|
|
|
|
true
|
|
end
|
|
|
|
def can_destroy_shared_ai_bot_conversation?(conversation)
|
|
return false if anonymous?
|
|
|
|
conversation.user_id == user.id || is_admin?
|
|
end
|
|
end
|
|
end
|