diff options
| author | levlam <levlam@telegram.org> | 2025-10-03 16:29:55 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2025-10-03 16:29:55 +0300 |
| commit | 9cd78505d6d64c9ae2243d35b2eaad75c028f79e (patch) | |
| tree | 2e91cbef492d94675ee959a02e4ec3cdc3189e99 /td/telegram/Usernames.cpp | |
| parent | 2a9e1d3592b6f42c35c6487fb7e9b2d3d53e9f87 (diff) | |
Support disabled editable usernames.
Diffstat (limited to 'td/telegram/Usernames.cpp')
| -rw-r--r-- | td/telegram/Usernames.cpp | 97 |
1 files changed, 67 insertions, 30 deletions
diff --git a/td/telegram/Usernames.cpp b/td/telegram/Usernames.cpp index 992db4305..5122d4635 100644 --- a/td/telegram/Usernames.cpp +++ b/td/telegram/Usernames.cpp @@ -28,6 +28,7 @@ Usernames::Usernames(string &&first_username, vector<telegram_api::object_ptr<te return; } bool was_editable = false; + bool is_editable_username_disabled = false; for (auto &username : usernames) { if (username->username_.empty()) { LOG(ERROR) << "Receive empty username in " << to_string(usernames); @@ -38,10 +39,7 @@ Usernames::Usernames(string &&first_username, vector<telegram_api::object_ptr<te LOG(ERROR) << "Receive two editable usernames in " << to_string(usernames); return; } - if (!username->active_) { - LOG(ERROR) << "Receive disabled editable usernames in " << to_string(usernames); - return; - } + is_editable_username_disabled = !username->active_; was_editable = true; } } @@ -50,12 +48,16 @@ Usernames::Usernames(string &&first_username, vector<telegram_api::object_ptr<te if (usernames[i]->active_) { active_usernames_.push_back(std::move(usernames[i]->username_)); if (usernames[i]->editable_) { - editable_username_pos_ = narrow_cast<int32>(i); + editable_username_pos_ = narrow_cast<int32>(active_usernames_.size() - 1); } } else { disabled_usernames_.push_back(std::move(usernames[i]->username_)); + if (usernames[i]->editable_) { + editable_username_pos_ = narrow_cast<int32>(disabled_usernames_.size() - 1); + } } } + is_editable_username_disabled_ = is_editable_username_disabled; CHECK(has_editable_username() == was_editable); } @@ -63,14 +65,17 @@ tl_object_ptr<td_api::usernames> Usernames::get_usernames_object() const { if (is_empty()) { return nullptr; } - return make_tl_object<td_api::usernames>( - vector<string>(active_usernames_), vector<string>(disabled_usernames_), - has_editable_username() ? active_usernames_[editable_username_pos_] : string()); + return make_tl_object<td_api::usernames>(vector<string>(active_usernames_), vector<string>(disabled_usernames_), + get_editable_username()); } Usernames Usernames::change_editable_username(string &&new_username) const { Usernames result = *this; if (has_editable_username()) { + if (is_editable_username_disabled_) { + LOG(INFO) << "Tried to change disabled editable username"; + return result; + } if (new_username.empty()) { result.active_usernames_.erase(result.active_usernames_.begin() + editable_username_pos_); result.editable_username_pos_ = -1; @@ -80,6 +85,7 @@ Usernames Usernames::change_editable_username(string &&new_username) const { } } else if (!new_username.empty()) { // add to the beginning + CHECK(!is_editable_username_disabled_); result.active_usernames_.insert(result.active_usernames_.begin(), std::move(new_username)); result.editable_username_pos_ = 0; } @@ -88,7 +94,8 @@ Usernames Usernames::change_editable_username(string &&new_username) const { bool Usernames::can_toggle(const string &username) const { if (td::contains(active_usernames_, username)) { - return !has_editable_username() || active_usernames_[editable_username_pos_] != username; + return !has_editable_username() || is_editable_username_disabled_ || + active_usernames_[editable_username_pos_] != username; } if (td::contains(disabled_usernames_, username)) { return true; @@ -98,16 +105,8 @@ bool Usernames::can_toggle(const string &username) const { Usernames Usernames::toggle(const string &username, bool is_active) const { Usernames result = *this; - for (size_t i = 0; i < disabled_usernames_.size(); i++) { - if (disabled_usernames_[i] == username) { - if (is_active) { - // activate the username - result.disabled_usernames_.erase(result.disabled_usernames_.begin() + i); - result.active_usernames_.push_back(username); - // editable username position wasn't changed - } - return result; - } + if (!can_toggle(username)) { + return result; } for (size_t i = 0; i < active_usernames_.size(); i++) { if (active_usernames_[i] == username) { @@ -115,10 +114,40 @@ Usernames Usernames::toggle(const string &username, bool is_active) const { // disable the username result.active_usernames_.erase(result.active_usernames_.begin() + i); result.disabled_usernames_.insert(result.disabled_usernames_.begin(), username); - if (result.has_editable_username() && i <= static_cast<size_t>(result.editable_username_pos_)) { - CHECK(i != static_cast<size_t>(result.editable_username_pos_)); - CHECK(result.editable_username_pos_ > 0); - result.editable_username_pos_--; + if (has_editable_username()) { + if (is_editable_username_disabled_) { + result.editable_username_pos_++; + } else { + if (i <= static_cast<size_t>(result.editable_username_pos_)) { + CHECK(i != static_cast<size_t>(result.editable_username_pos_)); + CHECK(result.editable_username_pos_ > 0); + result.editable_username_pos_--; + } + } + } + } + return result; + } + } + for (size_t i = 0; i < disabled_usernames_.size(); i++) { + if (disabled_usernames_[i] == username) { + if (is_active) { + // activate the username + result.disabled_usernames_.erase(result.disabled_usernames_.begin() + i); + result.active_usernames_.push_back(username); + if (is_editable_username_disabled_) { + CHECK(has_editable_username()); + if (static_cast<size_t>(editable_username_pos_) == i) { + // editable username was activated + result.is_editable_username_disabled_ = false; + result.editable_username_pos_ = static_cast<int32>(result.active_usernames_.size() - 1); + } else if (i <= static_cast<size_t>(editable_username_pos_)) { + // editable username position decreased + CHECK(result.editable_username_pos_ > 0); + result.editable_username_pos_--; + } + } else { + // editable username position wasn't changed } } return result; @@ -131,13 +160,17 @@ Usernames Usernames::toggle(const string &username, bool is_active) const { Usernames Usernames::deactivate_all() const { Usernames result; for (size_t i = 0; i < active_usernames_.size(); i++) { - if (i == static_cast<size_t>(editable_username_pos_)) { + if (!is_editable_username_disabled_ && i == static_cast<size_t>(editable_username_pos_)) { result.active_usernames_.push_back(active_usernames_[i]); result.editable_username_pos_ = 0; } else { result.disabled_usernames_.push_back(active_usernames_[i]); } } + if (is_editable_username_disabled_) { + CHECK(has_editable_username()); + result.editable_username_pos_ = editable_username_pos_ + static_cast<int32>(result.disabled_usernames_.size()); + } append(result.disabled_usernames_, disabled_usernames_); CHECK(result.has_editable_username() == has_editable_username()); return result; @@ -167,11 +200,15 @@ Usernames Usernames::reorder_to(vector<string> &&new_username_order) const { result.active_usernames_ = std::move(new_username_order); result.disabled_usernames_ = disabled_usernames_; if (has_editable_username()) { - const string &editable_username = active_usernames_[editable_username_pos_]; - for (size_t i = 0; i < result.active_usernames_.size(); i++) { - if (result.active_usernames_[i] == editable_username) { - result.editable_username_pos_ = narrow_cast<int32>(i); - break; + if (is_editable_username_disabled_) { + result.editable_username_pos_ = editable_username_pos_; + } else { + const string &editable_username = active_usernames_[editable_username_pos_]; + for (size_t i = 0; i < result.active_usernames_.size(); i++) { + if (result.active_usernames_[i] == editable_username) { + result.editable_username_pos_ = narrow_cast<int32>(i); + break; + } } } CHECK(result.has_editable_username()); @@ -208,7 +245,7 @@ bool operator!=(const Usernames &lhs, const Usernames &rhs) { StringBuilder &operator<<(StringBuilder &string_builder, const Usernames &usernames) { string_builder << "Usernames["; if (usernames.has_editable_username()) { - string_builder << usernames.active_usernames_[usernames.editable_username_pos_]; + string_builder << usernames.get_editable_username(); } if (!usernames.active_usernames_.empty()) { string_builder << ", active " << usernames.active_usernames_; |
