diff --git a/CMakeLists.txt b/CMakeLists.txt
index 245e6a8..e875fcf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,12 @@ if (POLICY CMP0065)
cmake_policy(SET CMP0065 NEW)
endif()
-project(TelegramBotApi VERSION 5.3.1 LANGUAGES CXX)
+project(TelegramBotApi VERSION 5.3.3 LANGUAGES CXX)
+
+if (POLICY CMP0069)
+ option(TELEGRAM_BOT_API_ENABLE_LTO "Use \"ON\" to enable Link Time Optimization.")
+ set(TD_ENABLE_LTO "${TELEGRAM_BOT_API_ENABLE_LTO}" CACHE STRING "Enable LTO" FORCE)
+endif()
add_subdirectory(td EXCLUDE_FROM_ALL)
@@ -27,10 +32,27 @@ if (POLICY CMP0060)
# link libraries by full path
cmake_policy(SET CMP0060 NEW)
endif()
+if (POLICY CMP0074)
+ # use environment variables to find libraries
+ cmake_policy(SET CMP0074 NEW)
+endif()
include(PreventInSourceBuild)
prevent_in_source_build()
+if (POLICY CMP0069 AND TELEGRAM_BOT_API_ENABLE_LTO)
+ cmake_policy(SET CMP0069 NEW)
+ include(CheckIPOSupported)
+ check_ipo_supported(RESULT IPO_SUPPORTED LANGUAGES CXX)
+ if (IPO_SUPPORTED)
+ string(REPLACE ";" " " CXX_FLAGS_IPO "${CMAKE_CXX_COMPILE_OPTIONS_IPO}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_IPO}")
+
+ string(REPLACE ";" " " LINK_FLAGS_IPO "${CMAKE_CXX_LINK_OPTIONS_IPO}")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINK_FLAGS_IPO}")
+ endif()
+endif()
+
set(CMAKE_THREAD_PREFER_PTHREAD ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
diff --git a/build.html b/build.html
index f80af61..2b7a006 100644
--- a/build.html
+++ b/build.html
@@ -34,9 +34,8 @@ select.large { font-size: large; }
-
-
-
+
+
@@ -249,7 +248,6 @@ function onOptionsChanged() {
pre_text.push('Download and install Microsoft Visual Studio. Enable C++ support while installing.');
pre_text.push('Download and install CMake; choose "Add CMake to the system PATH" option while installing.');
pre_text.push('Download and install Git.');
- pre_text.push('Download and install gperf. Add the path to gperf.exe to the PATH environment variable.');
}
if (os_linux && linux_distro === 'Other') {
var compiler = use_clang ? 'clang >= 3.4' : 'g++ >= 4.9.2';
@@ -334,14 +332,13 @@ function onOptionsChanged() {
cmake = 'cmake3';
packages += ' gperf';
} else {
- commands.push(sudo + 'dnf --enablerepo=PowerTools install gperf');
+ commands.push(sudo + 'dnf --enablerepo=powertools install gperf');
}
packages += ' ' + cmake;
commands.push(sudo + 'yum install -y ' + packages);
break;
- case 'Debian 8':
- case 'Debian 9':
- case 'Debian 10':
+ case 'Debian 8/9':
+ case 'Debian 10+':
case 'Ubuntu 14':
case 'Ubuntu 16':
case 'Ubuntu 18':
@@ -362,7 +359,7 @@ function onOptionsChanged() {
}
if (use_clang) {
packages += ' clang' + getClangVersionSuffix() + ' libc++-dev';
- if (linux_distro === 'Debian 10' || linux_distro === 'Ubuntu 18' || linux_distro === 'Ubuntu 20') {
+ if (linux_distro === 'Debian 10+' || linux_distro === 'Ubuntu 18' || linux_distro === 'Ubuntu 20') {
packages += ' libc++abi-dev';
}
} else {
@@ -410,9 +407,9 @@ function onOptionsChanged() {
commands.push('cd vcpkg');
commands.push(local + 'bootstrap-vcpkg.bat');
if (build_64bit) {
- commands.push(local + 'vcpkg.exe install openssl:x64-windows zlib:x64-windows');
+ commands.push(local + 'vcpkg.exe install gperf:x64-windows openssl:x64-windows zlib:x64-windows');
} else {
- commands.push(local + 'vcpkg.exe install openssl:x86-windows zlib:x86-windows');
+ commands.push(local + 'vcpkg.exe install gperf:x86-windows openssl:x86-windows zlib:x86-windows');
}
commands.push('cd ..');
}
diff --git a/td b/td
index f8ab675..cf2be88 160000
--- a/td
+++ b/td
@@ -1 +1 @@
-Subproject commit f8ab675ad14080b1609b5904c366052c814d1788
+Subproject commit cf2be88c34b1b844fb9c2cdf28c3b5f0cce6be6b
diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp
index 1398791..8414ab8 100644
--- a/telegram-bot-api/Client.cpp
+++ b/telegram-bot-api/Client.cpp
@@ -377,7 +377,7 @@ class Client::JsonDatedFiles : public Jsonable {
class Client::JsonUser : public Jsonable {
public:
- JsonUser(int32 user_id, const Client *client, bool full_bot_info = false)
+ JsonUser(int64 user_id, const Client *client, bool full_bot_info = false)
: user_id_(user_id), client_(client), full_bot_info_(full_bot_info) {
}
void store(JsonValueScope *scope) const {
@@ -416,14 +416,14 @@ class Client::JsonUser : public Jsonable {
}
private:
- int32 user_id_;
+ int64 user_id_;
const Client *client_;
bool full_bot_info_;
};
class Client::JsonUsers : public Jsonable {
public:
- JsonUsers(const td::vector &user_ids, const Client *client) : user_ids_(user_ids), client_(client) {
+ JsonUsers(const td::vector &user_ids, const Client *client) : user_ids_(user_ids), client_(client) {
}
void store(JsonValueScope *scope) const {
auto array = scope->enter_array();
@@ -433,7 +433,7 @@ class Client::JsonUsers : public Jsonable {
}
private:
- const td::vector &user_ids_;
+ const td::vector &user_ids_;
const Client *client_;
};
@@ -524,7 +524,9 @@ class Client::JsonVectorEntities : public Jsonable {
void store(JsonValueScope *scope) const {
auto array = scope->enter_array();
for (auto &entity : entities_) {
- if (entity->type_->get_id() != td_api::textEntityTypeBankCardNumber::ID) {
+ auto entity_type = entity->type_->get_id();
+ if (entity_type != td_api::textEntityTypeBankCardNumber::ID &&
+ entity_type != td_api::textEntityTypeMediaTimestamp::ID) {
array << JsonEntity(entity.get(), client_);
}
}
@@ -1533,15 +1535,9 @@ class Client::JsonVoiceChatScheduled : public Jsonable {
class Client::JsonVoiceChatStarted : public Jsonable {
public:
- explicit JsonVoiceChatStarted(const td_api::messageVoiceChatStarted *voice_chat_started)
- : voice_chat_started_(voice_chat_started) {
- }
void store(JsonValueScope *scope) const {
auto object = scope->enter_object();
}
-
- private:
- const td_api::messageVoiceChatStarted *voice_chat_started_;
};
class Client::JsonVoiceChatEnded : public Jsonable {
@@ -1848,7 +1844,7 @@ void Client::JsonMessage::store(JsonValueScope *scope) const {
}
case td_api::messageChatAddMembers::ID: {
auto message_add_members = static_cast(message_->content.get());
- int32 user_id = client_->choose_added_member_id(message_add_members);
+ int64 user_id = client_->choose_added_member_id(message_add_members);
if (user_id > 0) {
object("new_chat_participant", JsonUser(user_id, client_));
object("new_chat_member", JsonUser(user_id, client_));
@@ -1868,7 +1864,7 @@ void Client::JsonMessage::store(JsonValueScope *scope) const {
}
case td_api::messageChatDeleteMember::ID: {
auto message_delete_member = static_cast(message_->content.get());
- int32 user_id = message_delete_member->user_id_;
+ int64 user_id = message_delete_member->user_id_;
object("left_chat_participant", JsonUser(user_id, client_));
object("left_chat_member", JsonUser(user_id, client_));
break;
@@ -1961,6 +1957,8 @@ void Client::JsonMessage::store(JsonValueScope *scope) const {
break;
case td_api::messageCustomServiceAction::ID:
break;
+ case td_api::messageChatSetTheme::ID:
+ break;
case td_api::messageWebsiteConnected::ID: {
auto chat = client_->get_chat(message_->chat_id);
if (chat->type != ChatInfo::Type::Private) {
@@ -1991,11 +1989,9 @@ void Client::JsonMessage::store(JsonValueScope *scope) const {
object("voice_chat_scheduled", JsonVoiceChatScheduled(content));
break;
}
- case td_api::messageVoiceChatStarted::ID: {
- auto content = static_cast(message_->content.get());
- object("voice_chat_started", JsonVoiceChatStarted(content));
+ case td_api::messageVoiceChatStarted::ID:
+ object("voice_chat_started", JsonVoiceChatStarted());
break;
- }
case td_api::messageVoiceChatEnded::ID: {
auto content = static_cast(message_->content.get());
object("voice_chat_ended", JsonVoiceChatEnded(content));
@@ -2050,7 +2046,7 @@ class Client::JsonMessageId : public Jsonable {
class Client::JsonInlineQuery : public Jsonable {
public:
- JsonInlineQuery(int64 inline_query_id, int32 sender_user_id, const td_api::location *user_location,
+ JsonInlineQuery(int64 inline_query_id, int64 sender_user_id, const td_api::location *user_location,
const td_api::ChatType *chat_type, const td::string &query, const td::string &offset,
const Client *client)
: inline_query_id_(inline_query_id)
@@ -2106,7 +2102,7 @@ class Client::JsonInlineQuery : public Jsonable {
private:
int64 inline_query_id_;
- int32 sender_user_id_;
+ int64 sender_user_id_;
const td_api::location *user_location_;
const td_api::ChatType *chat_type_;
const td::string &query_;
@@ -2116,7 +2112,7 @@ class Client::JsonInlineQuery : public Jsonable {
class Client::JsonChosenInlineResult : public Jsonable {
public:
- JsonChosenInlineResult(int32 sender_user_id, const td_api::location *user_location, const td::string &query,
+ JsonChosenInlineResult(int64 sender_user_id, const td_api::location *user_location, const td::string &query,
const td::string &result_id, const td::string &inline_message_id, const Client *client)
: sender_user_id_(sender_user_id)
, user_location_(user_location)
@@ -2140,7 +2136,7 @@ class Client::JsonChosenInlineResult : public Jsonable {
}
private:
- int32 sender_user_id_;
+ int64 sender_user_id_;
const td_api::location *user_location_;
const td::string &query_;
const td::string &result_id_;
@@ -2150,7 +2146,7 @@ class Client::JsonChosenInlineResult : public Jsonable {
class Client::JsonCallbackQuery : public Jsonable {
public:
- JsonCallbackQuery(int64 callback_query_id, int32 sender_user_id, int64 chat_id, int64 message_id,
+ JsonCallbackQuery(int64 callback_query_id, int64 sender_user_id, int64 chat_id, int64 message_id,
const MessageInfo *message_info, int64 chat_instance, td_api::CallbackQueryPayload *payload,
const Client *client)
: callback_query_id_(callback_query_id)
@@ -2178,7 +2174,7 @@ class Client::JsonCallbackQuery : public Jsonable {
private:
int64 callback_query_id_;
- int32 sender_user_id_;
+ int64 sender_user_id_;
int64 chat_id_;
int64 message_id_;
const MessageInfo *message_info_;
@@ -2189,7 +2185,7 @@ class Client::JsonCallbackQuery : public Jsonable {
class Client::JsonInlineCallbackQuery : public Jsonable {
public:
- JsonInlineCallbackQuery(int64 callback_query_id, int32 sender_user_id, const td::string &inline_message_id,
+ JsonInlineCallbackQuery(int64 callback_query_id, int64 sender_user_id, const td::string &inline_message_id,
int64 chat_instance, td_api::CallbackQueryPayload *payload, const Client *client)
: callback_query_id_(callback_query_id)
, sender_user_id_(sender_user_id)
@@ -2210,7 +2206,7 @@ class Client::JsonInlineCallbackQuery : public Jsonable {
private:
int64 callback_query_id_;
- int32 sender_user_id_;
+ int64 sender_user_id_;
const td::string &inline_message_id_;
int64 chat_instance_;
td_api::CallbackQueryPayload *payload_;
@@ -3384,7 +3380,7 @@ class Client::TdOnGetEditedMessageCallback : public TdQueryCallback {
class Client::TdOnGetCallbackQueryMessageCallback : public TdQueryCallback {
public:
- TdOnGetCallbackQueryMessageCallback(Client *client, int32 user_id, int state)
+ TdOnGetCallbackQueryMessageCallback(Client *client, int64 user_id, int state)
: client_(client), user_id_(user_id), state_(state) {
}
@@ -3403,13 +3399,13 @@ class Client::TdOnGetCallbackQueryMessageCallback : public TdQueryCallback {
private:
Client *client_;
- int32 user_id_;
+ int64 user_id_;
int state_;
};
class Client::TdOnGetStickerSetCallback : public TdQueryCallback {
public:
- TdOnGetStickerSetCallback(Client *client, int64 set_id, int32 new_callback_query_user_id, int64 new_message_chat_id)
+ TdOnGetStickerSetCallback(Client *client, int64 set_id, int64 new_callback_query_user_id, int64 new_message_chat_id)
: client_(client)
, set_id_(set_id)
, new_callback_query_user_id_(new_callback_query_user_id)
@@ -3435,7 +3431,7 @@ class Client::TdOnGetStickerSetCallback : public TdQueryCallback {
private:
Client *client_;
int64 set_id_;
- int32 new_callback_query_user_id_;
+ int64 new_callback_query_user_id_;
int64 new_message_chat_id_;
};
@@ -3646,9 +3642,6 @@ class Client::TdOnGetSupergroupMembersCountCallback : public TdQueryCallback {
CHECK(result->get_id() == td_api::supergroupFullInfo::ID);
auto supergroup_full_info = move_object_as(result);
- if (supergroup_full_info->member_count_ == 0) {
- return fail_query(400, "Bad Request: need administrator rights", std::move(query_));
- }
return answer_query(td::VirtuallyJsonableInt(supergroup_full_info->member_count_), std::move(query_));
}
@@ -4164,7 +4157,7 @@ void Client::on_get_edited_message(object_ptr edited_message) {
}
}
-void Client::on_get_callback_query_message(object_ptr message, int32 user_id, int state) {
+void Client::on_get_callback_query_message(object_ptr message, int64 user_id, int state) {
CHECK(user_id != 0);
auto &queue = new_callback_query_queues_[user_id];
CHECK(queue.has_active_request_);
@@ -4198,7 +4191,7 @@ void Client::on_get_callback_query_message(object_ptr message,
process_new_callback_query_queue(user_id, state + 1);
}
-void Client::on_get_sticker_set(int64 set_id, int32 new_callback_query_user_id, int64 new_message_chat_id,
+void Client::on_get_sticker_set(int64 set_id, int64 new_callback_query_user_id, int64 new_message_chat_id,
object_ptr sticker_set) {
if (new_callback_query_user_id != 0) {
auto &queue = new_callback_query_queues_[new_callback_query_user_id];
@@ -4248,7 +4241,7 @@ void Client::check_user_read_access(const UserInfo *user_info, PromisedQueryPtr
}
template
-void Client::check_user(int32 user_id, PromisedQueryPtr query, OnSuccess on_success) {
+void Client::check_user(int64 user_id, PromisedQueryPtr query, OnSuccess on_success) {
const UserInfo *user_info = get_user_info(user_id);
if (user_info != nullptr) {
return check_user_read_access(user_info, std::move(query), std::move(on_success));
@@ -4258,7 +4251,7 @@ void Client::check_user(int32 user_id, PromisedQueryPtr query, OnSuccess on_succ
}
template
-void Client::check_user_no_fail(int32 user_id, PromisedQueryPtr query, OnSuccess on_success) {
+void Client::check_user_no_fail(int64 user_id, PromisedQueryPtr query, OnSuccess on_success) {
const UserInfo *user_info = get_user_info(user_id);
if (user_info != nullptr) {
on_success(std::move(query));
@@ -4559,7 +4552,7 @@ void Client::resolve_inline_query_results_bot_usernames(td::vectorsecond.empty());
@@ -4594,7 +4587,7 @@ void Client::on_resolve_bot_username(const td::string &username, int32 user_id)
}
template
-void Client::get_chat_member(int64 chat_id, int32 user_id, PromisedQueryPtr query, OnSuccess on_success) {
+void Client::get_chat_member(int64 chat_id, int64 user_id, PromisedQueryPtr query, OnSuccess on_success) {
check_user_no_fail(
user_id, std::move(query),
[this, chat_id, user_id, on_success = std::move(on_success)](PromisedQueryPtr query) mutable {
@@ -4995,17 +4988,15 @@ void Client::on_update(object_ptr result) {
my_id_ = -1;
} else {
CHECK(update->value_->get_id() == td_api::optionValueInteger::ID);
- my_id_ = static_cast(move_object_as(update->value_)->value_);
+ my_id_ = move_object_as(update->value_)->value_;
}
}
if (name == "group_anonymous_bot_user_id" && update->value_->get_id() == td_api::optionValueInteger::ID) {
- group_anonymous_bot_user_id_ =
- static_cast(move_object_as(update->value_)->value_);
+ group_anonymous_bot_user_id_ = move_object_as(update->value_)->value_;
}
if (name == "telegram_service_notifications_chat_id" &&
update->value_->get_id() == td_api::optionValueInteger::ID) {
- service_notifications_user_id_ =
- static_cast(move_object_as(update->value_)->value_);
+ service_notifications_user_id_ = move_object_as(update->value_)->value_;
}
if (name == "authorization_date") {
if (update->value_->get_id() == td_api::optionValueEmpty::ID) {
@@ -5074,7 +5065,7 @@ void Client::on_update(object_ptr result) {
add_update_chat_member(move_object_as(result));
break;
default:
- // we are not interested in this updates
+ // we are not interested in this update
break;
}
}
@@ -5306,7 +5297,7 @@ td::Result> Client::get_inline_
TRY_RESULT(request_write_access, get_json_object_bool_field(login_url_object, "request_write_access"));
TRY_RESULT(forward_text, get_json_object_string_field(login_url_object, "forward_text"));
- int32 bot_user_id = 0;
+ int64 bot_user_id = 0;
if (bot_username.empty()) {
bot_user_id = my_id_;
} else {
@@ -6161,7 +6152,7 @@ td::Result Client::get_bot_command_scope(JsonValue &&va
return BotCommandScope(make_object(0), std::move(chat_id));
}
- TRY_RESULT(user_id, get_json_object_int_field(object, "user_id", false));
+ TRY_RESULT(user_id, get_json_object_long_field(object, "user_id", false));
if (user_id <= 0) {
return Status::Error(400, "Invalid user_id specified");
}
@@ -6500,7 +6491,7 @@ td::Result> Client::get_text_entity_t
if (type == "text_mention") {
TRY_RESULT(user, get_json_object_field(object, "user", JsonValue::Type::Object, false));
CHECK(user.type() == JsonValue::Type::Object);
- TRY_RESULT(user_id, get_json_object_int_field(user.get_object(), "id", false));
+ TRY_RESULT(user_id, get_json_object_long_field(user.get_object(), "id", false));
return make_object(user_id);
}
if (type == "mention" || type == "hashtag" || type == "cashtag" || type == "bot_command" || type == "url" ||
@@ -6857,8 +6848,8 @@ td::Result Client::get_inline_message_id(const Query *query, Slice fi
return s_arg;
}
-td::Result Client::get_user_id(const Query *query, Slice field_name) {
- int32 user_id = get_integer_arg(query, field_name, 0, 0);
+td::Result Client::get_user_id(const Query *query, Slice field_name) {
+ int64 user_id = td::max(td::to_integer(query->arg(field_name)), static_cast(0));
if (user_id == 0) {
return Status::Error(400, PSLICE() << "Invalid " << field_name << " specified");
}
@@ -7033,9 +7024,9 @@ void Client::on_message_send_succeeded(object_ptr &&message, in
auto &query = pending_send_message_queries_[query_id];
if (query.is_multisend) {
query.messages.push_back(td::json_encode(JsonMessage(message_info, true, "sent message", this)));
- query.awaited_messages--;
+ query.awaited_message_count--;
- if (query.awaited_messages == 0) {
+ if (query.awaited_message_count == 0) {
if (query.error == nullptr) {
answer_query(JsonMessages(query.messages), std::move(query.query));
} else {
@@ -7044,7 +7035,7 @@ void Client::on_message_send_succeeded(object_ptr &&message, in
pending_send_message_queries_.erase(query_id);
}
} else {
- CHECK(query.awaited_messages == 1);
+ CHECK(query.awaited_message_count == 1);
if (query.query->method() == "copymessage") {
answer_query(JsonMessageId(new_message_id), std::move(query.query));
} else {
@@ -7063,14 +7054,14 @@ void Client::on_message_send_failed(int64 chat_id, int64 old_message_id, int64 n
if (query.error == nullptr) {
query.error = std::move(error);
}
- query.awaited_messages--;
+ query.awaited_message_count--;
- if (query.awaited_messages == 0) {
+ if (query.awaited_message_count == 0) {
fail_query_with_error(std::move(query.query), std::move(query.error));
pending_send_message_queries_.erase(query_id);
}
} else {
- CHECK(query.awaited_messages == 1);
+ CHECK(query.awaited_message_count == 1);
fail_query_with_error(std::move(query.query), std::move(error));
pending_send_message_queries_.erase(query_id);
}
@@ -9380,7 +9371,7 @@ void Client::on_sent_message(object_ptr &&message, int64 query_
yet_unsent_message.send_message_query_id = query_id;
auto emplace_result = yet_unsent_messages_.emplace(yet_unsent_message_id, yet_unsent_message);
CHECK(emplace_result.second);
- pending_send_message_queries_[query_id].awaited_messages++;
+ pending_send_message_queries_[query_id].awaited_message_count++;
}
void Client::abort_long_poll(bool from_set_webhook) {
@@ -9545,7 +9536,7 @@ void Client::long_poll_wakeup(bool force_flag) {
}
}
-void Client::add_user(std::unordered_map &users, object_ptr &&user) {
+void Client::add_user(std::unordered_map &users, object_ptr &&user) {
auto user_info = &users[user->id_];
user_info->first_name = std::move(user->first_name_);
user_info->last_name = std::move(user->last_name_);
@@ -9583,17 +9574,17 @@ void Client::add_user(std::unordered_map &users, object_ptrsecond;
}
-void Client::set_user_bio(int32 user_id, td::string &&bio) {
+void Client::set_user_bio(int64 user_id, td::string &&bio) {
auto user_info = &users_[user_id];
user_info->bio = std::move(bio);
}
-void Client::add_group(std::unordered_map &groups, object_ptr &&group) {
+void Client::add_group(std::unordered_map &groups, object_ptr &&group) {
auto group_info = &groups[group->id_];
group_info->member_count = group->member_count_;
group_info->left = group->status_->get_id() == td_api::chatMemberStatusLeft::ID;
@@ -9605,22 +9596,22 @@ void Client::add_group(std::unordered_map &groups, object_ptr<
}
}
-const Client::GroupInfo *Client::get_group_info(int32 group_id) const {
+const Client::GroupInfo *Client::get_group_info(int64 group_id) const {
auto it = groups_.find(group_id);
return it == groups_.end() ? nullptr : &it->second;
}
-void Client::set_group_description(int32 group_id, td::string &&descripton) {
+void Client::set_group_description(int64 group_id, td::string &&descripton) {
auto group_info = &groups_[group_id];
group_info->description = std::move(descripton);
}
-void Client::set_group_invite_link(int32 group_id, td::string &&invite_link) {
+void Client::set_group_invite_link(int64 group_id, td::string &&invite_link) {
auto group_info = &groups_[group_id];
group_info->invite_link = std::move(invite_link);
}
-void Client::add_supergroup(std::unordered_map &supergroups,
+void Client::add_supergroup(std::unordered_map &supergroups,
object_ptr &&supergroup) {
auto supergroup_info = &supergroups[supergroup->id_];
supergroup_info->username = std::move(supergroup->username_);
@@ -9635,42 +9626,42 @@ void Client::add_supergroup(std::unordered_map &supergrou
// end custom properties
}
-void Client::set_supergroup_description(int32 supergroup_id, td::string &&descripton) {
+void Client::set_supergroup_description(int64 supergroup_id, td::string &&descripton) {
auto supergroup_info = &supergroups_[supergroup_id];
supergroup_info->description = std::move(descripton);
}
-void Client::set_supergroup_invite_link(int32 supergroup_id, td::string &&invite_link) {
+void Client::set_supergroup_invite_link(int64 supergroup_id, td::string &&invite_link) {
auto supergroup_info = &supergroups_[supergroup_id];
supergroup_info->invite_link = std::move(invite_link);
}
-void Client::set_supergroup_sticker_set_id(int32 supergroup_id, int64 sticker_set_id) {
+void Client::set_supergroup_sticker_set_id(int64 supergroup_id, int64 sticker_set_id) {
auto supergroup_info = &supergroups_[supergroup_id];
supergroup_info->sticker_set_id = sticker_set_id;
}
-void Client::set_supergroup_can_set_sticker_set(int32 supergroup_id, bool can_set_sticker_set) {
+void Client::set_supergroup_can_set_sticker_set(int64 supergroup_id, bool can_set_sticker_set) {
auto supergroup_info = &supergroups_[supergroup_id];
supergroup_info->can_set_sticker_set = can_set_sticker_set;
}
-void Client::set_supergroup_slow_mode_delay(int32 supergroup_id, int32 slow_mode_delay) {
+void Client::set_supergroup_slow_mode_delay(int64 supergroup_id, int32 slow_mode_delay) {
auto supergroup_info = &supergroups_[supergroup_id];
supergroup_info->slow_mode_delay = slow_mode_delay;
}
-void Client::set_supergroup_linked_chat_id(int32 supergroup_id, int64 linked_chat_id) {
+void Client::set_supergroup_linked_chat_id(int64 supergroup_id, int64 linked_chat_id) {
auto supergroup_info = &supergroups_[supergroup_id];
supergroup_info->linked_chat_id = linked_chat_id;
}
-void Client::set_supergroup_location(int32 supergroup_id, object_ptr location) {
+void Client::set_supergroup_location(int64 supergroup_id, object_ptr location) {
auto supergroup_info = &supergroups_[supergroup_id];
supergroup_info->location = std::move(location);
}
-const Client::SupergroupInfo *Client::get_supergroup_info(int32 supergroup_id) const {
+const Client::SupergroupInfo *Client::get_supergroup_info(int64 supergroup_id) const {
auto it = supergroups_.find(supergroup_id);
return it == supergroups_.end() ? nullptr : &it->second;
}
@@ -10003,7 +9994,7 @@ void Client::add_update_poll_answer(object_ptr &&updat
add_update(UpdateType::PollAnswer, JsonPollAnswer(update.get(), this), 86400, update->poll_id_);
}
-void Client::add_new_inline_query(int64 inline_query_id, int32 sender_user_id, object_ptr location,
+void Client::add_new_inline_query(int64 inline_query_id, int64 sender_user_id, object_ptr location,
object_ptr chat_type, const td::string &query,
const td::string &offset) {
add_update(UpdateType::InlineQuery,
@@ -10011,7 +10002,7 @@ void Client::add_new_inline_query(int64 inline_query_id, int32 sender_user_id, o
sender_user_id + (static_cast(1) << 33));
}
-void Client::add_new_chosen_inline_result(int32 sender_user_id, object_ptr location,
+void Client::add_new_chosen_inline_result(int64 sender_user_id, object_ptr location,
const td::string &query, const td::string &result_id,
const td::string &inline_message_id) {
add_update(UpdateType::ChosenInlineResult,
@@ -10030,7 +10021,7 @@ void Client::add_new_callback_query(object_ptr &
process_new_callback_query_queue(user_id, 0);
}
-void Client::process_new_callback_query_queue(int32 user_id, int state) {
+void Client::process_new_callback_query_queue(int64 user_id, int state) {
auto &queue = new_callback_query_queues_[user_id];
if (queue.has_active_request_) {
CHECK(state == 0);
@@ -10146,7 +10137,7 @@ void Client::add_update_chat_member(object_ptr &&updat
}
}
-td::int32 Client::choose_added_member_id(const td_api::messageChatAddMembers *message_add_members) const {
+td::int64 Client::choose_added_member_id(const td_api::messageChatAddMembers *message_add_members) const {
CHECK(message_add_members != nullptr);
for (auto &member_user_id : message_add_members->member_user_ids_) {
if (member_user_id == my_id_) {
@@ -10284,6 +10275,8 @@ bool Client::need_skip_update_message(int64 chat_id, const object_ptr(-1000000000000ll) - static_cast(supergroup_id);
+ return static_cast(-1000000000000ll) - supergroup_id;
}
-td::int64 Client::get_basic_group_chat_id(int32 basic_group_id) {
- return -static_cast(basic_group_id);
+td::int64 Client::get_basic_group_chat_id(int64 basic_group_id) {
+ return -basic_group_id;
}
constexpr Client::int64 Client::GREAT_MINDS_SET_ID;
diff --git a/telegram-bot-api/Client.h b/telegram-bot-api/Client.h
index 4330a3c..feded1c 100644
--- a/telegram-bot-api/Client.h
+++ b/telegram-bot-api/Client.h
@@ -221,9 +221,9 @@ class Client : public WebhookActor::Callback {
void on_get_edited_message(object_ptr edited_message);
- void on_get_callback_query_message(object_ptr message, int32 user_id, int state);
+ void on_get_callback_query_message(object_ptr message, int64 user_id, int state);
- void on_get_sticker_set(int64 set_id, int32 new_callback_query_user_id, int64 new_message_chat_id,
+ void on_get_sticker_set(int64 set_id, int64 new_callback_query_user_id, int64 new_message_chat_id,
object_ptr sticker_set);
void on_get_sticker_set_name(int64 set_id, const td::string &name);
@@ -270,10 +270,10 @@ class Client : public WebhookActor::Callback {
class TdOnResolveBotUsernameCallback;
template
- void check_user(int32 user_id, PromisedQueryPtr query, OnSuccess on_success);
+ void check_user(int64 user_id, PromisedQueryPtr query, OnSuccess on_success);
template
- void check_user_no_fail(int32 user_id, PromisedQueryPtr query, OnSuccess on_success);
+ void check_user_no_fail(int64 user_id, PromisedQueryPtr query, OnSuccess on_success);
template
static void check_user_read_access(const UserInfo *user_info, PromisedQueryPtr query, OnSuccess on_success);
@@ -315,7 +315,7 @@ class Client : public WebhookActor::Callback {
PromisedQueryPtr query, OnSuccess on_success);
template
- void get_chat_member(int64 chat_id, int32 user_id, PromisedQueryPtr query, OnSuccess on_success);
+ void get_chat_member(int64 chat_id, int64 user_id, PromisedQueryPtr query, OnSuccess on_success);
void send_request(object_ptr &&f, std::unique_ptr handler);
void do_send_request(object_ptr &&f, std::unique_ptr handler);
@@ -381,10 +381,10 @@ class Client : public WebhookActor::Callback {
struct BotCommandScope {
object_ptr scope_;
td::string chat_id_;
- td::int32 user_id_ = 0;
+ td::int64 user_id_ = 0;
explicit BotCommandScope(object_ptr scope, td::string chat_id = td::string(),
- td::int32 user_id = 0)
+ td::int64 user_id = 0)
: scope_(std::move(scope)), chat_id_(std::move(chat_id)), user_id_(user_id) {
}
};
@@ -465,7 +465,7 @@ class Client : public WebhookActor::Callback {
static td::Result get_inline_message_id(const Query *query, Slice field_name = Slice("inline_message_id"));
- static td::Result get_user_id(const Query *query, Slice field_name = Slice("user_id"));
+ static td::Result get_user_id(const Query *query, Slice field_name = Slice("user_id"));
int64 extract_yet_unsent_message_query_id(int64 chat_id, int64 message_id, bool *is_reply_to_message_deleted);
@@ -636,7 +636,7 @@ class Client : public WebhookActor::Callback {
void fix_inline_query_results_bot_user_ids(td::vector> &results) const;
void resolve_bot_usernames(PromisedQueryPtr query, td::Promise on_success);
- void on_resolve_bot_username(const td::string &username, int32 user_id);
+ void on_resolve_bot_username(const td::string &username, int64 user_id);
void abort_long_poll(bool from_set_webhook);
@@ -682,9 +682,9 @@ class Client : public WebhookActor::Callback {
bool can_read_all_group_messages = false;
bool is_inline_bot = false;
};
- static void add_user(std::unordered_map &users, object_ptr &&user);
- void set_user_bio(int32 user_id, td::string &&bio);
- const UserInfo *get_user_info(int32 user_id) const;
+ static void add_user(std::unordered_map &users, object_ptr &&user);
+ void set_user_bio(int64 user_id, td::string &&bio);
+ const UserInfo *get_user_info(int64 user_id) const;
struct GroupInfo {
td::string description;
@@ -693,12 +693,12 @@ class Client : public WebhookActor::Callback {
bool left = false;
bool kicked = false;
bool is_active = false;
- int32 upgraded_to_supergroup_id = 0;
+ int64 upgraded_to_supergroup_id = 0;
};
- static void add_group(std::unordered_map &groups, object_ptr &&group);
- void set_group_description(int32 group_id, td::string &&descripton);
- void set_group_invite_link(int32 group_id, td::string &&invite_link);
- const GroupInfo *get_group_info(int32 group_id) const;
+ static void add_group(std::unordered_map &groups, object_ptr &&group);
+ void set_group_description(int64 group_id, td::string &&descripton);
+ void set_group_invite_link(int64 group_id, td::string &&invite_link);
+ const GroupInfo *get_group_info(int64 group_id) const;
struct SupergroupInfo {
td::string username;
@@ -719,16 +719,16 @@ class Client : public WebhookActor::Callback {
bool is_scam = false;
// end custom properties
};
- static void add_supergroup(std::unordered_map &supergroups,
+ static void add_supergroup(std::unordered_map &supergroups,
object_ptr &&supergroup);
- void set_supergroup_description(int32 supergroup_id, td::string &&descripton);
- void set_supergroup_invite_link(int32 supergroup_id, td::string &&invite_link);
- void set_supergroup_sticker_set_id(int32 supergroup_id, int64 sticker_set_id);
- void set_supergroup_can_set_sticker_set(int32 supergroup_id, bool can_set_sticker_set);
- void set_supergroup_slow_mode_delay(int32 supergroup_id, int32 slow_mode_delay);
- void set_supergroup_linked_chat_id(int32 supergroup_id, int64 linked_chat_id);
- void set_supergroup_location(int32 supergroup_id, object_ptr location);
- const SupergroupInfo *get_supergroup_info(int32 supergroup_id) const;
+ void set_supergroup_description(int64 supergroup_id, td::string &&descripton);
+ void set_supergroup_invite_link(int64 supergroup_id, td::string &&invite_link);
+ void set_supergroup_sticker_set_id(int64 supergroup_id, int64 sticker_set_id);
+ void set_supergroup_can_set_sticker_set(int64 supergroup_id, bool can_set_sticker_set);
+ void set_supergroup_slow_mode_delay(int64 supergroup_id, int32 slow_mode_delay);
+ void set_supergroup_linked_chat_id(int64 supergroup_id, int64 linked_chat_id);
+ void set_supergroup_location(int64 supergroup_id, object_ptr location);
+ const SupergroupInfo *get_supergroup_info(int64 supergroup_id) const;
struct ChatInfo {
enum class Type { Private, Group, Supergroup, Unknown };
@@ -738,9 +738,9 @@ class Client : public WebhookActor::Callback {
object_ptr photo;
object_ptr permissions;
union {
- int32 user_id;
- int32 group_id;
- int32 supergroup_id;
+ int64 user_id;
+ int64 group_id;
+ int64 supergroup_id;
};
};
ChatInfo *add_chat(int64 chat_id);
@@ -758,13 +758,13 @@ class Client : public WebhookActor::Callback {
mutable const MessageInfo *lru_prev = nullptr;
int64 id = 0;
- int32 sender_user_id = 0;
+ int64 sender_user_id = 0;
int64 sender_chat_id = 0;
int64 chat_id = 0;
int32 date = 0;
int32 edit_date = 0;
int64 initial_chat_id = 0;
- int32 initial_sender_user_id = 0;
+ int64 initial_sender_user_id = 0;
int64 initial_sender_chat_id = 0;
int32 initial_send_date = 0;
int64 initial_message_id = 0;
@@ -774,7 +774,7 @@ class Client : public WebhookActor::Callback {
int64 reply_to_message_id = 0;
int64 message_thread_id = 0;
int64 media_album_id = 0;
- int32 via_bot_user_id = 0;
+ int64 via_bot_user_id = 0;
object_ptr content;
object_ptr reply_markup;
@@ -810,7 +810,7 @@ class Client : public WebhookActor::Callback {
Slice get_sticker_set_name(int64 sticker_set_id) const;
- int32 choose_added_member_id(const td_api::messageChatAddMembers *message_add_members) const;
+ int64 choose_added_member_id(const td_api::messageChatAddMembers *message_add_members) const;
bool need_skip_update_message(int64 chat_id, const object_ptr &message, bool is_edited) const;
@@ -870,23 +870,23 @@ class Client : public WebhookActor::Callback {
static int32 as_scheduled_message_id(int64 message_id);
- static int64 get_supergroup_chat_id(int32 supergroup_id);
+ static int64 get_supergroup_chat_id(int64 supergroup_id);
- static int64 get_basic_group_chat_id(int32 basic_group_id);
+ static int64 get_basic_group_chat_id(int64 basic_group_id);
void add_update_poll(object_ptr &&update);
void add_update_poll_answer(object_ptr &&update);
- void add_new_inline_query(int64 inline_query_id, int32 sender_user_id, object_ptr location,
+ void add_new_inline_query(int64 inline_query_id, int64 sender_user_id, object_ptr location,
object_ptr chat_type, const td::string &query, const td::string &offset);
- void add_new_chosen_inline_result(int32 sender_user_id, object_ptr location,
+ void add_new_chosen_inline_result(int64 sender_user_id, object_ptr location,
const td::string &query, const td::string &result_id,
const td::string &inline_message_id);
void add_new_callback_query(object_ptr &&query);
- void process_new_callback_query_queue(int32 user_id, int state);
+ void process_new_callback_query_queue(int64 user_id, int state);
void add_new_inline_callback_query(object_ptr &&query);
@@ -966,19 +966,19 @@ class Client : public WebhookActor::Callback {
int64 tqueue_id_;
double start_time_ = 0;
- int32 my_id_ = -1;
+ int64 my_id_ = -1;
int32 authorization_date_ = -1;
- int32 group_anonymous_bot_user_id_ = 0;
- int32 service_notifications_user_id_ = 0;
+ int64 group_anonymous_bot_user_id_ = 0;
+ int64 service_notifications_user_id_ = 0;
static std::unordered_map methods_;
MessageInfo messages_lru_root_;
std::unordered_map, FullMessageIdHash> messages_; // message cache
- std::unordered_map users_; // user info cache
- std::unordered_map groups_; // group info cache
- std::unordered_map supergroups_; // supergroup info cache
+ std::unordered_map users_; // user info cache
+ std::unordered_map groups_; // group info cache
+ std::unordered_map supergroups_; // supergroup info cache
std::unordered_map chats_; // chat info cache
std::unordered_map, FullMessageIdHash>
@@ -1001,7 +1001,7 @@ class Client : public WebhookActor::Callback {
struct PendingSendMessageQuery {
PromisedQueryPtr query;
bool is_multisend = false;
- int32 awaited_messages = 0;
+ int32 awaited_message_count = 0;
td::vector messages;
object_ptr error;
};
@@ -1027,14 +1027,14 @@ class Client : public WebhookActor::Callback {
std::queue> queue_;
bool has_active_request_ = false;
};
- std::unordered_map new_callback_query_queues_; // sender_user_id -> queue
+ std::unordered_map new_callback_query_queues_; // sender_user_id -> queue
std::unordered_map sticker_set_names_;
- int32 cur_temp_bot_user_id_ = 1;
- std::unordered_map bot_user_ids_;
+ int64 cur_temp_bot_user_id_ = 1;
+ std::unordered_map bot_user_ids_;
std::unordered_set unresolved_bot_usernames_;
- std::unordered_map temp_to_real_bot_user_id_;
+ std::unordered_map temp_to_real_bot_user_id_;
std::unordered_map> awaiting_bot_resolve_queries_;
struct PendingBotResolveQuery {
diff --git a/telegram-bot-api/ClientManager.cpp b/telegram-bot-api/ClientManager.cpp
index 3fc9106..170ac66 100644
--- a/telegram-bot-api/ClientManager.cpp
+++ b/telegram-bot-api/ClientManager.cpp
@@ -220,16 +220,28 @@ void ClientManager::get_stats(td::PromiseActor promise,
}
td::Slice id_filter;
+ int new_verbosity_level = -1;
+ td::string tag;
for (auto &arg : args) {
if (arg.first == "id") {
id_filter = arg.second;
}
if (arg.first == "v") {
- auto r_verbosity = td::to_integer_safe(arg.second);
- if (r_verbosity.is_ok()) {
- parameters_->shared_data_->next_verbosity_level_ = r_verbosity.ok();
+ auto r_new_verbosity_level = td::to_integer_safe(arg.second);
+ if (r_new_verbosity_level.is_ok()) {
+ new_verbosity_level = r_new_verbosity_level.ok();
}
}
+ if (arg.first == "tag") {
+ tag = arg.second;
+ }
+ }
+ if (new_verbosity_level > 0) {
+ if (tag.empty()) {
+ parameters_->shared_data_->next_verbosity_level_ = new_verbosity_level;
+ } else {
+ td::ClientActor::execute(td::td_api::make_object(tag, new_verbosity_level));
+ }
}
auto now = td::Time::now();
diff --git a/telegram-bot-api/ClientParameters.h b/telegram-bot-api/ClientParameters.h
index 1826605..5718fad 100644
--- a/telegram-bot-api/ClientParameters.h
+++ b/telegram-bot-api/ClientParameters.h
@@ -32,6 +32,7 @@ struct SharedData {
std::atomic next_verbosity_level_{-1};
// not thread-safe
+ size_t query_list_size_ = 0;
td::ListNode query_list_;
td::unique_ptr webhook_db_;
td::unique_ptr user_db_;
diff --git a/telegram-bot-api/Query.cpp b/telegram-bot-api/Query.cpp
index 98dcad3..f9b9714 100644
--- a/telegram-bot-api/Query.cpp
+++ b/telegram-bot-api/Query.cpp
@@ -48,6 +48,7 @@ Query::Query(td::vector &&container, td::Slice token, bool is_u
if (shared_data_) {
shared_data_->query_count_++;
if (method_ != "getupdates") {
+ shared_data_->query_list_size_++;
shared_data_->query_list_.put(this);
}
}
diff --git a/telegram-bot-api/Query.h b/telegram-bot-api/Query.h
index 3a8e1dc..d51c45d 100644
--- a/telegram-bot-api/Query.h
+++ b/telegram-bot-api/Query.h
@@ -113,6 +113,9 @@ class Query : public td::ListNode {
~Query() {
if (shared_data_) {
shared_data_->query_count_--;
+ if (!empty()) {
+ shared_data_->query_list_size_--;
+ }
}
}
diff --git a/telegram-bot-api/telegram-bot-api.cpp b/telegram-bot-api/telegram-bot-api.cpp
index 62efff3..8027854 100644
--- a/telegram-bot-api/telegram-bot-api.cpp
+++ b/telegram-bot-api/telegram-bot-api.cpp
@@ -84,6 +84,10 @@ void print_log() {
td::signal_safe_write("------------------------\n");
}
+static void dump_stacktrace_signal_handler(int sig) {
+ td::Stacktrace::print_to_stderr();
+}
+
static void fail_signal_handler(int sig) {
td::signal_safe_write_signal_number(sig);
td::Stacktrace::PrintOptions options;
@@ -144,13 +148,14 @@ static void dump_statistics(const std::shared_ptr &shared_data,
LOG(WARNING) << td::tag("buffer_mem", td::format::as_size(td::BufferAllocator::get_buffer_mem()));
LOG(WARNING) << td::tag("buffer_slice_size", td::format::as_size(td::BufferAllocator::get_buffer_slice_size()));
+ auto query_list_size = shared_data->query_list_size_;
auto query_count = shared_data->query_count_.load();
- LOG(WARNING) << td::tag("pending queries", query_count);
+ LOG(WARNING) << td::tag("pending queries", query_count) << td::tag("pending requests", query_list_size);
td::uint64 i = 0;
bool was_gap = false;
for (auto end = &shared_data->query_list_, cur = end->prev; cur != end; cur = cur->prev, i++) {
- if (i < 20 || i > query_count - 20 || i % (query_count / 50 + 1) == 0) {
+ if (i < 20 || i > query_list_size - 20 || i % (query_list_size / 50 + 1) == 0) {
if (was_gap) {
LOG(WARNING) << "...";
was_gap = false;
@@ -186,13 +191,14 @@ int main(int argc, char *argv[]) {
td::set_runtime_signal_handler(0, change_verbosity_level_signal_handler).ensure();
td::set_runtime_signal_handler(1, dump_log_signal_handler).ensure();
+ td::set_runtime_signal_handler(2, dump_stacktrace_signal_handler).ensure();
td::init_openssl_threads();
auto start_time = td::Time::now();
auto shared_data = std::make_shared();
auto parameters = std::make_unique();
- parameters->version_ = "5.3.1";
+ parameters->version_ = "5.3.3";
parameters->shared_data_ = shared_data;
parameters->start_time_ = start_time;
auto net_query_stats = td::create_net_query_stats();