about summary refs log tree commit diff
path: root/app/services
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-02-28 21:22:56 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-02-28 21:22:56 +0100
commit11ff92c9d7b27c2c9ed86f649aef8d956cc8b989 (patch)
treea6294bad9352e6f2e181388a33a4b45dcda53319 /app/services
parent47d50b0e3967f1d396bdbe8ea3e8909ce2be599f (diff)
Adding a test for ReblogService, fixing mentions for remote statuses
Diffstat (limited to 'app/services')
-rw-r--r--app/services/process_feed_service.rb36
-rw-r--r--app/services/process_mentions_service.rb12
2 files changed, 36 insertions, 12 deletions
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb
index 146869552..f6584bbda 100644
--- a/app/services/process_feed_service.rb
+++ b/app/services/process_feed_service.rb
@@ -5,10 +5,12 @@ class ProcessFeedService < BaseService
   def call(body, account)
     xml = Nokogiri::XML(body)
 
+    # If we got a full feed, make sure the account's profile is up to date
     unless xml.at_xpath('/xmlns:feed').nil?
       update_remote_profile_service.(xml.at_xpath('/xmlns:feed/xmlns:author'), account)
     end
 
+    # Process entries
     xml.xpath('//xmlns:entry').each do |entry|
       next unless [:note, :comment, :activity].include? object_type(entry)
 
@@ -16,7 +18,7 @@ class ProcessFeedService < BaseService
 
       next unless status.nil?
 
-      status = Status.new(uri: activity_id(entry), account: account, text: content(entry), created_at: published(entry), updated_at: updated(entry))
+      status = Status.new(uri: activity_id(entry), url: activity_link(entry), account: account, text: content(entry), created_at: published(entry), updated_at: updated(entry))
 
       if object_type(entry) == :comment
         add_reply!(entry, status)
@@ -26,7 +28,25 @@ class ProcessFeedService < BaseService
         add_post!(entry, status)
       end
 
-      process_mentions_service.(status) unless status.new_record?
+      # If we added a status, go through accounts it mentions and create respective relations
+      unless status.new_record?
+        entry.xpath('./xmlns:link[@rel="mentioned"]').each do |mention_link|
+          # Here we have to do a reverse lookup of local accounts by their URL!
+          # It's not pretty at all! I really wish all these protocols sticked to
+          # using acct:username@domain only! It would make things so much easier
+          # and tidier
+
+          href = Addressable::URI.parse(mention_link.attribute('href').value)
+
+          if href.host == LOCAL_DOMAIN
+            mentioned_account = Account.find_by(username: href.path.gsub('/users/', ''), domain: nil)
+
+            unless mentioned_account.nil?
+              mentioned_account.mentions.first_or_create(status: status)
+            end
+          end
+        end
+      end
     end
   end
 
@@ -103,12 +123,18 @@ class ProcessFeedService < BaseService
     xml.at_xpath('./xmlns:id').content
   end
 
+  def activity_link(xml)
+    xml.at_xpath('./xmlns:link[@rel="alternate"]').attribute('href').value
+  rescue
+    ''
+  end
+
   def target_content(xml)
     xml.at_xpath('.//activity:object/xmlns:content').content
   end
 
   def target_url(xml)
-    xml.at_xpath('.//activity:object/xmlns:link[@rel=alternate]').attribute('href').value
+    xml.at_xpath('.//activity:object/xmlns:link[@rel="alternate"]').attribute('href').value
   end
 
   def object_type(xml)
@@ -127,10 +153,6 @@ class ProcessFeedService < BaseService
     @follow_remote_account_service ||= FollowRemoteAccountService.new
   end
 
-  def process_mentions_service
-    @process_mentions_service ||= ProcessMentionsService.new
-  end
-
   def update_remote_profile_service
     @update_remote_profile_service ||= UpdateRemoteProfileService.new
   end
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index 93866666a..e1fc2f038 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -4,15 +4,17 @@ class ProcessMentionsService < BaseService
   # remote users
   # @param [Status] status
   def call(status)
+    return unless status.local?
+
     status.text.scan(Account::MENTION_RE).each do |match|
-      username, domain = match.first.split('@')
-      local_account = Account.find_by(username: username, domain: domain)
+      username, domain  = match.first.split('@')
+      mentioned_account = Account.find_by(username: username, domain: domain)
 
-      if local_account.nil?
-        local_account = follow_remote_account_service.("acct:#{match.first}")
+      if mentioned_account.nil?
+        mentioned_account = follow_remote_account_service.("acct:#{match.first}")
       end
 
-      local_account.mentions.first_or_create(status: status)
+      mentioned_account.mentions.first_or_create(status: status)
     end
 
     status.mentions.each do |mentioned_account|