about summary refs log tree commit diff
path: root/app/services/process_feed_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/process_feed_service.rb')
-rw-r--r--app/services/process_feed_service.rb42
1 files changed, 27 insertions, 15 deletions
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb
index 1aaf85d94..703938b46 100644
--- a/app/services/process_feed_service.rb
+++ b/app/services/process_feed_service.rb
@@ -32,12 +32,17 @@ class ProcessFeedService < BaseService
 
   def add_reblog!(entry, status)
     status.reblog = find_original_status(entry, target_id(entry))
+
+    if status.reblog.nil?
+      status.reblog = fetch_remote_status(entry)
+    end
+
     status.save! unless status.reblog.nil?
   end
 
   def add_reply!(entry, status)
     status.thread = find_original_status(entry, thread_id(entry))
-    status.save! unless status.thread.nil?
+    status.save!
   end
 
   def find_original_status(xml, id)
@@ -46,23 +51,22 @@ class ProcessFeedService < BaseService
     if local_id?(id)
       Status.find(unique_tag_to_local_id(id, 'Status'))
     else
-      status = Status.find_by(uri: id)
-
-      if status.nil?
-        status = fetch_remote_status(xml, id)
-      end
-
-      status
+      Status.find_by(uri: id)
     end
   end
 
-  def fetch_remote_status(xml, id)
-    url = xml.at_xpath('./link[@rel="self"]').attribute('href').value
-    nil
-  end
+  def fetch_remote_status(xml)
+    username = xml.at_xpath('./activity:object/xmlns:author/xmlns:name').content
+    url      = xml.at_xpath('./activity:object/xmlns:author/xmlns:uri').content
+    domain   = Addressable::URI.parse(url).host
+    account  = Account.find_by(username: username, domain: domain)
+
+    if account.nil?
+      account = follow_remote_account_service.("acct:#{username}@#{domain}", false)
+      return nil if account.nil?
+    end
 
-  def local_id?(id)
-    id.start_with?("tag:#{LOCAL_DOMAIN}")
+    Status.new(account: account, uri: target_id(xml), text: target_content(xml), url: target_url(xml))
   end
 
   def published(xml)
@@ -84,7 +88,7 @@ class ProcessFeedService < BaseService
   end
 
   def target_id(xml)
-    xml.at_xpath('./activity:object/xmlns:id').content
+    xml.at_xpath('.//activity:object/xmlns:id').content
   rescue
     nil
   end
@@ -93,6 +97,14 @@ class ProcessFeedService < BaseService
     entry.at_xpath('./xmlns:id').content
   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
+  end
+
   def object_type(xml)
     xml.at_xpath('./activity:object-type').content.gsub('http://activitystrea.ms/schema/1.0/', '').to_sym
   rescue