diff options
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/follow_remote_account_service.rb | 33 | ||||
-rw-r--r-- | app/services/follow_service.rb | 2 |
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 |