From 42e08ce4219630faabe9105c1b1c92c8f66a7c5a Mon Sep 17 00:00:00 2001 From: itzephir Date: Sat, 13 Dec 2025 11:15:30 +0300 Subject: [PATCH] hotfix: hotfix limit and logs --- src/controllers/GetChatsController.cpp | 96 ++++++++-------- src/controllers/SendMessageController.cpp | 4 + src/facade/TgClientFacade.cpp | 132 +++++++++++----------- src/tgClient/TgClientTdlib.cpp | 2 +- third_party/td | 2 +- 5 files changed, 121 insertions(+), 115 deletions(-) diff --git a/src/controllers/GetChatsController.cpp b/src/controllers/GetChatsController.cpp index dbd65e5..b5150b3 100644 --- a/src/controllers/GetChatsController.cpp +++ b/src/controllers/GetChatsController.cpp @@ -6,14 +6,13 @@ #include #include -ChatsController::ChatsController(ITgClient& client) - : client_(client) - , last_cache_update_(0) - , last_error_("") {} +ChatsController::ChatsController(ITgClient& client) : client_(client) + , last_cache_update_(0) + , last_error_("") {} std::vector ChatsController::get_chats(int limit) { clear_error(); - + if (!cached_chats_.empty() && !should_refresh_cache()) { int return_count = std::min(static_cast(cached_chats_.size()), limit); auto result = std::vector( @@ -23,17 +22,19 @@ std::vector ChatsController::get_chats(int limit) { reverse(result.begin(), result.end()); return result; } - + try { std::vector chats = client_.get_chats(limit); - + update_cache(chats); - - std::cout << "[ChatsController] Retrieved " << chats.size() - << " chats\n"; + +#ifndef NDEBUG + std::cout << "[ChatsController] Retrieved " << chats.size() + << " chats\n"; +#endif + reverse(chats.begin(), chats.end()); return chats; - } catch (const std::exception& e) { handle_error(std::string("Failed to get chats: ") + e.what()); return {}; @@ -42,40 +43,41 @@ std::vector ChatsController::get_chats(int limit) { void ChatsController::refresh_chats() { clear_error(); - + try { std::vector chats = client_.get_chats(100); - + update_cache(chats); - - std::cout << "[ChatsController] Cache refreshed with " - << chats.size() << " chats\n"; - + + +#ifndef NDEBUG + std::cout << "[ChatsController] Cache refreshed with " + << chats.size() << " chats\n"; +#endif } catch (const std::exception& e) { handle_error(std::string("Failed to refresh chats: ") + e.what()); } } - void ChatsController::update_cache(const std::vector& chats) { cached_chats_ = chats; - + chat_titles_.clear(); for (const auto& chat : chats) { chat_titles_[chat.chatId] = chat.title; } - + last_cache_update_ = std::time(nullptr); } bool ChatsController::should_refresh_cache() const { const int CACHE_TTL_SECONDS = 5 * 60; - + if (cached_chats_.empty()) { return true; } - + time_t now = std::time(nullptr); return (now - last_cache_update_) > CACHE_TTL_SECONDS; } @@ -83,65 +85,67 @@ bool ChatsController::should_refresh_cache() const { std::vector ChatsController::search_chats( const std::string& query, int limit) { - clear_error(); - + if (query.empty()) { return get_chats(limit); } - + if (cached_chats_.empty()) { refresh_chats(); } - + std::vector result; std::string query_lower = query; - - std::transform(query_lower.begin(), query_lower.end(), + + std::transform(query_lower.begin(), query_lower.end(), query_lower.begin(), ::tolower); - + for (const auto& chat : cached_chats_) { if (result.size() >= static_cast(limit)) { break; } - + std::string title_lower = chat.title; std::transform(title_lower.begin(), title_lower.end(), - title_lower.begin(), ::tolower); - + title_lower.begin(), ::tolower); + if (title_lower.find(query_lower) != std::string::npos) { result.push_back(chat); } } - - std::cout << "[ChatsController] Found " << result.size() - << " chats matching '" << query << "'\n"; - + + +#ifndef NDEBUG + std::cout << "[ChatsController] Found " << result.size() + << " chats matching '" << query << "'\n"; +#endif + return result; } ITgClient::Chat ChatsController::get_chat_info(const std::string& chat_id) { clear_error(); - + if (chat_id.empty()) { handle_error("Chat ID cannot be empty"); return ITgClient::Chat{"", ""}; } - + for (const auto& chat : cached_chats_) { if (chat.chatId == chat_id) { return chat; } } - + refresh_chats(); - + for (const auto& chat : cached_chats_) { if (chat.chatId == chat_id) { return chat; } } - + handle_error("Chat not found: " + chat_id); return ITgClient::Chat{"", ""}; } @@ -150,13 +154,13 @@ bool ChatsController::chat_exists(const std::string& chat_id) { if (chat_id.empty()) { return false; } - + for (const auto& chat : cached_chats_) { if (chat.chatId == chat_id) { return true; } } - + return false; } @@ -164,7 +168,10 @@ void ChatsController::clear_cache() { cached_chats_.clear(); chat_titles_.clear(); last_cache_update_ = 0; + +#ifndef NDEBUG std::cout << "[ChatsController] Cache cleared\n"; +#endif } const std::string& ChatsController::get_last_error() const { @@ -182,7 +189,6 @@ void ChatsController::clear_error() { } std::string ChatsController::get_chat_title(const std::string& chat_id) { - if (chat_id.empty()) { return ""; } @@ -209,4 +215,4 @@ std::string ChatsController::get_chat_title(const std::string& chat_id) { } } return "Unknown chat"; -} \ No newline at end of file +} diff --git a/src/controllers/SendMessageController.cpp b/src/controllers/SendMessageController.cpp index 534e374..107ff56 100644 --- a/src/controllers/SendMessageController.cpp +++ b/src/controllers/SendMessageController.cpp @@ -19,7 +19,11 @@ bool MessageController::send_message(const std::string& chat_id, try { client_.send_message(chat_id, text); + +#ifndef NDEBUG std::cout << "[MessageController] Message sent to chat " << chat_id << "\n"; +#endif + return true; } catch (const std::exception& e) { diff --git a/src/facade/TgClientFacade.cpp b/src/facade/TgClientFacade.cpp index 089f650..78b11a8 100644 --- a/src/facade/TgClientFacade.cpp +++ b/src/facade/TgClientFacade.cpp @@ -23,17 +23,12 @@ TgClientFacade::TgClientFacade(ITgClient& client) : client_(client) { std::string TgClientFacade::auth_state_to_string(ITgClient::AuthState state) { using AuthState = ITgClient::AuthState; switch (state) { - case AuthState::WaitingPhone: - return "WaitingPhone"; - case AuthState::WaitingCode: - return "WaitingCode"; - case AuthState::Ready: - return "Ready"; - case AuthState::LoggingOut: - return "LoggingOut"; - case AuthState::Error: - default: - return "Error"; + case AuthState::WaitingPhone: return "WaitingPhone"; + case AuthState::WaitingCode: return "WaitingCode"; + case AuthState::Ready: return "Ready"; + case AuthState::LoggingOut: return "LoggingOut"; + case AuthState::Error: + default: return "Error"; } } @@ -82,19 +77,18 @@ int TgClientFacade::run(int argc, char** argv) { } else if (command == "logout") { return handle_logout(); } else if (command == "chats") { - int limit; + int limit = 0; try { if (argc < 3) { + limit = 20; + } else { limit = std::stoi(argv[2]); - if (limit <= 0) { - limit = 20; - } - } + } } catch (...) { std::cerr << "[tgcli] Invalid limit, using default 20\n"; limit = 20; } - return handle_get_chats(limit); + return handle_get_chats(limit); } else if (command == "search-chats") { if (argc < 3) { std::cerr << "[tgcli] search-chats: query is required\n"; @@ -122,7 +116,6 @@ int TgClientFacade::run(int argc, char** argv) { } return handle_history(argv[2], limit); - } else if (command == "send") { if (argc < 4) { std::cerr << "[tgcli] send: not enough arguments\n"; @@ -142,6 +135,9 @@ int TgClientFacade::run(int argc, char** argv) { const std::string message = oss.str(); return handle_send(chat_id, message); + } else if (command == "--help" || command == "-h") { + print_usage(); + return 0; } else { std::cerr << "[tgcli] Unknown command: " << command << "\n"; print_usage(); @@ -162,7 +158,7 @@ int TgClientFacade::handle_auth_status() { bool authorized = auth_controller_->is_authorized(); std::cout << "[tgcli] Auth state: " << auth_state_to_string(state) - << " (authorized=" << (authorized ? "true" : "false") << ")\n"; + << " (authorized=" << (authorized ? "true" : "false") << ")\n"; return 0; } @@ -177,7 +173,7 @@ int TgClientFacade::handle_login_phone(const std::string& phone) { auto state = auth_controller_->get_auth_state(); std::cout << "[tgcli] login-phone: new state = " - << auth_state_to_string(state) << "\n"; + << auth_state_to_string(state) << "\n"; return 0; } @@ -192,7 +188,7 @@ int TgClientFacade::handle_login_code(const std::string& code) { auto state = auth_controller_->get_auth_state(); std::cout << "[tgcli] login-code: new state = " - << auth_state_to_string(state) << "\n"; + << auth_state_to_string(state) << "\n"; if (auth_controller_->is_authorized()) { std::cout << "[tgcli] Authorization completed\n"; @@ -206,7 +202,7 @@ int TgClientFacade::handle_logout() { auto state = auth_controller_->get_auth_state(); std::cout << "[tgcli] logout: new state = " - << auth_state_to_string(state) << "\n"; + << auth_state_to_string(state) << "\n"; return 0; } @@ -232,24 +228,24 @@ int TgClientFacade::handle_get_chats(int limit) { std::cout << "[tgcli] No chats found\n"; return 0; } - + std::cout << "[tgcli] Found " << chats.size() << " chats:\n"; std::cout << "========================================\n"; - + for (size_t i = 0; i < chats.size(); ++i) { const auto& chat = chats[i]; - const std::string label = label_controller_ ? label_controller_->label_for_chat_id(chat.chatId) - : std::string{}; + const std::string label = label_controller_ + ? label_controller_->label_for_chat_id(chat.chatId) + : std::string{}; std::cout << std::setw(3) << (i + 1) << ". " - << "Label: " << (label.empty() ? "-" : label) - << " | Title: " << chat.title - << " | ID: " << chat.chatId - << "\n"; + << "Label: " << (label.empty() ? "-" : label) + << " | Title: " << chat.title + << " | ID: " << chat.chatId + << "\n"; } - + std::cout << "========================================\n"; - } catch (const std::exception& e) { std::cerr << "[tgcli] get-chats error: " << e.what() << "\n"; return 1; @@ -266,16 +262,16 @@ int TgClientFacade::handle_search_chats(const std::string& query) { try { auto chats = chats_controller_->search_chats(query, 50); - + if (chats.empty()) { std::cout << "[tgcli] No chats found for query: " << query << "\n"; return 0; } - - std::cout << "[tgcli] Found " << chats.size() - << " chats matching '" << query << "':\n"; + + std::cout << "[tgcli] Found " << chats.size() + << " chats matching '" << query << "':\n"; std::cout << "========================================\n"; - + for (size_t i = 0; i < chats.size(); ++i) { const auto& chat = chats[i]; @@ -285,13 +281,12 @@ int TgClientFacade::handle_search_chats(const std::string& query) { } std::cout << std::setw(3) << (i + 1) << ". " - << "Label: " << (label.empty() ? "-" : label) - << " | Title: " << chat.title - << " | ID: " << chat.chatId << "\n"; + << "Label: " << (label.empty() ? "-" : label) + << " | Title: " << chat.title + << " | ID: " << chat.chatId << "\n"; } - + std::cout << "========================================\n"; - } catch (const std::exception& e) { std::cerr << "[tgcli] search-chats error: " << e.what() << "\n"; return 1; @@ -307,22 +302,22 @@ int TgClientFacade::handle_chat_info(const std::string& chat_id) { } try { - const std::string resolved_id = label_controller_ ? label_controller_->resolve_chat_id(chat_id) - : chat_id; + const std::string resolved_id = label_controller_ + ? label_controller_->resolve_chat_id(chat_id) + : chat_id; auto chat = chats_controller_->get_chat_info(resolved_id); - + if (chat.chatId.empty()) { std::cerr << "[tgcli] Chat not found: " << chat_id << "\n"; return 1; } - + std::cout << "[tgcli] Chat info:\n"; std::cout << " Label: " - << (label_controller_ ? label_controller_->label_for_chat_id(chat.chatId) : std::string{"-"}) - << "\n"; + << (label_controller_ ? label_controller_->label_for_chat_id(chat.chatId) : std::string{"-"}) + << "\n"; std::cout << " ID: " << chat.chatId << "\n"; std::cout << " Title: " << chat.title << "\n"; - } catch (const std::exception& e) { std::cerr << "[tgcli] chat-info error: " << e.what() << "\n"; return 1; @@ -342,29 +337,30 @@ int TgClientFacade::handle_history(const std::string& chat_id, int limit) { } try { - const std::string resolved_id = label_controller_ ? label_controller_->resolve_chat_id(chat_id) - : chat_id; + const std::string resolved_id = label_controller_ + ? label_controller_->resolve_chat_id(chat_id) + : chat_id; auto messages = history_controller_->get_chat_history(resolved_id, limit); std::this_thread::sleep_for(std::chrono::milliseconds(800)); // you saw nothing... messages = client_.get_chat_history(resolved_id, limit); - - + + if (messages.empty()) { std::cout << "[tgcli] No messages found in chat: " << chat_id << "\n"; return 0; } - - std::cout << "[tgcli] History for chat " << chat_id - << " (" << messages.size() << " messages):\n"; + + std::cout << "[tgcli] History for chat " << chat_id + << " (" << messages.size() << " messages):\n"; std::cout << "========================================\n"; - + for (const auto& msg : messages) { - std::cout << "[" << chats_controller_->get_chat_title(msg.sender) << "] " << "(" << msg.messageID << "): " << msg.text << "\n"; + std::cout << "[" << chats_controller_->get_chat_title(msg.sender) << "] " << "(" << msg.messageID << "): " + << msg.text << "\n"; } - + std::cout << "========================================\n"; - } catch (const std::exception& e) { std::cerr << "[tgcli] history error: " << e.what() << "\n"; return 1; @@ -374,7 +370,7 @@ int TgClientFacade::handle_history(const std::string& chat_id, int limit) { } // ===================== -// SEND команда +// SEND команда // ===================== int TgClientFacade::handle_send(const std::string& chat_id, @@ -385,21 +381,21 @@ int TgClientFacade::handle_send(const std::string& chat_id, } try { - const std::string resolved_id = label_controller_ ? label_controller_->resolve_chat_id(chat_id) - : chat_id; + const std::string resolved_id = label_controller_ + ? label_controller_->resolve_chat_id(chat_id) + : chat_id; bool success = message_controller_->send_message(resolved_id, message); - + if (success) { std::cout << "[tgcli] Message sent to chat " << chat_id << "\n"; return 0; } else { - std::cerr << "[tgcli] Failed to send message: " - << message_controller_->get_last_error() << "\n"; + std::cerr << "[tgcli] Failed to send message: " + << message_controller_->get_last_error() << "\n"; return 1; } - } catch (const std::exception& e) { std::cerr << "[tgcli] send error: " << e.what() << "\n"; return 1; } -} \ No newline at end of file +} diff --git a/src/tgClient/TgClientTdlib.cpp b/src/tgClient/TgClientTdlib.cpp index 14198f4..585b30c 100644 --- a/src/tgClient/TgClientTdlib.cpp +++ b/src/tgClient/TgClientTdlib.cpp @@ -13,7 +13,7 @@ TgClientTdlib::TgClientTdlib() { - td::ClientManager::execute(td_api::make_object(1)); + td::ClientManager::execute(td_api::make_object(0)); client_manager_ = std::make_unique(); client_id_ = client_manager_->create_client_id(); } diff --git a/third_party/td b/third_party/td index 889bdf0..a9a8353 160000 --- a/third_party/td +++ b/third_party/td @@ -1 +1 @@ -Subproject commit 889bdf06029f98f3d04cac874dafab6f4f847c47 +Subproject commit a9a8353d4d879242001aeef55605ce4cd930513d