API scheme updated to layer 75.

This commit is contained in:
John Preston 2018-01-03 17:37:21 +03:00
parent 05e36a064f
commit 31234cb487
7 changed files with 154 additions and 60 deletions

View File

@ -219,7 +219,7 @@ userStatusLastMonth#77ebc742 = UserStatus;
chatEmpty#9ba2d800 id:int = Chat;
chat#d91cdd54 flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true admins_enabled:flags.3?true admin:flags.4?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel = Chat;
chatForbidden#7328bdb id:int title:string = Chat;
channel#450b7115 flags:# creator:flags.0?true left:flags.2?true editor:flags.3?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true democracy:flags.10?true signatures:flags.11?true min:flags.12?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?string admin_rights:flags.14?ChannelAdminRights banned_rights:flags.15?ChannelBannedRights participants_count:flags.17?int = Chat;
channel#c88974ac flags:# creator:flags.0?true left:flags.2?true editor:flags.3?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true democracy:flags.10?true signatures:flags.11?true min:flags.12?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?string admin_rights:flags.14?ChannelAdminRights banned_rights:flags.15?ChannelBannedRights participants_count:flags.17?int feed_id:flags.18?int = Chat;
channelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat;
chatFull#2e02a614 id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> = ChatFull;
@ -272,6 +272,7 @@ messageActionScreenshotTaken#4792929b = MessageAction;
messageActionCustomAction#fae69f56 message:string = MessageAction;
dialog#e4def5db flags:# pinned:flags.2?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 = Dialog;
dialogFeed#36086d42 flags:# pinned:flags.2?true peer:Peer top_message:int feed_id:int feed_other_channels:Vector<int> read_max_position:flags.3?FeedPosition unread_count:int unread_muted_count:int = Dialog;
photoEmpty#2331b22d id:long = Photo;
photo#9288dd29 flags:# has_stickers:flags.0?true id:long access_hash:long date:int sizes:Vector<PhotoSize> = Photo;
@ -422,8 +423,8 @@ updateRecentStickers#9a422c20 = Update;
updateConfig#a229dd06 = Update;
updatePtsChanged#3354678f = Update;
updateChannelWebPage#40771900 channel_id:int webpage:WebPage pts:int pts_count:int = Update;
updateDialogPinned#d711a2cc flags:# pinned:flags.0?true peer:Peer = Update;
updatePinnedDialogs#d8caf68d flags:# order:flags.0?Vector<Peer> = Update;
updateDialogPinned#19d27f3c flags:# pinned:flags.0?true peer:DialogPeer = Update;
updatePinnedDialogs#ea4cb65b flags:# order:flags.0?Vector<DialogPeer> = Update;
updateBotWebhookJSON#8317c0c3 data:DataJSON = Update;
updateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update;
updateBotShippingQuery#e0cdc940 query_id:long user_id:int payload:bytes shipping_address:PostAddress = Update;
@ -435,6 +436,7 @@ updateFavedStickers#e511996d = Update;
updateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector<int> = Update;
updateContactsReset#7084a7be = Update;
updateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update;
updateReadFeed#994852a9 feed_id:int max_position:FeedPosition = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
@ -937,6 +939,23 @@ help.recentMeUrls#e0310d7 urls:Vector<RecentMeUrl> chats:Vector<Chat> users:Vect
inputSingleMedia#5eaa7809 media:InputMedia random_id:long = InputSingleMedia;
feedPosition#5059dc73 date:int peer:Peer id:int = FeedPosition;
messages.feedMessagesNotModified#4678d0cf = messages.FeedMessages;
messages.feedMessages#55c3a1b1 flags:# max_position:flags.0?FeedPosition min_position:flags.1?FeedPosition read_max_position:flags.2?FeedPosition messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.FeedMessages;
feedBroadcasts#4f4feaf1 feed_id:int channels:Vector<int> = FeedBroadcasts;
feedBroadcastsUngrouped#9a687cba channels:Vector<int> = FeedBroadcasts;
channels.feedSourcesNotModified#88b12a17 = channels.FeedSources;
channels.feedSources#8e8bca3d flags:# newly_joined_feed:flags.0?int feeds:Vector<FeedBroadcasts> chats:Vector<Chat> users:Vector<User> = channels.FeedSources;
inputDialogPeerFeed#2c38b8cf feed_id:int = InputDialogPeer;
inputDialogPeer#fcaafeb7 peer:InputPeer = InputDialogPeer;
dialogPeerFeed#da429411 feed_id:int = DialogPeer;
dialogPeer#e56dbf05 peer:Peer = DialogPeer;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -1011,7 +1030,7 @@ contacts.resetTopPeerRating#1ae373ac category:TopPeerCategory peer:InputPeer = B
contacts.resetSaved#879537f1 = Bool;
messages.getMessages#4222fa74 id:Vector<int> = messages.Messages;
messages.getDialogs#191ba9c5 flags:# exclude_pinned:flags.0?true offset_date:int offset_id:int offset_peer:InputPeer limit:int = messages.Dialogs;
messages.getDialogs#5c0fae2 flags:# exclude_pinned:flags.0?true feed_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit: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#39e9ea0 flags:# peer:InputPeer q:string from_id:flags.0?InputUser filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;
messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages;
@ -1072,7 +1091,7 @@ messages.editMessage#5d1b8dd flags:# no_webpage:flags.1?true stop_geo_live:flags
messages.editInlineBotMessage#b0e08243 flags:# no_webpage:flags.1?true stop_geo_live:flags.12?true id:InputBotInlineMessageID message:flags.11?string reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> geo_point:flags.13?InputGeoPoint = Bool;
messages.getBotCallbackAnswer#810a9fec flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes = messages.BotCallbackAnswer;
messages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool;
messages.getPeerDialogs#2d9776b9 peers:Vector<InputPeer> = messages.PeerDialogs;
messages.getPeerDialogs#e470bcfd peers:Vector<InputDialogPeer> = messages.PeerDialogs;
messages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector<MessageEntity> = Bool;
messages.getAllDrafts#6a3f8d65 = Updates;
messages.getFeaturedStickers#2dacca4f hash:int = messages.FeaturedStickers;
@ -1090,8 +1109,8 @@ messages.getInlineGameHighScores#f635e1b id:InputBotInlineMessageID user_id:Inpu
messages.getCommonChats#d0a48c4 user_id:InputUser max_id:int limit:int = messages.Chats;
messages.getAllChats#eba80ff0 except_ids:Vector<int> = messages.Chats;
messages.getWebPage#32ca8f91 url:string hash:int = WebPage;
messages.toggleDialogPin#3289be6a flags:# pinned:flags.0?true peer:InputPeer = Bool;
messages.reorderPinnedDialogs#959ff644 flags:# force:flags.0?true order:Vector<InputPeer> = Bool;
messages.toggleDialogPin#a731e257 flags:# pinned:flags.0?true peer:InputDialogPeer = Bool;
messages.reorderPinnedDialogs#5b51d63f flags:# force:flags.0?true order:Vector<InputDialogPeer> = Bool;
messages.getPinnedDialogs#e254d64e = messages.PeerDialogs;
messages.setBotShippingResults#e5f672fa flags:# query_id:long error:flags.0?string shipping_options:flags.1?Vector<ShippingOption> = Bool;
messages.setBotPrecheckoutResults#9c2dd95 flags:# success:flags.1?true query_id:long error:flags.0?string = Bool;
@ -1166,6 +1185,12 @@ channels.setStickers#ea8ca4f9 channel:InputChannel stickerset:InputStickerSet =
channels.readMessageContents#eab5dc38 channel:InputChannel id:Vector<int> = Bool;
channels.deleteHistory#af369d42 channel:InputChannel max_id:int = Bool;
channels.togglePreHistoryHidden#eabbb94c channel:InputChannel enabled:Bool = Updates;
channels.getFeed#18117df2 flags:# offset_to_max_read:flags.3?true feed_id:int offset_position:flags.0?FeedPosition add_offset:int limit:int max_position:flags.1?FeedPosition min_position:flags.2?FeedPosition sources_hash:int hash:int = messages.FeedMessages;
channels.searchFeed#88325369 feed_id:int q:string offset_date:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
channels.getFeedSources#d8ce236e flags:# feed_id:flags.0?int hash:int = channels.FeedSources;
channels.changeFeedBroadcast#2528871e flags:# channel:InputChannel feed_id:flags.0?int = Bool;
channels.setFeedBroadcasts#7e91b8f2 feed_id:int channels:Vector<InputChannel> also_newly_joined:Bool = Bool;
channels.readFeed#9c3011d feed_id:int max_position:FeedPosition = Updates;
bots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON;
bots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool;
@ -1196,4 +1221,4 @@ langpack.getStrings#2e1ee318 lang_code:string keys:Vector<string> = Vector<LangP
langpack.getDifference#b2e4d7d from_version:int = LangPackDifference;
langpack.getLanguages#800fd57d = Vector<LangPackLanguage>;
// LAYER 74
// LAYER 75

