Add specific rate limits for posting and following (#13172)
This commit is contained in:
		@@ -87,10 +87,10 @@ module AccountInteractions
 | 
			
		||||
    has_many :announcement_mutes, dependent: :destroy
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def follow!(other_account, reblogs: nil, uri: nil)
 | 
			
		||||
  def follow!(other_account, reblogs: nil, uri: nil, rate_limit: false)
 | 
			
		||||
    reblogs = true if reblogs.nil?
 | 
			
		||||
 | 
			
		||||
    rel = active_relationships.create_with(show_reblogs: reblogs, uri: uri)
 | 
			
		||||
    rel = active_relationships.create_with(show_reblogs: reblogs, uri: uri, rate_limit: rate_limit)
 | 
			
		||||
                              .find_or_create_by!(target_account: other_account)
 | 
			
		||||
 | 
			
		||||
    rel.update!(show_reblogs: reblogs)
 | 
			
		||||
@@ -99,6 +99,18 @@ module AccountInteractions
 | 
			
		||||
    rel
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def request_follow!(other_account, reblogs: nil, uri: nil, rate_limit: false)
 | 
			
		||||
    reblogs = true if reblogs.nil?
 | 
			
		||||
 | 
			
		||||
    rel = follow_requests.create_with(show_reblogs: reblogs, uri: uri, rate_limit: rate_limit)
 | 
			
		||||
                         .find_or_create_by!(target_account: other_account)
 | 
			
		||||
 | 
			
		||||
    rel.update!(show_reblogs: reblogs)
 | 
			
		||||
    remove_potential_friendship(other_account)
 | 
			
		||||
 | 
			
		||||
    rel
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def block!(other_account, uri: nil)
 | 
			
		||||
    remove_potential_friendship(other_account)
 | 
			
		||||
    block_relationships.create_with(uri: uri)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								app/models/concerns/rate_limitable.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								app/models/concerns/rate_limitable.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module RateLimitable
 | 
			
		||||
  extend ActiveSupport::Concern
 | 
			
		||||
 | 
			
		||||
  def rate_limit=(value)
 | 
			
		||||
    @rate_limit = value
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def rate_limit?
 | 
			
		||||
    @rate_limit
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def rate_limiter(by, options = {})
 | 
			
		||||
    return @rate_limiter if defined?(@rate_limiter)
 | 
			
		||||
 | 
			
		||||
    @rate_limiter = RateLimiter.new(by, options)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class_methods do
 | 
			
		||||
    def rate_limit(options = {})
 | 
			
		||||
      after_create do
 | 
			
		||||
        by = public_send(options[:by])
 | 
			
		||||
 | 
			
		||||
        if rate_limit? && by&.local?
 | 
			
		||||
          rate_limiter(by, options).record!
 | 
			
		||||
          @rate_limit_recorded = true
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      after_rollback do
 | 
			
		||||
        rate_limiter(public_send(options[:by]), options).rollback! if @rate_limit_recorded
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user