mirror of https://github.com/procxx/kepka.git
Fix dialogs list in export.
This commit is contained in:
parent
4156beaa3c
commit
eaf3ea9289
|
@ -45,6 +45,14 @@ int32 BarePeerId(PeerId peerId) {
|
||||||
return int32(peerId & 0xFFFFFFFFULL);
|
return int32(peerId & 0xFFFFFFFFULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsChatPeerId(PeerId peerId) {
|
||||||
|
return (peerId & kChatPeerIdShift) == kChatPeerIdShift;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsUserPeerId(PeerId peerId) {
|
||||||
|
return (peerId & kUserPeerIdShift) == kUserPeerIdShift;
|
||||||
|
}
|
||||||
|
|
||||||
PeerId ParsePeerId(const MTPPeer &data) {
|
PeerId ParsePeerId(const MTPPeer &data) {
|
||||||
return data.match([](const MTPDpeerUser &data) {
|
return data.match([](const MTPDpeerUser &data) {
|
||||||
return UserPeerId(data.vuser_id.v);
|
return UserPeerId(data.vuser_id.v);
|
||||||
|
@ -526,11 +534,9 @@ Chat EmptyChat(int32 chatId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Peer EmptyPeer(PeerId peerId) {
|
Peer EmptyPeer(PeerId peerId) {
|
||||||
if (UserPeerId(BarePeerId(peerId)) == peerId) {
|
if (IsUserPeerId(peerId)) {
|
||||||
auto user = ParseUser(MTP_userEmpty(MTP_int(BarePeerId(peerId))));
|
|
||||||
return Peer{ EmptyUser(BarePeerId(peerId)) };
|
return Peer{ EmptyUser(BarePeerId(peerId)) };
|
||||||
} else if (ChatPeerId(BarePeerId(peerId)) == peerId) {
|
} else if (IsChatPeerId(peerId)) {
|
||||||
auto chat = ParseChat(MTP_chatEmpty(MTP_int(BarePeerId(peerId))));
|
|
||||||
return Peer{ EmptyChat(BarePeerId(peerId)) };
|
return Peer{ EmptyChat(BarePeerId(peerId)) };
|
||||||
}
|
}
|
||||||
Unexpected("PeerId in EmptyPeer.");
|
Unexpected("PeerId in EmptyPeer.");
|
||||||
|
@ -762,6 +768,10 @@ Message ParseMessage(const MTPMessage &data, const QString &mediaFolder) {
|
||||||
auto result = Message();
|
auto result = Message();
|
||||||
data.match([&](const MTPDmessage &data) {
|
data.match([&](const MTPDmessage &data) {
|
||||||
result.id = data.vid.v;
|
result.id = data.vid.v;
|
||||||
|
const auto peerId = ParsePeerId(data.vto_id);
|
||||||
|
if (IsChatPeerId(peerId)) {
|
||||||
|
result.chatId = BarePeerId(peerId);
|
||||||
|
}
|
||||||
const auto date = result.date = data.vdate.v;
|
const auto date = result.date = data.vdate.v;
|
||||||
if (data.has_edit_date()) {
|
if (data.has_edit_date()) {
|
||||||
result.edited = data.vedit_date.v;
|
result.edited = data.vedit_date.v;
|
||||||
|
@ -805,6 +815,10 @@ Message ParseMessage(const MTPMessage &data, const QString &mediaFolder) {
|
||||||
result.text = ParseString(data.vmessage);
|
result.text = ParseString(data.vmessage);
|
||||||
}, [&](const MTPDmessageService &data) {
|
}, [&](const MTPDmessageService &data) {
|
||||||
result.id = data.vid.v;
|
result.id = data.vid.v;
|
||||||
|
const auto peerId = ParsePeerId(data.vto_id);
|
||||||
|
if (IsChatPeerId(peerId)) {
|
||||||
|
result.chatId = BarePeerId(peerId);
|
||||||
|
}
|
||||||
const auto date = result.date = data.vdate.v;
|
const auto date = result.date = data.vdate.v;
|
||||||
result.action = ParseServiceAction(data.vaction, mediaFolder, date);
|
result.action = ParseServiceAction(data.vaction, mediaFolder, date);
|
||||||
if (data.has_from_id()) {
|
if (data.has_from_id()) {
|
||||||
|
@ -819,13 +833,14 @@ Message ParseMessage(const MTPMessage &data, const QString &mediaFolder) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<int32, Message> ParseMessagesList(
|
std::map<uint64, Message> ParseMessagesList(
|
||||||
const MTPVector<MTPMessage> &data,
|
const MTPVector<MTPMessage> &data,
|
||||||
const QString &mediaFolder) {
|
const QString &mediaFolder) {
|
||||||
auto result = std::map<int32, Message>();
|
auto result = std::map<uint64, Message>();
|
||||||
for (const auto &message : data.v) {
|
for (const auto &message : data.v) {
|
||||||
auto parsed = ParseMessage(message, mediaFolder);
|
auto parsed = ParseMessage(message, mediaFolder);
|
||||||
result.emplace(parsed.id, std::move(parsed));
|
const auto shift = uint64(uint32(parsed.chatId)) << 32;
|
||||||
|
result.emplace(shift | uint32(parsed.id), std::move(parsed));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1011,7 +1026,11 @@ DialogsInfo ParseDialogsInfo(const MTPmessages_Dialogs &data) {
|
||||||
info.input = peer.input();
|
info.input = peer.input();
|
||||||
}
|
}
|
||||||
info.topMessageId = fields.vtop_message.v;
|
info.topMessageId = fields.vtop_message.v;
|
||||||
const auto messageIt = messages.find(info.topMessageId);
|
const auto shift = IsChatPeerId(info.peerId)
|
||||||
|
? (uint64(uint32(BarePeerId(info.peerId))) << 32)
|
||||||
|
: 0;
|
||||||
|
const auto messageIt = messages.find(
|
||||||
|
shift | uint32(info.topMessageId));
|
||||||
if (messageIt != end(messages)) {
|
if (messageIt != end(messages)) {
|
||||||
const auto &message = messageIt->second;
|
const auto &message = messageIt->second;
|
||||||
info.topMessageDate = message.date;
|
info.topMessageDate = message.date;
|
||||||
|
|
|
@ -393,6 +393,7 @@ ServiceAction ParseServiceAction(
|
||||||
|
|
||||||
struct Message {
|
struct Message {
|
||||||
int32 id = 0;
|
int32 id = 0;
|
||||||
|
int32 chatId = 0;
|
||||||
TimeId date = 0;
|
TimeId date = 0;
|
||||||
TimeId edited = 0;
|
TimeId edited = 0;
|
||||||
int32 fromId = 0;
|
int32 fromId = 0;
|
||||||
|
@ -409,7 +410,7 @@ struct Message {
|
||||||
};
|
};
|
||||||
|
|
||||||
Message ParseMessage(const MTPMessage &data, const QString &mediaFolder);
|
Message ParseMessage(const MTPMessage &data, const QString &mediaFolder);
|
||||||
std::map<int32, Message> ParseMessagesList(
|
std::map<uint64, Message> ParseMessagesList(
|
||||||
const MTPVector<MTPMessage> &data,
|
const MTPVector<MTPMessage> &data,
|
||||||
const QString &mediaFolder);
|
const QString &mediaFolder);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue