diff options
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/process_feed_service.rb | 36 | ||||
-rw-r--r-- | app/services/process_mentions_service.rb | 12 |
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| |