API scheme downgraded to layer 76.

This commit is contained in:
John Preston 2018-03-06 20:07:42 +03:00
parent 7f73cc3085
commit ee182ea684
19 changed files with 692 additions and 707 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#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;
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;
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;
@ -273,7 +273,6 @@ messageActionCustomAction#fae69f56 message:string = MessageAction;
messageActionBotAllowed#abe9affe domain: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;
@ -437,7 +436,6 @@ 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#6fa68e41 flags:# feed_id:int max_position:FeedPosition unread_count:flags.0?int unread_muted_count:flags.0?int = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
@ -948,27 +946,14 @@ inputMessageReplyTo#bad88395 id:int = InputMessage;
inputMessagePinned#86872538 = InputMessage;
inputDialogPeer#fcaafeb7 peer:InputPeer = InputDialogPeer;
inputDialogPeerFeed#2c38b8cf feed_id:int = InputDialogPeer;
dialogPeer#e56dbf05 peer:Peer = DialogPeer;
dialogPeerFeed#da429411 feed_id:int = DialogPeer;
messages.foundStickerSetsNotModified#d54b65d = messages.FoundStickerSets;
messages.foundStickerSets#5108d648 hash:int sets:Vector<StickerSetCovered> = messages.FoundStickerSets;
fileHash#6242c773 offset:int limit:int hash:bytes = FileHash;
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;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -1046,7 +1031,7 @@ contacts.resetTopPeerRating#1ae373ac category:TopPeerCategory peer:InputPeer = B
contacts.resetSaved#879537f1 = Bool;
messages.getMessages#63c66506 id:Vector<InputMessage> = messages.Messages;
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.getDialogs#191ba9c5 flags:# exclude_pinned:flags.0?true 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#8614ef68 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 hash:int = messages.Messages;
messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages;
@ -1204,12 +1189,6 @@ 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#b90f450 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 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#ffb37511 flags:# channel:InputChannel feed_id:flags.0?int = Updates;
channels.setFeedBroadcasts#ea80bfae flags:# feed_id:int channels:flags.0?Vector<InputChannel> also_newly_joined:flags.1?Bool = Updates;
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;
@ -1240,4 +1219,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 77
// LAYER 76

View file

@ -165,7 +165,7 @@ void ApiWrap::savePinnedOrder() {
if (const auto history = pinned.history()) {
peers.push_back(MTP_inputDialogPeer(history->peer->input));
} else if (const auto feed = pinned.feed()) {
peers.push_back(MTP_inputDialogPeerFeed(MTP_int(feed->id())));
// peers.push_back(MTP_inputDialogPeerFeed(MTP_int(feed->id()))); // #feed
}
}
auto flags = MTPmessages_ReorderPinnedDialogs::Flag::f_force;
@ -174,50 +174,50 @@ void ApiWrap::savePinnedOrder() {
MTP_vector(peers)
)).send();
}
void ApiWrap::toggleChannelGrouping(
not_null<ChannelData*> channel,
bool group,
base::lambda<void()> callback) {
if (const auto already = _channelGroupingRequests.take(channel)) {
request(already->first).cancel();
}
const auto feedId = Data::Feed::kId;
const auto flags = group
? MTPchannels_ChangeFeedBroadcast::Flag::f_feed_id
: MTPchannels_ChangeFeedBroadcast::Flag(0);
const auto requestId = request(MTPchannels_ChangeFeedBroadcast(
MTP_flags(flags),
channel->inputChannel,
MTP_int(feedId)
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
if (group) {
channel->setFeed(Auth().data().feed(feedId));
} else {
channel->clearFeed();
}
if (const auto data = _channelGroupingRequests.take(channel)) {
data->second();
}
}).fail([=](const RPCError &error) {
_channelGroupingRequests.remove(channel);
}).send();
_channelGroupingRequests.emplace(channel, requestId, callback);
}
void ApiWrap::ungroupAllFromFeed(not_null<Data::Feed*> feed) {
const auto flags = MTPchannels_SetFeedBroadcasts::Flag::f_channels
| MTPchannels_SetFeedBroadcasts::Flag::f_also_newly_joined;
request(MTPchannels_SetFeedBroadcasts(
MTP_flags(flags),
MTP_int(feed->id()),
MTP_vector<MTPInputChannel>(0),
MTP_bool(false)
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
}).send();
}
// #feed
//void ApiWrap::toggleChannelGrouping(
// not_null<ChannelData*> channel,
// bool group,
// base::lambda<void()> callback) {
// if (const auto already = _channelGroupingRequests.take(channel)) {
// request(already->first).cancel();
// }
// const auto feedId = Data::Feed::kId;
// const auto flags = group
// ? MTPchannels_ChangeFeedBroadcast::Flag::f_feed_id
// : MTPchannels_ChangeFeedBroadcast::Flag(0);
// const auto requestId = request(MTPchannels_ChangeFeedBroadcast(
// MTP_flags(flags),
// channel->inputChannel,
// MTP_int(feedId)
// )).done([=](const MTPUpdates &result) {
// applyUpdates(result);
// if (group) {
// channel->setFeed(Auth().data().feed(feedId));
// } else {
// channel->clearFeed();
// }
// if (const auto data = _channelGroupingRequests.take(channel)) {
// data->second();
// }
// }).fail([=](const RPCError &error) {
// _channelGroupingRequests.remove(channel);
// }).send();
// _channelGroupingRequests.emplace(channel, requestId, callback);
//}
//
//void ApiWrap::ungroupAllFromFeed(not_null<Data::Feed*> feed) {
// const auto flags = MTPchannels_SetFeedBroadcasts::Flag::f_channels
// | MTPchannels_SetFeedBroadcasts::Flag::f_also_newly_joined;
// request(MTPchannels_SetFeedBroadcasts(
// MTP_flags(flags),
// MTP_int(feed->id()),
// MTP_vector<MTPInputChannel>(0),
// MTP_bool(false)
// )).done([=](const MTPUpdates &result) {
// applyUpdates(result);
// }).send();
//}
void ApiWrap::sendMessageFail(const RPCError &error) {
if (error.type() == qstr("PEER_FLOOD")) {
@ -391,17 +391,17 @@ void ApiWrap::requestDialogEntry(not_null<Data::Feed*> feed) {
}
_dialogFeedRequests.emplace(feed);
auto peers = QVector<MTPInputDialogPeer>(
1,
MTP_inputDialogPeerFeed(MTP_int(feed->id())));
request(MTPmessages_GetPeerDialogs(
MTP_vector(std::move(peers))
)).done([=](const MTPmessages_PeerDialogs &result) {
applyPeerDialogs(result);
_dialogFeedRequests.remove(feed);
}).fail([=](const RPCError &error) {
_dialogFeedRequests.remove(feed);
}).send();
//auto peers = QVector<MTPInputDialogPeer>( // #feed
// 1,
// MTP_inputDialogPeerFeed(MTP_int(feed->id())));
//request(MTPmessages_GetPeerDialogs(
// MTP_vector(std::move(peers))
//)).done([=](const MTPmessages_PeerDialogs &result) {
// applyPeerDialogs(result);
// _dialogFeedRequests.remove(feed);
//}).fail([=](const RPCError &error) {
// _dialogFeedRequests.remove(feed);
//}).send();
}
//void ApiWrap::requestFeedDialogsEntries(not_null<Data::Feed*> feed) {
@ -460,11 +460,11 @@ void ApiWrap::applyPeerDialogs(const MTPmessages_PeerDialogs &dialogs) {
}
} break;
case mtpc_dialogFeed: {
const auto &fields = dialog.c_dialogFeed();
const auto feed = Auth().data().feed(fields.vfeed_id.v);
feed->applyDialog(fields);
} break;
//case mtpc_dialogFeed: { // #feed
// const auto &fields = dialog.c_dialogFeed();
// const auto feed = Auth().data().feed(fields.vfeed_id.v);
// feed->applyDialog(fields);
//} break;
}
}
_session->data().sendHistoryChangeNotifications();
@ -548,9 +548,9 @@ void ApiWrap::applyFeedDialogs(
}
}
} break;
case mtpc_dialogFeed: {
LOG(("API Error: Unexpected dialogFeed in feed dialogs list."));
} break;
//case mtpc_dialogFeed: { // #feed
// LOG(("API Error: Unexpected dialogFeed in feed dialogs list."));
//} break;
default: Unexpected("Type in DialogsInner::dialogsReceived");
}
}
@ -2714,44 +2714,44 @@ void ApiWrap::requestMessageAfterDate(
const auto addOffset = -2;
const auto limit = 1;
const auto hash = 0;
request(MTPchannels_GetFeed(
MTP_flags(MTPchannels_GetFeed::Flag::f_offset_position),
MTP_int(feed->id()),
MTP_feedPosition(
MTP_int(offsetDate),
MTP_peerUser(MTP_int(_session->userId())),
MTP_int(0)),
MTP_int(addOffset),
MTP_int(limit),
MTPfeedPosition(), // max_id
MTPfeedPosition(), // min_id
MTP_int(hash)
)).done([
=,
callback = std::forward<Callback>(callback)
](const MTPmessages_FeedMessages &result) {
if (result.type() == mtpc_messages_feedMessagesNotModified) {
LOG(("API Error: "
"Unexpected messages.feedMessagesNotModified."));
callback(Data::UnreadMessagePosition);
return;
}
Assert(result.type() == mtpc_messages_feedMessages);
const auto &data = result.c_messages_feedMessages();
const auto &messages = data.vmessages.v;
const auto type = NewMessageExisting;
App::feedUsers(data.vusers);
App::feedChats(data.vchats);
for (const auto &msg : messages) {
if (const auto item = App::histories().addNewMessage(msg, type)) {
if (item->date() >= offsetDate || true) {
callback(item->position());
return;
}
}
}
callback(Data::UnreadMessagePosition);
}).send();
//request(MTPchannels_GetFeed( // #feed
// MTP_flags(MTPchannels_GetFeed::Flag::f_offset_position),
// MTP_int(feed->id()),
// MTP_feedPosition(
// MTP_int(offsetDate),
// MTP_peerUser(MTP_int(_session->userId())),
// MTP_int(0)),
// MTP_int(addOffset),
// MTP_int(limit),
// MTPfeedPosition(), // max_id
// MTPfeedPosition(), // min_id
// MTP_int(hash)
//)).done([
// =,
// callback = std::forward<Callback>(callback)
//](const MTPmessages_FeedMessages &result) {
// if (result.type() == mtpc_messages_feedMessagesNotModified) {
// LOG(("API Error: "
// "Unexpected messages.feedMessagesNotModified."));
// callback(Data::UnreadMessagePosition);
// return;
// }
// Assert(result.type() == mtpc_messages_feedMessages);
// const auto &data = result.c_messages_feedMessages();
// const auto &messages = data.vmessages.v;
// const auto type = NewMessageExisting;
// App::feedUsers(data.vusers);
// App::feedChats(data.vchats);
// for (const auto &msg : messages) {
// if (const auto item = App::histories().addNewMessage(msg, type)) {
// if (item->date() >= offsetDate || true) {
// callback(item->position());
// return;
// }
// }
// }
// callback(Data::UnreadMessagePosition);
//}).send();
}
void ApiWrap::jumpToFeedDate(not_null<Data::Feed*> feed, const QDate &date) {
@ -3032,271 +3032,271 @@ void ApiWrap::userPhotosDone(
fullCount
));
}
void ApiWrap::requestFeedChannels(not_null<Data::Feed*> feed) {
if (_feedChannelsGetRequests.contains(feed)) {
return;
}
const auto hash = feed->channelsHash();
request(MTPchannels_GetFeedSources(
MTP_flags(MTPchannels_GetFeedSources::Flag::f_feed_id),
MTP_int(feed->id()),
MTP_int(hash)
)).done([=](const MTPchannels_FeedSources &result) {
_feedChannelsGetRequests.remove(feed);
switch (result.type()) {
case mtpc_channels_feedSourcesNotModified:
if (feed->channelsHash() == hash) {
feedChannelsDone(feed);
} else {
requestFeedChannels(feed);
}
break;
case mtpc_channels_feedSources: {
const auto &data = result.c_channels_feedSources();
applyFeedSources(data);
if (feed->channelsLoaded()) {
feedChannelsDone(feed);
} else {
LOG(("API Error: feed channels not received for "
).arg(feed->id()));
}
} break;
default: Unexpected("Type in channels.getFeedSources response.");
}
}).fail([=](const RPCError &error) {
_feedChannelsGetRequests.remove(feed);
}).send();
_feedChannelsGetRequests.emplace(feed);
}
void ApiWrap::applyFeedSources(const MTPDchannels_feedSources &data) {
// First we set channels without reading them from data.
// This allows us to apply them all at once without registering
// them one by one.
for (const auto &broadcasts : data.vfeeds.v) {
if (broadcasts.type() == mtpc_feedBroadcasts) {
const auto &list = broadcasts.c_feedBroadcasts();
const auto feedId = list.vfeed_id.v;
const auto feed = _session->data().feed(feedId);
auto channels = std::vector<not_null<ChannelData*>>();
for (const auto &channelId : list.vchannels.v) {
channels.push_back(App::channel(channelId.v));
}
feed->setChannels(std::move(channels));
}
}
App::feedUsers(data.vusers);
App::feedChats(data.vchats);
if (data.has_newly_joined_feed()) {
_session->data().setDefaultFeedId(
data.vnewly_joined_feed.v);
}
}
void ApiWrap::setFeedChannels(
not_null<Data::Feed*> feed,
const std::vector<not_null<ChannelData*>> &channels) {
if (const auto already = _feedChannelsSetRequests.take(feed)) {
request(*already).cancel();
}
auto inputs = QVector<MTPInputChannel>();
inputs.reserve(channels.size());
for (const auto channel : channels) {
inputs.push_back(channel->inputChannel);
}
const auto requestId = request(MTPchannels_SetFeedBroadcasts(
MTP_flags(MTPchannels_SetFeedBroadcasts::Flag::f_channels),
MTP_int(feed->id()),
MTP_vector<MTPInputChannel>(inputs),
MTPbool()
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
_feedChannelsSetRequests.remove(feed);
}).fail([=](const RPCError &error) {
_feedChannelsSetRequests.remove(feed);
}).send();
}
void ApiWrap::feedChannelsDone(not_null<Data::Feed*> feed) {
feed->setChannelsLoaded(true);
for (const auto key : base::take(_feedMessagesRequestsPending)) {
std::apply(
[=](auto&&...args) { requestFeedMessages(args...); },
key);
}
}
void ApiWrap::requestFeedMessages(
not_null<Data::Feed*> feed,
Data::MessagePosition messageId,
SliceType slice) {
const auto key = std::make_tuple(feed, messageId, slice);
if (_feedMessagesRequests.contains(key)
|| _feedMessagesRequestsPending.contains(key)) {
return;
}
if (!feed->channelsLoaded()) {
_feedMessagesRequestsPending.emplace(key);
requestFeedChannels(feed);
return;
}
// We request messages with overlapping and skip overlapped in response.
const auto limit = kFeedMessagesLimit;
const auto addOffset = [&] {
switch (slice) {
case SliceType::Before: return -2;
case SliceType::Around: return -limit / 2;
case SliceType::After: return 1 - limit;
}
Unexpected("Direction in PrepareSearchRequest");
}();
const auto hash = int32(0);
const auto flags = (messageId && messageId.fullId.channel)
? MTPchannels_GetFeed::Flag::f_offset_position
: MTPchannels_GetFeed::Flag::f_offset_to_max_read;
const auto requestId = request(MTPchannels_GetFeed(
MTP_flags(flags),
MTP_int(feed->id()),
MTP_feedPosition(
MTP_int(messageId.date),
MTP_peerChannel(MTP_int(messageId.fullId.channel)),
MTP_int(messageId.fullId.msg)),
MTP_int(addOffset),
MTP_int(limit),
MTPFeedPosition(),
MTPFeedPosition(),
MTP_int(hash)
)).done([=](const MTPmessages_FeedMessages &result) {
const auto key = std::make_tuple(feed, messageId, slice);
_feedMessagesRequests.remove(key);
feedMessagesDone(feed, messageId, slice, result);
}).fail([=](const RPCError &error) {
_feedMessagesRequests.remove(key);
if (error.type() == qstr("SOURCES_HASH_INVALID")) {
_feedMessagesRequestsPending.emplace(key);
requestFeedChannels(feed);
}
}).send();
_feedMessagesRequests.emplace(key);
}
void ApiWrap::feedMessagesDone(
not_null<Data::Feed*> feed,
Data::MessagePosition messageId,
SliceType slice,
const MTPmessages_FeedMessages &result) {
if (result.type() == mtpc_messages_feedMessagesNotModified) {
LOG(("API Error: Unexpected messages.feedMessagesNotModified."));
_session->storage().add(Storage::FeedMessagesAddSlice(
feed->id(),
std::vector<Data::MessagePosition>(),
Data::FullMessagesRange));
return;
}
Assert(result.type() == mtpc_messages_feedMessages);
const auto &data = result.c_messages_feedMessages();
const auto &messages = data.vmessages.v;
const auto type = NewMessageExisting;
auto ids = std::vector<Data::MessagePosition>();
auto noSkipRange = Data::MessagesRange(messageId, messageId);
const auto accumulateFrom = [](auto &from, const auto &candidate) {
if (!from || from > candidate) {
from = candidate;
}
};
const auto accumulateTill = [](auto &till, const auto &candidate) {
if (!till || till < candidate) {
till = candidate;
}
};
const auto tooLargePosition = [&](const auto &position) {
return (slice == SliceType::Before) && !(position < messageId);
};
const auto tooSmallPosition = [&](const auto &position) {
return (slice == SliceType::After) && !(messageId < position);
};
App::feedUsers(data.vusers);
App::feedChats(data.vchats);
if (!messages.empty()) {
ids.reserve(messages.size());
for (const auto &msg : messages) {
if (const auto item = App::histories().addNewMessage(msg, type)) {
const auto position = item->position();
if (tooLargePosition(position)) {
accumulateTill(noSkipRange.till, position);
continue;
} else if (tooSmallPosition(position)) {
accumulateFrom(noSkipRange.from, position);
continue;
}
ids.push_back(position);
accumulateFrom(noSkipRange.from, position);
accumulateTill(noSkipRange.till, position);
}
}
ranges::reverse(ids);
}
if (data.has_min_position() && !ids.empty()) {
accumulateFrom(
noSkipRange.from,
Data::FeedPositionFromMTP(data.vmin_position));
} else if (slice == SliceType::Before) {
noSkipRange.from = Data::MinMessagePosition;
}
if (data.has_max_position() && !ids.empty()) {
accumulateTill(
noSkipRange.till,
Data::FeedPositionFromMTP(data.vmax_position));
} else if (slice == SliceType::After) {
noSkipRange.till = Data::MaxMessagePosition;
}
const auto unreadPosition = [&] {
if (data.has_read_max_position()) {
return Data::FeedPositionFromMTP(data.vread_max_position);
} else if (!messageId) {
const auto result = ids.empty()
? noSkipRange.till
: ids.back();
return Data::MessagePosition(
result.date,
FullMsgId(result.fullId.channel, result.fullId.msg - 1));
}
return Data::MessagePosition();
}();
_session->storage().add(Storage::FeedMessagesAddSlice(
feed->id(),
std::move(ids),
noSkipRange));
if (unreadPosition) {
feed->setUnreadPosition(unreadPosition);
}
}
void ApiWrap::saveDefaultFeedId(FeedId id, bool isDefaultFeedId) {
if (const auto already = base::take(_saveDefaultFeedIdRequest)) {
request(already).cancel();
}
_saveDefaultFeedIdRequest = request(MTPchannels_SetFeedBroadcasts(
MTP_flags(MTPchannels_SetFeedBroadcasts::Flag::f_also_newly_joined),
MTP_int(id),
MTPVector<MTPInputChannel>(),
MTP_bool(isDefaultFeedId)
)).send();
}
// #feed
//void ApiWrap::requestFeedChannels(not_null<Data::Feed*> feed) {
// if (_feedChannelsGetRequests.contains(feed)) {
// return;
// }
// const auto hash = feed->channelsHash();
// request(MTPchannels_GetFeedSources(
// MTP_flags(MTPchannels_GetFeedSources::Flag::f_feed_id),
// MTP_int(feed->id()),
// MTP_int(hash)
// )).done([=](const MTPchannels_FeedSources &result) {
// _feedChannelsGetRequests.remove(feed);
//
// switch (result.type()) {
// case mtpc_channels_feedSourcesNotModified:
// if (feed->channelsHash() == hash) {
// feedChannelsDone(feed);
// } else {
// requestFeedChannels(feed);
// }
// break;
//
// case mtpc_channels_feedSources: {
// const auto &data = result.c_channels_feedSources();
// applyFeedSources(data);
// if (feed->channelsLoaded()) {
// feedChannelsDone(feed);
// } else {
// LOG(("API Error: feed channels not received for "
// ).arg(feed->id()));
// }
// } break;
//
// default: Unexpected("Type in channels.getFeedSources response.");
// }
// }).fail([=](const RPCError &error) {
// _feedChannelsGetRequests.remove(feed);
// }).send();
// _feedChannelsGetRequests.emplace(feed);
//}
//
//void ApiWrap::applyFeedSources(const MTPDchannels_feedSources &data) {
// // First we set channels without reading them from data.
// // This allows us to apply them all at once without registering
// // them one by one.
// for (const auto &broadcasts : data.vfeeds.v) {
// if (broadcasts.type() == mtpc_feedBroadcasts) {
// const auto &list = broadcasts.c_feedBroadcasts();
// const auto feedId = list.vfeed_id.v;
// const auto feed = _session->data().feed(feedId);
// auto channels = std::vector<not_null<ChannelData*>>();
// for (const auto &channelId : list.vchannels.v) {
// channels.push_back(App::channel(channelId.v));
// }
// feed->setChannels(std::move(channels));
// }
// }
//
// App::feedUsers(data.vusers);
// App::feedChats(data.vchats);
//
// if (data.has_newly_joined_feed()) {
// _session->data().setDefaultFeedId(
// data.vnewly_joined_feed.v);
// }
//}
//
//void ApiWrap::setFeedChannels(
// not_null<Data::Feed*> feed,
// const std::vector<not_null<ChannelData*>> &channels) {
// if (const auto already = _feedChannelsSetRequests.take(feed)) {
// request(*already).cancel();
// }
// auto inputs = QVector<MTPInputChannel>();
// inputs.reserve(channels.size());
// for (const auto channel : channels) {
// inputs.push_back(channel->inputChannel);
// }
// const auto requestId = request(MTPchannels_SetFeedBroadcasts(
// MTP_flags(MTPchannels_SetFeedBroadcasts::Flag::f_channels),
// MTP_int(feed->id()),
// MTP_vector<MTPInputChannel>(inputs),
// MTPbool()
// )).done([=](const MTPUpdates &result) {
// applyUpdates(result);
//
// _feedChannelsSetRequests.remove(feed);
// }).fail([=](const RPCError &error) {
// _feedChannelsSetRequests.remove(feed);
// }).send();
//
//}
//
//void ApiWrap::feedChannelsDone(not_null<Data::Feed*> feed) {
// feed->setChannelsLoaded(true);
// for (const auto key : base::take(_feedMessagesRequestsPending)) {
// std::apply(
// [=](auto&&...args) { requestFeedMessages(args...); },
// key);
// }
//}
//
//void ApiWrap::requestFeedMessages(
// not_null<Data::Feed*> feed,
// Data::MessagePosition messageId,
// SliceType slice) {
// const auto key = std::make_tuple(feed, messageId, slice);
// if (_feedMessagesRequests.contains(key)
// || _feedMessagesRequestsPending.contains(key)) {
// return;
// }
//
// if (!feed->channelsLoaded()) {
// _feedMessagesRequestsPending.emplace(key);
// requestFeedChannels(feed);
// return;
// }
//
// // We request messages with overlapping and skip overlapped in response.
// const auto limit = kFeedMessagesLimit;
// const auto addOffset = [&] {
// switch (slice) {
// case SliceType::Before: return -2;
// case SliceType::Around: return -limit / 2;
// case SliceType::After: return 1 - limit;
// }
// Unexpected("Direction in PrepareSearchRequest");
// }();
// const auto hash = int32(0);
// const auto flags = (messageId && messageId.fullId.channel)
// ? MTPchannels_GetFeed::Flag::f_offset_position
// : MTPchannels_GetFeed::Flag::f_offset_to_max_read;
// const auto requestId = request(MTPchannels_GetFeed(
// MTP_flags(flags),
// MTP_int(feed->id()),
// MTP_feedPosition(
// MTP_int(messageId.date),
// MTP_peerChannel(MTP_int(messageId.fullId.channel)),
// MTP_int(messageId.fullId.msg)),
// MTP_int(addOffset),
// MTP_int(limit),
// MTPFeedPosition(),
// MTPFeedPosition(),
// MTP_int(hash)
// )).done([=](const MTPmessages_FeedMessages &result) {
// const auto key = std::make_tuple(feed, messageId, slice);
// _feedMessagesRequests.remove(key);
// feedMessagesDone(feed, messageId, slice, result);
// }).fail([=](const RPCError &error) {
// _feedMessagesRequests.remove(key);
// if (error.type() == qstr("SOURCES_HASH_INVALID")) {
// _feedMessagesRequestsPending.emplace(key);
// requestFeedChannels(feed);
// }
// }).send();
// _feedMessagesRequests.emplace(key);
//}
//
//void ApiWrap::feedMessagesDone(
// not_null<Data::Feed*> feed,
// Data::MessagePosition messageId,
// SliceType slice,
// const MTPmessages_FeedMessages &result) {
// if (result.type() == mtpc_messages_feedMessagesNotModified) {
// LOG(("API Error: Unexpected messages.feedMessagesNotModified."));
// _session->storage().add(Storage::FeedMessagesAddSlice(
// feed->id(),
// std::vector<Data::MessagePosition>(),
// Data::FullMessagesRange));
// return;
// }
// Assert(result.type() == mtpc_messages_feedMessages);
// const auto &data = result.c_messages_feedMessages();
// const auto &messages = data.vmessages.v;
// const auto type = NewMessageExisting;
//
// auto ids = std::vector<Data::MessagePosition>();
// auto noSkipRange = Data::MessagesRange(messageId, messageId);
// const auto accumulateFrom = [](auto &from, const auto &candidate) {
// if (!from || from > candidate) {
// from = candidate;
// }
// };
// const auto accumulateTill = [](auto &till, const auto &candidate) {
// if (!till || till < candidate) {
// till = candidate;
// }
// };
// const auto tooLargePosition = [&](const auto &position) {
// return (slice == SliceType::Before) && !(position < messageId);
// };
// const auto tooSmallPosition = [&](const auto &position) {
// return (slice == SliceType::After) && !(messageId < position);
// };
// App::feedUsers(data.vusers);
// App::feedChats(data.vchats);
// if (!messages.empty()) {
// ids.reserve(messages.size());
// for (const auto &msg : messages) {
// if (const auto item = App::histories().addNewMessage(msg, type)) {
// const auto position = item->position();
// if (tooLargePosition(position)) {
// accumulateTill(noSkipRange.till, position);
// continue;
// } else if (tooSmallPosition(position)) {
// accumulateFrom(noSkipRange.from, position);
// continue;
// }
// ids.push_back(position);
// accumulateFrom(noSkipRange.from, position);
// accumulateTill(noSkipRange.till, position);
// }
// }
// ranges::reverse(ids);
// }
// if (data.has_min_position() && !ids.empty()) {
// accumulateFrom(
// noSkipRange.from,
// Data::FeedPositionFromMTP(data.vmin_position));
// } else if (slice == SliceType::Before) {
// noSkipRange.from = Data::MinMessagePosition;
// }
// if (data.has_max_position() && !ids.empty()) {
// accumulateTill(
// noSkipRange.till,
// Data::FeedPositionFromMTP(data.vmax_position));
// } else if (slice == SliceType::After) {
// noSkipRange.till = Data::MaxMessagePosition;
// }
//
// const auto unreadPosition = [&] {
// if (data.has_read_max_position()) {
// return Data::FeedPositionFromMTP(data.vread_max_position);
// } else if (!messageId) {
// const auto result = ids.empty()
// ? noSkipRange.till
// : ids.back();
// return Data::MessagePosition(
// result.date,
// FullMsgId(result.fullId.channel, result.fullId.msg - 1));
// }
// return Data::MessagePosition();
// }();
//
// _session->storage().add(Storage::FeedMessagesAddSlice(
// feed->id(),
// std::move(ids),
// noSkipRange));
//
// if (unreadPosition) {
// feed->setUnreadPosition(unreadPosition);
// }
//}
//
//void ApiWrap::saveDefaultFeedId(FeedId id, bool isDefaultFeedId) {
// if (const auto already = base::take(_saveDefaultFeedIdRequest)) {
// request(already).cancel();
// }
// _saveDefaultFeedIdRequest = request(MTPchannels_SetFeedBroadcasts(
// MTP_flags(MTPchannels_SetFeedBroadcasts::Flag::f_also_newly_joined),
// MTP_int(id),
// MTPVector<MTPInputChannel>(),
// MTP_bool(isDefaultFeedId)
// )).send();
//}
void ApiWrap::sendAction(const SendOptions &options) {
readServerHistory(options.history);
@ -3936,38 +3936,38 @@ void ApiWrap::readFeed(
void ApiWrap::readFeeds() {
auto delay = kFeedReadTimeout;
const auto now = getms(true);
for (auto i = begin(_feedReadsDelayed); i != end(_feedReadsDelayed);) {
const auto feed = i->first;
const auto time = i->second;
// Clang fails to capture structure-binded feed to lambda :(
//const auto [feed, time] = *i;
if (time > now) {
accumulate_min(delay, time - now);
++i;
} else if (_feedReadRequests.contains(feed)) {
++i;
} else {
const auto position = feed->unreadPosition();
const auto requestId = request(MTPchannels_ReadFeed(
MTP_int(feed->id()),
MTP_feedPosition(
MTP_int(position.date),
MTP_peerChannel(MTP_int(position.fullId.channel)),
MTP_int(position.fullId.msg))
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
_feedReadRequests.remove(feed);
}).fail([=](const RPCError &error) {
_feedReadRequests.remove(feed);
}).send();
_feedReadRequests.emplace(feed, requestId);
//for (auto i = begin(_feedReadsDelayed); i != end(_feedReadsDelayed);) { // #feed
// const auto feed = i->first;
// const auto time = i->second;
// // Clang fails to capture structure-binded feed to lambda :(
// //const auto [feed, time] = *i;
// if (time > now) {
// accumulate_min(delay, time - now);
// ++i;
// } else if (_feedReadRequests.contains(feed)) {
// ++i;
// } else {
// const auto position = feed->unreadPosition();
// const auto requestId = request(MTPchannels_ReadFeed(
// MTP_int(feed->id()),
// MTP_feedPosition(
// MTP_int(position.date),
// MTP_peerChannel(MTP_int(position.fullId.channel)),
// MTP_int(position.fullId.msg))
// )).done([=](const MTPUpdates &result) {
// applyUpdates(result);
// _feedReadRequests.remove(feed);
// }).fail([=](const RPCError &error) {
// _feedReadRequests.remove(feed);
// }).send();
// _feedReadRequests.emplace(feed, requestId);
i = _feedReadsDelayed.erase(i);
}
}
if (!_feedReadsDelayed.empty()) {
_feedReadTimer.callOnce(delay);
}
// i = _feedReadsDelayed.erase(i);
// }
//}
//if (!_feedReadsDelayed.empty()) {
// _feedReadTimer.callOnce(delay);
//}
}
void ApiWrap::sendReadRequest(not_null<PeerData*> peer, MsgId upTo) {

View file

@ -60,11 +60,11 @@ public:
void applyUpdates(const MTPUpdates &updates, uint64 sentMessageRandomId = 0);
void savePinnedOrder();
void toggleChannelGrouping(
not_null<ChannelData*> channel,
bool group,
base::lambda<void()> callback);
void ungroupAllFromFeed(not_null<Data::Feed*> feed);
//void toggleChannelGrouping( // #feed
// not_null<ChannelData*> channel,
// bool group,
// base::lambda<void()> callback);
//void ungroupAllFromFeed(not_null<Data::Feed*> feed);
using RequestMessageDataCallback = base::lambda<void(ChannelData*, MsgId)>;
void requestMessageData(
@ -76,10 +76,10 @@ public:
void requestDialogEntry(not_null<Data::Feed*> feed);
//void requestFeedDialogsEntries(not_null<Data::Feed*> feed);
void requestDialogEntry(not_null<History*> history);
void applyFeedSources(const MTPDchannels_feedSources &data);
void setFeedChannels(
not_null<Data::Feed*> feed,
const std::vector<not_null<ChannelData*>> &channels);
//void applyFeedSources(const MTPDchannels_feedSources &data); // #feed
//void setFeedChannels(
// not_null<Data::Feed*> feed,
// const std::vector<not_null<ChannelData*>> &channels);
void requestFullPeer(PeerData *peer);
void requestPeer(PeerData *peer);
@ -180,13 +180,13 @@ public:
not_null<UserData*> user,
PhotoId afterId);
void requestFeedChannels(
not_null<Data::Feed*> feed);
void requestFeedMessages(
not_null<Data::Feed*> feed,
Data::MessagePosition messageId,
SliceType slice);
void saveDefaultFeedId(FeedId id, bool isDefaultFeedId);
//void requestFeedChannels( // #feed
// not_null<Data::Feed*> feed);
//void requestFeedMessages(
// not_null<Data::Feed*> feed,
// Data::MessagePosition messageId,
// SliceType slice);
//void saveDefaultFeedId(FeedId id, bool isDefaultFeedId);
void stickerSetInstalled(uint64 setId) {
_stickerSetInstalled.fire_copy(setId);
@ -375,12 +375,12 @@ private:
PhotoId photoId,
const MTPphotos_Photos &result);
void feedChannelsDone(not_null<Data::Feed*> feed);
void feedMessagesDone(
not_null<Data::Feed*> feed,
Data::MessagePosition messageId,
SliceType slice,
const MTPmessages_FeedMessages &result);
//void feedChannelsDone(not_null<Data::Feed*> feed); // #feed
//void feedMessagesDone(
// not_null<Data::Feed*> feed,
// Data::MessagePosition messageId,
// SliceType slice,
// const MTPmessages_FeedMessages &result);
void sendSharedContact(
const QString &phone,

View file

@ -563,11 +563,11 @@ namespace {
cdata->setRestrictionReason(QString());
}
cdata->setFlags(d.vflags.v);
if (d.has_feed_id()) {
cdata->setFeed(Auth().data().feed(d.vfeed_id.v));
} else {
cdata->clearFeed();
}
//if (d.has_feed_id()) { // #feed
// cdata->setFeed(Auth().data().feed(d.vfeed_id.v));
//} else {
// cdata->clearFeed();
//}
}
QString uname = d.has_username() ? TextUtilities::SingleLine(qs(d.vusername)) : QString();

View file

@ -20,14 +20,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Data {
MessagePosition FeedPositionFromMTP(const MTPFeedPosition &position) {
Expects(position.type() == mtpc_feedPosition);
const auto &data = position.c_feedPosition();
return MessagePosition(data.vdate.v, FullMsgId(
peerToChannel(peerFromMTP(data.vpeer)),
data.vid.v));
}
// #feed
//MessagePosition FeedPositionFromMTP(const MTPFeedPosition &position) {
// Expects(position.type() == mtpc_feedPosition);
//
// const auto &data = position.c_feedPosition();
// return MessagePosition(data.vdate.v, FullMsgId(
// peerToChannel(peerFromMTP(data.vpeer)),
// data.vid.v));
//}
Feed::Feed(FeedId id, not_null<Data::Session*> parent)
: Entry(this)
@ -328,36 +329,36 @@ rpl::producer<int> Feed::unreadCountValue() const {
bool Feed::unreadCountKnown() const {
return !!_unreadCount;
}
void Feed::applyDialog(const MTPDdialogFeed &data) {
const auto addChannel = [&](ChannelId channelId) {
if (const auto channel = App::channelLoaded(channelId)) {
channel->setFeed(this);
}
};
for (const auto &channelId : data.vfeed_other_channels.v) {
addChannel(channelId.v);
}
_lastMessage = nullptr;
if (const auto peerId = peerFromMTP(data.vpeer)) {
if (const auto channelId = peerToChannel(peerId)) {
addChannel(channelId);
const auto fullId = FullMsgId(channelId, data.vtop_message.v);
if (const auto item = App::histItemById(fullId)) {
justUpdateLastMessage(item);
}
}
}
updateChatsListDate();
setUnreadCounts(
data.vunread_count.v,
data.vunread_muted_count.v);
if (data.has_read_max_position()) {
setUnreadPosition(FeedPositionFromMTP(data.vread_max_position));
}
}
// #feed
//void Feed::applyDialog(const MTPDdialogFeed &data) {
// const auto addChannel = [&](ChannelId channelId) {
// if (const auto channel = App::channelLoaded(channelId)) {
// channel->setFeed(this);
// }
// };
// for (const auto &channelId : data.vfeed_other_channels.v) {
// addChannel(channelId.v);
// }
//
// _lastMessage = nullptr;
// if (const auto peerId = peerFromMTP(data.vpeer)) {
// if (const auto channelId = peerToChannel(peerId)) {
// addChannel(channelId);
// const auto fullId = FullMsgId(channelId, data.vtop_message.v);
// if (const auto item = App::histItemById(fullId)) {
// justUpdateLastMessage(item);
// }
// }
// }
// updateChatsListDate();
//
// setUnreadCounts(
// data.vunread_count.v,
// data.vunread_muted_count.v);
// if (data.has_read_max_position()) {
// setUnreadPosition(FeedPositionFromMTP(data.vread_max_position));
// }
//}
void Feed::changedInChatListHook(Dialogs::Mode list, bool added) {
if (list == Dialogs::Mode::All && unreadCount()) {

View file

@ -27,7 +27,7 @@ struct FeedUpdate {
FeedUpdateFlag flag;
};
MessagePosition FeedPositionFromMTP(const MTPFeedPosition &position);
//MessagePosition FeedPositionFromMTP(const MTPFeedPosition &position); // #feed
class Feed : public Dialogs::Entry {
public:
@ -44,7 +44,7 @@ public:
void messageRemoved(not_null<HistoryItem*> item);
void historyCleared(not_null<History*> history);
void applyDialog(const MTPDdialogFeed &data);
//void applyDialog(const MTPDdialogFeed &data); // #feed
void setUnreadCounts(int unreadNonMutedCount, int unreadMutedCount);
void setUnreadPosition(const MessagePosition &position);
void unreadCountChanged(

View file

@ -31,10 +31,10 @@ rpl::producer<MessagesSlice> FeedMessagesViewer(
using AroundData = MessagesSliceBuilder::AroundData;
const auto requestMediaAround = [=](const AroundData &data) {
if (data.aroundId || !key.position) {
Auth().api().requestFeedMessages(
feed,
data.aroundId,
data.direction);
//Auth().api().requestFeedMessages( // #feed
// feed,
// data.aroundId,
// data.direction);
}
};
builder->insufficientAround(

View file

@ -426,11 +426,11 @@ void Session::applyPinnedDialogs(const QVector<MTPDialog> &list) {
}
} break;
case mtpc_dialogFeed: {
const auto &feedData = dialog.c_dialogFeed();
const auto feedId = feedData.vfeed_id.v;
setPinnedDialog(feed(feedId), true);
} break;
//case mtpc_dialogFeed: { // #feed
// const auto &feedData = dialog.c_dialogFeed();
// const auto feedId = feedData.vfeed_id.v;
// setPinnedDialog(feed(feedId), true);
//} break;
default: Unexpected("Type in ApiWrap::applyDialogsPinned.");
}
@ -448,11 +448,11 @@ void Session::applyPinnedDialogs(const QVector<MTPDialogPeer> &list) {
setPinnedDialog(App::history(peerId), true);
}
} break;
case mtpc_dialogPeerFeed: {
const auto &feedData = dialogPeer.c_dialogPeerFeed();
const auto feedId = feedData.vfeed_id.v;
setPinnedDialog(feed(feedId), true);
} break;
//case mtpc_dialogPeerFeed: { // #feed
// const auto &feedData = dialogPeer.c_dialogPeerFeed();
// const auto feedId = feedData.vfeed_id.v;
// setPinnedDialog(feed(feedId), true);
//} break;
}
}
}

View file

@ -1754,7 +1754,7 @@ void DialogsInner::dialogsReceived(const QVector<MTPDialog> &added) {
for (const auto &dialog : added) {
switch (dialog.type()) {
case mtpc_dialog: applyDialog(dialog.c_dialog()); break;
case mtpc_dialogFeed: applyFeedDialog(dialog.c_dialogFeed()); break;
//case mtpc_dialogFeed: applyFeedDialog(dialog.c_dialogFeed()); break; // #feed
default: Unexpected("Type in DialogsInner::dialogsReceived");
}
}
@ -1787,19 +1787,19 @@ void DialogsInner::applyDialog(const MTPDdialog &dialog) {
}
}
}
void DialogsInner::applyFeedDialog(const MTPDdialogFeed &dialog) {
const auto feedId = dialog.vfeed_id.v;
const auto feed = Auth().data().feed(feedId);
feed->applyDialog(dialog);
if (!feed->isPinnedDialog()) {
const auto date = feed->chatsListDate();
if (!date.isNull()) {
addSavedPeersAfter(date);
}
}
}
// #feed
//void DialogsInner::applyFeedDialog(const MTPDdialogFeed &dialog) {
// const auto feedId = dialog.vfeed_id.v;
// const auto feed = Auth().data().feed(feedId);
// feed->applyDialog(dialog);
//
// if (!feed->isPinnedDialog()) {
// const auto date = feed->chatsListDate();
// if (!date.isNull()) {
// addSavedPeersAfter(date);
// }
// }
//}
void DialogsInner::addSavedPeersAfter(const QDateTime &date) {
auto &saved = cRefSavedPeersByTime();

View file

@ -193,7 +193,7 @@ private:
const base::flat_set<QChar> &oldLetters);
void applyDialog(const MTPDdialog &dialog);
void applyFeedDialog(const MTPDdialogFeed &dialog);
// void applyFeedDialog(const MTPDdialogFeed &dialog); // #feed
void itemRemoved(not_null<const HistoryItem*> item);
enum class UpdateRowSection {

View file

@ -389,7 +389,7 @@ void DialogsWidget::updateDialogsOffset(
const auto &dialog = dialogs[--i];
switch (dialog.type()) {
case mtpc_dialog: fillFromDialog(dialog.c_dialog()); break;
case mtpc_dialogFeed: fillFromDialog(dialog.c_dialogFeed()); break;
// case mtpc_dialogFeed: fillFromDialog(dialog.c_dialogFeed()); break; // #feed
default: Unexpected("Type in DialogsWidget::updateDialogsOffset");
}
if (lastDate) {
@ -518,16 +518,16 @@ bool DialogsWidget::onSearchMessages(bool searchCache) {
rpcDone(&DialogsWidget::searchReceived, DialogsSearchPeerFromStart),
rpcFail(&DialogsWidget::searchFailed, DialogsSearchPeerFromStart));
} else if (const auto feed = _searchInChat.feed()) {
_searchRequest = MTP::send(
MTPchannels_SearchFeed(
MTP_int(feed->id()),
MTP_string(_searchQuery),
MTP_int(0),
MTP_inputPeerEmpty(),
MTP_int(0),
MTP_int(SearchPerPage)),
rpcDone(&DialogsWidget::searchReceived, DialogsSearchFromStart),
rpcFail(&DialogsWidget::searchFailed, DialogsSearchFromStart));
//_searchRequest = MTP::send( // #feed
// MTPchannels_SearchFeed(
// MTP_int(feed->id()),
// MTP_string(_searchQuery),
// MTP_int(0),
// MTP_inputPeerEmpty(),
// MTP_int(0),
// MTP_int(SearchPerPage)),
// rpcDone(&DialogsWidget::searchReceived, DialogsSearchFromStart),
// rpcFail(&DialogsWidget::searchFailed, DialogsSearchFromStart));
} else {
_searchRequest = MTP::send(
MTPmessages_SearchGlobal(
@ -637,18 +637,18 @@ void DialogsWidget::onSearchMore() {
rpcDone(&DialogsWidget::searchReceived, offsetId ? DialogsSearchPeerFromOffset : DialogsSearchPeerFromStart),
rpcFail(&DialogsWidget::searchFailed, offsetId ? DialogsSearchPeerFromOffset : DialogsSearchPeerFromStart));
} else if (const auto feed = _searchInChat.feed()) {
_searchRequest = MTP::send(
MTPchannels_SearchFeed(
MTP_int(feed->id()),
MTP_string(_searchQuery),
MTP_int(offsetDate),
offsetPeer
? offsetPeer->input
: MTP_inputPeerEmpty(),
MTP_int(offsetId),
MTP_int(SearchPerPage)),
rpcDone(&DialogsWidget::searchReceived, offsetId ? DialogsSearchFromOffset : DialogsSearchFromStart),
rpcFail(&DialogsWidget::searchFailed, offsetId ? DialogsSearchFromOffset : DialogsSearchFromStart));
//_searchRequest = MTP::send( // #feed
// MTPchannels_SearchFeed(
// MTP_int(feed->id()),
// MTP_string(_searchQuery),
// MTP_int(offsetDate),
// offsetPeer
// ? offsetPeer->input
// : MTP_inputPeerEmpty(),
// MTP_int(offsetId),
// MTP_int(SearchPerPage)),
// rpcDone(&DialogsWidget::searchReceived, offsetId ? DialogsSearchFromOffset : DialogsSearchFromStart),
// rpcFail(&DialogsWidget::searchFailed, offsetId ? DialogsSearchFromOffset : DialogsSearchFromStart));
} else {
_searchRequest = MTP::send(
MTPmessages_SearchGlobal(
@ -707,7 +707,7 @@ void DialogsWidget::loadDialogs() {
_dialogsRequestId = MTP::send(
MTPmessages_GetDialogs(
MTP_flags(flags),
MTP_int(feedId),
//MTP_int(feedId), // #feed
MTP_int(_dialogsOffsetDate),
MTP_int(_dialogsOffsetId),
_dialogsOffsetPeer

View file

@ -37,9 +37,9 @@ void AddToggleGroupingAction(
not_null<PeerData*> peer) {
if (const auto channel = peer->asChannel()) {
const auto grouped = (channel->feed() != nullptr);
menu->addAction(
lang(grouped ? lng_feed_ungroup : lng_feed_group),
[=] { Window::ToggleChannelGrouping(channel, !grouped); });
//menu->addAction( // #feed
// lang(grouped ? lng_feed_ungroup : lng_feed_group),
// [=] { Window::ToggleChannelGrouping(channel, !grouped); });
}
}

View file

@ -2406,7 +2406,7 @@ void ListWidget::refreshItem(not_null<const Element*> view) {
if (const auto i = _views.find(item); i != end(_views)) {
auto result = std::move(i->second);
_views.erase(i);
return std::move(result);
return result;
}
return nullptr;
}();

View file

@ -96,7 +96,7 @@ ChannelsController::ChannelsController(not_null<Controller*> controller)
, _controller(controller)
, _feed(_controller->key().feed()) {
if (!_feed->channelsLoaded()) {
Auth().api().requestFeedChannels(_feed);
// Auth().api().requestFeedChannels(_feed); // #feed
}
_controller->setSearchEnabledByContent(false);
}
@ -198,9 +198,9 @@ base::unique_qptr<Ui::PopupMenu> ChannelsController::rowContextMenu(
base::lambda<void()> handler) {
return result->addAction(text, handler);
});
result->addAction(
lang(lng_feed_ungroup),
[=] { Window::ToggleChannelGrouping(channel, false); });
//result->addAction( // #feed
// lang(lng_feed_ungroup),
// [=] { Window::ToggleChannelGrouping(channel, false); });
result->addAction(
lang(lng_profile_leave_channel),
@ -252,19 +252,19 @@ void NotificationsController::loadMoreRows() {
if (_preloadRequestId || _allLoaded) {
return;
}
_preloadRequestId = request(MTPmessages_GetDialogs(
MTP_flags(MTPmessages_GetDialogs::Flag::f_feed_id),
MTP_int(_feed->id()),
MTP_int(_preloadOffsetDate),
MTP_int(_preloadOffsetId),
_preloadPeer ? _preloadPeer->input : MTP_inputPeerEmpty(),
MTP_int(Data::Feed::kChannelsLimit)
)).done([=](const MTPmessages_Dialogs &result) {
applyFeedDialogs(result);
_preloadRequestId = 0;
}).fail([=](const RPCError &error) {
_preloadRequestId = 0;
}).send();
//_preloadRequestId = request(MTPmessages_GetDialogs( // #feed
// MTP_flags(MTPmessages_GetDialogs::Flag::f_feed_id),
// MTP_int(_feed->id()),
// MTP_int(_preloadOffsetDate),
// MTP_int(_preloadOffsetId),
// _preloadPeer ? _preloadPeer->input : MTP_inputPeerEmpty(),
// MTP_int(Data::Feed::kChannelsLimit)
//)).done([=](const MTPmessages_Dialogs &result) {
// applyFeedDialogs(result);
// _preloadRequestId = 0;
//}).fail([=](const RPCError &error) {
// _preloadRequestId = 0;
//}).send();
}
void NotificationsController::applyFeedDialogs(
@ -310,9 +310,9 @@ void NotificationsController::applyFeedDialogs(
}
}
} break;
case mtpc_dialogFeed: {
LOG(("API Error: Unexpected dialogFeed in feed dialogs list."));
} break;
//case mtpc_dialogFeed: { // #feed
// LOG(("API Error: Unexpected dialogFeed in feed dialogs list."));
//} break;
default: Unexpected("Type in DialogsInner::dialogsReceived");
}
}
@ -360,7 +360,7 @@ void EditController::Start(
return;
}
box->closeBox();
Auth().api().setFeedChannels(feed, channels);
//Auth().api().setFeedChannels(feed, channels); // #feed
});
box->addButton(langFactory(lng_cancel), [box] { box->closeBox(); });
};
@ -372,8 +372,8 @@ void EditController::Start(
EditController::EditController(
not_null<Data::Feed*> feed,
ChannelData *channel)
: _feed(feed)
, _startWithChannel(channel) {
: _feed(feed) {
//, _startWithChannel(channel) { // #feed
}
void EditController::prepare() {
@ -391,62 +391,62 @@ void EditController::loadMoreRows() {
if (_preloadRequestId || _allLoaded) {
return;
}
const auto hash = 0;
_preloadRequestId = request(MTPchannels_GetFeedSources(
MTP_flags(0),
MTP_int(0),
MTP_int(hash)
)).done([=](const MTPchannels_FeedSources &result) {
applyFeedSources(result);
_preloadRequestId = 0;
}).fail([=](const RPCError &error) {
_preloadRequestId = 0;
}).send();
}
void EditController::applyFeedSources(
const MTPchannels_FeedSources &result) {
auto channels = std::vector<not_null<ChannelData*>>();
switch (result.type()) {
case mtpc_channels_feedSourcesNotModified:
LOG(("API Error: Unexpected channels.feedSourcesNotModified."));
break;
case mtpc_channels_feedSources: {
const auto &data = result.c_channels_feedSources();
Auth().api().applyFeedSources(data);
for (const auto &chat : data.vchats.v) {
if (chat.type() == mtpc_channel) {
channels.push_back(App::channel(chat.c_channel().vid.v));
}
}
} break;
default: Unexpected("Type in channels.getFeedSources response.");
}
_allLoaded = true;
if (channels.size() < kChannelsInFeedMin) {
setDescriptionText(lng_feed_too_few_channels(
lt_count,
kChannelsInFeedMin));
delegate()->peerListSetSearchMode(PeerListSearchMode::Disabled);
} else {
auto alreadyInFeed = ranges::view::all(
channels
) | ranges::view::filter([&](not_null<ChannelData*> channel) {
return (channel->feed() == _feed)
|| (channel == _startWithChannel);
});
delegate()->peerListAddSelectedRows(alreadyInFeed);
for (const auto channel : channels) {
delegate()->peerListAppendRow(createRow(channel));
}
}
delegate()->peerListRefreshRows();
//const auto hash = 0; // #feed
//_preloadRequestId = request(MTPchannels_GetFeedSources(
// MTP_flags(0),
// MTP_int(0),
// MTP_int(hash)
//)).done([=](const MTPchannels_FeedSources &result) {
// applyFeedSources(result);
// _preloadRequestId = 0;
//}).fail([=](const RPCError &error) {
// _preloadRequestId = 0;
//}).send();
}
// #feed
//void EditController::applyFeedSources(
// const MTPchannels_FeedSources &result) {
// auto channels = std::vector<not_null<ChannelData*>>();
//
// switch (result.type()) {
// case mtpc_channels_feedSourcesNotModified:
// LOG(("API Error: Unexpected channels.feedSourcesNotModified."));
// break;
//
// case mtpc_channels_feedSources: {
// const auto &data = result.c_channels_feedSources();
// Auth().api().applyFeedSources(data);
//
// for (const auto &chat : data.vchats.v) {
// if (chat.type() == mtpc_channel) {
// channels.push_back(App::channel(chat.c_channel().vid.v));
// }
// }
// } break;
//
// default: Unexpected("Type in channels.getFeedSources response.");
// }
//
// _allLoaded = true;
// if (channels.size() < kChannelsInFeedMin) {
// setDescriptionText(lng_feed_too_few_channels(
// lt_count,
// kChannelsInFeedMin));
// delegate()->peerListSetSearchMode(PeerListSearchMode::Disabled);
// } else {
// auto alreadyInFeed = ranges::view::all(
// channels
// ) | ranges::view::filter([&](not_null<ChannelData*> channel) {
// return (channel->feed() == _feed)
// || (channel == _startWithChannel);
// });
// delegate()->peerListAddSelectedRows(alreadyInFeed);
// for (const auto channel : channels) {
// delegate()->peerListAppendRow(createRow(channel));
// }
// }
// delegate()->peerListRefreshRows();
//}
void EditController::rowClicked(not_null<PeerListRow*> row) {
delegate()->peerListSetRowChecked(row, !row->checked());

View file

@ -71,9 +71,9 @@ private:
not_null<Data::Feed*> _feed;
mtpRequestId _preloadRequestId = 0;
TimeId _preloadOffsetDate = TimeId(0);
MsgId _preloadOffsetId = MsgId(0);
PeerData *_preloadPeer = nullptr;
//TimeId _preloadOffsetDate = TimeId(0); // #feed
//MsgId _preloadOffsetId = MsgId(0);
//PeerData *_preloadPeer = nullptr;
bool _allLoaded = false;
};
@ -97,10 +97,10 @@ public:
private:
std::unique_ptr<PeerListRow> createRow(not_null<ChannelData*> channel);
void applyFeedSources(const MTPchannels_FeedSources &result);
// void applyFeedSources(const MTPchannels_FeedSources &result); // #feed
not_null<Data::Feed*> _feed;
ChannelData *_startWithChannel = nullptr;
// ChannelData *_startWithChannel = nullptr; // #feed
mtpRequestId _preloadRequestId = 0;
bool _allLoaded = false;

View file

@ -715,7 +715,7 @@ object_ptr<Ui::RpWidget> FeedDetailsFiller::setupDefaultToggle() {
const auto makeDefault = (Auth().data().defaultFeedId() != feedId);
const auto defaultFeedId = makeDefault ? feedId : 0;
Auth().data().setDefaultFeedId(defaultFeedId);
Auth().api().saveDefaultFeedId(feedId, makeDefault);
// Auth().api().saveDefaultFeedId(feedId, makeDefault); // #feed
});
object_ptr<FloatingIcon>(
result,

View file

@ -4686,21 +4686,21 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
}
} break;
case mtpc_updateReadFeed: {
const auto &d = update.c_updateReadFeed();
const auto feedId = d.vfeed_id.v;
if (const auto feed = Auth().data().feedLoaded(feedId)) {
feed->setUnreadPosition(
Data::FeedPositionFromMTP(d.vmax_position));
if (d.has_unread_count() && d.has_unread_muted_count()) {
feed->setUnreadCounts(
d.vunread_count.v,
d.vunread_muted_count.v);
} else {
Auth().api().requestDialogEntry(feed);
}
}
} break;
//case mtpc_updateReadFeed: { // #feed
// const auto &d = update.c_updateReadFeed();
// const auto feedId = d.vfeed_id.v;
// if (const auto feed = Auth().data().feedLoaded(feedId)) {
// feed->setUnreadPosition(
// Data::FeedPositionFromMTP(d.vmax_position));
// if (d.has_unread_count() && d.has_unread_muted_count()) {
// feed->setUnreadCounts(
// d.vunread_count.v,
// d.vunread_muted_count.v);
// } else {
// Auth().api().requestDialogEntry(feed);
// }
// }
//} break;
// Deleted messages.
case mtpc_updateDeleteMessages: {
@ -4987,17 +4987,17 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
return false;
}
} break;
case mtpc_dialogPeerFeed: {
const auto &feed = dialogPeer.c_dialogPeerFeed();
const auto feedId = feed.vfeed_id.v;
if (!Auth().data().feedLoaded(feedId)) {
DEBUG_LOG(("API Error: "
"pinned feed not loaded for feedId %1"
).arg(feedId
));
return false;
}
} break;
//case mtpc_dialogPeerFeed: { // #feed
// const auto &feed = dialogPeer.c_dialogPeerFeed();
// const auto feedId = feed.vfeed_id.v;
// if (!Auth().data().feedLoaded(feedId)) {
// DEBUG_LOG(("API Error: "
// "pinned feed not loaded for feedId %1"
// ).arg(feedId
// ));
// return false;
// }
//} break;
}
}
return true;
@ -5027,18 +5027,18 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
_dialogs->loadPinnedDialogs();
}
} break;
case mtpc_dialogPeerFeed: {
const auto feedId = d.vpeer.c_dialogPeerFeed().vfeed_id.v;
if (const auto feed = Auth().data().feedLoaded(feedId)) {
Auth().data().setPinnedDialog(feed, d.is_pinned());
} else {
DEBUG_LOG(("API Error: "
"pinned feed not loaded for feedId %1"
).arg(feedId
));
_dialogs->loadPinnedDialogs();
}
} break;
//case mtpc_dialogPeerFeed: { // #feed
// const auto feedId = d.vpeer.c_dialogPeerFeed().vfeed_id.v;
// if (const auto feed = Auth().data().feedLoaded(feedId)) {
// Auth().data().setPinnedDialog(feed, d.is_pinned());
// } else {
// DEBUG_LOG(("API Error: "
// "pinned feed not loaded for feedId %1"
// ).arg(feedId
// ));
// _dialogs->loadPinnedDialogs();
// }
//} break;
}
} break;

View file

@ -138,11 +138,16 @@ void TogglePinnedDialog(Dialogs::Key key) {
if (isPinned) {
flags |= MTPmessages_ToggleDialogPin::Flag::f_pinned;
}
MTP::send(MTPmessages_ToggleDialogPin(
MTP_flags(flags),
key.history()
? MTP_inputDialogPeer(key.history()->peer->input)
: MTP_inputDialogPeerFeed(MTP_int(key.feed()->id()))));
//MTP::send(MTPmessages_ToggleDialogPin( // #feed
// MTP_flags(flags),
// key.history()
// ? MTP_inputDialogPeer(key.history()->peer->input)
// : MTP_inputDialogPeerFeed(MTP_int(key.feed()->id()))));
if (key.history()) {
MTP::send(MTPmessages_ToggleDialogPin(
MTP_flags(flags),
MTP_inputDialogPeer(key.history()->peer->input)));
}
if (isPinned) {
if (const auto main = App::main()) {
main->dialogsToUp();
@ -330,9 +335,9 @@ void Filler::addChannelActions(not_null<ChannelData*> channel) {
const auto feed = channel->feed();
const auto grouped = (feed != nullptr);
if (!grouped || feed->channels().size() > 1) {
_addAction(
lang(grouped ? lng_feed_ungroup : lng_feed_group),
[=] { ToggleChannelGrouping(channel, !grouped); });
//_addAction( // #feed
// lang(grouped ? lng_feed_ungroup : lng_feed_group),
// [=] { ToggleChannelGrouping(channel, !grouped); });
}
}
if (_source != PeerMenuSource::ChatsList) {
@ -481,9 +486,9 @@ void FeedFiller::addSearch() {
void FeedFiller::addUngroup() {
const auto feed = _feed;
_addAction(lang(lng_feed_ungroup_all), [=] {
PeerMenuUngroupFeed(feed);
});
//_addAction(lang(lng_feed_ungroup_all), [=] { // #feed
// PeerMenuUngroupFeed(feed);
//});
}
} // namespace
@ -655,32 +660,32 @@ void PeerMenuAddMuteAction(
Ui::AttachAsChild(muteAction, std::move(lifetime));
}
void PeerMenuUngroupFeed(not_null<Data::Feed*> feed) {
Ui::show(Box<ConfirmBox>(
lang(lng_feed_sure_ungroup_all),
lang(lng_feed_ungroup_sure),
[=] { Ui::hideLayer(); Auth().api().ungroupAllFromFeed(feed); }));
}
void ToggleChannelGrouping(not_null<ChannelData*> channel, bool group) {
const auto callback = [=] {
Ui::Toast::Show(lang(group
? lng_feed_channel_added
: lng_feed_channel_removed));
};
if (group) {
const auto feed = Auth().data().feed(Data::Feed::kId);
if (feed->channels().size() < 2) {
Info::FeedProfile::EditController::Start(feed, channel);
return;
}
}
Auth().api().toggleChannelGrouping(
channel,
group,
callback);
}
// #feed
//void PeerMenuUngroupFeed(not_null<Data::Feed*> feed) {
// Ui::show(Box<ConfirmBox>(
// lang(lng_feed_sure_ungroup_all),
// lang(lng_feed_ungroup_sure),
// [=] { Ui::hideLayer(); Auth().api().ungroupAllFromFeed(feed); }));
//}
//
//void ToggleChannelGrouping(not_null<ChannelData*> channel, bool group) {
// const auto callback = [=] {
// Ui::Toast::Show(lang(group
// ? lng_feed_channel_added
// : lng_feed_channel_removed));
// };
// if (group) {
// const auto feed = Auth().data().feed(Data::Feed::kId);
// if (feed->channels().size() < 2) {
// Info::FeedProfile::EditController::Start(feed, channel);
// return;
// }
// }
// Auth().api().toggleChannelGrouping(
// channel,
// group,
// callback);
//}
base::lambda<void()> ClearHistoryHandler(not_null<PeerData*> peer) {
return [peer] {

View file

@ -48,9 +48,9 @@ void PeerMenuDeleteContact(not_null<UserData*> user);
void PeerMenuShareContactBox(not_null<UserData*> user);
void PeerMenuAddContact(not_null<UserData*> user);
void PeerMenuAddChannelMembers(not_null<ChannelData*> channel);
void PeerMenuUngroupFeed(not_null<Data::Feed*> feed);
//void PeerMenuUngroupFeed(not_null<Data::Feed*> feed); // #feed
void ToggleChannelGrouping(not_null<ChannelData*> channel, bool group);
//void ToggleChannelGrouping(not_null<ChannelData*> channel, bool group); // #feed
base::lambda<void()> ClearHistoryHandler(not_null<PeerData*> peer);
base::lambda<void()> DeleteAndLeaveHandler(not_null<PeerData*> peer);