about summary refs log tree commit diff
path: root/app/services
diff options
context:
space:
mode:
Diffstat (limited to 'app/services')
-rw-r--r--app/services/follow_remote_account_service.rb33
-rw-r--r--app/services/follow_service.rb2
2 files changed, 28 insertions, 7 deletions
diff --git a/app/services/follow_remote_account_service.rb b/app/services/follow_remote_account_service.rb
index 41f8fa4a0..bd3c760d7 100644
--- a/app/services/follow_remote_account_service.rb
+++ b/app/services/follow_remote_account_service.rb
@@ -5,10 +5,13 @@ class FollowRemoteAccountService
     username, domain = uri.split('@')
     account = Account.where(username: username, domain: domain).first
 
-    return account unless account.nil?
+    if account.nil?
+      account = Account.new(username: username, domain: domain)
+    elsif account.subscribed?
+      return account
+    end
 
-    account = Account.new(username: username, domain: domain)
-    data    = Goldfinger.finger("acct:#{uri}")
+    data = Goldfinger.finger("acct:#{uri}")
 
     account.remote_url  = data.link('http://schemas.google.com/g/2010#updates-from').href
     account.salmon_url  = data.link('salmon').href
@@ -21,16 +24,20 @@ class FollowRemoteAccountService
     feed = get_feed(account.remote_url)
     hubs = feed.xpath('//xmlns:link[@rel="hub"]')
 
-    return false if hubs.empty? || hubs.first.attribute('href').nil? || feed.at_xpath('/xmlns:author/xmlns:uri').nil?
+    return nil if hubs.empty? || hubs.first.attribute('href').nil? || feed.at_xpath('/xmlns:feed/xmlns:author/xmlns:uri').nil?
 
-    account.uri     = feed.at_xpath('/xmlns:author/xmlns:uri').content
+    account.uri     = feed.at_xpath('/xmlns:feed/xmlns:author/xmlns:uri').content
     account.hub_url = hubs.first.attribute('href').value
+
+    get_profile(feed, account)
     account.save!
 
     subscription = account.subscription(subscription_url(account))
     subscription.subscribe
+
+    return account
   rescue Goldfinger::Error, HTTP::Error => e
-    false
+    nil
   end
 
   private
@@ -40,6 +47,20 @@ class FollowRemoteAccountService
     Nokogiri::XML(response)
   end
 
+  def get_profile(xml, account)
+    author = xml.at_xpath('/xmlns:feed/xmlns:author')
+
+    if author.at_xpath('./poco:displayName').nil?
+      account.display_name = account.username
+    else
+      account.display_name = author.at_xpath('./poco:displayName').content
+    end
+
+    unless author.at_xpath('./poco:note').nil?
+      account.note = author.at_xpath('./poco:note').content
+    end
+  end
+
   def magic_key_to_pem(magic_key)
     _, modulus, exponent = magic_key.split('.')
     modulus, exponent = [modulus, exponent].map { |n| Base64.urlsafe_decode64(n).bytes.inject(0) { |num, byte| (num << 8) | byte } }
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb
index fc606730b..ea868b544 100644
--- a/app/services/follow_service.rb
+++ b/app/services/follow_service.rb
@@ -1,7 +1,7 @@
 class FollowService
   def call(source_account, uri)
     target_account = follow_remote_account_service.(uri)
-    source_account.follow!(target_account)
+    source_account.follow!(target_account) unless target_account.nil?
   end
 
   private