|
|
|
@ -5,7 +5,7 @@ class ProcessInteractionService |
|
|
|
|
body = salmon.unpack(envelope) |
|
|
|
|
xml = Nokogiri::XML(body) |
|
|
|
|
|
|
|
|
|
return unless involves_target_account?(xml, target_account) && contains_author?(xml) |
|
|
|
|
return unless contains_author?(xml) |
|
|
|
|
|
|
|
|
|
username = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name').content |
|
|
|
|
url = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri').content |
|
|
|
@ -18,17 +18,17 @@ class ProcessInteractionService |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
if salmon.verify(envelope, account.keypair) |
|
|
|
|
case get_verb(xml) |
|
|
|
|
case verb(xml) |
|
|
|
|
when :follow |
|
|
|
|
account.follow!(target_account) |
|
|
|
|
follow!(account, target_account) |
|
|
|
|
when :unfollow |
|
|
|
|
account.unfollow!(target_account) |
|
|
|
|
unfollow!(account, target_account) |
|
|
|
|
when :favorite |
|
|
|
|
# todo: a favourite |
|
|
|
|
favourite!(xml, account) |
|
|
|
|
when :post |
|
|
|
|
# todo: a reply |
|
|
|
|
add_post!(body, account) if mentions_account?(xml, target_account) |
|
|
|
|
when :share |
|
|
|
|
# todo: a reblog |
|
|
|
|
add_post!(body, account) unless status.nil? |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
@ -39,26 +39,37 @@ class ProcessInteractionService |
|
|
|
|
!(xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name').nil? || xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri').nil?) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def involves_target_account?(xml, account) |
|
|
|
|
targeted_at_account?(xml, account) || mentions_account?(xml, account) |
|
|
|
|
def mentions_account?(xml, account) |
|
|
|
|
xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]').each { |mention_link| return true if mention_link.attribute('ref') == profile_url(name: account.username) } |
|
|
|
|
false |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def targeted_at_account?(xml, account) |
|
|
|
|
target_id = xml.at_xpath('/xmlns:entry/activity:object/xmlns:id') |
|
|
|
|
!target_id.nil? && target_id.content == profile_url(name: account.username) |
|
|
|
|
def verb(xml) |
|
|
|
|
xml.at_xpath('//activity:verb').content.gsub('http://activitystrea.ms/schema/1.0/', '').to_sym |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def mentions_account?(xml, account) |
|
|
|
|
xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]').each do |mention_link| |
|
|
|
|
return true if mention_link.attribute('ref') == profile_url(name: account.username) |
|
|
|
|
end |
|
|
|
|
def follow!(account, target_account) |
|
|
|
|
account.follow!(target_account) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
false |
|
|
|
|
def unfollow!(account, target_account) |
|
|
|
|
account.unfollow!(target_account) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def favourite!(xml, from_account) |
|
|
|
|
status.favourites.first_or_create!(account: from_account) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def add_post!(body, account) |
|
|
|
|
process_feed_service.(body, account) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def get_verb(xml) |
|
|
|
|
verb = xml.at_xpath('//activity:verb').content.gsub 'http://activitystrea.ms/schema/1.0/', '' |
|
|
|
|
verb.to_sym |
|
|
|
|
def status(xml) |
|
|
|
|
Status.find(unique_tag_to_local_id(activity_id, 'Status')) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def activity_id(xml) |
|
|
|
|
xml.at_xpath('/xmlns:entry/xmlns:id').content |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def salmon |
|
|
|
@ -68,4 +79,8 @@ class ProcessInteractionService |
|
|
|
|
def follow_remote_account_service |
|
|
|
|
FollowRemoteAccountService.new |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def process_feed_service |
|
|
|
|
ProcessFeedService.new |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|