Update API scheme on layer 216.

This commit is contained in:
John Preston
2025-09-26 12:19:36 +04:00
parent e0f4aca336
commit 304cc33b76
9 changed files with 72 additions and 45 deletions
@@ -281,7 +281,8 @@ void ShowConferenceCallLinkBox(
MTPphone_ToggleGroupCallSettings( MTPphone_ToggleGroupCallSettings(
MTP_flags(Flag::f_reset_invite_hash), MTP_flags(Flag::f_reset_invite_hash),
call->input(), call->input(),
MTPbool()) // join_muted MTPBool(), // join_muted
MTPBool()) // messages_enabled
).done([=](const MTPUpdates &result) { ).done([=](const MTPUpdates &result) {
call->session().api().applyUpdates(result); call->session().api().applyUpdates(result);
ShowConferenceCallLinkBox(show, call, args); ShowConferenceCallLinkBox(show, call, args);
@@ -309,20 +309,23 @@ template <typename MTPD>
} // namespace } // namespace
QByteArray SerializeMessage(const MTPTextWithEntities &text) { QByteArray SerializeMessage(const PreparedMessage &data) {
return Serialize(Object("groupCallMessage", { return Serialize(Object("groupCallMessage", {
Value(
"random_id",
String(QByteArray::number(int64(data.randomId)))),
Value( Value(
"message", "message",
Object("textWithEntities", { Object("textWithEntities", {
Value("text", String(text.data().vtext().v)), Value("text", String(data.message.data().vtext().v)),
Value( Value(
"entities", "entities",
Array(Entities(text.data().ventities().v))), Array(Entities(data.message.data().ventities().v))),
})), })),
})); }));
} }
std::optional<MTPTextWithEntities> DeserializeMessage( std::optional<PreparedMessage> DeserializeMessage(
const QByteArray &data) { const QByteArray &data) {
auto error = QJsonParseError(); auto error = QJsonParseError();
auto document = QJsonDocument::fromJson(data, &error); auto document = QJsonDocument::fromJson(data, &error);
@@ -335,6 +338,10 @@ std::optional<MTPTextWithEntities> DeserializeMessage(
if (Unsupported(groupCallMessage, "groupCallMessage")) { if (Unsupported(groupCallMessage, "groupCallMessage")) {
return {}; return {};
} }
const auto randomId = GetLong(groupCallMessage, "random_id").value_or(0);
if (!randomId) {
return {};
}
const auto message = groupCallMessage["message"].toObject(); const auto message = groupCallMessage["message"].toObject();
if (Unsupported(message, "textWithEntities")) { if (Unsupported(message, "textWithEntities")) {
return {}; return {};
@@ -349,9 +356,12 @@ std::optional<MTPTextWithEntities> DeserializeMessage(
return {}; return {};
} }
const auto entities = GetEntities(text, maybeEntities->toArray()); const auto entities = GetEntities(text, maybeEntities->toArray());
return MTP_textWithEntities( return PreparedMessage{
MTP_string(text), .randomId = randomId,
MTP_vector<MTPMessageEntity>(entities)); .message = MTP_textWithEntities(
MTP_string(text),
MTP_vector<MTPMessageEntity>(entities)),
};
} }
} // namespace Calls::Group } // namespace Calls::Group
@@ -9,8 +9,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Calls::Group { namespace Calls::Group {
[[nodiscard]] QByteArray SerializeMessage(const MTPTextWithEntities &text); struct PreparedMessage {
[[nodiscard]] std::optional<MTPTextWithEntities> DeserializeMessage( uint64 randomId = 0;
MTPTextWithEntities message;
};
[[nodiscard]] QByteArray SerializeMessage(const PreparedMessage &data);
[[nodiscard]] std::optional<PreparedMessage> DeserializeMessage(
const QByteArray &data); const QByteArray &data);
} // namespace Calls::Group } // namespace Calls::Group
@@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "apiwrap.h" #include "apiwrap.h"
#include "api/api_text_entities.h" #include "api/api_text_entities.h"
#include "base/random.h"
#include "base/unixtime.h" #include "base/unixtime.h"
#include "calls/group/calls_group_call.h" #include "calls/group/calls_group_call.h"
#include "calls/group/calls_group_message_encryption.h" #include "calls/group/calls_group_message_encryption.h"
@@ -63,10 +64,10 @@ void Messages::send(TextWithTags text) {
prepared.entities, prepared.entities,
Api::ConvertOption::SkipLocal))); Api::ConvertOption::SkipLocal)));
const auto id = ++_autoincrementId; const auto randomId = base::RandomValue<uint64>();
const auto from = _call->peer()->session().user(); const auto from = _call->peer()->session().user();
_messages.push_back({ _messages.push_back({
.id = id, .randomId = randomId,
.peer = from, .peer = from,
.text = std::move(prepared), .text = std::move(prepared),
}); });
@@ -74,14 +75,15 @@ void Messages::send(TextWithTags text) {
if (!_call->conference()) { if (!_call->conference()) {
_api->request(MTPphone_SendGroupCallMessage( _api->request(MTPphone_SendGroupCallMessage(
_call->inputCall(), _call->inputCall(),
MTP_long(randomId),
serialized serialized
)).done([=](const MTPBool &, const MTP::Response &response) { )).done([=](const MTPBool &, const MTP::Response &response) {
sent(id, response); sent(randomId, response);
}).fail([=](const MTP::Error &, const MTP::Response &response) { }).fail([=](const MTP::Error &, const MTP::Response &response) {
failed(id, response); failed(randomId, response);
}).send(); }).send();
} else { } else {
const auto bytes = SerializeMessage(serialized); const auto bytes = SerializeMessage({ randomId, serialized });
auto v = std::vector<std::uint8_t>(bytes.size()); auto v = std::vector<std::uint8_t>(bytes.size());
bytes::copy(bytes::make_span(v), bytes::make_span(bytes)); bytes::copy(bytes::make_span(v), bytes::make_span(bytes));
@@ -93,9 +95,9 @@ void Messages::send(TextWithTags text) {
_call->inputCall(), _call->inputCall(),
MTP_bytes(bytes::make_span(encrypted)) MTP_bytes(bytes::make_span(encrypted))
)).done([=](const MTPBool &, const MTP::Response &response) { )).done([=](const MTPBool &, const MTP::Response &response) {
sent(id, response); sent(randomId, response);
}).fail([=](const MTP::Error &, const MTP::Response &response) { }).fail([=](const MTP::Error &, const MTP::Response &response) {
failed(id, response); failed(randomId, response);
}).send(); }).send();
} }
checkDestroying(true); checkDestroying(true);
@@ -105,7 +107,7 @@ void Messages::received(const MTPDupdateGroupCallMessage &data) {
if (!ready()) { if (!ready()) {
return; return;
} }
received(data.vfrom_id(), data.vmessage()); received(data.vrandom_id().v, data.vfrom_id(), data.vmessage());
pushChanges(); pushChanges();
} }
@@ -129,17 +131,22 @@ void Messages::received(const MTPDupdateGroupCallEncryptedMessage &data) {
LOG(("API Error: Can't parse decrypted message")); LOG(("API Error: Can't parse decrypted message"));
return; return;
} }
received(fromId, *deserialized, true); received(deserialized->randomId, fromId, deserialized->message, true);
pushChanges(); pushChanges();
} }
void Messages::received( void Messages::received(
uint64 randomId,
const MTPPeer &from, const MTPPeer &from,
const MTPTextWithEntities &message, const MTPTextWithEntities &message,
bool checkCustomEmoji) { bool checkCustomEmoji) {
const auto peer = _call->peer(); const auto peer = _call->peer();
if (peerFromMTP(from) == peer->session().userPeerId()) { const auto i = ranges::find(_messages, randomId, &Message::randomId);
// Our own we add only locally. if (i != end(_messages)) {
if (peerFromMTP(from) == peer->session().userPeerId() && !i->date) {
i->date = base::unixtime::now();
checkDestroying(true);
}
return; return;
} }
auto allowedEntityTypes = std::vector<EntityType>{ auto allowedEntityTypes = std::vector<EntityType>{
@@ -155,9 +162,8 @@ void Messages::received(
if (checkCustomEmoji && !peer->isSelf() && !peer->isPremium()) { if (checkCustomEmoji && !peer->isSelf() && !peer->isPremium()) {
allowedEntityTypes.pop_back(); allowedEntityTypes.pop_back();
} }
const auto id = ++_autoincrementId;
_messages.push_back({ _messages.push_back({
.id = id, .randomId = randomId,
.date = base::unixtime::now(), .date = base::unixtime::now(),
.peer = peer->owner().peer(peerFromMTP(from)), .peer = peer->owner().peer(peerFromMTP(from)),
.text = Ui::Text::Filtered( .text = Ui::Text::Filtered(
@@ -215,17 +221,17 @@ void Messages::pushChanges() {
_changes.fire_copy(_messages); _changes.fire_copy(_messages);
} }
void Messages::sent(int id, const MTP::Response &response) { void Messages::sent(uint64 randomId, const MTP::Response &response) {
const auto i = ranges::find(_messages, id, &Message::id); const auto i = ranges::find(_messages, randomId, &Message::randomId);
if (i != end(_messages)) { if (i != end(_messages) && !i->date) {
i->date = Api::UnixtimeFromMsgId(response.outerMsgId); i->date = Api::UnixtimeFromMsgId(response.outerMsgId);
checkDestroying(true); checkDestroying(true);
} }
} }
void Messages::failed(int id, const MTP::Response &response) { void Messages::failed(uint64 randomId, const MTP::Response &response) {
const auto i = ranges::find(_messages, id, &Message::id); const auto i = ranges::find(_messages, randomId, &Message::randomId);
if (i != end(_messages)) { if (i != end(_messages) && !i->date) {
i->date = Api::UnixtimeFromMsgId(response.outerMsgId); i->date = Api::UnixtimeFromMsgId(response.outerMsgId);
i->failed = true; i->failed = true;
checkDestroying(true); checkDestroying(true);
@@ -25,7 +25,7 @@ struct Response;
namespace Calls::Group { namespace Calls::Group {
struct Message { struct Message {
int id = 0; uint64 randomId = 0;
TimeId date = 0; TimeId date = 0;
not_null<PeerData*> peer; not_null<PeerData*> peer;
TextWithEntities text; TextWithEntities text;
@@ -50,11 +50,12 @@ private:
void checkDestroying(bool afterChanges = false); void checkDestroying(bool afterChanges = false);
void received( void received(
uint64 randomId,
const MTPPeer &from, const MTPPeer &from,
const MTPTextWithEntities &message, const MTPTextWithEntities &message,
bool checkCustomEmoji = false); bool checkCustomEmoji = false);
void sent(int id, const MTP::Response &response); void sent(uint64 randomId, const MTP::Response &response);
void failed(int id, const MTP::Response &response); void failed(uint64 randomId, const MTP::Response &response);
const not_null<GroupCall*> _call; const not_null<GroupCall*> _call;
const not_null<MTP::Sender*> _api; const not_null<MTP::Sender*> _api;
@@ -67,7 +68,6 @@ private:
std::vector<Message> _messages; std::vector<Message> _messages;
rpl::event_stream<std::vector<Message>> _changes; rpl::event_stream<std::vector<Message>> _changes;
int _autoincrementId = 0;
TimeId _ttl = 0; TimeId _ttl = 0;
rpl::lifetime _lifetime; rpl::lifetime _lifetime;
@@ -101,7 +101,7 @@ void ReceiveOnlyWheelEvents(not_null<Ui::ElasticScroll*> scroll) {
} // namespace } // namespace
struct MessagesUi::MessageView { struct MessagesUi::MessageView {
int id = 0; uint64 id = 0;
PeerData *from = nullptr; PeerData *from = nullptr;
Ui::Animations::Simple toggleAnimation; Ui::Animations::Simple toggleAnimation;
Ui::Animations::Simple sentAnimation; Ui::Animations::Simple sentAnimation;
@@ -150,7 +150,11 @@ void MessagesUi::setupList(rpl::producer<std::vector<Message>> messages) {
for (auto &entry : _views) { for (auto &entry : _views) {
if (!entry.removed) { if (!entry.removed) {
const auto id = entry.id; const auto id = entry.id;
const auto i = ranges::find(from, till, id, &Message::id); const auto i = ranges::find(
from,
till,
id,
&Message::randomId);
if (i == till) { if (i == till) {
toggleMessage(entry, false); toggleMessage(entry, false);
continue; continue;
@@ -168,7 +172,7 @@ void MessagesUi::setupList(rpl::producer<std::vector<Message>> messages) {
} }
auto addedSendingToBottom = false; auto addedSendingToBottom = false;
for (auto i = from; i != till; ++i) { for (auto i = from; i != till; ++i) {
if (!ranges::contains(_views, i->id, &MessageView::id)) { if (!ranges::contains(_views, i->randomId, &MessageView::id)) {
if (i + 1 == till && !i->date) { if (i + 1 == till && !i->date) {
addedSendingToBottom = true; addedSendingToBottom = true;
} }
@@ -277,7 +281,7 @@ void MessagesUi::toggleMessage(MessageView &entry, bool shown) {
repaintMessage(id); repaintMessage(id);
} }
void MessagesUi::repaintMessage(int id) { void MessagesUi::repaintMessage(uint64 id) {
auto i = ranges::find(_views, id, &MessageView::id); auto i = ranges::find(_views, id, &MessageView::id);
if (i == end(_views)) { if (i == end(_views)) {
return; return;
@@ -327,7 +331,7 @@ void MessagesUi::appendMessage(const Message &data) {
} }
auto &entry = _views.emplace_back(); auto &entry = _views.emplace_back();
const auto id = entry.id = data.id; const auto id = entry.id = data.randomId;
const auto repaint = [=] { const auto repaint = [=] {
repaintMessage(id); repaintMessage(id);
}; };
@@ -56,7 +56,7 @@ private:
void updateMessageSize(MessageView &entry); void updateMessageSize(MessageView &entry);
bool updateMessageHeight(MessageView &entry); bool updateMessageHeight(MessageView &entry);
void animateMessageSent(MessageView &entry); void animateMessageSent(MessageView &entry);
void repaintMessage(int id); void repaintMessage(uint64 id);
void recountHeights(std::vector<MessageView>::iterator i, int top); void recountHeights(std::vector<MessageView>::iterator i, int top);
void appendMessage(const Message &data); void appendMessage(const Message &data);
void checkReactionContent( void checkReactionContent(
@@ -84,7 +84,8 @@ void SaveCallJoinMuted(
peer->session().api().request(MTPphone_ToggleGroupCallSettings( peer->session().api().request(MTPphone_ToggleGroupCallSettings(
MTP_flags(MTPphone_ToggleGroupCallSettings::Flag::f_join_muted), MTP_flags(MTPphone_ToggleGroupCallSettings::Flag::f_join_muted),
call->input(), call->input(),
MTP_bool(joinMuted) MTP_bool(joinMuted),
MTPBool() // messages_enabled
)).send(); )).send();
} }
+5 -5
View File
@@ -442,7 +442,7 @@ updateGroupCallChainBlocks#a477288f call:InputGroupCall sub_chain_id:int blocks:
updateReadMonoForumInbox#77b0e372 channel_id:long saved_peer_id:Peer read_max_id:int = Update; updateReadMonoForumInbox#77b0e372 channel_id:long saved_peer_id:Peer read_max_id:int = Update;
updateReadMonoForumOutbox#a4a79376 channel_id:long saved_peer_id:Peer read_max_id:int = Update; updateReadMonoForumOutbox#a4a79376 channel_id:long saved_peer_id:Peer read_max_id:int = Update;
updateMonoForumNoPaidException#9f812b08 flags:# exception:flags.0?true channel_id:long saved_peer_id:Peer = Update; updateMonoForumNoPaidException#9f812b08 flags:# exception:flags.0?true channel_id:long saved_peer_id:Peer = Update;
updateGroupCallMessage#96fb0840 call:InputGroupCall from_id:Peer message:TextWithEntities = Update; updateGroupCallMessage#78c314e0 call:InputGroupCall from_id:Peer random_id:long message:TextWithEntities = Update;
updateGroupCallEncryptedMessage#c957a766 call:InputGroupCall from_id:Peer encrypted_message:bytes = Update; updateGroupCallEncryptedMessage#c957a766 call:InputGroupCall from_id:Peer encrypted_message:bytes = Update;
updatePinnedForumTopic#683b2c52 flags:# pinned:flags.0?true peer:Peer topic_id:int = Update; updatePinnedForumTopic#683b2c52 flags:# pinned:flags.0?true peer:Peer topic_id:int = Update;
updatePinnedForumTopics#def143d0 flags:# peer:Peer order:flags.0?Vector<int> = Update; updatePinnedForumTopics#def143d0 flags:# peer:Peer order:flags.0?Vector<int> = Update;
@@ -1359,7 +1359,7 @@ peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked;
stats.messageStats#7fe91c14 views_graph:StatsGraph reactions_by_emotion_graph:StatsGraph = stats.MessageStats; stats.messageStats#7fe91c14 views_graph:StatsGraph reactions_by_emotion_graph:StatsGraph = stats.MessageStats;
groupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall; groupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall;
groupCall#553b0ba1 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true conference:flags.14?true creator:flags.15?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int invite_link:flags.16?string = GroupCall; groupCall#553b0ba1 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true conference:flags.14?true creator:flags.15?true messages_enabled:flags.17?true can_change_messages_enabled:flags.18?true min:flags.19?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int invite_link:flags.16?string = GroupCall;
inputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall; inputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall;
inputGroupCallSlug#fe06823f slug:string = InputGroupCall; inputGroupCallSlug#fe06823f slug:string = InputGroupCall;
@@ -1578,7 +1578,7 @@ stickerKeyword#fcfeb29c document_id:long keyword:Vector<string> = StickerKeyword
username#b4073647 flags:# editable:flags.0?true active:flags.1?true username:string = Username; username#b4073647 flags:# editable:flags.0?true active:flags.1?true username:string = Username;
forumTopicDeleted#23f109b id:int = ForumTopic; forumTopicDeleted#23f109b id:int = ForumTopic;
forumTopic#71701da9 flags:# my:flags.1?true closed:flags.2?true pinned:flags.3?true short:flags.5?true hidden:flags.6?true title_missing:flags.7?true id:int date:int title:string icon_color:int icon_emoji_id:flags.0?long top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int from_id:Peer notify_settings:PeerNotifySettings draft:flags.4?DraftMessage = ForumTopic; forumTopic#cdff0eca flags:# my:flags.1?true closed:flags.2?true pinned:flags.3?true short:flags.5?true hidden:flags.6?true title_missing:flags.7?true id:int date:int peer:Peer title:string icon_color:int icon_emoji_id:flags.0?long top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int from_id:Peer notify_settings:PeerNotifySettings draft:flags.4?DraftMessage = ForumTopic;
messages.forumTopics#367617d3 flags:# order_by_create_date:flags.0?true count:int topics:Vector<ForumTopic> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> pts:int = messages.ForumTopics; messages.forumTopics#367617d3 flags:# order_by_create_date:flags.0?true count:int topics:Vector<ForumTopic> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> pts:int = messages.ForumTopics;
@@ -2699,7 +2699,7 @@ phone.joinGroupCall#8fb53057 flags:# muted:flags.0?true video_stopped:flags.2?tr
phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates; phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates;
phone.inviteToGroupCall#7b393160 call:InputGroupCall users:Vector<InputUser> = Updates; phone.inviteToGroupCall#7b393160 call:InputGroupCall users:Vector<InputUser> = Updates;
phone.discardGroupCall#7a777135 call:InputGroupCall = Updates; phone.discardGroupCall#7a777135 call:InputGroupCall = Updates;
phone.toggleGroupCallSettings#74bbb43d flags:# reset_invite_hash:flags.1?true call:InputGroupCall join_muted:flags.0?Bool = Updates; phone.toggleGroupCallSettings#e9723804 flags:# reset_invite_hash:flags.1?true call:InputGroupCall join_muted:flags.0?Bool messages_enabled:flags.2?Bool = Updates;
phone.getGroupCall#41845db call:InputGroupCall limit:int = phone.GroupCall; phone.getGroupCall#41845db call:InputGroupCall limit:int = phone.GroupCall;
phone.getGroupParticipants#c558d8ab call:InputGroupCall ids:Vector<InputPeer> sources:Vector<int> offset:string limit:int = phone.GroupParticipants; phone.getGroupParticipants#c558d8ab call:InputGroupCall ids:Vector<InputPeer> sources:Vector<int> offset:string limit:int = phone.GroupParticipants;
phone.checkGroupCall#b59cf977 call:InputGroupCall sources:Vector<int> = Vector<int>; phone.checkGroupCall#b59cf977 call:InputGroupCall sources:Vector<int> = Vector<int>;
@@ -2722,7 +2722,7 @@ phone.sendConferenceCallBroadcast#c6701900 call:InputGroupCall block:bytes = Upd
phone.inviteConferenceCallParticipant#bcf22685 flags:# video:flags.0?true call:InputGroupCall user_id:InputUser = Updates; phone.inviteConferenceCallParticipant#bcf22685 flags:# video:flags.0?true call:InputGroupCall user_id:InputUser = Updates;
phone.declineConferenceCallInvite#3c479971 msg_id:int = Updates; phone.declineConferenceCallInvite#3c479971 msg_id:int = Updates;
phone.getGroupCallChainBlocks#ee9f88a6 call:InputGroupCall sub_chain_id:int offset:int limit:int = Updates; phone.getGroupCallChainBlocks#ee9f88a6 call:InputGroupCall sub_chain_id:int offset:int limit:int = Updates;
phone.sendGroupCallMessage#db608048 call:InputGroupCall message:TextWithEntities = Bool; phone.sendGroupCallMessage#87893014 call:InputGroupCall random_id:long message:TextWithEntities = Bool;
phone.sendGroupCallEncryptedMessage#e5afa56d call:InputGroupCall encrypted_message:bytes = Bool; phone.sendGroupCallEncryptedMessage#e5afa56d call:InputGroupCall encrypted_message:bytes = Bool;
langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference; langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference;