2016-11-15 16:56:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# frozen_string_literal: true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-17 17:56:23 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								class  Status  <  ApplicationRecord 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 23:54:26 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  include  ActiveModel :: Validations 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-24 13:21:53 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  include  Paginable 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 02:13:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  include  Streamable 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-30 15:57:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  include  Cacheable 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-24 13:21:53 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-15 22:52:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  enum  visibility :  [ :public ,  :unlisted ,  :private ,  :direct ] ,  _suffix :  :visibility 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-30 21:32:11 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 08:58:50 +11:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  belongs_to  :application ,  class_name :  'Doorkeeper::Application' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-22 23:18:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  belongs_to  :account ,  inverse_of :  :statuses 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-31 14:35:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  belongs_to  :in_reply_to_account ,  foreign_key :  'in_reply_to_account_id' ,  class_name :  'Account' 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-22 16:00:20 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-06 12:34:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  belongs_to  :thread ,  foreign_key :  'in_reply_to_id' ,  class_name :  'Status' ,  inverse_of :  :replies 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 17:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  belongs_to  :reblog ,  foreign_key :  'reblog_of_id' ,  class_name :  'Status' ,  inverse_of :  :reblogs 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-24 12:57:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_many  :favourites ,  inverse_of :  :status ,  dependent :  :destroy 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-16 10:46:15 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_many  :reblogs ,  foreign_key :  'reblog_of_id' ,  class_name :  'Status' ,  inverse_of :  :reblog ,  dependent :  :destroy 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-06 12:34:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_many  :replies ,  foreign_key :  'in_reply_to_id' ,  class_name :  'Status' ,  inverse_of :  :thread 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 02:13:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_many  :mentions ,  dependent :  :destroy 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-05 17:46:36 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_many  :media_attachments ,  dependent :  :destroy 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-05 15:20:05 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_and_belongs_to_many  :tags 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-21 14:59:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_one  :notification ,  as :  :activity ,  dependent :  :destroy 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-20 01:00:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  has_one  :preview_card ,  dependent :  :destroy 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-21 14:59:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-22 18:10:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  validates  :account ,  presence :  true 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  validates  :uri ,  uniqueness :  true ,  unless :  'local?' 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-25 00:49:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  validates  :text ,  presence :  true ,  unless :  'reblog?' 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 23:54:26 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  validates_with  StatusLengthValidator 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-02 15:33:24 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  validates  :reblog ,  uniqueness :  {  scope :  :account ,  message :  'of status already exists'  } ,  if :  'reblog?' 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-10-09 15:15:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  default_scope  {  order ( 'id desc' )  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-02 14:14:49 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  scope  :remote ,  - >  {  where . not ( uri :  nil )  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  scope  :local ,  - >  {  where ( uri :  nil )  } 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-30 15:57:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  scope  :without_replies ,  - >  {  where ( 'statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id' )  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  scope  :without_reblogs ,  - >  {  where ( 'statuses.reblog_of_id IS NULL' )  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 14:01:33 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  cache_associated  :account ,  :application ,  :media_attachments ,  :tags ,  :stream_entry ,  mentions :  :account ,  reblog :  [ :account ,  :application ,  :stream_entry ,  :tags ,  :media_attachments ,  mentions :  :account ] ,  thread :  :account 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-11 16:47:36 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-09 20:25:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  def  reply? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    super  ||  ! in_reply_to_id . nil? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  def  local? 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-29 21:28:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    uri . nil? 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  def  reblog? 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-29 21:28:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ! reblog_of_id . nil? 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-22 18:10:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  def  verb 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    reblog?  ?  :share  :  :post 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-22 18:10:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  def  object_type 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    reply?  ?  :comment  :  :note 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-22 18:10:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  def  content 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-29 21:28:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    reblog?  ?  reblog . text  :  text 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-23 19:17:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  def  target 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-29 21:28:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    reblog 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-22 18:10:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  def  title 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-21 10:31:20 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    content 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-22 18:10:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-21 20:00:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  def  hidden? 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-15 22:52:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    private_visibility?  ||  direct_visibility? 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 16:09:46 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-21 20:00:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  def  permitted? ( other_account  =  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-15 22:52:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  direct_visibility? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      account . id  ==  other_account & . id  ||  mentions . where ( account :  other_account ) . exists? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    elsif  private_visibility? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      account . id  ==  other_account & . id  ||  other_account & . following? ( account )  ||  mentions . where ( account :  other_account ) . exists? 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-11 15:10:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      other_account . nil?  ||  ! account . blocking? ( other_account ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 16:09:46 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-15 17:33:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  def  ancestors ( account  =  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-29 21:28:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ids       =  ( Status . find_by_sql ( [ 'WITH RECURSIVE search_tree(id, in_reply_to_id, path) AS (SELECT id, in_reply_to_id, ARRAY[id] FROM statuses WHERE id = ? UNION ALL SELECT statuses.id, statuses.in_reply_to_id, path || statuses.id FROM search_tree JOIN statuses ON statuses.id = search_tree.in_reply_to_id WHERE NOT statuses.id = ANY(path)) SELECT id FROM search_tree ORDER BY path DESC' ,  id ] )  -  [ self ] ) . pluck ( :id ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 17:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    statuses  =  Status . where ( id :  ids ) . group_by ( & :id ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-15 17:33:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    results   =  ids . map  {  | id |  statuses [ id ] . first  } 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-21 20:00:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    results   =  results . reject  {  | status |  filter_from_context? ( status ,  account )  } 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-21 23:18:28 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-15 17:33:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    results 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-21 11:43:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-15 17:33:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  def  descendants ( account  =  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-29 21:28:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ids       =  ( Status . find_by_sql ( [ 'WITH RECURSIVE search_tree(id, path) AS (SELECT id, ARRAY[id] FROM statuses WHERE id = ? UNION ALL SELECT statuses.id, path || statuses.id FROM search_tree JOIN statuses ON statuses.in_reply_to_id = search_tree.id WHERE NOT statuses.id = ANY(path)) SELECT id FROM search_tree ORDER BY path' ,  id ] )  -  [ self ] ) . pluck ( :id ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 17:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    statuses  =  Status . where ( id :  ids ) . group_by ( & :id ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-15 17:33:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    results   =  ids . map  {  | id |  statuses [ id ] . first  } 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-21 20:00:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    results   =  results . reject  {  | status |  filter_from_context? ( status ,  account )  } 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-21 23:18:28 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-15 17:33:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    results 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-21 11:43:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-05 15:20:05 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  class  <<  self 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  as_home_timeline ( account ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-02 18:49:32 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      where ( account :  [ account ]  +  account . following ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-05 15:20:05 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:16:20 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  as_public_timeline ( account  =  nil ,  local_only  =  false ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-26 15:45:35 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      query  =  joins ( 'LEFT OUTER JOIN accounts ON statuses.account_id = accounts.id' ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-30 21:32:11 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								              . where ( visibility :  :public ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								              . without_replies 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								              . without_reblogs 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-05 22:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:16:20 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      query  =  query . where ( 'accounts.domain IS NULL' )  if  local_only 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-06 00:24:33 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      account . nil?  ?  filter_timeline_default ( query )  :  filter_timeline_default ( filter_timeline ( query ,  account ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-05 15:20:05 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:16:20 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  as_tag_timeline ( tag ,  account  =  nil ,  local_only  =  false ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-08 23:22:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      query  =  tag . statuses 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-15 16:56:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                 . joins ( 'LEFT OUTER JOIN accounts ON statuses.account_id = accounts.id' ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-30 21:32:11 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                 . where ( visibility :  :public ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                 . without_reblogs 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-05 22:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:16:20 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      query  =  query . where ( 'accounts.domain IS NULL' )  if  local_only 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-06 00:24:33 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      account . nil?  ?  filter_timeline_default ( query )  :  filter_timeline_default ( filter_timeline ( query ,  account ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-05 15:20:05 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  favourites_map ( status_ids ,  account_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      Favourite . select ( 'status_id' ) . where ( status_id :  status_ids ) . where ( account_id :  account_id ) . map  {  | f |  [ f . status_id ,  true ]  } . to_h 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  reblogs_map ( status_ids ,  account_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      select ( 'reblog_of_id' ) . where ( reblog_of_id :  status_ids ) . where ( account_id :  account_id ) . map  {  | s |  [ s . reblog_of_id ,  true ]  } . to_h 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-10 00:03:33 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-03 18:21:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  reload_stale_associations! ( cached_items ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      account_ids  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      cached_items . each  do  | item | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        account_ids  <<  item . account_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        account_ids  <<  item . reblog . account_id  if  item . reblog? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      accounts  =  Account . where ( id :  account_ids . uniq ) . map  {  | a |  [ a . id ,  a ]  } . to_h 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      cached_items . each  do  | item | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        item . account  =  accounts [ item . account_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        item . reblog . account  =  accounts [ item . reblog . account_id ]  if  item . reblog? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-26 19:13:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  permitted_for ( target_account ,  account ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-15 22:52:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      return  where . not ( visibility :  [ :private ,  :direct ] )  if  account . nil? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      if  target_account . blocking? ( account )  # get rid of blocked peeps 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-26 19:13:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        where ( '1 = 0' ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-15 22:52:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      elsif  account . id  ==  target_account . id  # author can see own stuff 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        where ( '1 = 1' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      elsif  account . following? ( target_account )  # followers can see followers-only stuff, but also things they are mentioned in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        joins ( 'LEFT OUTER JOIN mentions ON statuses.id = mentions.status_id AND mentions.account_id = '  +  account . id . to_s ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          . where ( 'statuses.visibility != ? OR mentions.id IS NOT NULL' ,  Status . visibilities [ :direct ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      else  # non-followers can see everything that isn't private/direct, but can see stuff they are mentioned in 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-11 19:16:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        joins ( 'LEFT OUTER JOIN mentions ON statuses.id = mentions.status_id AND mentions.account_id = '  +  account . id . to_s ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-15 22:52:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								          . where ( 'statuses.visibility NOT IN (?) OR mentions.id IS NOT NULL' ,  [ Status . visibilities [ :direct ] ,  Status . visibilities [ :private ] ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-26 19:13:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-10 00:03:33 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    private 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  filter_timeline ( query ,  account ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-02 18:49:32 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      blocked  =  Block . where ( account :  account ) . pluck ( :target_account_id )  +  Block . where ( target_account :  account ) . pluck ( :account_id )  +  Mute . where ( account :  account ) . pluck ( :target_account_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      query    =  query . where ( 'statuses.account_id NOT IN (?)' ,  blocked )  unless  blocked . empty?   # Only give us statuses from people we haven't blocked, or muted, or that have blocked us 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 19:51:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      query    =  query . where ( 'accounts.silenced = TRUE' )  if  account . silenced?                   # and if we're hellbanned, only people who are also hellbanned 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-05 22:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      query 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  filter_timeline_default ( query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      query . where ( 'accounts.silenced = FALSE' ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-10 00:03:33 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 21:23:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-22 21:39:53 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  before_validation  do 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-29 21:28:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    text . strip! 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-25 00:49:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    spoiler_text & . strip! 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-31 14:35:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-09 21:22:49 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    self . reply                   =  ! ( in_reply_to_id . nil?  &&  thread . nil? )  unless  reply 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-31 14:35:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    self . reblog                  =  reblog . reblog  if  reblog?  &&  reblog . reblog? 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-09 20:25:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    self . in_reply_to_account_id  =  ( thread . account_id  ==  account_id  &&  thread . reply?  ?  thread . in_reply_to_account_id  :  thread . account_id )  if  reply?  &&  ! thread . nil? 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-22 23:03:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    self . visibility              =  ( account . locked?  ?  :private  :  :public )  if  visibility . nil? 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-21 20:00:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  private 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  def  filter_from_context? ( status ,  account ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 19:51:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    account & . blocking? ( status . account_id )  ||  account & . muting? ( status . account_id )  ||  ( status . account . silenced?  &&  ! account & . following? ( status . account_id ) )  ||  ! status . permitted? ( account ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-22 21:39:53 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  end 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-20 22:53:20 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								end