Adding a test for ReblogService, fixing mentions for remote statuses
This commit is contained in:
@ -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
|
||||
|
@ -4,15 +4,17 @@ class ProcessMentionsService < BaseService
|
||||
# remote users
|
||||
# @param [Status] status
|
||||
def call(status)
|
||||
status.text.scan(Account::MENTION_RE).each do |match|
|
||||
username, domain = match.first.split('@')
|
||||
local_account = Account.find_by(username: username, domain: domain)
|
||||
return unless status.local?
|
||||
|
||||
if local_account.nil?
|
||||
local_account = follow_remote_account_service.("acct:#{match.first}")
|
||||
status.text.scan(Account::MENTION_RE).each do |match|
|
||||
username, domain = match.first.split('@')
|
||||
mentioned_account = Account.find_by(username: username, domain: domain)
|
||||
|
||||
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|
|
||||
|
Reference in New Issue
Block a user