Skip to content
Extraits de code Groupes Projets
process_interaction_service.rb 3,2 ko
Newer Older
  • Learn to ignore specific revisions
  • Eugen Rochko's avatar
    Eugen Rochko a validé
    class ProcessInteractionService < BaseService
      # Record locally the remote interaction with our user
      # @param [String] envelope Salmon envelope
      # @param [Account] target_account Account the Salmon was addressed to
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
      def call(envelope, target_account)
        body = salmon.unpack(envelope)
        xml  = Nokogiri::XML(body)
    
    
        return unless contains_author?(xml)
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
    
    
        username = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name').content
        url      = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri').content
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
        domain   = Addressable::URI.parse(url).host
        account  = Account.find_by(username: username, domain: domain)
    
        if account.nil?
    
          account = follow_remote_account_service.("#{username}@#{domain}", false)
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
        end
    
        if salmon.verify(envelope, account.keypair)
    
          update_remote_profile_service.(xml.at_xpath('/xmlns:entry/xmlns:author'), account)
    
    
            follow!(account, target_account)
    
            unfollow!(account, target_account)
    
            favourite!(xml, account)
    
            add_post!(body, account) if mentions_account?(xml, target_account)
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
            add_post!(body, account) unless status(xml).nil?
    
          when :delete
            delete_post!(xml, account)
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
          end
        end
      end
    
      private
    
    
      def contains_author?(xml)
        !(xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name').nil? || xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri').nil?)
      end
    
    
      def mentions_account?(xml, account)
    
        xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]').each { |mention_link| return true if mention_link.attribute('href').value == TagManager.instance.url_for(account) }
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
        xml.at_xpath('//activity:verb').content.gsub('http://activitystrea.ms/schema/1.0/', '').gsub('http://ostatus.org/schema/1.0/', '').to_sym
    
      def follow!(account, target_account)
        account.follow!(target_account)
    
        NotificationMailer.follow(target_account, account).deliver_later
    
      def unfollow!(account, target_account)
        account.unfollow!(target_account)
      end
    
    
      def delete_post!(xml, account)
        status = Status.find(activity_id(xml))
    
        return if status.nil?
    
        if account.id == status.account_id
          RemoveStatusService.new.(status)
        end
      end
    
    
      def favourite!(xml, from_account)
    
        current_status = status(xml)
        current_status.favourites.where(account: from_account).first_or_create!(account: from_account)
        NotificationMailer.favourite(current_status, from_account).deliver_later
    
      end
    
      def add_post!(body, account)
        process_feed_service.(body, account)
    
        Status.find(TagManager.instance.unique_tag_to_local_id(activity_id(xml), 'Status'))
    
        xml.at_xpath('//activity:object/xmlns:id').content
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
      def salmon
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
        @salmon ||= OStatus2::Salmon.new
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
      end
    
      def follow_remote_account_service
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
        @follow_remote_account_service ||= FollowRemoteAccountService.new
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
      end
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
        @process_feed_service ||= ProcessFeedService.new
    
    
      def update_remote_profile_service
        @update_remote_profile_service ||= UpdateRemoteProfileService.new
      end
    
    Eugen Rochko's avatar
    Eugen Rochko a validé
    end