process_mentions_service.rb 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # frozen_string_literal: true
  2. class ProcessMentionsService < BaseService
  3. # Scan status for mentions and fetch remote mentioned users, create
  4. # local mention pointers, send Salmon notifications to mentioned
  5. # remote users
  6. # @param [Status] status
  7. def call(status)
  8. return unless status.local?
  9. status.text.scan(Account::MENTION_RE).each do |match|
  10. username, domain = match.first.split('@')
  11. mentioned_account = Account.find_remote(username, domain)
  12. if mentioned_account.nil? && !domain.nil?
  13. begin
  14. mentioned_account = follow_remote_account_service.call(match.first.to_s)
  15. rescue Goldfinger::Error, HTTP::Error
  16. mentioned_account = nil
  17. end
  18. end
  19. next if mentioned_account.nil?
  20. mentioned_account.mentions.where(status: status).first_or_create(status: status)
  21. end
  22. status.mentions.each do |mention|
  23. mentioned_account = mention.account
  24. next if status.private_visibility? && !mentioned_account.following?(status.account)
  25. if mentioned_account.local?
  26. NotifyService.new.call(mentioned_account, mention)
  27. else
  28. NotificationWorker.perform_async(status.stream_entry.id, mentioned_account.id)
  29. end
  30. end
  31. end
  32. private
  33. def follow_remote_account_service
  34. @follow_remote_account_service ||= FollowRemoteAccountService.new
  35. end
  36. end