
    wi	                     B    d dl Z d dlZd dlmZ  e       Z G d d      Zy)    N)get_settingsc                   @    e Zd ZdZd Zd
dedededz  dedz  def
d	Z	y)RateLimiterz%Token bucket rate limiter using Redisc                     t        j                  t        j                  d      | _        t        j
                  | _        t        j                  | _        y )NT)decode_responses)	redisfrom_urlsettings	REDIS_URLredis_clientRATE_LIMIT_BUCKET_SIZEbucket_sizeRATE_LIMIT_REFILL_RATE_PER_SECrefill_rate)selfs    3/var/www/notifications/app/services/rate_limiter.py__init__zRateLimiter.__init__   s8    !NN8+=+=PTU#::#BB    Nkeytokensr   r   returnc                 ^   t        j                          }d| }||n| j                  }||n| j                  }| j                  j	                         }	|	j                  |d       |	j                  |d       |	j                         \  }
}|
|}
|}nt        |
      }
t        |      }||z
  }||z  }t        ||
|z         }
|
|k\  rh|
|z  }
| j                  j	                         }	|	j                  |d|
       |	j                  |d|       |	j                  |d       |	j                          yy)a  
        Check if request is allowed under rate limit and consume tokens
        
        Args:
            key: rate limit key (e.g., "tenant:123:telegram" or "tenant:123")
            tokens: number of tokens to consume (default: 1)
            bucket_size: override default bucket size (optional)
            refill_rate: override default refill rate (optional)
        
        Returns:
            True if allowed, False if rate limited
        z
ratelimit:r   last_refilli  TF)timer   r   r   pipelinehgetexecutefloatminhsetexpire)r   r   r   r   r   now
bucket_keybucket_size_to_userefill_rate_to_usepipecurrent_tokensr   elapsedrefill_amounts                 r   check_and_consumezRateLimiter.check_and_consume   s;    iik!#'
 -8,C[IYIY,7,C[IYIY   ))+		*h'		*m,&*lln# !/NK">2N,K #"44/-1OP V#f$N$$--/DIIj(N;IIj-5KK
D)LLN r   )   NN)
__name__
__module____qualname____doc__r   strintr   boolr*    r   r   r   r      sC    /C
3S 3# 3d
 3hmptht 3  AE 3r   r   )r   r   app.core.configr   r
   r   r3   r   r   <module>r5      s      (>; ;r   