From 11ff92c9d7b27c2c9ed86f649aef8d956cc8b989 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 28 Feb 2016 21:22:56 +0100 Subject: Adding a test for ReblogService, fixing mentions for remote statuses --- app/services/process_feed_service.rb | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) (limited to 'app/services/process_feed_service.rb') 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 -- cgit