aboutsummaryrefslogtreecommitdiffhomepage
path: root/td/telegram/Usernames.cpp
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2025-10-03 16:29:55 +0300
committerlevlam <levlam@telegram.org>2025-10-03 16:29:55 +0300
commit9cd78505d6d64c9ae2243d35b2eaad75c028f79e (patch)
tree2e91cbef492d94675ee959a02e4ec3cdc3189e99 /td/telegram/Usernames.cpp
parent2a9e1d3592b6f42c35c6487fb7e9b2d3d53e9f87 (diff)
Support disabled editable usernames.
Diffstat (limited to 'td/telegram/Usernames.cpp')
-rw-r--r--td/telegram/Usernames.cpp97
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_;