aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2026-07-10 21:12:12 +0300
committerlevlam <levlam@telegram.org>2026-07-10 21:12:12 +0300
commit19e96afc059580dc360ba63751d222fcfc144f51 (patch)
tree027253fa10a5e0b08bec238be5b81b9c1cd923c6
parent5e6beb57c2777190688cd5b369c3337af4951327 (diff)
Add td_api::messageChatCommunityChanged.
-rw-r--r--td/generate/scheme/td_api.tl4
-rw-r--r--td/telegram/DialogAction.cpp1
-rw-r--r--td/telegram/MessageContent.cpp82
-rw-r--r--td/telegram/MessageContentType.cpp10
-rw-r--r--td/telegram/MessageContentType.h3
5 files changed, 96 insertions, 4 deletions
diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl
index 75ef5aea5..afc828046 100644
--- a/td/generate/scheme/td_api.tl
+++ b/td/generate/scheme/td_api.tl
@@ -5279,6 +5279,10 @@ messageChatJoinByRequest = MessageContent;
//@description A chat member was deleted @user_id User identifier of the deleted chat member
messageChatDeleteMember user_id:int53 = MessageContent;
+//@description The chat was added or deleted from a community
+//@community_id Identifier of the community to which the chat belongs; 0 if none
+messageChatCommunityChanged community_id:int53 = MessageContent;
+
//@description A basic group was upgraded to a supergroup and was deactivated as the result @supergroup_id Identifier of the supergroup to which the basic group was upgraded
messageChatUpgradeTo supergroup_id:int53 = MessageContent;
diff --git a/td/telegram/DialogAction.cpp b/td/telegram/DialogAction.cpp
index bf2da949c..e4adb4976 100644
--- a/td/telegram/DialogAction.cpp
+++ b/td/telegram/DialogAction.cpp
@@ -513,6 +513,7 @@ bool DialogAction::is_canceled_by_message_of_type(MessageContentType message_con
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
case MessageContentType::RichText:
+ case MessageContentType::ChangeCommunity:
return false;
default:
UNREACHABLE();
diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp
index e84b60b61..5366fd21d 100644
--- a/td/telegram/MessageContent.cpp
+++ b/td/telegram/MessageContent.cpp
@@ -22,6 +22,8 @@
#include "td/telegram/ChatId.h"
#include "td/telegram/ChatManager.h"
#include "td/telegram/ChatTheme.hpp"
+#include "td/telegram/CommunityId.h"
+#include "td/telegram/CommunityManager.h"
#include "td/telegram/Contact.h"
#include "td/telegram/CurrencyAmount.h"
#include "td/telegram/CurrencyAmount.hpp"
@@ -549,7 +551,7 @@ class MessageChatSetTtl final : public MessageContent {
class MessageUnsupported final : public MessageContent {
public:
- static constexpr int32 CURRENT_VERSION = 60;
+ static constexpr int32 CURRENT_VERSION = 61;
int32 version = CURRENT_VERSION;
MessageUnsupported() = default;
@@ -1795,6 +1797,19 @@ class MessageRichText final : public MessageContent {
}
};
+class MessageChangeCommunity final : public MessageContent {
+ public:
+ CommunityId community_id;
+
+ MessageChangeCommunity() = default;
+ explicit MessageChangeCommunity(CommunityId community_id) : community_id(community_id) {
+ }
+
+ MessageContentType get_type() const final {
+ return MessageContentType::ChangeCommunity;
+ }
+};
+
template <class StorerT>
static void store(const MessageContent *content, StorerT &storer) {
CHECK(content != nullptr);
@@ -2956,6 +2971,17 @@ static void store(const MessageContent *content, StorerT &storer) {
store(m->rich_message, storer);
break;
}
+ case MessageContentType::ChangeCommunity: {
+ const auto *m = static_cast<const MessageChangeCommunity *>(content);
+ bool has_community_id = m->community_id.is_valid();
+ BEGIN_STORE_FLAGS();
+ STORE_FLAG(has_community_id);
+ END_STORE_FLAGS();
+ if (has_community_id) {
+ store(m->community_id, storer);
+ }
+ break;
+ }
default:
UNREACHABLE();
}
@@ -4412,6 +4438,18 @@ static void parse(unique_ptr<MessageContent> &content, ParserT &parser) {
content = std::move(m);
break;
}
+ case MessageContentType::ChangeCommunity: {
+ auto m = make_unique<MessageChangeCommunity>();
+ bool has_community_id;
+ BEGIN_PARSE_FLAGS();
+ PARSE_FLAG(has_community_id);
+ END_PARSE_FLAGS();
+ if (has_community_id) {
+ parse(m->community_id, parser);
+ }
+ content = std::move(m);
+ break;
+ }
default:
is_bad = true;
@@ -5411,6 +5449,7 @@ bool can_message_content_have_input_media(const Td *td, const MessageContent *co
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return false;
case MessageContentType::Animation:
case MessageContentType::Audio:
@@ -5584,6 +5623,7 @@ SecretInputMedia get_message_content_secret_input_media(
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
case MessageContentType::RichText:
+ case MessageContentType::ChangeCommunity:
break;
default:
UNREACHABLE();
@@ -5818,6 +5858,7 @@ static InputMedia get_message_content_input_media_impl(
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
break;
default:
UNREACHABLE();
@@ -6100,6 +6141,7 @@ void delete_message_content_thumbnail(Td *td, MessageContent *content, int32 med
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
break;
default:
UNREACHABLE();
@@ -6374,6 +6416,7 @@ Status can_send_message_content(DialogId dialog_id, const MessageContent *conten
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
UNREACHABLE();
}
return Status::OK();
@@ -6575,6 +6618,7 @@ static int32 get_message_content_media_index_mask(const MessageContent *content,
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return 0;
default:
UNREACHABLE();
@@ -7042,6 +7086,8 @@ vector<UserId> get_message_content_min_user_ids(const Td *td, const MessageConte
const auto *content = static_cast<const MessageRichText *>(message_content);
return content->rich_message.get_user_ids();
}
+ case MessageContentType::ChangeCommunity:
+ break;
default:
UNREACHABLE();
break;
@@ -7657,6 +7703,7 @@ void merge_message_contents(Td *td, const MessageContent *old_content, MessageCo
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
break;
default:
UNREACHABLE();
@@ -7836,6 +7883,7 @@ bool merge_message_content_file_id(Td *td, MessageContent *message_content, File
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
case MessageContentType::RichText:
+ case MessageContentType::ChangeCommunity:
LOG(ERROR) << "Receive new file " << new_file_id << " in a sent message of the type " << content_type;
break;
default:
@@ -8662,6 +8710,14 @@ void compare_message_contents(Td *td, const MessageContent *old_content, const M
RichMessage::compare(td, lhs->rich_message, rhs->rich_message, is_content_changed, need_update);
break;
}
+ case MessageContentType::ChangeCommunity: {
+ const auto *lhs = static_cast<const MessageChangeCommunity *>(old_content);
+ const auto *rhs = static_cast<const MessageChangeCommunity *>(new_content);
+ if (lhs->community_id != rhs->community_id) {
+ need_update = true;
+ }
+ break;
+ }
default:
UNREACHABLE();
break;
@@ -10255,6 +10311,7 @@ unique_ptr<MessageContent> dup_message_content(Td *td, DialogId dialog_id, const
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return nullptr;
default:
UNREACHABLE();
@@ -10296,6 +10353,7 @@ unique_ptr<MessageContent> get_action_message_content(Td *td, tl_object_ptr<tele
case telegram_api::messageActionSuggestedPostRefund::ID:
case telegram_api::messageActionNewCreatorPending::ID:
case telegram_api::messageActionChangeCreator::ID:
+ case telegram_api::messageActionChangeCommunity::ID:
LOG(ERROR) << "Receive business " << to_string(action_ptr);
break;
case telegram_api::messageActionHistoryClear::ID:
@@ -10332,7 +10390,6 @@ unique_ptr<MessageContent> get_action_message_content(Td *td, tl_object_ptr<tele
case telegram_api::messageActionNoForwardsRequest::ID:
case telegram_api::messageActionPollAppendAnswer::ID:
case telegram_api::messageActionPollDeleteAnswer::ID:
- case telegram_api::messageActionChangeCommunity::ID:
// ok
break;
case telegram_api::messageActionBotAllowed::ID:
@@ -11123,7 +11180,12 @@ unique_ptr<MessageContent> get_action_message_content(Td *td, tl_object_ptr<tele
return td::make_unique<MessageManagedBotCreated>(bot_user_id);
}
case telegram_api::messageActionChangeCommunity::ID: {
- break;
+ auto action = telegram_api::move_object_as<telegram_api::messageActionChangeCommunity>(action_ptr);
+ auto community_id = CommunityId(action->community_id_);
+ if (!community_id.is_valid()) {
+ community_id = {};
+ }
+ return td::make_unique<MessageChangeCommunity>(community_id);
}
default:
UNREACHABLE();
@@ -11903,6 +11965,11 @@ td_api::object_ptr<td_api::MessageContent> get_message_content_object(
m->poll_message_id.get(), check_utf8(m->data) ? m->data : base64_encode(m->data),
get_formatted_text_object(nullptr, m->text, true, -1));
}
+ case MessageContentType::ChangeCommunity: {
+ const auto *m = static_cast<const MessageChangeCommunity *>(content);
+ return td_api::make_object<td_api::messageChatCommunityChanged>(
+ td->community_manager_->get_community_id_object(m->community_id, "messageChatCommunityChanged"));
+ }
default:
UNREACHABLE();
return nullptr;
@@ -12842,6 +12909,7 @@ string get_message_content_search_text(const Td *td, const MessageContent *conte
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return string();
default:
UNREACHABLE();
@@ -13414,6 +13482,11 @@ void add_message_content_dependencies(Dependencies &dependencies, const MessageC
content->rich_message.add_dependencies(dependencies);
break;
}
+ case MessageContentType::ChangeCommunity: {
+ const auto *content = static_cast<const MessageChangeCommunity *>(message_content);
+ dependencies.add(content->community_id);
+ break;
+ }
default:
UNREACHABLE();
break;
@@ -13444,6 +13517,9 @@ void apply_updates_from_service_message_content(Td *td, const MessageContent *co
return td->messages_manager_->get_message_from_server(
get_message_content_replied_message_full_id(dialog_id, content), Promise<Unit>(),
"apply_updates_from_service_message_content");
+ case MessageContentType::ChangeCommunity:
+ // TODO apply community change
+ return;
default:
// nothing to do
return;
diff --git a/td/telegram/MessageContentType.cpp b/td/telegram/MessageContentType.cpp
index 84f942ba0..2e60ce6c6 100644
--- a/td/telegram/MessageContentType.cpp
+++ b/td/telegram/MessageContentType.cpp
@@ -200,6 +200,8 @@ StringBuilder &operator<<(StringBuilder &string_builder, MessageContentType cont
return string_builder << "PollDeleteAnswer";
case MessageContentType::RichText:
return string_builder << "RichMessage";
+ case MessageContentType::ChangeCommunity:
+ return string_builder << "ChangeCommunity";
default:
return string_builder << "Invalid type " << static_cast<int32>(content_type);
}
@@ -314,6 +316,7 @@ bool is_allowed_media_group_content(MessageContentType content_type) {
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
case MessageContentType::RichText:
+ case MessageContentType::ChangeCommunity:
return false;
default:
UNREACHABLE();
@@ -463,6 +466,7 @@ bool can_be_secret_message_content(MessageContentType content_type) {
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
case MessageContentType::RichText:
+ case MessageContentType::ChangeCommunity:
return false;
default:
UNREACHABLE();
@@ -567,6 +571,7 @@ bool can_be_local_message_content(MessageContentType content_type) {
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return false;
default:
UNREACHABLE();
@@ -671,6 +676,7 @@ bool is_service_message_content(MessageContentType content_type) {
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return true;
default:
UNREACHABLE();
@@ -775,6 +781,7 @@ bool is_editable_message_content(MessageContentType content_type) {
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return false;
default:
UNREACHABLE();
@@ -944,6 +951,7 @@ bool can_have_message_content_caption(MessageContentType content_type) {
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
case MessageContentType::RichText:
+ case MessageContentType::ChangeCommunity:
return false;
default:
UNREACHABLE();
@@ -1050,6 +1058,7 @@ bool can_send_message_content_to_secret_chat(MessageContentType content_type) {
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
default:
UNREACHABLE();
return false;
@@ -1171,6 +1180,7 @@ bool get_default_service_message_content_reactions_are_possible(MessageContentTy
case MessageContentType::ManagedBotCreated:
case MessageContentType::PollAppendAnswer:
case MessageContentType::PollDeleteAnswer:
+ case MessageContentType::ChangeCommunity:
return true;
default:
UNREACHABLE();
diff --git a/td/telegram/MessageContentType.h b/td/telegram/MessageContentType.h
index 27e0b2caf..8ed3291f0 100644
--- a/td/telegram/MessageContentType.h
+++ b/td/telegram/MessageContentType.h
@@ -107,7 +107,8 @@ enum class MessageContentType : int32 {
ManagedBotCreated,
PollAppendAnswer,
PollDeleteAnswer,
- RichText
+ RichText,
+ ChangeCommunity
};
// increase MessageUnsupported::CURRENT_VERSION each time a new message content type is added