View File

@ -322,10 +322,14 @@ void ApiWrap::gotChatFull(PeerData *peer, const MTPmessages_ChatFull &result, mt
auto &d = result.c_messages_chatFull();
auto &vc = d.vchats.v;
auto badVersion = false;
if (peer->isChat()) {
badVersion = (!vc.isEmpty() && vc[0].type() == mtpc_chat && vc[0].c_chat().vversion.v < peer->asChat()->version);
} else if (peer->isChannel()) {
badVersion = (!vc.isEmpty() && vc[0].type() == mtpc_channel && vc[0].c_channel().vversion.v < peer->asChannel()->version);
if (const auto chat = peer->asChat()) {
badVersion = !vc.isEmpty()
&& (vc[0].type() == mtpc_chat)
&& (vc[0].c_chat().vversion.v < chat->version);
} else if (const auto channel = peer->asChannel()) {
badVersion = !vc.isEmpty()
&& (vc[0].type() == mtpc_channel)
&& (vc[0].c_channel().vversion.v < channel->version);
}
App::feedUsers(d.vusers);
@ -455,9 +459,9 @@ void ApiWrap::gotChatFull(PeerData *peer, const MTPmessages_ChatFull &result, mt
}
}
if (badVersion) {
if (auto chat = peer->asChat()) {
if (const auto chat = peer->asChat()) {
chat->version = vc[0].c_chat().vversion.v;
} else if (auto channel = peer->asChannel()) {
} else if (const auto channel = peer->asChannel()) {
channel->version = vc[0].c_channel().vversion.v;
}
requestPeer(peer);
@ -510,10 +514,14 @@ void ApiWrap::requestPeer(PeerData *peer) {
if (auto chats = Api::getChatsFromMessagesChats(result)) {
auto &v = chats->v;
bool badVersion = false;
if (auto chat = peer->asChat()) {
badVersion = (!v.isEmpty() && v[0].type() == mtpc_chat && v[0].c_chat().vversion.v < chat->version);
} else if (auto channel = peer->asChannel()) {
badVersion = (!v.isEmpty() && v[0].type() == mtpc_channel && v[0].c_channel().vversion.v < channel->version);
if (const auto chat = peer->asChat()) {
badVersion = !v.isEmpty()
&& (v[0].type() == mtpc_chat)
&& (v[0].c_chat().vversion.v < chat->version);
} else if (const auto channel = peer->asChannel()) {
badVersion = !v.isEmpty()
&& (v[0].type() == mtpc_channel)
&& (v[0].c_channel().vversion.v < channel->version);
}
auto chat = App::feedChats(*chats);
if (chat == peer) {

View File

@ -1492,13 +1492,13 @@ void DialogsInner::itemRemoved(not_null<const HistoryItem*> item) {
}
void DialogsInner::dialogsReceived(const QVector<MTPDialog> &added) {
for_const (auto &dialog, added) {
for (const auto &dialog : added) {
if (dialog.type() != mtpc_dialog) {
continue;
}
auto &d = dialog.c_dialog();
auto peerId = peerFromMTP(d.vpeer);
const auto &d = dialog.c_dialog();
const auto peerId = peerFromMTP(d.vpeer);
if (!peerId) {
continue;
}

View File

@ -352,9 +352,9 @@ void DialogsWidget::dialogsReceived(const MTPmessages_Dialogs &dialogs, mtpReque
continue;
}
auto &dialogData = dialog.c_dialog();
if (auto peer = peerFromMTP(dialogData.vpeer)) {
auto history = App::history(peer);
const auto &dialogData = dialog.c_dialog();
if (const auto peer = peerFromMTP(dialogData.vpeer)) {
const auto history = App::history(peer);
history->setPinnedDialog(dialogData.is_pinned());
if (!lastDate) {
@ -417,9 +417,9 @@ void DialogsWidget::pinnedDialogsReceived(const MTPmessages_PeerDialogs &dialogs
continue;
}
auto &dialogData = dialog.c_dialog();
if (auto peer = peerFromMTP(dialogData.vpeer)) {
auto history = App::history(peer);
const auto &dialogData = dialog.c_dialog();
if (const auto peer = peerFromMTP(dialogData.vpeer)) {
const auto history = App::history(peer);
history->setPinnedDialog(dialogData.is_pinned());
}
}
@ -575,10 +575,22 @@ void DialogsWidget::loadDialogs() {
return;
}
auto firstLoad = !_dialogsOffsetDate;
auto loadCount = firstLoad ? DialogsFirstLoad : DialogsPerPage;
auto flags = MTPmessages_GetDialogs::Flag::f_exclude_pinned;
_dialogsRequestId = MTP::send(MTPmessages_GetDialogs(MTP_flags(flags), MTP_int(_dialogsOffsetDate), MTP_int(_dialogsOffsetId), _dialogsOffsetPeer ? _dialogsOffsetPeer->input : MTP_inputPeerEmpty(), MTP_int(loadCount)), rpcDone(&DialogsWidget::dialogsReceived), rpcFail(&DialogsWidget::dialogsFailed));
const auto firstLoad = !_dialogsOffsetDate;
const auto loadCount = firstLoad ? DialogsFirstLoad : DialogsPerPage;
const auto flags = MTPmessages_GetDialogs::Flag::f_exclude_pinned;
const auto feedId = 0;
_dialogsRequestId = MTP::send(
MTPmessages_GetDialogs(
MTP_flags(flags),
MTP_int(feedId),
MTP_int(_dialogsOffsetDate),
MTP_int(_dialogsOffsetId),
_dialogsOffsetPeer
? _dialogsOffsetPeer->input
: MTP_inputPeerEmpty(),
MTP_int(loadCount)),
rpcDone(&DialogsWidget::dialogsReceived),
rpcFail(&DialogsWidget::dialogsFailed));
if (!_pinnedDialogsReceived) {
loadPinnedDialogs();
}

View File

@ -720,14 +720,17 @@ QList<History*> Histories::getPinnedOrder() const {
}
void Histories::savePinnedToServer() const {
auto order = getPinnedOrder();
auto peers = QVector<MTPInputPeer>();
const auto order = getPinnedOrder();
auto peers = QVector<MTPInputDialogPeer>();
peers.reserve(order.size());
for_const (auto history, order) {
peers.push_back(history->peer->input);
for (const auto history : order) {
peers.push_back(MTP_inputDialogPeer(history->peer->input));
}
auto flags = MTPmessages_ReorderPinnedDialogs::Flag::f_force;
MTP::send(MTPmessages_ReorderPinnedDialogs(MTP_flags(flags), MTP_vector(peers)));
MTP::send(
MTPmessages_ReorderPinnedDialogs(
MTP_flags(flags),
MTP_vector(peers)));
}
void Histories::selfDestructIn(not_null<HistoryItem*> item, TimeMs delay) {

View File

@ -4275,8 +4275,8 @@ void MainWidget::inviteImportDone(const MTPUpdates &updates) {
default: LOG(("API Error: unexpected update cons %1 (MainWidget::inviteImportDone)").arg(updates.type())); break;
}
if (v && !v->isEmpty()) {
auto &mtpChat = v->front();
auto peerId = [&] {
const auto &mtpChat = v->front();
const auto peerId = [&] {
if (mtpChat.type() == mtpc_chat) {
return peerFromChat(mtpChat.c_chat().vid.v);
} else if (mtpChat.type() == mtpc_channel) {
@ -4284,7 +4284,7 @@ void MainWidget::inviteImportDone(const MTPUpdates &updates) {
}
return PeerId(0);
}();
if (auto peer = App::peerLoaded(peerId)) {
if (const auto peer = App::peerLoaded(peerId)) {
_controller->showPeerHistory(
peer,
SectionShow::Way::Forward);
@ -5023,6 +5023,12 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
}
} break;
case mtpc_updateReadFeed: {
const auto &d = update.c_updateReadFeed();
const auto feedId = d.vfeed_id.v;
// #TODO feeds
} break;
// Deleted messages.
case mtpc_updateDeleteMessages: {
auto &d = update.c_updateDeleteMessages();
@ -5277,24 +5283,50 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
} break;
case mtpc_updatePinnedDialogs: {
auto &d = update.c_updatePinnedDialogs();
const auto &d = update.c_updatePinnedDialogs();
if (d.has_order()) {
auto allLoaded = true;
auto &order = d.vorder.v;
for_const (auto &peer, order) {
auto peerId = peerFromMTP(peer);
if (!App::historyLoaded(peerId)) {
allLoaded = false;
DEBUG_LOG(("API Error: pinned chat not loaded for peer %1").arg(peerId));
break;
const auto &order = d.vorder.v;
const auto allLoaded = [&] {
for (const auto &dialogPeer : order) {
switch (dialogPeer.type()) {
case mtpc_dialogPeer: {
const auto &peer = dialogPeer.c_dialogPeer();
const auto peerId = peerFromMTP(peer.vpeer);
if (!App::historyLoaded(peerId)) {
DEBUG_LOG(("API Error: "
"pinned chat not loaded for peer %1"
).arg(peerId
));
return false;
}
} break;
case mtpc_dialogPeerFeed: {
const auto &feed = dialogPeer.c_dialogPeerFeed();
const auto feedId = feed.vfeed_id.v;
// #TODO feeds
} break;
}
}
}
return true;
}();
if (allLoaded) {
App::histories().clearPinned();
for (auto i = order.size(); i != 0;) {
auto history = App::historyLoaded(peerFromMTP(order[--i]));
Assert(history != nullptr);
history->setPinnedDialog(true);
const auto &dialogPeer = order[--i];
switch (dialogPeer.type()) {
case mtpc_dialogPeer: {
const auto &peer = dialogPeer.c_dialogPeer();
const auto peerId = peerFromMTP(peer.vpeer);
const auto history = App::historyLoaded(peerId);
Assert(history != nullptr);
history->setPinnedDialog(true);
} break;
case mtpc_dialogPeerFeed: {
const auto &feed = dialogPeer.c_dialogPeerFeed();
const auto feedId = feed.vfeed_id.v;
// #TODO feeds
} break;
}
}
} else {
_dialogs->loadPinnedDialogs();
@ -5305,13 +5337,24 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
} break;
case mtpc_updateDialogPinned: {
auto &d = update.c_updateDialogPinned();
auto peerId = peerFromMTP(d.vpeer);
if (auto history = App::historyLoaded(peerId)) {
history->setPinnedDialog(d.is_pinned());
} else {
DEBUG_LOG(("API Error: pinned chat not loaded for peer %1").arg(peerId));
_dialogs->loadPinnedDialogs();
const auto &d = update.c_updateDialogPinned();
switch (d.vpeer.type()) {
case mtpc_dialogPeer: {
const auto peerId = peerFromMTP(d.vpeer.c_dialogPeer().vpeer);
if (const auto history = App::historyLoaded(peerId)) {
history->setPinnedDialog(d.is_pinned());
} else {
DEBUG_LOG(("API Error: "
"pinned chat not loaded for peer %1"
).arg(peerId
));
_dialogs->loadPinnedDialogs();
}
} break;
case mtpc_dialogPeerFeed: {
const auto feedId = d.vpeer.c_dialogPeerFeed().vfeed_id.v;
// #TODO feeds
} break;
}
} break;

View File

@ -137,7 +137,10 @@ void Filler::addPinToggle() {
if (isPinned) {
flags |= MTPmessages_ToggleDialogPin::Flag::f_pinned;
}
MTP::send(MTPmessages_ToggleDialogPin(MTP_flags(flags), peer->input));
MTP::send(
MTPmessages_ToggleDialogPin(
MTP_flags(flags),
MTP_inputDialogPeer(peer->input)));
if (isPinned) {
if (auto main = App::main()) {
main->dialogsToUp();