Process favourites, reblogs and replies from Salmon
This commit is contained in:
		| @@ -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) | ||||
|   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) | ||||
|   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 | ||||
|  | ||||
|     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 get_verb(xml) | ||||
|     verb = xml.at_xpath('//activity:verb').content.gsub 'http://activitystrea.ms/schema/1.0/', '' | ||||
|     verb.to_sym | ||||
|   def verb(xml) | ||||
|     xml.at_xpath('//activity:verb').content.gsub('http://activitystrea.ms/schema/1.0/', '').to_sym | ||||
|   end | ||||
|  | ||||
|   def follow!(account, target_account) | ||||
|     account.follow!(target_account) | ||||
|   end | ||||
|  | ||||
|   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 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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user