fixes
This commit is contained in:
@@ -52,10 +52,14 @@ pub struct TdClient {
|
||||
pub current_chat_id: Option<i64>,
|
||||
/// Кэш usernames: user_id -> username
|
||||
user_usernames: HashMap<i64, String>,
|
||||
/// Кэш имён: user_id -> display_name (first_name + last_name)
|
||||
user_names: HashMap<i64, String>,
|
||||
/// Связь chat_id -> user_id для приватных чатов
|
||||
chat_user_ids: HashMap<i64, i64>,
|
||||
/// Очередь сообщений для отметки как прочитанных: (chat_id, message_ids)
|
||||
pub pending_view_messages: Vec<(i64, Vec<i64>)>,
|
||||
/// Очередь user_id для загрузки имён
|
||||
pub pending_user_ids: Vec<i64>,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
@@ -78,8 +82,10 @@ impl TdClient {
|
||||
current_chat_messages: Vec::new(),
|
||||
current_chat_id: None,
|
||||
user_usernames: HashMap::new(),
|
||||
user_names: HashMap::new(),
|
||||
chat_user_ids: HashMap::new(),
|
||||
pending_view_messages: Vec::new(),
|
||||
pending_user_ids: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,8 +217,18 @@ impl TdClient {
|
||||
}
|
||||
}
|
||||
Update::User(update) => {
|
||||
// Сохраняем username пользователя
|
||||
// Сохраняем имя и username пользователя
|
||||
let user = update.user;
|
||||
|
||||
// Сохраняем display name (first_name + last_name)
|
||||
let display_name = if user.last_name.is_empty() {
|
||||
user.first_name.clone()
|
||||
} else {
|
||||
format!("{} {}", user.first_name, user.last_name)
|
||||
};
|
||||
self.user_names.insert(user.id, display_name);
|
||||
|
||||
// Сохраняем username если есть
|
||||
if let Some(usernames) = user.usernames {
|
||||
if let Some(username) = usernames.active_usernames.first() {
|
||||
self.user_usernames.insert(user.id, username.clone());
|
||||
@@ -305,10 +321,28 @@ impl TdClient {
|
||||
self.chats.sort_by(|a, b| b.order.cmp(&a.order));
|
||||
}
|
||||
|
||||
fn convert_message(&self, message: &TdMessage, chat_id: i64) -> MessageInfo {
|
||||
fn convert_message(&mut self, message: &TdMessage, chat_id: i64) -> MessageInfo {
|
||||
let sender_name = match &message.sender_id {
|
||||
tdlib_rs::enums::MessageSender::User(user) => format!("User_{}", user.user_id),
|
||||
tdlib_rs::enums::MessageSender::Chat(chat) => format!("Chat_{}", chat.chat_id),
|
||||
tdlib_rs::enums::MessageSender::User(user) => {
|
||||
// Пробуем получить имя из кеша
|
||||
if let Some(name) = self.user_names.get(&user.user_id) {
|
||||
name.clone()
|
||||
} else {
|
||||
// Добавляем в очередь для загрузки
|
||||
if !self.pending_user_ids.contains(&user.user_id) {
|
||||
self.pending_user_ids.push(user.user_id);
|
||||
}
|
||||
format!("User_{}", user.user_id)
|
||||
}
|
||||
}
|
||||
tdlib_rs::enums::MessageSender::Chat(chat) => {
|
||||
// Для чатов используем название чата
|
||||
self.chats
|
||||
.iter()
|
||||
.find(|c| c.id == chat.chat_id)
|
||||
.map(|c| c.title.clone())
|
||||
.unwrap_or_else(|| format!("Chat_{}", chat.chat_id))
|
||||
}
|
||||
};
|
||||
|
||||
// Определяем, прочитано ли исходящее сообщение
|
||||
@@ -412,11 +446,10 @@ impl TdClient {
|
||||
|
||||
match result {
|
||||
Ok(tdlib_rs::enums::Messages::Messages(messages)) => {
|
||||
let batch: Vec<MessageInfo> = messages
|
||||
.messages
|
||||
.into_iter()
|
||||
.filter_map(|m| m.map(|msg| self.convert_message(&msg, chat_id)))
|
||||
.collect();
|
||||
let mut batch: Vec<MessageInfo> = Vec::new();
|
||||
for m in messages.messages.into_iter().flatten() {
|
||||
batch.push(self.convert_message(&m, chat_id));
|
||||
}
|
||||
|
||||
if batch.is_empty() {
|
||||
break;
|
||||
@@ -484,11 +517,10 @@ impl TdClient {
|
||||
|
||||
match result {
|
||||
Ok(tdlib_rs::enums::Messages::Messages(messages)) => {
|
||||
let mut result_messages: Vec<MessageInfo> = messages
|
||||
.messages
|
||||
.into_iter()
|
||||
.filter_map(|m| m.map(|msg| self.convert_message(&msg, chat_id)))
|
||||
.collect();
|
||||
let mut result_messages: Vec<MessageInfo> = Vec::new();
|
||||
for m in messages.messages.into_iter().flatten() {
|
||||
result_messages.push(self.convert_message(&m, chat_id));
|
||||
}
|
||||
|
||||
// Сообщения приходят от новых к старым, переворачиваем
|
||||
result_messages.reverse();
|
||||
@@ -585,6 +617,33 @@ impl TdClient {
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
/// Обработка очереди user_id для загрузки имён
|
||||
pub async fn process_pending_user_ids(&mut self) {
|
||||
let pending = std::mem::take(&mut self.pending_user_ids);
|
||||
for user_id in pending {
|
||||
// Пропускаем если имя уже есть
|
||||
if self.user_names.contains_key(&user_id) {
|
||||
continue;
|
||||
}
|
||||
// Загружаем информацию о пользователе
|
||||
if let Ok(User::User(user)) = functions::get_user(user_id, self.client_id).await {
|
||||
let display_name = if user.last_name.is_empty() {
|
||||
user.first_name.clone()
|
||||
} else {
|
||||
format!("{} {}", user.first_name, user.last_name)
|
||||
};
|
||||
self.user_names.insert(user_id, display_name.clone());
|
||||
|
||||
// Обновляем имя в текущих сообщениях
|
||||
for msg in &mut self.current_chat_messages {
|
||||
if msg.sender_name == format!("User_{}", user_id) {
|
||||
msg.sender_name = display_name.clone();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Статическая функция для извлечения текста сообщения (без &self)
|
||||
|
||||
Reference in New Issue
Block a user