Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
""" | |
import logging | |
from datetime import datetime, timedelta, timezone | |
from typing import Tuple, Dict, List | |
logger = logging.getLogger(__name__) | |
class RateLimiter: | |
def __init__(self, period_days: int = 7, quota: int = 5): | |
self.period_days = period_days | |
self.quota = quota | |
self.submission_history: Dict[str, List[datetime]] = {} | |
self.higher_quota_users = set() # Users with higher quotas | |
self.unlimited_users = set() # Users with no quota limits | |
def add_unlimited_user(self, user_id: str): | |
"""Add a user to the unlimited users list""" | |
self.unlimited_users.add(user_id) | |
def add_higher_quota_user(self, user_id: str): | |
"""Add a user to the higher quota users list""" | |
self.higher_quota_users.add(user_id) | |
def record_submission(self, user_id: str): | |
"""Record a new submission for a user""" | |
current_time = datetime.now(timezone.utc) | |
if user_id not in self.submission_history: | |
self.submission_history[user_id] = [] | |
self.submission_history[user_id].append(current_time) | |
def clean_old_submissions(self, user_id: str): | |
"""Remove submissions older than the period""" | |
if user_id not in self.submission_history: | |
return | |
current_time = datetime.now(timezone.utc) | |
cutoff_time = current_time - timedelta(days=self.period_days) | |
self.submission_history[user_id] = [ | |
time for time in self.submission_history[user_id] | |
if time > cutoff_time | |
] | |
async def check_rate_limit(self, user_id: str) -> Tuple[bool, str]: | |
"""Check if a user has exceeded their rate limit | |
Returns: | |
Tuple[bool, str]: (is_allowed, error_message) | |
""" | |
# Unlimited users bypass all checks | |
if user_id in self.unlimited_users: | |
return True, "" | |
# Clean old submissions | |
self.clean_old_submissions(user_id) | |
# Get current submission count | |
submission_count = len(self.submission_history.get(user_id, [])) | |
# Calculate user's quota | |
user_quota = self.quota * 2 if user_id in self.higher_quota_users else self.quota | |
# Check if user has exceeded their quota | |
if submission_count >= user_quota: | |
error_msg = ( | |
f"User '{user_id}' has reached the limit of {user_quota} submissions " | |
f"in the last {self.period_days} days. Please wait before submitting again." | |
) | |
return False, error_msg | |
return True, "" | |
""" |