Support updateBotCommands.
This commit is contained in:
parent
da2d81c81b
commit
f210906dca
@ -6052,6 +6052,90 @@ void ContactsManager::update_is_location_visible() {
|
|||||||
G()->shared_config().set_option_boolean("is_location_visible", expire_date != 0);
|
G()->shared_config().set_option_boolean("is_location_visible", expire_date != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ContactsManager::on_update_bot_commands(DialogId dialog_id, UserId bot_user_id,
|
||||||
|
vector<tl_object_ptr<telegram_api::botCommand>> &&bot_commands) {
|
||||||
|
if (!bot_user_id.is_valid()) {
|
||||||
|
LOG(ERROR) << "Receive updateBotCOmmands about invalid " << bot_user_id;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!have_user(bot_user_id) || !is_user_bot(bot_user_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (td_->auth_manager_->is_bot()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto is_from_bot = [bot_user_id](const BotCommands &commands) {
|
||||||
|
return commands.get_bot_user_id() == bot_user_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (dialog_id.get_type()) {
|
||||||
|
case DialogType::User: {
|
||||||
|
UserId user_id(dialog_id.get_user_id());
|
||||||
|
auto user_full = get_user_full(user_id);
|
||||||
|
if (user_full != nullptr) {
|
||||||
|
on_update_user_full_commands(user_full, user_id, std::move(bot_commands));
|
||||||
|
update_user_full(user_full, user_id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DialogType::Chat: {
|
||||||
|
ChatId chat_id(dialog_id.get_chat_id());
|
||||||
|
auto chat_full = get_chat_full(chat_id);
|
||||||
|
if (chat_full != nullptr) {
|
||||||
|
if (bot_commands.empty()) {
|
||||||
|
if (td::remove_if(chat_full->bot_commands, is_from_bot)) {
|
||||||
|
chat_full->is_changed = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BotCommands commands(bot_user_id, std::move(bot_commands));
|
||||||
|
auto it = std::find_if(chat_full->bot_commands.begin(), chat_full->bot_commands.end(), is_from_bot);
|
||||||
|
if (it != chat_full->bot_commands.end()) {
|
||||||
|
if (*it != commands) {
|
||||||
|
*it = std::move(commands);
|
||||||
|
chat_full->is_changed = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
chat_full->bot_commands.push_back(std::move(commands));
|
||||||
|
chat_full->is_changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update_chat_full(chat_full, chat_id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DialogType::Channel: {
|
||||||
|
ChannelId channel_id(dialog_id.get_channel_id());
|
||||||
|
auto channel_full = get_channel_full(channel_id, "on_update_bot_commands");
|
||||||
|
if (channel_full != nullptr) {
|
||||||
|
if (bot_commands.empty()) {
|
||||||
|
if (td::remove_if(channel_full->bot_commands, is_from_bot)) {
|
||||||
|
channel_full->is_changed = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BotCommands commands(bot_user_id, std::move(bot_commands));
|
||||||
|
auto it = std::find_if(channel_full->bot_commands.begin(), channel_full->bot_commands.end(), is_from_bot);
|
||||||
|
if (it != channel_full->bot_commands.end()) {
|
||||||
|
if (*it != commands) {
|
||||||
|
*it = std::move(commands);
|
||||||
|
channel_full->is_changed = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
channel_full->bot_commands.push_back(std::move(commands));
|
||||||
|
channel_full->is_changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update_channel_full(channel_full, channel_id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DialogType::SecretChat:
|
||||||
|
default:
|
||||||
|
LOG(ERROR) << "Receive updateBotCommands in " << dialog_id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FileId ContactsManager::get_profile_photo_file_id(int64 photo_id) const {
|
FileId ContactsManager::get_profile_photo_file_id(int64 photo_id) const {
|
||||||
auto it = my_photo_file_id_.find(photo_id);
|
auto it = my_photo_file_id_.find(photo_id);
|
||||||
if (it == my_photo_file_id_.end()) {
|
if (it == my_photo_file_id_.end()) {
|
||||||
@ -10069,9 +10153,7 @@ void ContactsManager::on_get_user_full(tl_object_ptr<telegram_api::userFull> &&u
|
|||||||
if (user->bot_info_ != nullptr && !td_->auth_manager_->is_bot()) {
|
if (user->bot_info_ != nullptr && !td_->auth_manager_->is_bot()) {
|
||||||
description = std::move(user->bot_info_->description_);
|
description = std::move(user->bot_info_->description_);
|
||||||
|
|
||||||
auto commands = transform(std::move(user->bot_info_->commands_),
|
on_update_user_full_commands(user_full, user_id, std::move(user->bot_info_->commands_));
|
||||||
[](auto &&bot_command) { return BotCommand(std::move(bot_command)); });
|
|
||||||
on_update_user_full_commands(user_full, user_id, std::move(commands));
|
|
||||||
}
|
}
|
||||||
if (user_full->description != description) {
|
if (user_full->description != description) {
|
||||||
user_full->description = std::move(description);
|
user_full->description = std::move(description);
|
||||||
@ -11000,8 +11082,11 @@ void ContactsManager::on_update_user_full_common_chat_count(UserFull *user_full,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContactsManager::on_update_user_full_commands(UserFull *user_full, UserId user_id, vector<BotCommand> &&commands) {
|
void ContactsManager::on_update_user_full_commands(UserFull *user_full, UserId user_id,
|
||||||
|
vector<tl_object_ptr<telegram_api::botCommand>> &&bot_commands) {
|
||||||
CHECK(user_full != nullptr);
|
CHECK(user_full != nullptr);
|
||||||
|
auto commands =
|
||||||
|
transform(std::move(bot_commands), [](auto &&bot_command) { return BotCommand(std::move(bot_command)); });
|
||||||
if (user_full->commands != commands) {
|
if (user_full->commands != commands) {
|
||||||
user_full->commands = std::move(commands);
|
user_full->commands = std::move(commands);
|
||||||
user_full->is_changed = true;
|
user_full->is_changed = true;
|
||||||
|
@ -206,6 +206,9 @@ class ContactsManager : public Actor {
|
|||||||
|
|
||||||
int32 on_update_peer_located(vector<tl_object_ptr<telegram_api::PeerLocated>> &&peers, bool from_update);
|
int32 on_update_peer_located(vector<tl_object_ptr<telegram_api::PeerLocated>> &&peers, bool from_update);
|
||||||
|
|
||||||
|
void on_update_bot_commands(DialogId dialog_id, UserId bot_user_id,
|
||||||
|
vector<tl_object_ptr<telegram_api::botCommand>> &&bot_commands);
|
||||||
|
|
||||||
void on_update_dialog_administrators(DialogId dialog_id, vector<DialogAdministrator> &&administrators,
|
void on_update_dialog_administrators(DialogId dialog_id, vector<DialogAdministrator> &&administrators,
|
||||||
bool have_access, bool from_database);
|
bool have_access, bool from_database);
|
||||||
|
|
||||||
@ -1178,7 +1181,8 @@ class ContactsManager : public Actor {
|
|||||||
|
|
||||||
void on_update_user_full_is_blocked(UserFull *user_full, UserId user_id, bool is_blocked);
|
void on_update_user_full_is_blocked(UserFull *user_full, UserId user_id, bool is_blocked);
|
||||||
void on_update_user_full_common_chat_count(UserFull *user_full, UserId user_id, int32 common_chat_count);
|
void on_update_user_full_common_chat_count(UserFull *user_full, UserId user_id, int32 common_chat_count);
|
||||||
void on_update_user_full_commands(UserFull *user_full, UserId user_id, vector<BotCommand> &&commands);
|
void on_update_user_full_commands(UserFull *user_full, UserId user_id,
|
||||||
|
vector<tl_object_ptr<telegram_api::botCommand>> &&bot_commands);
|
||||||
void on_update_user_full_need_phone_number_privacy_exception(UserFull *user_full, UserId user_id,
|
void on_update_user_full_need_phone_number_privacy_exception(UserFull *user_full, UserId user_id,
|
||||||
bool need_phone_number_privacy_exception);
|
bool need_phone_number_privacy_exception);
|
||||||
|
|
||||||
|
@ -2614,6 +2614,8 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updatePeerBlocked> up
|
|||||||
}
|
}
|
||||||
|
|
||||||
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateBotCommands> update, Promise<Unit> &&promise) {
|
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateBotCommands> update, Promise<Unit> &&promise) {
|
||||||
|
td_->contacts_manager_->on_update_bot_commands(DialogId(update->peer_), UserId(update->bot_id_),
|
||||||
|
std::move(update->commands_));
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user