From 2b7ea39b1a367586d5fc062e6d0536b0463ff890 Mon Sep 17 00:00:00 2001 From: Tolmachev Igor Date: Mon, 6 Oct 2025 12:20:23 +0300 Subject: Init project --- .clangd | 2 + .gitignore | 2 + .gitmodules | 3 ++ CMakeLists.txt | 7 +++ README.md | 19 +++++++ client.cpp | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 21 ++++++++ td | 1 + 8 files changed, 218 insertions(+) create mode 100644 .clangd create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 client.cpp create mode 100644 main.cpp create mode 160000 td diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..a17128a --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Remove: [-flto-odr-type-merging] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..969e7ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.cache +build/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f1273f5 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "td"] + path = td + url = https://github.com/tdlib/td.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e09b51f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 4.1) + +project(AutoTelegramReaction) +add_executable(AutoTelegramReaction main.cpp) + +add_subdirectory(td) +target_link_libraries(AutoTelegramReaction PRIVATE Td::TdStatic) diff --git a/README.md b/README.md new file mode 100644 index 0000000..77f6b2d --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Auto telegram reaction + +Automatically sets reactions for the user + +## Build + +```sh +mkdir build && cd build +``` + +```sh +cmake DCMAKE_BUILD_TYPE=Release .. && cmake --build . +``` + +## Usage + +```sh +./AutoTelegramReaction +``` diff --git a/client.cpp b/client.cpp new file mode 100644 index 0000000..a64973e --- /dev/null +++ b/client.cpp @@ -0,0 +1,163 @@ +#include "td/telegram/Client.h" +#include "td/telegram/td_api.h" +#include +#include +#include + +using namespace td::td_api; + +class AutoReactClient { +private: + td::ClientManager manager; + int client_id; + bool is_authorized; + + int user_id; + string emoji; + +public: + AutoReactClient(int user_id, string emoji) { + td::ClientManager manager; + + this->manager = std::move(manager); + this->client_id = this->manager.create_client_id(); + this->is_authorized = false; + + this->manager.send( + client_id, 1, + td::td_api::make_object("version")); + + this->user_id = user_id; + this->emoji = emoji; + } + + void authorize() { + std::cout << "Client authorization" << std::endl; + + while (!this->is_authorized) { + auto response = this->manager.receive(10); + + if (response.object == NULL || (response.request_id != 0 && + response.object->get_id() != error::ID)) { + continue; + } + + switch (response.object->get_id()) { + case (updateAuthorizationState::ID): + on_auth_state( + move_object_as(response.object)); + break; + case (error::ID): + on_auth_error(move_object_as(response.object)); + break; + default: + continue; + } + } + } + + void loop() { + while (this->is_authorized) { + auto response = this->manager.receive(10); + + if (response.object == NULL || (response.request_id != 0 && + response.object->get_id() != error::ID)) { + continue; + } + + feed_update(std::move(response.object)); + } + } + +private: + void on_auth_error(object_ptr err) { + std::cout << "Error while authorizing: " << err->message_ << std::endl; + std::exit(1); + } + + void on_auth_state(object_ptr update) { + switch (update->authorization_state_->get_id()) { + case (authorizationStateWaitTdlibParameters::ID): + set_td_lib_params(); + break; + case (authorizationStateWaitPhoneNumber::ID): + input_phone_number(); + break; + case (authorizationStateWaitCode::ID): + input_auth_code(); + break; + case (authorizationStateWaitPassword::ID): + input_password(); + break; + case (authorizationStateReady::ID): + this->is_authorized = true; + break; + default: + std::cout << "Unhandled auth state: " + << to_string(update->authorization_state_) << std::endl; + break; + } + } + + void set_td_lib_params() { + auto request = make_object(); + request->database_directory_ = "tdlib/db"; + request->files_directory_ = "tdlib/files"; + request->api_id_ = 2092395; + request->api_hash_ = "38e26914cf0fda6356fda8f9d28f3bb9"; + request->system_language_code_ = "en"; + request->device_model_ = "auto reaction client"; + request->system_version_ = "1.0.0"; + request->application_version_ = "1.0.0"; + this->manager.send(this->client_id, 1, std::move(request)); + } + + void input_phone_number() { + auto request = make_object(); + std::cout << "Enter the phone number: "; + std::cin >> request->phone_number_; + this->manager.send(this->client_id, 1, std::move(request)); + } + + void input_auth_code() { + auto request = make_object(); + std::cout << "Enter auth code: "; + std::cin >> request->code_; + this->manager.send(this->client_id, 1, std::move(request)); + } + + void input_password() { + auto request = make_object(); + std::cout << "Enter password: "; + std::cin >> request->password_; + this->manager.send(this->client_id, 1, std::move(request)); + } + + void feed_update(object_ptr object) { + switch (object->get_id()) { + case (error::ID): + on_error(move_object_as(object)); + break; + case (updateNewMessage::ID): + on_new_message(move_object_as(object)); + break; + default: + break; + } + } + + void on_error(object_ptr err) {} + + void on_new_message(object_ptr update) { + if (update->message_->sender_id_->get_id() == messageSenderUser::ID && + move_object_as(update->message_->sender_id_) + ->user_id_ == this->user_id) { + auto request = make_object(); + request->chat_id_ = update->message_->chat_id_; + request->message_id_ = update->message_->id_; + request->reaction_type_ = make_object(this->emoji); + request->is_big_ = true; + this->manager.send(this->client_id, 1, std::move(request)); + } + } +}; diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..f70e6c0 --- /dev/null +++ b/main.cpp @@ -0,0 +1,21 @@ +#include "client.cpp" +#include +#include +#include + +int main(int argc, char *argv[]) { + td::ClientManager::execute( + td::td_api::make_object(0)); + + if (argc != 3) { + std::cout << "Must be exactly 2 arguments (user_id and reaction_emoji)" + << std::endl; + return 1; + } + + AutoReactClient client(std::atoi(argv[1]), argv[2]); + client.authorize(); + client.loop(); + + return 0; +} diff --git a/td b/td new file mode 160000 index 0000000..369ee92 --- /dev/null +++ b/td @@ -0,0 +1 @@ +Subproject commit 369ee922b45bfa7e8da357e4d62e93925862d86d -- cgit v1.2.3