maxbot 0.7.6

Автоматизация работы с чат-ботами на платформе MAX (max.ru)
Documentation
use crate::config::get_global_max_rps;
use tokio::sync::Mutex;
use std::sync::OnceLock;
use std::time::{Duration, Instant};

static LAST_REQUEST_TIME: OnceLock<Mutex<Instant>> = OnceLock::new();

fn get_last_request_time() -> &'static Mutex<Instant> {
    LAST_REQUEST_TIME.get_or_init(|| Mutex::new(Instant::now()))
}

/// Приостанавливает выполнение текущей задачи, если превышен глобальный лимит RPS.
///
/// Функция автоматически вычисляет необходимую задержку на основе времени последнего
/// глобального запроса и текущего значения [`get_global_max_rps`][crate::get_global_max_rps].
/// Если ограничение равно `0`, пауза не выполняется.
///
/// Используется внутри [`MaxClient`][crate::MaxClient] при отсутствии локального ограничения.
pub async fn enforce_global_rate_limit() {
    let max_rps = get_global_max_rps();
    if max_rps == 0 {
        return;
    }
    let min_interval = Duration::from_millis(1000 / max_rps as u64);
    let last = get_last_request_time();
    let mut last_guard = last.lock().await;
    let now = Instant::now();
    let elapsed = now - *last_guard;
    if elapsed < min_interval {
        tokio::time::sleep(min_interval - elapsed).await;
    }
    *last_guard = Instant::now();
}