Public and hashtag timelines now exclude reblogs and replies
Fix #289 - don't download avatar unless the URL is http/https Fix #293 - reblog/reblogged is now boost/boosted
This commit is contained in:
		
							parent
							
								
									054138797f
								
							
						
					
					
						commit
						8a4913fde0
					
				
					 4 changed files with 19 additions and 13 deletions
				
			
		| 
						 | 
					@ -5,9 +5,9 @@ const en = {
 | 
				
			||||||
  "status.mention": "Mention",
 | 
					  "status.mention": "Mention",
 | 
				
			||||||
  "status.delete": "Delete",
 | 
					  "status.delete": "Delete",
 | 
				
			||||||
  "status.reply": "Reply",
 | 
					  "status.reply": "Reply",
 | 
				
			||||||
  "status.reblog": "Reblog",
 | 
					  "status.reblog": "Boost",
 | 
				
			||||||
  "status.favourite": "Favourite",
 | 
					  "status.favourite": "Favourite",
 | 
				
			||||||
  "status.reblogged_by": "{name} reblogged",
 | 
					  "status.reblogged_by": "{name} boosted",
 | 
				
			||||||
  "status.sensitive_warning": "Sensitive content",
 | 
					  "status.sensitive_warning": "Sensitive content",
 | 
				
			||||||
  "status.sensitive_toggle": "Click to view",
 | 
					  "status.sensitive_toggle": "Click to view",
 | 
				
			||||||
  "video_player.toggle_sound": "Toggle sound",
 | 
					  "video_player.toggle_sound": "Toggle sound",
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@ const en = {
 | 
				
			||||||
  "upload_form.undo": "Undo",
 | 
					  "upload_form.undo": "Undo",
 | 
				
			||||||
  "notification.follow": "{name} followed you",
 | 
					  "notification.follow": "{name} followed you",
 | 
				
			||||||
  "notification.favourite": "{name} favourited your status",
 | 
					  "notification.favourite": "{name} favourited your status",
 | 
				
			||||||
  "notification.reblog": "{name} reblogged your status",
 | 
					  "notification.reblog": "{name} boosted your status",
 | 
				
			||||||
  "notification.mention": "{name} mentioned you"
 | 
					  "notification.mention": "{name} mentioned you"
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -116,7 +116,11 @@ class Account < ApplicationRecord
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def avatar_remote_url=(url)
 | 
					  def avatar_remote_url=(url)
 | 
				
			||||||
    self.avatar = URI.parse(url) unless self[:avatar_remote_url] == url
 | 
					    parsed_url = URI.parse(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return if !%w(http https).include?(parsed_url.scheme) || self[:avatar_remote_url] == url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    self.avatar              = parsed_url
 | 
				
			||||||
    self[:avatar_remote_url] = url
 | 
					    self[:avatar_remote_url] = url
 | 
				
			||||||
  rescue OpenURI::HTTPError => e
 | 
					  rescue OpenURI::HTTPError => e
 | 
				
			||||||
    Rails.logger.debug "Error fetching remote avatar: #{e}"
 | 
					    Rails.logger.debug "Error fetching remote avatar: #{e}"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,7 +97,10 @@ class Status < ApplicationRecord
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def as_public_timeline(account = nil)
 | 
					    def as_public_timeline(account = nil)
 | 
				
			||||||
      query = joins('LEFT OUTER JOIN accounts ON statuses.account_id = accounts.id').where('accounts.silenced = FALSE')
 | 
					      query = joins('LEFT OUTER JOIN accounts ON statuses.account_id = accounts.id')
 | 
				
			||||||
 | 
					              .where('accounts.silenced = FALSE')
 | 
				
			||||||
 | 
					              .where('statuses.in_reply_to_id IS NULL')
 | 
				
			||||||
 | 
					              .where('statuses.reblog_of_id IS NULL')
 | 
				
			||||||
      query = filter_timeline(query, account) unless account.nil?
 | 
					      query = filter_timeline(query, account) unless account.nil?
 | 
				
			||||||
      query
 | 
					      query
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					@ -106,6 +109,8 @@ class Status < ApplicationRecord
 | 
				
			||||||
      query = tag.statuses
 | 
					      query = tag.statuses
 | 
				
			||||||
                 .joins('LEFT OUTER JOIN accounts ON statuses.account_id = accounts.id')
 | 
					                 .joins('LEFT OUTER JOIN accounts ON statuses.account_id = accounts.id')
 | 
				
			||||||
                 .where('accounts.silenced = FALSE')
 | 
					                 .where('accounts.silenced = FALSE')
 | 
				
			||||||
 | 
					                 .where('statuses.in_reply_to_id IS NULL')
 | 
				
			||||||
 | 
					                 .where('statuses.reblog_of_id IS NULL')
 | 
				
			||||||
      query = filter_timeline(query, account) unless account.nil?
 | 
					      query = filter_timeline(query, account) unless account.nil?
 | 
				
			||||||
      query
 | 
					      query
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					@ -123,13 +128,7 @@ class Status < ApplicationRecord
 | 
				
			||||||
    def filter_timeline(query, account)
 | 
					    def filter_timeline(query, account)
 | 
				
			||||||
      blocked = Block.where(account: account).pluck(:target_account_id)
 | 
					      blocked = Block.where(account: account).pluck(:target_account_id)
 | 
				
			||||||
      return query if blocked.empty?
 | 
					      return query if blocked.empty?
 | 
				
			||||||
 | 
					      query.where('statuses.account_id NOT IN (?)', blocked)
 | 
				
			||||||
      query
 | 
					 | 
				
			||||||
        .joins('LEFT OUTER JOIN statuses AS parents ON statuses.in_reply_to_id = parents.id')
 | 
					 | 
				
			||||||
        .joins('LEFT OUTER JOIN statuses AS reblogs ON statuses.reblog_of_id = reblogs.id')
 | 
					 | 
				
			||||||
        .where('statuses.account_id NOT IN (?)', blocked)
 | 
					 | 
				
			||||||
        .where('(parents.id IS NULL OR parents.account_id NOT IN (?))', blocked)
 | 
					 | 
				
			||||||
        .where('(reblogs.id IS NULL OR reblogs.account_id NOT IN (?))', blocked)
 | 
					 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,14 +41,17 @@ class FanOutOnWriteService < BaseService
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def deliver_to_hashtags(status)
 | 
					  def deliver_to_hashtags(status)
 | 
				
			||||||
    Rails.logger.debug "Delivering status #{status.id} to hashtags"
 | 
					    return if status.reblog? || status.reply?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Rails.logger.debug "Delivering status #{status.id} to hashtags"
 | 
				
			||||||
    status.tags.find_each do |tag|
 | 
					    status.tags.find_each do |tag|
 | 
				
			||||||
      FeedManager.instance.broadcast("hashtag:#{tag.name}", type: 'update', id: status.id)
 | 
					      FeedManager.instance.broadcast("hashtag:#{tag.name}", type: 'update', id: status.id)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def deliver_to_public(status)
 | 
					  def deliver_to_public(status)
 | 
				
			||||||
 | 
					    return if status.reblog? || status.reply?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Rails.logger.debug "Delivering status #{status.id} to public timeline"
 | 
					    Rails.logger.debug "Delivering status #{status.id} to public timeline"
 | 
				
			||||||
    FeedManager.instance.broadcast(:public, type: 'update', id: status.id)
 | 
					    FeedManager.instance.broadcast(:public, type: 'update', id: status.id)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue