Update API scheme to layer 120.

This commit is contained in:
John Preston 2020-10-06 15:58:16 +03:00
parent eb27763cae
commit cc28ba4284
21 changed files with 113 additions and 105 deletions

View File

@ -69,7 +69,7 @@ inputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = In
inputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia;
inputMediaGame#d33f43f3 id:InputGame = InputMedia;
inputMediaInvoice#f4e096c3 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:string = InputMedia;
inputMediaGeoLive#ce4e82fd flags:# stopped:flags.0?true geo_point:InputGeoPoint period:flags.1?int = InputMedia;
inputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia;
inputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector<bytes> solution:flags.1?string solution_entities:flags.1?Vector<MessageEntity> = InputMedia;
inputMediaDice#e66fbf7b emoticon:string = InputMedia;
@ -78,7 +78,7 @@ inputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?Inp
inputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto;
inputGeoPointEmpty#e4c123d6 = InputGeoPoint;
inputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;
inputGeoPoint#48222faf flags:# lat:double long:double accuracy_radius:flags.0?int = InputGeoPoint;
inputPhotoEmpty#1cd7bf0d = InputPhoto;
inputPhoto#3bb3b94a id:long access_hash:long file_reference:bytes = InputPhoto;
@ -141,7 +141,7 @@ chatPhotoEmpty#37c1011c = ChatPhoto;
chatPhoto#d20b9f3c flags:# has_video:flags.0?true photo_small:FileLocation photo_big:FileLocation dc_id:int = ChatPhoto;
messageEmpty#83e5de54 id:int = Message;
message#58ae39c9 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector<RestrictionReason> = Message;
message#58ae39c9 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector<RestrictionReason> = Message;
messageService#286fa604 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction = Message;
messageMediaEmpty#3ded6320 = MessageMedia;
@ -154,7 +154,7 @@ messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia;
messageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia;
messageMediaGame#fdb19008 game:Game = MessageMedia;
messageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia;
messageMediaGeoLive#7c3c2609 geo:GeoPoint period:int = MessageMedia;
messageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int proximity_notification_radius:flags.1?int = MessageMedia;
messageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia;
messageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia;
@ -181,6 +181,7 @@ messageActionBotAllowed#abe9affe domain:string = MessageAction;
messageActionSecureValuesSentMe#1b287353 values:Vector<SecureValue> credentials:SecureCredentialsEncrypted = MessageAction;
messageActionSecureValuesSent#d95c6154 types:Vector<SecureValueType> = MessageAction;
messageActionContactSignUp#f3f25f76 = MessageAction;
messageActionGeoProximityReached#98e0d697 from_id:Peer to_id:Peer distance:int = MessageAction;
dialog#2c171f72 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int = Dialog;
dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog;
@ -195,7 +196,7 @@ photoStrippedSize#e0b0bc2e type:string bytes:bytes = PhotoSize;
photoSizeProgressive#5aa86a51 type:string location:FileLocation w:int h:int sizes:Vector<int> = PhotoSize;
geoPointEmpty#1117dd5f = GeoPoint;
geoPoint#296f104 long:double lat:double access_hash:long = GeoPoint;
geoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radius:flags.0?int = GeoPoint;
auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode;
@ -247,8 +248,8 @@ messages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<
messages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs;
messages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
messages.messagesSlice#c8edce1e flags:# inexact:flags.1?true count:int next_rate:flags.0?int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
messages.channelMessages#99262e37 flags:# inexact:flags.1?true pts:int count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
messages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
messages.channelMessages#64479808 flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
messages.messagesNotModified#74535f21 count:int = messages.Messages;
messages.chats#64ff9fd5 chats:Vector<Chat> = messages.Chats;
@ -274,6 +275,7 @@ inputMessagesFilterRoundVideo#b549da53 = MessagesFilter;
inputMessagesFilterMyMentions#c1f8e69a = MessagesFilter;
inputMessagesFilterGeo#e7026d0d = MessagesFilter;
inputMessagesFilterContacts#e062db83 = MessagesFilter;
inputMessagesFilterPinned#1bb00451 = MessagesFilter;
updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update;
updateMessageID#4e90bfd6 id:int random_id:long = Update;
@ -313,7 +315,6 @@ updateSavedGifs#9375341e = Update;
updateBotInlineQuery#54826690 flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint offset:string = Update;
updateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update;
updateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update;
updateChannelPinnedMessage#98592475 channel_id:int id:int = Update;
updateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;
updateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update;
updateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;
@ -338,8 +339,6 @@ updateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector<int> =
updateContactsReset#7084a7be = Update;
updateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update;
updateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update;
updateUserPinnedMessage#4c43da18 user_id:int id:int = Update;
updateChatPinnedMessage#e10db349 chat_id:int id:int version:int = Update;
updateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update;
updateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update;
updateFolderPeers#19360dc0 folder_peers:Vector<FolderPeer> pts:int pts_count:int = Update;
@ -361,6 +360,8 @@ updateReadChannelDiscussionInbox#1cc7de54 flags:# channel_id:int top_msg_id:int
updateReadChannelDiscussionOutbox#4638a26c channel_id:int top_msg_id:int read_max_id:int = Update;
updatePeerBlocked#246a4b22 peer_id:Peer blocked:Bool = Update;
updateChannelUserTyping#ff2abe9f flags:# channel_id:int top_msg_id:flags.0?int user_id:int action:SendMessageAction = Update;
updatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vector<int> pts:int pts_count:int = Update;
updatePinnedChannelMessages#8588878b flags:# pinned:flags.0?true channel_id:int messages:Vector<int> pts:int pts_count:int = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
@ -607,6 +608,7 @@ channelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelPar
channelParticipantCreator#447dca4b flags:# user_id:int admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant;
channelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant;
channelParticipantBanned#1c0facaf flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant;
channelParticipantLeft#c3c6796b user_id:int = ChannelParticipant;
channelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter;
channelParticipantsAdmins#b4608969 = ChannelParticipantsFilter;
@ -615,6 +617,7 @@ channelParticipantsBots#b0d1865b = ChannelParticipantsFilter;
channelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter;
channelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter;
channelParticipantsContacts#bb6ae88d q:string = ChannelParticipantsFilter;
channelParticipantsMentions#e04b5ceb flags:# q:flags.0?string top_msg_id:flags.1?int = ChannelParticipantsFilter;
channels.channelParticipants#f56ee2a8 count:int participants:Vector<ChannelParticipant> users:Vector<User> = channels.ChannelParticipants;
channels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants;
@ -628,7 +631,7 @@ messages.savedGifs#2e0709a5 hash:int gifs:Vector<Document> = messages.SavedGifs;
inputBotInlineMessageMediaAuto#3380c786 flags:# message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;
inputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;
inputBotInlineMessageMediaGeo#c1b15d65 flags:# geo_point:InputGeoPoint period:int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;
inputBotInlineMessageMediaGeo#96929a85 flags:# geo_point:InputGeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;
inputBotInlineMessageMediaVenue#417bbf11 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;
inputBotInlineMessageMediaContact#a6edbffd flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;
inputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;
@ -640,7 +643,7 @@ inputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:Input
botInlineMessageMediaAuto#764cf810 flags:# message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = BotInlineMessage;
botInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = BotInlineMessage;
botInlineMessageMediaGeo#b722de65 flags:# geo:GeoPoint period:int reply_markup:flags.2?ReplyMarkup = BotInlineMessage;
botInlineMessageMediaGeo#51846fd flags:# geo:GeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = BotInlineMessage;
botInlineMessageMediaVenue#8a86659c flags:# geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;
botInlineMessageMediaContact#18d1cdc2 flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;
@ -1164,8 +1167,6 @@ messageViews#455b853d flags:# views:flags.0?int forwards:flags.1?int replies:fla
messages.messageViews#b6c4f543 views:Vector<MessageViews> chats:Vector<Chat> users:Vector<User> = messages.MessageViews;
stats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats;
messages.discussionMessage#f5dd8f9d flags:# messages:Vector<Message> max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int chats:Vector<Chat> users:Vector<User> = messages.DiscussionMessage;
messageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader;
@ -1174,6 +1175,8 @@ messageReplies#4128faac flags:# comments:flags.0?true replies:int replies_pts:in
peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked;
stats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -1299,7 +1302,7 @@ contacts.blockFromReplies#29a8962c flags:# delete_message:flags.0?true delete_hi
messages.getMessages#63c66506 id:Vector<InputMessage> = messages.Messages;
messages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs;
messages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;
messages.search#4e17810b flags:# peer:InputPeer q:string from_id:flags.0?InputUser top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;
messages.search#c352eec flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;
messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages;
messages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int = messages.AffectedHistory;
messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector<int> = messages.AffectedMessages;
@ -1393,7 +1396,7 @@ messages.getSplitRanges#1cff7e08 = Vector<MessageRange>;
messages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool;
messages.getDialogUnreadMarks#22e24e22 = Vector<DialogPeer>;
messages.clearAllDrafts#7e58ee9c = Bool;
messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true peer:InputPeer id:int = Updates;
messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates;
messages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector<bytes> = Updates;
messages.getPollResults#73bb643b peer:InputPeer msg_id:int = Updates;
messages.getOnlines#6e2be050 peer:InputPeer = ChatOnlines;
@ -1422,6 +1425,7 @@ messages.getOldFeaturedStickers#5fe7025b offset:int limit:int hash:int = message
messages.getReplies#24b581ba peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;
messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage;
messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool;
messages.unpinAllMessages#f025bc8b peer:InputPeer = messages.AffectedHistory;
updates.getState#edd4882a = updates.State;
updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference;
@ -1543,4 +1547,4 @@ stats.getMegagroupStats#dcdf8607 flags:# dark:flags.0?true channel:InputChannel
stats.getMessagePublicForwards#5630281b channel:InputChannel msg_id:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats;
// LAYER 119
// LAYER 120

View File

@ -1998,31 +1998,6 @@ void Updates::feedUpdate(const MTPUpdate &update) {
}
} break;
// Pinned message.
case mtpc_updateUserPinnedMessage: {
const auto &d = update.c_updateUserPinnedMessage();
if (const auto user = session().data().userLoaded(d.vuser_id().v)) {
user->setPinnedMessageId(d.vid().v);
}
} break;
case mtpc_updateChatPinnedMessage: {
const auto &d = update.c_updateChatPinnedMessage();
if (const auto chat = session().data().chatLoaded(d.vchat_id().v)) {
const auto status = chat->applyUpdateVersion(d.vversion().v);
if (status == ChatData::UpdateStatus::Good) {
chat->setPinnedMessageId(d.vid().v);
}
}
} break;
case mtpc_updateChannelPinnedMessage: {
const auto &d = update.c_updateChannelPinnedMessage();
if (const auto channel = session().data().channelLoaded(d.vchannel_id().v)) {
channel->setPinnedMessageId(d.vid().v);
}
} break;
////// Cloud sticker sets
case mtpc_updateNewStickerSet: {
const auto &d = update.c_updateNewStickerSet();

View File

@ -1692,6 +1692,9 @@ void ApiWrap::requestSelfParticipant(not_null<ChannelData*> channel) {
}, [&](const MTPDchannelParticipant &data) {
LOG(("API Error: Got self regular participant."));
finalize(-1, 0);
}, [&](const MTPDchannelParticipantLeft &data) {
LOG(("API Error: Got self left participant."));
finalize(-1, 0);
});
});
}).fail([=](const RPCError &error) {

View File

@ -86,6 +86,9 @@ public:
AdminDoneCallback adminDoneCallback,
BannedDoneCallback bannedDoneCallback);
[[nodiscard]] not_null<PeerData*> peer() const {
return _peer;
}
[[nodiscard]] Main::Session &session() const override;
void prepare() override;
void rowClicked(not_null<PeerListRow*> row) override;

View File

@ -557,6 +557,8 @@ UserData *ParticipantsAdditionalData::applyParticipant(
return logBad();
}
return applyBanned(data);
}, [&](const MTPDchannelParticipantLeft &data) {
return logBad();
});
}

