# frozen_string_literal: true class Chat::ChatMessageRateLimiter def self.run!(user) instance = self.new(user) instance.run! end def initialize(user) @user = user end def run! return if @user.staff? allowed_message_count = ( if @user.trust_level == TrustLevel[0] SiteSetting.chat_allowed_messages_for_trust_level_0 else SiteSetting.chat_allowed_messages_for_other_trust_levels end ) return if allowed_message_count.zero? @rate_limiter = RateLimiter.new(@user, "create_chat_message", allowed_message_count, 30.seconds) silence_user if @rate_limiter.remaining.zero? @rate_limiter.performed! end def clear! # Used only for testing. Need to clear the rate limiter between tests. @rate_limiter.clear! if defined?(@rate_limiter) end private def silence_user silenced_for_minutes = SiteSetting.chat_auto_silence_duration return unless silenced_for_minutes > 0 UserSilencer.silence( @user, Discourse.system_user, silenced_till: silenced_for_minutes.minutes.from_now, reason: I18n.t("chat.errors.rate_limit_exceeded"), ) end end