| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 01:37:26 +02:00
										 |  |  | class OStatus::AtomSerializer | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |   include RoutingHelper | 
					
						
							| 
									
										
										
										
											2017-04-22 03:33:24 +02:00
										 |  |  |   include ActionView::Helpers::SanitizeHelper | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   class << self | 
					
						
							|  |  |  |     def render(element) | 
					
						
							|  |  |  |       document = Ox::Document.new(version: '1.0') | 
					
						
							|  |  |  |       document << element | 
					
						
							| 
									
										
										
										
											2017-04-17 19:58:54 +02:00
										 |  |  |       ('<?xml version="1.0"?>' + Ox.dump(element, effort: :tolerant)).force_encoding('UTF-8') | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def author(account) | 
					
						
							|  |  |  |     author = Ox::Element.new('author') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     uri = OStatus::TagManager.instance.uri_for(account) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     append_element(author, 'id', uri) | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(author, 'activity:object-type', OStatus::TagManager::TYPES[:person]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(author, 'uri', uri) | 
					
						
							|  |  |  |     append_element(author, 'name', account.username) | 
					
						
							| 
									
										
										
										
											2017-04-10 16:58:06 -04:00
										 |  |  |     append_element(author, 'email', account.local? ? account.local_username_and_domain : account.acct) | 
					
						
							| 
									
										
										
										
											2017-04-22 03:33:24 +02:00
										 |  |  |     append_element(author, 'summary', Formatter.instance.simplified_format(account).to_str, type: :html) if account.note? | 
					
						
							| 
									
										
										
										
											2017-10-13 16:44:43 +02:00
										 |  |  |     append_element(author, 'link', nil, rel: :alternate, type: 'text/html', href: ::TagManager.instance.url_for(account)) | 
					
						
							| 
									
										
										
										
											2017-05-11 14:32:03 +02:00
										 |  |  |     append_element(author, 'link', nil, rel: :avatar, type: account.avatar_content_type, 'media:width': 120, 'media:height': 120, href: full_asset_url(account.avatar.url(:original))) if account.avatar? | 
					
						
							|  |  |  |     append_element(author, 'link', nil, rel: :header, type: account.header_content_type, 'media:width': 700, 'media:height': 335, href: full_asset_url(account.header.url(:original))) if account.header? | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(author, 'poco:preferredUsername', account.username) | 
					
						
							| 
									
										
										
										
											2017-04-12 12:24:18 -04:00
										 |  |  |     append_element(author, 'poco:displayName', account.display_name) if account.display_name? | 
					
						
							| 
									
										
										
										
											2017-04-22 03:33:24 +02:00
										 |  |  |     append_element(author, 'poco:note', account.local? ? account.note : strip_tags(account.note)) if account.note? | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(author, 'mastodon:scope', account.locked? ? :private : :public) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     author | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def feed(account, stream_entries) | 
					
						
							|  |  |  |     feed = Ox::Element.new('feed') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     add_namespaces(feed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     append_element(feed, 'id', account_url(account, format: 'atom')) | 
					
						
							| 
									
										
										
										
											2017-04-16 02:40:36 +02:00
										 |  |  |     append_element(feed, 'title', account.display_name.presence || account.username) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(feed, 'subtitle', account.note) | 
					
						
							|  |  |  |     append_element(feed, 'updated', account.updated_at.iso8601) | 
					
						
							|  |  |  |     append_element(feed, 'logo', full_asset_url(account.avatar.url(:original))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     feed << author(account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-13 16:44:43 +02:00
										 |  |  |     append_element(feed, 'link', nil, rel: :alternate, type: 'text/html', href: ::TagManager.instance.url_for(account)) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(feed, 'link', nil, rel: :self, type: 'application/atom+xml', href: account_url(account, format: 'atom')) | 
					
						
							|  |  |  |     append_element(feed, 'link', nil, rel: :next, type: 'application/atom+xml', href: account_url(account, format: 'atom', max_id: stream_entries.last.id)) if stream_entries.size == 20
 | 
					
						
							|  |  |  |     append_element(feed, 'link', nil, rel: :hub, href: api_push_url) | 
					
						
							|  |  |  |     append_element(feed, 'link', nil, rel: :salmon, href: api_salmon_url(account.id)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stream_entries.each do |stream_entry| | 
					
						
							|  |  |  |       feed << entry(stream_entry) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     feed | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def entry(stream_entry, root = false) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     add_namespaces(entry) if root | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.uri_for(stream_entry.status)) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'published', stream_entry.created_at.iso8601) | 
					
						
							|  |  |  |     append_element(entry, 'updated', stream_entry.updated_at.iso8601) | 
					
						
							| 
									
										
										
										
											2017-05-11 14:32:03 +02:00
										 |  |  |     append_element(entry, 'title', stream_entry&.status&.title || "#{stream_entry.account.acct} deleted status") | 
					
						
							| 
									
										
										
										
											2017-04-07 12:21:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     entry << author(stream_entry.account) if root | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[stream_entry.object_type]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[stream_entry.verb]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     entry << object(stream_entry.target) if stream_entry.targeted? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-11 14:32:03 +02:00
										 |  |  |     if stream_entry.status.nil? | 
					
						
							|  |  |  |       append_element(entry, 'content', 'Deleted status') | 
					
						
							| 
									
										
										
										
											2017-08-29 16:11:05 +02:00
										 |  |  |     elsif stream_entry.status.destroyed? | 
					
						
							|  |  |  |       append_element(entry, 'content', 'Deleted status') | 
					
						
							|  |  |  |       append_element(entry, 'link', nil, rel: :alternate, type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(stream_entry.status)) if stream_entry.account.local? | 
					
						
							| 
									
										
										
										
											2017-05-11 14:32:03 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |       serialize_status_attributes(entry, stream_entry.status) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-13 16:44:43 +02:00
										 |  |  |     append_element(entry, 'link', nil, rel: :alternate, type: 'text/html', href: ::TagManager.instance.url_for(stream_entry.status)) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'link', nil, rel: :self, type: 'application/atom+xml', href: account_stream_entry_url(stream_entry.account, stream_entry, format: 'atom')) | 
					
						
							| 
									
										
										
										
											2017-10-13 16:44:43 +02:00
										 |  |  |     append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(stream_entry.thread), href: ::TagManager.instance.url_for(stream_entry.thread)) if stream_entry.threaded? | 
					
						
							| 
									
										
										
										
											2017-05-12 19:09:21 +02:00
										 |  |  |     append_element(entry, 'ostatus:conversation', nil, ref: conversation_uri(stream_entry.status.conversation)) unless stream_entry&.status&.conversation_id.nil? | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def object(status) | 
					
						
							|  |  |  |     object = Ox::Element.new('activity:object') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(object, 'id', OStatus::TagManager.instance.uri_for(status)) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(object, 'published', status.created_at.iso8601) | 
					
						
							|  |  |  |     append_element(object, 'updated', status.updated_at.iso8601) | 
					
						
							|  |  |  |     append_element(object, 'title', status.title) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     object << author(status.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[status.object_type]) | 
					
						
							|  |  |  |     append_element(object, 'activity:verb', OStatus::TagManager::VERBS[status.verb]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     serialize_status_attributes(object, status) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-13 16:44:43 +02:00
										 |  |  |     append_element(object, 'link', nil, rel: :alternate, type: 'text/html', href: ::TagManager.instance.url_for(status)) | 
					
						
							|  |  |  |     append_element(object, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(status.thread), href: ::TagManager.instance.url_for(status.thread)) unless status.thread.nil? | 
					
						
							| 
									
										
										
										
											2017-05-12 19:09:21 +02:00
										 |  |  |     append_element(object, 'ostatus:conversation', nil, ref: conversation_uri(status.conversation)) unless status.conversation_id.nil? | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def follow_salmon(follow) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     description = "#{follow.account.acct} started following #{follow.target_account.acct}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(follow.created_at, follow.id, 'Follow')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', description) | 
					
						
							|  |  |  |     append_element(entry, 'content', description, type: :html) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(follow.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:follow]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object = author(follow.target_account) | 
					
						
							|  |  |  |     object.value = 'activity:object' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << object | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def follow_request_salmon(follow_request) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(follow_request.created_at, follow_request.id, 'FollowRequest')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', "#{follow_request.account.acct} requested to follow #{follow_request.target_account.acct}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(follow_request.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:request_friend]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object = author(follow_request.target_account) | 
					
						
							|  |  |  |     object.value = 'activity:object' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << object | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def authorize_follow_request_salmon(follow_request) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', "#{follow_request.target_account.acct} authorizes follow request by #{follow_request.account.acct}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(follow_request.target_account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:authorize]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object = Ox::Element.new('activity:object') | 
					
						
							|  |  |  |     object << author(follow_request.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(object, 'activity:verb', OStatus::TagManager::VERBS[:request_friend]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     inner_object = author(follow_request.target_account) | 
					
						
							|  |  |  |     inner_object.value = 'activity:object' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     object << inner_object | 
					
						
							|  |  |  |     entry  << object | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def reject_follow_request_salmon(follow_request) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', "#{follow_request.target_account.acct} rejects follow request by #{follow_request.account.acct}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(follow_request.target_account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:reject]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object = Ox::Element.new('activity:object') | 
					
						
							|  |  |  |     object << author(follow_request.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(object, 'activity:verb', OStatus::TagManager::VERBS[:request_friend]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     inner_object = author(follow_request.target_account) | 
					
						
							|  |  |  |     inner_object.value = 'activity:object' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     object << inner_object | 
					
						
							|  |  |  |     entry  << object | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def unfollow_salmon(follow) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     description = "#{follow.account.acct} is no longer following #{follow.target_account.acct}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow.id, 'Follow')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', description) | 
					
						
							|  |  |  |     append_element(entry, 'content', description, type: :html) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(follow.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unfollow]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object = author(follow.target_account) | 
					
						
							|  |  |  |     object.value = 'activity:object' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << object | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def block_salmon(block) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     description = "#{block.account.acct} no longer wishes to interact with #{block.target_account.acct}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', description) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(block.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:block]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object = author(block.target_account) | 
					
						
							|  |  |  |     object.value = 'activity:object' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << object | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def unblock_salmon(block) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     description = "#{block.account.acct} no longer blocks #{block.target_account.acct}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', description) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(block.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unblock]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     object = author(block.target_account) | 
					
						
							|  |  |  |     object.value = 'activity:object' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << object | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def favourite_salmon(favourite) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     description = "#{favourite.account.acct} favourited a status by #{favourite.status.account.acct}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(favourite.created_at, favourite.id, 'Favourite')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', description) | 
					
						
							|  |  |  |     append_element(entry, 'content', description, type: :html) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(favourite.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:favorite]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     entry << object(favourite.status) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-13 16:44:43 +02:00
										 |  |  |     append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(favourite.status), href: ::TagManager.instance.url_for(favourite.status)) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def unfavourite_salmon(favourite) | 
					
						
							|  |  |  |     entry = Ox::Element.new('entry') | 
					
						
							|  |  |  |     add_namespaces(entry) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     description = "#{favourite.account.acct} no longer favourites a status by #{favourite.status.account.acct}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, favourite.id, 'Favourite')) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     append_element(entry, 'title', description) | 
					
						
							|  |  |  |     append_element(entry, 'content', description, type: :html) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     entry << author(favourite.account) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity]) | 
					
						
							|  |  |  |     append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unfavorite]) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     entry << object(favourite.status) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-13 16:44:43 +02:00
										 |  |  |     append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(favourite.status), href: ::TagManager.instance.url_for(favourite.status)) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     entry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def append_element(parent, name, content = nil, attributes = {}) | 
					
						
							|  |  |  |     element = Ox::Element.new(name) | 
					
						
							| 
									
										
										
										
											2017-04-16 20:32:27 +02:00
										 |  |  |     attributes.each { |k, v| element[k] = sanitize_str(v) } | 
					
						
							|  |  |  |     element << sanitize_str(content) unless content.nil? | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     parent  << element | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 20:32:27 +02:00
										 |  |  |   def sanitize_str(raw_str) | 
					
						
							| 
									
										
										
										
											2017-04-17 19:58:54 +02:00
										 |  |  |     raw_str.to_s | 
					
						
							| 
									
										
										
										
											2017-04-16 20:32:27 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 19:09:21 +02:00
										 |  |  |   def conversation_uri(conversation) | 
					
						
							| 
									
										
										
										
											2017-05-31 14:38:17 -04:00
										 |  |  |     return conversation.uri if conversation.uri? | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     OStatus::TagManager.instance.unique_tag(conversation.created_at, conversation.id, 'Conversation') | 
					
						
							| 
									
										
										
										
											2017-05-12 19:09:21 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |   def add_namespaces(parent) | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     parent['xmlns']          = OStatus::TagManager::XMLNS | 
					
						
							|  |  |  |     parent['xmlns:thr']      = OStatus::TagManager::THR_XMLNS | 
					
						
							|  |  |  |     parent['xmlns:activity'] = OStatus::TagManager::AS_XMLNS | 
					
						
							|  |  |  |     parent['xmlns:poco']     = OStatus::TagManager::POCO_XMLNS | 
					
						
							|  |  |  |     parent['xmlns:media']    = OStatus::TagManager::MEDIA_XMLNS | 
					
						
							|  |  |  |     parent['xmlns:ostatus']  = OStatus::TagManager::OS_XMLNS | 
					
						
							|  |  |  |     parent['xmlns:mastodon'] = OStatus::TagManager::MTDN_XMLNS | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def serialize_status_attributes(entry, status) | 
					
						
							| 
									
										
										
										
											2017-08-18 01:03:18 +02:00
										 |  |  |     append_element(entry, 'link', nil, rel: :alternate, type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(status)) if status.account.local? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 22:03:43 -04:00
										 |  |  |     append_element(entry, 'summary', status.spoiler_text, 'xml:lang': status.language) if status.spoiler_text? | 
					
						
							| 
									
										
										
										
											2017-05-12 17:46:44 +02:00
										 |  |  |     append_element(entry, 'content', Formatter.instance.format(status).to_str, type: 'html', 'xml:lang': status.language) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     status.mentions.each do |mentioned| | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |       append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:person], href: OStatus::TagManager.instance.uri_for(mentioned.account)) | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-20 01:08:08 +09:00
										 |  |  |     append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:collection], href: OStatus::TagManager::COLLECTIONS[:public]) if status.public_visibility? | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     status.tags.each do |tag| | 
					
						
							|  |  |  |       append_element(entry, 'category', nil, term: tag.name) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     append_element(entry, 'category', nil, term: 'nsfw') if status.sensitive? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     status.media_attachments.each do |media| | 
					
						
							|  |  |  |       append_element(entry, 'link', nil, rel: :enclosure, type: media.file_content_type, length: media.file_file_size, href: full_asset_url(media.file.url(:original, false))) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     append_element(entry, 'mastodon:scope', status.visibility) | 
					
						
							| 
									
										
										
										
											2017-09-19 02:42:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     status.emojis.each do |emoji| | 
					
						
							|  |  |  |       append_element(entry, 'link', nil, rel: :emoji, href: full_asset_url(emoji.image.url), name: emoji.shortcode) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-04-07 05:56:56 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | end |