aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2026-07-09 12:44:48 +0300
committerlevlam <levlam@telegram.org>2026-07-09 12:44:48 +0300
commit67bb8bf40584c0d7d54292b63741561e1f6b69e5 (patch)
treeea09e6a6367a4ba305a255ed7ae453e65bc661c5
parenta17f7d29e5e19f07843537aff8d6bc6d7a677390 (diff)
Support manage_linked_peers administrator right.
-rw-r--r--td/telegram/ChatManager.cpp2
-rw-r--r--td/telegram/DialogParticipant.cpp32
-rw-r--r--td/telegram/DialogParticipant.h13
-rw-r--r--td/telegram/LinkManager.cpp2
4 files changed, 32 insertions, 17 deletions
diff --git a/td/telegram/ChatManager.cpp b/td/telegram/ChatManager.cpp
index 99a8f87ca..7b52cf8be 100644
--- a/td/telegram/ChatManager.cpp
+++ b/td/telegram/ChatManager.cpp
@@ -7644,7 +7644,7 @@ void ChatManager::on_update_channel_status(Channel *c, ChannelId channel_id, Dia
status = c->is_admined_monoforum && !td_->auth_manager_->is_bot()
? DialogParticipantStatus::Administrator(
AdministratorRights(true, true, false, false, false, false, false, false, false, false, false,
- false, false, false, false, false, false, ChannelType::Megagroup),
+ false, false, false, false, false, false, false, ChannelType::Megagroup),
string(), false)
: DialogParticipantStatus::Member(0, string());
} else {
diff --git a/td/telegram/DialogParticipant.cpp b/td/telegram/DialogParticipant.cpp
index ba9a47e7b..323ec8dbc 100644
--- a/td/telegram/DialogParticipant.cpp
+++ b/td/telegram/DialogParticipant.cpp
@@ -28,11 +28,12 @@ AdministratorRights::AdministratorRights(const tl_object_ptr<telegram_api::chatA
if (!rights->other_) {
LOG(ERROR) << "Receive wrong other flag in " << to_string(rights);
}
- *this = AdministratorRights(
- rights->anonymous_, rights->other_, rights->change_info_, rights->post_messages_, rights->edit_messages_,
- rights->delete_messages_, rights->invite_users_, rights->ban_users_, rights->pin_messages_,
- rights->manage_topics_, rights->add_admins_, rights->manage_call_, rights->post_stories_, rights->edit_stories_,
- rights->delete_stories_, rights->manage_direct_messages_, rights->manage_ranks_, channel_type);
+ *this = AdministratorRights(rights->anonymous_, rights->other_, rights->change_info_, rights->post_messages_,
+ rights->edit_messages_, rights->delete_messages_, rights->invite_users_,
+ rights->ban_users_, rights->pin_messages_, rights->manage_topics_, rights->add_admins_,
+ rights->manage_call_, rights->post_stories_, rights->edit_stories_,
+ rights->delete_stories_, rights->manage_direct_messages_, rights->manage_ranks_,
+ rights->manage_linked_peers_, channel_type);
}
AdministratorRights::AdministratorRights(const td_api::object_ptr<td_api::chatAdministratorRights> &rights,
@@ -46,7 +47,7 @@ AdministratorRights::AdministratorRights(const td_api::object_ptr<td_api::chatAd
rights->can_invite_users_, rights->can_restrict_members_, rights->can_pin_messages_,
rights->can_manage_topics_, rights->can_promote_members_, rights->can_manage_video_chats_,
rights->can_post_stories_, rights->can_edit_stories_, rights->can_delete_stories_,
- rights->can_manage_direct_messages_, rights->can_manage_tags_, channel_type);
+ rights->can_manage_direct_messages_, rights->can_manage_tags_, false, channel_type);
}
AdministratorRights::AdministratorRights(bool is_anonymous, bool can_manage_dialog, bool can_change_info,
@@ -55,7 +56,7 @@ AdministratorRights::AdministratorRights(bool is_anonymous, bool can_manage_dial
bool can_manage_topics, bool can_promote_members, bool can_manage_calls,
bool can_post_stories, bool can_edit_stories, bool can_delete_stories,
bool can_manage_direct_messages, bool can_manage_ranks,
- ChannelType channel_type) {
+ bool can_manage_linked_peers, ChannelType channel_type) {
switch (channel_type) {
case ChannelType::Broadcast:
can_pin_messages = false;
@@ -88,6 +89,7 @@ AdministratorRights::AdministratorRights(bool is_anonymous, bool can_manage_dial
(static_cast<uint64>(can_delete_stories) * CAN_DELETE_STORIES) |
(static_cast<uint64>(can_manage_direct_messages) * CAN_MANAGE_DIRECT_MESSAGES) |
(static_cast<uint64>(can_manage_ranks) * CAN_MANAGE_RANKS) |
+ (static_cast<uint64>(can_manage_linked_peers) * CAN_MANAGE_LINKED_PEERS) |
(static_cast<uint64>(is_anonymous) * IS_ANONYMOUS);
if (flags_ != 0) {
flags_ |= CAN_MANAGE_DIALOG;
@@ -99,7 +101,7 @@ telegram_api::object_ptr<telegram_api::chatAdminRights> AdministratorRights::get
0, can_change_info_and_settings(), can_post_messages(), can_edit_messages(), can_delete_messages(),
can_restrict_members(), can_invite_users(), can_pin_messages(), can_promote_members(), is_anonymous(),
can_manage_calls(), can_manage_dialog(), can_manage_topics(), can_post_stories(), can_edit_stories(),
- can_delete_stories(), can_manage_direct_messages(), can_manage_ranks(), false);
+ can_delete_stories(), can_manage_direct_messages(), can_manage_ranks(), can_manage_linked_peers());
}
td_api::object_ptr<td_api::chatAdministratorRights> AdministratorRights::get_chat_administrator_rights_object() const {
@@ -168,6 +170,9 @@ StringBuilder &operator<<(StringBuilder &string_builder, const AdministratorRigh
if (status.can_manage_ranks()) {
string_builder << "(manage_ranks)";
}
+ if (status.can_manage_linked_peers()) {
+ string_builder << "(manage_linked_peers)";
+ }
if (status.is_anonymous()) {
string_builder << "(anonymous)";
}
@@ -394,15 +399,16 @@ DialogParticipantStatus DialogParticipantStatus::Banned(int32 banned_until_date,
DialogParticipantStatus DialogParticipantStatus::GroupAdministrator(bool is_current_user_creator, string &&rank) {
return Administrator(AdministratorRights(false, true, true, false, false, true, true, true, true, false, false, true,
- false, false, false, false, true, ChannelType::Unknown),
+ false, false, false, false, true, false, ChannelType::Unknown),
std::move(rank), is_current_user_creator);
}
DialogParticipantStatus DialogParticipantStatus::ChannelAdministrator(bool is_current_user_creator, bool is_megagroup) {
- auto rights = is_megagroup ? AdministratorRights(false, true, true, false, false, true, true, true, true, true, false,
- false, false, false, false, false, true, ChannelType::Megagroup)
- : AdministratorRights(false, true, false, true, true, true, false, true, false, false,
- false, false, true, true, true, true, false, ChannelType::Broadcast);
+ auto rights = is_megagroup
+ ? AdministratorRights(false, true, true, false, false, true, true, true, true, true, false, false,
+ false, false, false, false, true, false, ChannelType::Megagroup)
+ : AdministratorRights(false, true, false, true, true, true, false, true, false, false, false, false,
+ true, true, true, true, false, false, ChannelType::Broadcast);
return Administrator(rights, string(), is_current_user_creator);
}
diff --git a/td/telegram/DialogParticipant.h b/td/telegram/DialogParticipant.h
index 0edf0e236..776c2dc5a 100644
--- a/td/telegram/DialogParticipant.h
+++ b/td/telegram/DialogParticipant.h
@@ -40,13 +40,14 @@ class AdministratorRights {
static constexpr uint64 CAN_DELETE_STORIES = static_cast<uint64>(1) << 50;
static constexpr uint64 CAN_MANAGE_DIRECT_MESSAGES = static_cast<uint64>(1) << 51;
static constexpr uint64 CAN_MANAGE_RANKS = static_cast<uint64>(1) << 52;
+ static constexpr uint64 CAN_MANAGE_LINKED_PEERS = static_cast<uint64>(1) << 53;
static constexpr uint64 IS_ANONYMOUS = 1 << 13;
static constexpr uint64 ALL_ADMINISTRATOR_RIGHTS =
CAN_CHANGE_INFO_AND_SETTINGS | CAN_POST_MESSAGES | CAN_EDIT_MESSAGES | CAN_DELETE_MESSAGES | CAN_INVITE_USERS |
CAN_RESTRICT_MEMBERS | CAN_PIN_MESSAGES | CAN_MANAGE_TOPICS | CAN_PROMOTE_MEMBERS | CAN_MANAGE_CALLS |
CAN_MANAGE_DIALOG | CAN_POST_STORIES | CAN_EDIT_STORIES | CAN_DELETE_STORIES | CAN_MANAGE_DIRECT_MESSAGES |
- CAN_MANAGE_RANKS;
+ CAN_MANAGE_RANKS | CAN_MANAGE_LINKED_PEERS;
uint64 flags_;
@@ -69,7 +70,7 @@ class AdministratorRights {
bool can_restrict_members, bool can_pin_messages, bool can_manage_topics,
bool can_promote_members, bool can_manage_calls, bool can_post_stories, bool can_edit_stories,
bool can_delete_stories, bool can_manage_direct_messages, bool can_manage_ranks,
- ChannelType channel_type);
+ bool can_manage_linked_peers, ChannelType channel_type);
telegram_api::object_ptr<telegram_api::chatAdminRights> get_chat_admin_rights() const;
@@ -139,6 +140,10 @@ class AdministratorRights {
return (flags_ & CAN_MANAGE_RANKS) != 0;
}
+ bool can_manage_linked_peers() const {
+ return (flags_ & CAN_MANAGE_LINKED_PEERS) != 0;
+ }
+
bool is_anonymous() const {
return (flags_ & IS_ANONYMOUS) != 0;
}
@@ -495,6 +500,10 @@ class DialogParticipantStatus {
return get_administrator_rights().can_manage_ranks();
}
+ bool can_manage_linked_peers() const {
+ return get_administrator_rights().can_manage_linked_peers();
+ }
+
bool can_be_edited() const {
return (flags_ & CAN_BE_EDITED) != 0;
}
diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp
index 41985e495..39fc3883b 100644
--- a/td/telegram/LinkManager.cpp
+++ b/td/telegram/LinkManager.cpp
@@ -453,7 +453,7 @@ static AdministratorRights get_administrator_rights(Slice rights, bool for_chann
return AdministratorRights(is_anonymous, can_manage_dialog, can_change_info, can_post_messages, can_edit_messages,
can_delete_messages, can_invite_users, can_restrict_members, can_pin_messages,
can_manage_topics, can_promote_members, can_manage_calls, can_post_stories,
- can_edit_stories, can_delete_stories, can_manage_direct_messages, can_manage_ranks,
+ can_edit_stories, can_delete_stories, can_manage_direct_messages, can_manage_ranks, false,
for_channel ? ChannelType::Broadcast : ChannelType::Megagroup);
}