discourse/plugins/chat/lib/post_notification_handler.rb

41 lines
1.2 KiB
Ruby

# frozen_string_literal: true
##
# Handles :post_alerter_after_save_post events from
# core. Used for notifying users that their chat message
# has been quoted in a post.
class Chat::PostNotificationHandler
attr_reader :post
def initialize(post, notified_users)
@post = post
@notified_users = notified_users
end
def handle
return false if post.post_type == Post.types[:whisper]
return false if post.topic.blank?
return false if post.topic.private_message?
quoted_users = extract_quoted_users(post)
if @notified_users.present?
quoted_users = quoted_users.where("users.id NOT IN (?)", @notified_users)
end
opts = { user_id: post.user.id, display_username: post.user.username }
quoted_users.each do |user|
# PostAlerter.create_notification handles many edge cases, such as
# muting, ignoring, double notifications etc.
PostAlerter.new.create_notification(user, Notification.types[:chat_quoted], post, opts)
end
end
private
def extract_quoted_users(post)
usernames =
post.raw.scan(/\[chat quote=\"([^;]+);.+\"\]/).uniq.map { |q| q.first.strip.downcase }
User.where.not(id: post.user_id).where(username_lower: usernames)
end
end