This commit is contained in:
Mikhail Kilin
2026-01-30 16:18:16 +03:00
parent 4deb0fbe00
commit a4cf6bac72
9 changed files with 936 additions and 215 deletions

View File

@@ -1,3 +1,7 @@
use crate::constants::{
LAZY_LOAD_USERS_PER_TICK, MAX_CHAT_USER_IDS, MAX_CHATS, MAX_MESSAGES_IN_CHAT,
MAX_USER_CACHE_SIZE, TDLIB_CHAT_LIMIT, TDLIB_MESSAGE_LIMIT,
};
use std::collections::HashMap;
use std::env;
use std::time::Instant;
@@ -7,15 +11,6 @@ use tdlib_rs::enums::{
};
use tdlib_rs::types::TextEntity;
/// Максимальный размер кэшей пользователей
const MAX_USER_CACHE_SIZE: usize = 500;
/// Максимальное количество сообщений в текущем чате
const MAX_MESSAGES_IN_CHAT: usize = 500;
/// Максимальное количество чатов
const MAX_CHATS: usize = 200;
/// Максимальный размер кэша chat_user_ids
const MAX_CHAT_USER_IDS: usize = 500;
/// Простой LRU-кэш на основе HashMap + Vec для отслеживания порядка
pub struct LruCache<V> {
map: HashMap<i64, V>,
@@ -1312,11 +1307,11 @@ impl TdClient {
chat_id,
query.to_string(),
None, // sender_id
0, // from_message_id
0, // offset
50, // limit
None, // filter (no filter = search by text)
0, // message_thread_id
0, // from_message_id
0, // offset
TDLIB_MESSAGE_LIMIT, // limit
None, // filter (no filter = search by text)
0, // message_thread_id
0, // saved_messages_topic_id
self.client_id,
)
@@ -1895,15 +1890,15 @@ impl TdClient {
/// Загружает только последние 5 запросов за цикл для снижения нагрузки
pub async fn process_pending_user_ids(&mut self) {
// Берём только последние запросы (они актуальнее — от недавних сообщений)
const BATCH_SIZE: usize = 5;
const LAZY_LOAD_USERS_PER_TICK: usize = 5;
// Убираем дубликаты и уже загруженные
self.pending_user_ids
.retain(|id| !self.user_names.contains_key(id));
self.pending_user_ids.dedup();
// Берём последние BATCH_SIZE элементов
let start = self.pending_user_ids.len().saturating_sub(BATCH_SIZE);
// Берём последние LAZY_LOAD_USERS_PER_TICK элементов
let start = self.pending_user_ids.len().saturating_sub(LAZY_LOAD_USERS_PER_TICK);
let batch: Vec<i64> = self.pending_user_ids.drain(start..).collect();
for user_id in batch {