Process updateChatParticipant and updateBotStopped.

This commit is contained in:
levlam 2021-02-19 02:16:50 +03:00
parent ad43c83bce
commit fd190bc9bd
4 changed files with 102 additions and 12 deletions

View File

@ -12832,6 +12832,72 @@ void ContactsManager::on_update_channel_default_permissions(ChannelId channel_id
} }
} }
void ContactsManager::on_update_bot_stopped(UserId user_id, int32 date, bool is_stopped) {
if (!td_->auth_manager_->is_bot()) {
LOG(ERROR) << "Receive updateBotStopped by non-bot";
return;
}
if (!user_id.is_valid() || date <= 0) {
LOG(ERROR) << "Receive invalid updateBotStopped by " << user_id << " at " << date;
return;
}
if (!have_user_force(user_id)) {
LOG(ERROR) << "Receive updateBotStopped by unknown " << user_id;
return;
}
DialogParticipant old_dialog_participant(get_my_id(), user_id, date, DialogParticipantStatus::Banned(0));
DialogParticipant new_dialog_participant(get_my_id(), user_id, date, DialogParticipantStatus::Member());
if (is_stopped) {
std::swap(old_dialog_participant.status, new_dialog_participant.status);
}
// TODO send update
}
void ContactsManager::on_update_chat_participant(ChatId chat_id, UserId user_id, int32 date,
tl_object_ptr<telegram_api::ChatParticipant> old_participant,
tl_object_ptr<telegram_api::ChatParticipant> new_participant) {
if (!td_->auth_manager_->is_bot()) {
LOG(ERROR) << "Receive updateChatParticipant by non-bot";
return;
}
if (!chat_id.is_valid() || !user_id.is_valid() || date <= 0 ||
(old_participant == nullptr && new_participant == nullptr)) {
LOG(ERROR) << "Receive invalid updateChatParticipant in " << chat_id << " for " << user_id << " at " << date << ": "
<< to_string(old_participant) << " -> " << to_string(new_participant);
return;
}
const Chat *c = get_chat(chat_id);
if (c == nullptr) {
LOG(ERROR) << "Receive updateChatParticipant in unknown " << chat_id;
return;
}
DialogParticipant old_dialog_participant;
DialogParticipant new_dialog_participant;
if (old_participant != nullptr) {
old_dialog_participant = DialogParticipant(std::move(old_participant), c->date, c->status.is_creator());
if (new_participant == nullptr) {
new_dialog_participant = DialogParticipant::left(old_dialog_participant.user_id);
} else {
new_dialog_participant = DialogParticipant(std::move(new_participant), c->date, c->status.is_creator());
}
} else {
new_dialog_participant = DialogParticipant(std::move(new_participant), c->date, c->status.is_creator());
old_dialog_participant = DialogParticipant::left(new_dialog_participant.user_id);
}
if (old_dialog_participant.user_id != new_dialog_participant.user_id || !old_dialog_participant.is_valid() ||
!new_dialog_participant.is_valid()) {
LOG(ERROR) << "Receive wrong updateChannelParticipant: " << old_dialog_participant << " -> "
<< new_dialog_participant;
return;
}
// TODO send update
}
void ContactsManager::on_update_channel_participant(ChannelId channel_id, UserId user_id, int32 date, void ContactsManager::on_update_channel_participant(ChannelId channel_id, UserId user_id, int32 date,
tl_object_ptr<telegram_api::ChannelParticipant> old_participant, tl_object_ptr<telegram_api::ChannelParticipant> old_participant,
tl_object_ptr<telegram_api::ChannelParticipant> new_participant) { tl_object_ptr<telegram_api::ChannelParticipant> new_participant) {

View File

@ -210,6 +210,11 @@ class ContactsManager : public Actor {
Promise<Unit> &&promise); Promise<Unit> &&promise);
void on_update_channel_default_permissions(ChannelId channel_id, RestrictedRights default_permissions); void on_update_channel_default_permissions(ChannelId channel_id, RestrictedRights default_permissions);
void on_update_channel_administrator_count(ChannelId channel_id, int32 administrator_count); void on_update_channel_administrator_count(ChannelId channel_id, int32 administrator_count);
void on_update_bot_stopped(UserId user_id, int32 date, bool is_stopped);
void on_update_chat_participant(ChatId chat_id, UserId user_id, int32 date,
tl_object_ptr<telegram_api::ChatParticipant> old_participant,
tl_object_ptr<telegram_api::ChatParticipant> new_participant);
void on_update_channel_participant(ChannelId channel_id, UserId user_id, int32 date, void on_update_channel_participant(ChannelId channel_id, UserId user_id, int32 date,
tl_object_ptr<telegram_api::ChannelParticipant> old_participant, tl_object_ptr<telegram_api::ChannelParticipant> old_participant,
tl_object_ptr<telegram_api::ChannelParticipant> new_participant); tl_object_ptr<telegram_api::ChannelParticipant> new_participant);

View File

@ -1954,6 +1954,19 @@ void UpdatesManager::process_qts_update(tl_object_ptr<telegram_api::Update> &&up
add_qts(qts)); add_qts(qts));
break; break;
} }
case telegram_api::updateBotStopped::ID: {
auto update = move_tl_object_as<telegram_api::updateBotStopped>(update_ptr);
td_->contacts_manager_->on_update_bot_stopped(UserId(update->user_id_), update->date_,
std::move(update->stopped_));
break;
}
case telegram_api::updateChatParticipant::ID: {
auto update = move_tl_object_as<telegram_api::updateChatParticipant>(update_ptr);
td_->contacts_manager_->on_update_chat_participant(ChatId(update->chat_id_), UserId(update->user_id_),
update->date_, std::move(update->prev_participant_),
std::move(update->new_participant_));
break;
}
case telegram_api::updateChannelParticipant::ID: { case telegram_api::updateChannelParticipant::ID: {
auto update = move_tl_object_as<telegram_api::updateChannelParticipant>(update_ptr); auto update = move_tl_object_as<telegram_api::updateChannelParticipant>(update_ptr);
td_->contacts_manager_->on_update_channel_participant(ChannelId(update->channel_id_), UserId(update->user_id_), td_->contacts_manager_->on_update_channel_participant(ChannelId(update->channel_id_), UserId(update->user_id_),
@ -2453,6 +2466,8 @@ int32 UpdatesManager::get_update_pts(const telegram_api::Update *update) {
bool UpdatesManager::is_qts_update(const telegram_api::Update *update) { bool UpdatesManager::is_qts_update(const telegram_api::Update *update) {
switch (update->get_id()) { switch (update->get_id()) {
case telegram_api::updateNewEncryptedMessage::ID: case telegram_api::updateNewEncryptedMessage::ID:
case telegram_api::updateBotStopped::ID:
case telegram_api::updateChatParticipant::ID:
case telegram_api::updateChannelParticipant::ID: case telegram_api::updateChannelParticipant::ID:
return true; return true;
default: default:
@ -2464,6 +2479,10 @@ int32 UpdatesManager::get_update_qts(const telegram_api::Update *update) {
switch (update->get_id()) { switch (update->get_id()) {
case telegram_api::updateNewEncryptedMessage::ID: case telegram_api::updateNewEncryptedMessage::ID:
return static_cast<const telegram_api::updateNewEncryptedMessage *>(update)->qts_; return static_cast<const telegram_api::updateNewEncryptedMessage *>(update)->qts_;
case telegram_api::updateBotStopped::ID:
return static_cast<const telegram_api::updateBotStopped *>(update)->qts_;
case telegram_api::updateChatParticipant::ID:
return static_cast<const telegram_api::updateChatParticipant *>(update)->qts_;
case telegram_api::updateChannelParticipant::ID: case telegram_api::updateChannelParticipant::ID:
return static_cast<const telegram_api::updateChannelParticipant *>(update)->qts_; return static_cast<const telegram_api::updateChannelParticipant *>(update)->qts_;
default: default:
@ -2850,6 +2869,16 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateLoginToken> upd
promise.set_value(Unit()); promise.set_value(Unit());
} }
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateBotStopped> update, Promise<Unit> &&promise) {
auto qts = update->qts_;
add_pending_qts_update(std::move(update), qts, std::move(promise));
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChatParticipant> update, Promise<Unit> &&promise) {
auto qts = update->qts_;
add_pending_qts_update(std::move(update), qts, std::move(promise));
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChannelParticipant> update, Promise<Unit> &&promise) { void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChannelParticipant> update, Promise<Unit> &&promise) {
auto qts = update->qts_; auto qts = update->qts_;
add_pending_qts_update(std::move(update), qts, std::move(promise)); add_pending_qts_update(std::move(update), qts, std::move(promise));
@ -2857,14 +2886,6 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChannelParticip
// unsupported updates // unsupported updates
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateBotStopped> update, Promise<Unit> &&promise) {
promise.set_value(Unit());
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChatParticipant> update, Promise<Unit> &&promise) {
promise.set_value(Unit());
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateTheme> update, Promise<Unit> &&promise) { void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateTheme> update, Promise<Unit> &&promise) {
promise.set_value(Unit()); promise.set_value(Unit());
} }

View File

@ -452,14 +452,12 @@ class UpdatesManager : public Actor {
void on_update(tl_object_ptr<telegram_api::updateLoginToken> update, Promise<Unit> &&promise); void on_update(tl_object_ptr<telegram_api::updateLoginToken> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateBotStopped> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateChatParticipant> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateChannelParticipant> update, Promise<Unit> &&promise); void on_update(tl_object_ptr<telegram_api::updateChannelParticipant> update, Promise<Unit> &&promise);
// unsupported updates // unsupported updates
void on_update(tl_object_ptr<telegram_api::updateBotStopped> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateChatParticipant> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateTheme> update, Promise<Unit> &&promise); void on_update(tl_object_ptr<telegram_api::updateTheme> update, Promise<Unit> &&promise);
}; };