View File

@ -296,7 +296,7 @@ void BoxController::loadMoreRows() {
MTP_flags(0),
MTP_inputPeerEmpty(),
MTP_string(),
MTP_inputUserEmpty(),
MTP_inputPeerEmpty(),
MTPint(), // top_msg_id
MTP_inputMessagesFilterPhoneCalls(MTP_flags(0)),
MTP_int(0),

View File

@ -36,9 +36,11 @@ QString LocationPoint::lonAsString() const {
MTPGeoPoint LocationPoint::toMTP() const {
return MTP_geoPoint(
MTP_flags(0),
MTP_double(_lon),
MTP_double(_lat),
MTP_long(_access));
MTP_long(_access),
MTP_int(0)); // accuracy_radius
}
float64 LocationPoint::lat() const {

View File

@ -87,7 +87,7 @@ std::optional<MTPmessages_Search> PrepareSearchRequest(
MTP_flags(0),
peer->input,
MTP_string(query),
MTP_inputUserEmpty(),
MTP_inputPeerEmpty(),
MTPint(), // top_msg_id
filter,
MTP_int(0),

View File

@ -380,7 +380,7 @@ int InnerWidget::searchedOffset() const {
int InnerWidget::searchInChatSkip() const {
auto result = st::searchedBarHeight + st::dialogsSearchInHeight;
if (_searchFromUser) {
if (_searchFromPeer) {
result += st::lineWidth + st::dialogsSearchInHeight;
}
return result;
@ -811,7 +811,7 @@ void InnerWidget::paintSearchInChat(Painter &p) const {
auto fullRect = QRect(0, top, width(), height - top);
p.fillRect(fullRect, st::dialogsBg);
if (_searchFromUser) {
if (_searchFromPeer) {
p.fillRect(QRect(0, top + st::dialogsSearchInHeight, width(), st::lineWidth), st::shadowFg);
}
@ -829,7 +829,7 @@ void InnerWidget::paintSearchInChat(Painter &p) const {
} else {
Unexpected("Empty Key in paintSearchInChat.");
}
if (const auto from = _searchFromUser) {
if (const auto from = _searchFromPeer) {
top += st::dialogsSearchInHeight + st::lineWidth;
p.setPen(st::dialogsTextFg);
p.setTextPalette(st::dialogsSearchFromPalette);
@ -1868,7 +1868,7 @@ void InnerWidget::applyFilterUpdate(QString newFilter, bool force) {
newFilter = words.isEmpty() ? QString() : words.join(' ');
if (newFilter != _filter || force) {
_filter = newFilter;
if (_filter.isEmpty() && !_searchFromUser) {
if (_filter.isEmpty() && !_searchFromPeer) {
clearFilter();
} else {
_state = WidgetState::Filtered;
@ -2328,7 +2328,7 @@ bool InnerWidget::hasFilteredResults() const {
return !_filterResults.empty() && _hashtagResults.empty();
}
void InnerWidget::searchInChat(Key key, UserData *from) {
void InnerWidget::searchInChat(Key key, PeerData *from) {
_searchInMigrated = nullptr;
if (const auto peer = key.peer()) {
if (const auto migrateTo = peer->migrateTo()) {
@ -2338,7 +2338,7 @@ void InnerWidget::searchInChat(Key key, UserData *from) {
}
}
_searchInChat = key;
_searchFromUser = from;
_searchFromPeer = from;
if (_searchInChat) {
_controller->closeFolder();
onHashtagFilterUpdate(QStringRef());
@ -2347,9 +2347,9 @@ void InnerWidget::searchInChat(Key key, UserData *from) {
} else {
_cancelSearchInChat->hide();
}
if (_searchFromUser) {
if (_searchFromPeer) {
_cancelSearchFromUser->show();
_searchFromUserUserpic = _searchFromUser->createUserpicView();
_searchFromUserUserpic = _searchFromPeer->createUserpicView();
} else {
_cancelSearchFromUser->hide();
_searchFromUserUserpic = nullptr;
@ -2386,7 +2386,7 @@ void InnerWidget::refreshSearchInChatLabel() {
dialog,
Ui::DialogTextOptions());
}
const auto from = _searchFromUser ? _searchFromUser->name : QString();
const auto from = _searchFromPeer ? _searchFromPeer->name : QString();
if (!from.isEmpty()) {
const auto fromUserText = tr::lng_dlg_search_from(
tr::now,

View File

@ -109,7 +109,7 @@ public:
}
bool hasFilteredResults() const;
void searchInChat(Key key, UserData *from);
void searchInChat(Key key, PeerData *from);
void applyFilterUpdate(QString newFilter, bool force = false);
void onHashtagFilterUpdate(QStringRef newFilter);
@ -119,7 +119,7 @@ public:
void setLoadMoreCallback(Fn<void()> callback);
[[nodiscard]] rpl::producer<> listBottomReached() const;
base::Observable<UserData*> searchFromUserChanged;
base::Observable<PeerData*> searchFromUserChanged;
[[nodiscard]] rpl::producer<ChosenRow> chosenRow() const;
[[nodiscard]] rpl::producer<> updated() const;
@ -395,7 +395,7 @@ private:
Key _searchInChat;
History *_searchInMigrated = nullptr;
UserData *_searchFromUser = nullptr;
PeerData *_searchFromPeer = nullptr;
mutable std::shared_ptr<Data::CloudImageView> _searchInChatUserpic;
mutable std::shared_ptr<Data::CloudImageView> _searchFromUserUserpic;
Ui::Text::String _searchInChatText;

View File

@ -19,7 +19,7 @@ namespace Dialogs {
void ShowSearchFromBox(
not_null<PeerData*> peer,
Fn<void(not_null<UserData*>)> callback,
Fn<void(not_null<PeerData*>)> callback,
Fn<void()> closedCallback) {
auto createController = [
peer,
@ -47,33 +47,33 @@ void ShowSearchFromBox(
SearchFromController::SearchFromController(
not_null<PeerData*> peer,
Fn<void(not_null<UserData*>)> callback)
Fn<void(not_null<PeerData*>)> callback)
: AddSpecialBoxController(
peer,
ParticipantsBoxController::Role::Members,
AdminDoneCallback(),
BannedDoneCallback())
, _callback(std::move(callback))
{
, _callback(std::move(callback)) {
_excludeSelf = false;
}
void SearchFromController::prepare() {
AddSpecialBoxController::prepare();
delegate()->peerListSetTitle(tr::lng_search_messages_from());
}
void SearchFromController::rowClicked(not_null<PeerListRow*> row) {
Expects(row->peer()->isUser());
if (const auto onstack = base::duplicate(_callback)) {
onstack(row->peer()->asUser());
if (const auto megagroup = peer()->asMegagroup()) {
if (!delegate()->peerListFindRow(megagroup->id)) {
delegate()->peerListAppendRow(
std::make_unique<PeerListRow>(megagroup));
setDescriptionText({});
delegate()->peerListRefreshRows();
}
}
}
std::unique_ptr<PeerListRow> SearchFromController::createRow(
not_null<UserData*> user) const {
return std::make_unique<PeerListRow>(user);
void SearchFromController::rowClicked(not_null<PeerListRow*> row) {
if (const auto onstack = base::duplicate(_callback)) {
onstack(row->peer());
}
}
} // namespace Dialogs

View File

@ -14,23 +14,20 @@ namespace Dialogs {
void ShowSearchFromBox(
not_null<PeerData*> peer,
Fn<void(not_null<UserData*>)> callback,
Fn<void(not_null<PeerData*>)> callback,
Fn<void()> closedCallback);
class SearchFromController : public AddSpecialBoxController {
public:
SearchFromController(
not_null<PeerData*> peer,
Fn<void(not_null<UserData*>)> callback);
Fn<void(not_null<PeerData*>)> callback);
void prepare() override;
void rowClicked(not_null<PeerListRow*> row) override;
protected:
std::unique_ptr<PeerListRow> createRow(not_null<UserData*> user) const;
private:
Fn<void(not_null<UserData*>)> _callback;
Fn<void(not_null<PeerData*>)> _callback;
};

View File

@ -208,8 +208,8 @@ Widget::Widget(
connect(_inner, SIGNAL(completeHashtag(QString)), this, SLOT(onCompleteHashtag(QString)));
connect(_inner, SIGNAL(refreshHashtags()), this, SLOT(onFilterCursorMoved()));
connect(_inner, SIGNAL(cancelSearchInChat()), this, SLOT(onCancelSearchInChat()));
subscribe(_inner->searchFromUserChanged, [this](UserData *user) {
setSearchInChat(_searchInChat, user);
subscribe(_inner->searchFromUserChanged, [this](PeerData *from) {
setSearchInChat(_searchInChat, from);
applyFilterUpdate(true);
});
_inner->chosenRow(
@ -789,7 +789,7 @@ void Widget::onDraggingScrollTimer() {
bool Widget::onSearchMessages(bool searchCache) {
auto result = false;
auto q = _filter->getLastText().trimmed();
if (q.isEmpty() && !_searchFromUser) {
if (q.isEmpty() && !_searchFromAuthor) {
cancelSearchRequest();
_api.request(base::take(_peerSearchRequest)).cancel();
return true;
@ -804,7 +804,7 @@ bool Widget::onSearchMessages(bool searchCache) {
const auto i = _searchCache.find(q);
if (i != _searchCache.end()) {
_searchQuery = q;
_searchQueryFrom = _searchFromUser;
_searchQueryFrom = _searchFromAuthor;
_searchNextRate = 0;
_searchFull = _searchFullMigrated = false;
cancelSearchRequest();
@ -816,9 +816,9 @@ bool Widget::onSearchMessages(bool searchCache) {
0);
result = true;
}
} else if (_searchQuery != q || _searchQueryFrom != _searchFromUser) {
} else if (_searchQuery != q || _searchQueryFrom != _searchFromAuthor) {
_searchQuery = q;
_searchQueryFrom = _searchFromUser;
_searchQueryFrom = _searchFromAuthor;
_searchNextRate = 0;
_searchFull = _searchFullMigrated = false;
cancelSearchRequest();
@ -836,8 +836,8 @@ bool Widget::onSearchMessages(bool searchCache) {
peer->input,
MTP_string(_searchQuery),
(_searchQueryFrom
? _searchQueryFrom->inputUser
: MTP_inputUserEmpty()),
? _searchQueryFrom->input
: MTP_inputPeerEmpty()),
MTPint(), // top_msg_id
MTP_inputMessagesFilterEmpty(),
MTP_int(0),
@ -1009,8 +1009,8 @@ void Widget::onSearchMore() {
peer->input,
MTP_string(_searchQuery),
(_searchQueryFrom
? _searchQueryFrom->inputUser
: MTP_inputUserEmpty()),
? _searchQueryFrom->input
: MTP_inputPeerEmpty()),
MTPint(), // top_msg_id
MTP_inputMessagesFilterEmpty(),
MTP_int(0),
@ -1103,8 +1103,8 @@ void Widget::onSearchMore() {
_searchInMigrated->peer->input,
MTP_string(_searchQuery),
(_searchQueryFrom
? _searchQueryFrom->inputUser
: MTP_inputUserEmpty()),
? _searchQueryFrom->input
: MTP_inputPeerEmpty()),
MTPint(), // top_msg_id
MTP_inputMessagesFilterEmpty(),
MTP_int(0),
@ -1380,7 +1380,7 @@ void Widget::applyFilterUpdate(bool force) {
auto filterText = _filter->getLastText();
_inner->applyFilterUpdate(filterText, force);
if (filterText.isEmpty() && !_searchFromUser) {
if (filterText.isEmpty() && !_searchFromAuthor) {
clearSearchCache();
}
_cancelSearch->toggle(!filterText.isEmpty(), anim::type::normal);
@ -1395,7 +1395,7 @@ void Widget::applyFilterUpdate(bool force) {
_peerSearchQuery = QString();
}
if (_chooseFromUser->toggled() || _searchFromUser) {
if (_chooseFromUser->toggled() || _searchFromAuthor) {
auto switchToChooseFrom = SwitchToChooseFromQuery();
if (_lastFilterText != switchToChooseFrom
&& switchToChooseFrom.startsWith(_lastFilterText)
@ -1412,7 +1412,7 @@ void Widget::searchInChat(Key chat) {
applyFilterUpdate(true);
}
void Widget::setSearchInChat(Key chat, UserData *from) {
void Widget::setSearchInChat(Key chat, PeerData *from) {
if (chat.folder()) {
chat = Key();
}
@ -1433,13 +1433,13 @@ void Widget::setSearchInChat(Key chat, UserData *from) {
} else if (!_searchInChat) {
from = nullptr;
}
if (_searchFromUser != from || searchInPeerUpdated) {
_searchFromUser = from;
if (_searchFromAuthor != from || searchInPeerUpdated) {
_searchFromAuthor = from;
updateSearchFromVisibility();
clearSearchCache();
}
_inner->searchInChat(_searchInChat, _searchFromUser);
if (_searchFromUser && _lastFilterText == SwitchToChooseFromQuery()) {
_inner->searchInChat(_searchInChat, _searchFromAuthor);
if (_searchFromAuthor && _lastFilterText == SwitchToChooseFromQuery()) {
onCancelSearch();
}
_filter->setFocus();
@ -1467,9 +1467,9 @@ void Widget::showSearchFrom() {
const auto chat = _searchInChat;
ShowSearchFromBox(
peer,
crl::guard(this, [=](not_null<UserData*> user) {
crl::guard(this, [=](not_null<PeerData*> from) {
Ui::hideLayer();
setSearchInChat(chat, user);
setSearchInChat(chat, from);
applyFilterUpdate(true);
}),
crl::guard(this, [=] { _filter->setFocus(); }));
@ -1558,7 +1558,7 @@ void Widget::updateSearchFromVisibility(bool fast) {
auto visible = [&] {
if (const auto peer = _searchInChat.peer()) {
if (peer->isChat() || peer->isMegagroup()) {
return !_searchFromUser;
return !_searchFromAuthor;
}
}
return false;

View File

@ -141,7 +141,7 @@ private:
void setupConnectingWidget();
void setupMainMenuToggle();
bool searchForPeersRequired(const QString &query) const;
void setSearchInChat(Key chat, UserData *from = nullptr);
void setSearchInChat(Key chat, PeerData *from = nullptr);
void showJumpToDate();
void showSearchFrom();
void showMainMenu();
@ -212,7 +212,7 @@ private:
Data::Folder *_openedFolder = nullptr;
Dialogs::Key _searchInChat;
History *_searchInMigrated = nullptr;
UserData *_searchFromUser = nullptr;
PeerData *_searchFromAuthor = nullptr;
QString _lastFilterText;
QTimer _searchTimer;
@ -222,7 +222,7 @@ private:
mtpRequestId _peerSearchRequest = 0;
QString _searchQuery;
UserData *_searchQueryFrom = nullptr;
PeerData *_searchQueryFrom = nullptr;
int32 _searchNextRate = 0;
bool _searchFull = false;
bool _searchFullMigrated = false;

View File

@ -1094,6 +1094,12 @@ ServiceAction ParseServiceAction(
result.content = content;
}, [&](const MTPDmessageActionContactSignUp &data) {
result.content = ActionContactSignUp();
}, [&](const MTPDmessageActionGeoProximityReached &data) {
auto content = ActionGeoProximityReached();
content.fromId = ParsePeerId(data.vfrom_id());
content.toId = ParsePeerId(data.vto_id());
content.distance = data.vdistance().v;
result.content = content;
}, [](const MTPDmessageActionEmpty &data) {});
return result;
}

View File

@ -450,6 +450,12 @@ struct ActionContactSignUp {
struct ActionPhoneNumberRequest {
};
struct ActionGeoProximityReached {
PeerId fromId = 0;
PeerId toId = 0;
int distance = 0;
};
struct ServiceAction {
std::variant<
v::null_t,
@ -473,7 +479,8 @@ struct ServiceAction {
ActionBotAllowed,
ActionSecureValuesSent,
ActionContactSignUp,
ActionPhoneNumberRequest> content;
ActionPhoneNumberRequest,
ActionGeoProximityReached> content;
};
ServiceAction ParseServiceAction(

View File

@ -1429,7 +1429,7 @@ void ApiWrap::requestChatMessages(
MTP_flags(MTPmessages_Search::Flag::f_from_id),
realPeerInput,
MTP_string(), // query
_user,
MTP_inputPeerSelf(),
MTPint(), // top_msg_id
MTP_inputMessagesFilterEmpty(),
MTP_int(0), // min_date

View File

@ -1092,6 +1092,8 @@ auto HtmlWriter::Wrap::pushMessage(
+ SerializeList(list);
}, [&](const ActionContactSignUp &data) {
return serviceFrom + " joined Telegram";
}, [&](const ActionGeoProximityReached &data) {
return serviceFrom + " reached"; // #TODO files distance from to
}, [&](const ActionPhoneNumberRequest &data) {
return serviceFrom + " requested your phone number";
}, [](v::null_t) { return QByteArray(); });

View File

@ -473,6 +473,9 @@ QByteArray SerializeMessage(
}, [&](const ActionContactSignUp &data) {
pushActor();
pushAction("joined_telegram");
}, [&](const ActionGeoProximityReached &data) {
pushActor();
pushAction("proximity_reached"); // #TODO files distance from to
}, [&](const ActionPhoneNumberRequest &data) {
pushActor();
pushAction("requested_phone_number");

View File

@ -260,6 +260,8 @@ void HistoryService::setMessageByAction(const MTPmessageAction &action) {
return prepareSecureValuesSent(data);
}, [&](const MTPDmessageActionContactSignUp &data) {
return prepareContactSignUp();
}, [&](const MTPDmessageActionGeoProximityReached &data) {
return PreparedText{ tr::lng_message_empty(tr::now) }; // #TODO files
}, [](const MTPDmessageActionPaymentSentMe &) {
LOG(("API Error: messageActionPaymentSentMe received."));
return PreparedText{ tr::lng_message_empty(tr::now) };

View File

@ -541,8 +541,10 @@ mtpRequestId DownloadMtprotoTask::sendRequest(
return api().request(MTPupload_GetWebFile(
MTP_inputWebFileGeoPointLocation(
MTP_inputGeoPoint(
MTP_flags(0),
MTP_double(location.lat),
MTP_double(location.lon)),
MTP_double(location.lon),
MTP_int(0)), // accuracy_radius
MTP_long(location.access),
MTP_int(location.width),
MTP_int(location.height),