Skip to content
Snippets Groups Projects
Commit 79baf2fd authored by Eugen Rochko's avatar Eugen Rochko
Browse files

Process favourites, reblogs and replies from Salmon

parent ee73d35e
No related branches found
No related tags found
No related merge requests found
......@@ -5,6 +5,11 @@ module ApplicationHelper
"tag:#{LOCAL_DOMAIN},#{date.strftime('%Y-%m-%d')}:objectId=#{id}:objectType=#{type}"
end
def unique_tag_to_local_id(tag, expected_type)
Regexp.new("objectId=([\d]+):objectType=#{expected_type}").match(tag)
return match[1] unless match.nil?
end
def subscription_url(account)
add_base_url_prefix subscriptions_path(id: account.id, format: '')
end
......
......@@ -15,7 +15,7 @@ class Account < ActiveRecord::Base
has_many :followers, through: :passive_relationships, source: :account
def follow!(other_account)
self.active_relationships.create!(target_account: other_account)
self.active_relationships.first_or_create!(target_account: other_account)
end
def unfollow!(other_account)
......
......@@ -18,6 +18,7 @@ class ProcessFeedService
# todo: not everything is a status. there are follows, favourites
# todo: RTs
# account.statuses.create!(reblog: status, uri: activity_uri(xml), url: activity_url(xml), text: content(xml))
end
end
end
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment