mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-03-19 18:05:37 +00:00
Use server time in dialogs list sorting.
This way it won't mess up when you change your local time.
This commit is contained in:
parent
f68cefbdc1
commit
9972f7b90e
Telegram/SourceFiles
@ -636,7 +636,7 @@ void ApiWrap::historyDialogEntryApplied(not_null<History*> history) {
|
||||
if (!chat->haveLeft()) {
|
||||
Local::addSavedPeer(
|
||||
history->peer,
|
||||
history->chatsListDate());
|
||||
ParseDateTime(history->chatsListTimeId()));
|
||||
}
|
||||
} else if (const auto channel = history->peer->asChannel()) {
|
||||
const auto inviter = channel->inviter;
|
||||
@ -653,12 +653,11 @@ void ApiWrap::historyDialogEntryApplied(not_null<History*> history) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!history->chatsListDate().isNull()
|
||||
&& history->loadedAtBottom()) {
|
||||
if (history->chatsListTimeId() != 0 && history->loadedAtBottom()) {
|
||||
if (const auto channel = history->peer->asChannel()) {
|
||||
const auto inviter = channel->inviter;
|
||||
if (inviter != 0
|
||||
&& history->chatsListDate() <= ParseDateTime(channel->inviteDate)
|
||||
&& history->chatsListTimeId() <= channel->inviteDate
|
||||
&& channel->amIn()) {
|
||||
if (const auto from = App::userLoaded(inviter)) {
|
||||
history->insertJoinedMessage(true);
|
||||
|
@ -125,6 +125,14 @@ QDateTime ParseDateTime(TimeId serverTime) {
|
||||
return QDateTime::fromTime_t(serverTime - unixtimeDelta);
|
||||
}
|
||||
|
||||
TimeId ServerTimeFromParsed(const QDateTime &date) {
|
||||
if (date.isNull()) {
|
||||
return TimeId(0);
|
||||
}
|
||||
QReadLocker locker(&unixtimeLock);
|
||||
return date.toTime_t() + unixtimeDelta;
|
||||
}
|
||||
|
||||
// Precise timing functions / rand init
|
||||
|
||||
struct CRYPTO_dynlock_value {
|
||||
|
@ -196,6 +196,7 @@ uint64 msgid();
|
||||
int GetNextRequestId();
|
||||
|
||||
QDateTime ParseDateTime(TimeId serverTime);
|
||||
TimeId ServerTimeFromParsed(const QDateTime &date);
|
||||
|
||||
inline void mylocaltime(struct tm * _Tm, const time_t * _Time) {
|
||||
#ifdef Q_OS_WIN
|
||||
|
@ -150,7 +150,7 @@ void Feed::unregisterOne(not_null<ChannelData*> channel) {
|
||||
void Feed::updateLastMessage(not_null<HistoryItem*> item) {
|
||||
if (justUpdateLastMessage(item)) {
|
||||
if (_lastMessage && *_lastMessage) {
|
||||
setChatsListDate(ItemDateTime(*_lastMessage));
|
||||
setChatsListTimeId((*_lastMessage)->date());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -304,7 +304,7 @@ void Feed::setLastMessageFromChannels() {
|
||||
|
||||
void Feed::updateChatsListDate() {
|
||||
if (_lastMessage && *_lastMessage) {
|
||||
setChatsListDate(ItemDateTime(*_lastMessage));
|
||||
setChatsListTimeId((*_lastMessage)->date());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -19,11 +19,11 @@ namespace {
|
||||
|
||||
auto DialogsPosToTopShift = 0;
|
||||
|
||||
uint64 DialogPosFromDate(const QDateTime &date) {
|
||||
if (date.isNull()) {
|
||||
uint64 DialogPosFromDate(TimeId date) {
|
||||
if (!date) {
|
||||
return 0;
|
||||
}
|
||||
return (uint64(date.toTime_t()) << 32) | (++DialogsPosToTopShift);
|
||||
return (uint64(date) << 32) | (++DialogsPosToTopShift);
|
||||
}
|
||||
|
||||
uint64 ProxyPromotedDialogPos() {
|
||||
@ -73,7 +73,7 @@ void Entry::updateChatListSortPosition() {
|
||||
? ProxyPromotedDialogPos()
|
||||
: isPinnedDialog()
|
||||
? PinnedDialogPos(_pinnedIndex)
|
||||
: DialogPosFromDate(adjustChatListDate());
|
||||
: DialogPosFromDate(adjustChatListTimeId());
|
||||
if (needUpdateInChatList()) {
|
||||
setChatListExistence(true);
|
||||
}
|
||||
@ -94,8 +94,8 @@ void Entry::setChatListExistence(bool exists) {
|
||||
}
|
||||
}
|
||||
|
||||
QDateTime Entry::adjustChatListDate() const {
|
||||
return chatsListDate();
|
||||
TimeId Entry::adjustChatListTimeId() const {
|
||||
return chatsListTimeId();
|
||||
}
|
||||
|
||||
void Entry::changedInChatListHook(Dialogs::Mode list, bool added) {
|
||||
@ -128,13 +128,13 @@ PositionChange Entry::adjustByPosInChatList(
|
||||
return { movedFrom, movedTo };
|
||||
}
|
||||
|
||||
void Entry::setChatsListDate(QDateTime date) {
|
||||
if (!_lastMessageDate.isNull() && _lastMessageDate >= date) {
|
||||
void Entry::setChatsListTimeId(TimeId date) {
|
||||
if (_lastMessageTimeId && _lastMessageTimeId >= date) {
|
||||
if (!inChatList(Dialogs::Mode::All)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
_lastMessageDate = date;
|
||||
_lastMessageTimeId = date;
|
||||
updateChatListSortPosition();
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ public:
|
||||
return _sortKeyInChatList;
|
||||
}
|
||||
void updateChatListSortPosition();
|
||||
void setChatsListDate(QDateTime date);
|
||||
void setChatsListTimeId(TimeId date);
|
||||
virtual void updateChatListExistence();
|
||||
bool needUpdateInChatList() const;
|
||||
|
||||
@ -94,8 +94,8 @@ public:
|
||||
paintUserpic(p, rtl() ? (w - x - size) : x, y, size);
|
||||
}
|
||||
|
||||
QDateTime chatsListDate() const {
|
||||
return _lastMessageDate;
|
||||
TimeId chatsListTimeId() const {
|
||||
return _lastMessageTimeId;
|
||||
}
|
||||
|
||||
virtual ~Entry() = default;
|
||||
@ -104,7 +104,7 @@ public:
|
||||
mutable Text lastItemTextCache;
|
||||
|
||||
private:
|
||||
virtual QDateTime adjustChatListDate() const;
|
||||
virtual TimeId adjustChatListTimeId() const;
|
||||
virtual void changedInChatListHook(Dialogs::Mode list, bool added);
|
||||
virtual void changedChatListPinHook();
|
||||
|
||||
@ -118,7 +118,7 @@ private:
|
||||
uint64 _sortKeyInChatList = 0;
|
||||
int _pinnedIndex = 0;
|
||||
bool _isProxyPromoted = false;
|
||||
QDateTime _lastMessageDate;
|
||||
TimeId _lastMessageTimeId = 0;
|
||||
|
||||
};
|
||||
|
||||
|
@ -1784,9 +1784,9 @@ void DialogsInner::applyDialog(const MTPDdialog &dialog) {
|
||||
history->applyDialog(dialog);
|
||||
|
||||
if (!history->useProxyPromotion() && !history->isPinnedDialog()) {
|
||||
const auto date = history->chatsListDate();
|
||||
if (!date.isNull()) {
|
||||
addSavedPeersAfter(date);
|
||||
const auto date = history->chatsListTimeId();
|
||||
if (date != 0) {
|
||||
addSavedPeersAfter(ParseDateTime(date));
|
||||
}
|
||||
}
|
||||
_contactsNoDialogs->del(history);
|
||||
@ -1818,7 +1818,7 @@ void DialogsInner::addSavedPeersAfter(const QDateTime &date) {
|
||||
auto &saved = cRefSavedPeersByTime();
|
||||
while (!saved.isEmpty() && (date.isNull() || date < saved.lastKey())) {
|
||||
const auto history = App::history(saved.last()->id);
|
||||
history->setChatsListDate(saved.lastKey());
|
||||
history->setChatsListTimeId(ServerTimeFromParsed(saved.lastKey()));
|
||||
_contactsNoDialogs->del(history);
|
||||
saved.remove(saved.lastKey(), saved.last());
|
||||
}
|
||||
|
@ -1827,14 +1827,11 @@ std::shared_ptr<AdminLog::LocalIdManager> History::adminLogIdManager() {
|
||||
return result;
|
||||
}
|
||||
|
||||
QDateTime History::adjustChatListDate() const {
|
||||
const auto result = chatsListDate();
|
||||
TimeId History::adjustChatListTimeId() const {
|
||||
const auto result = chatsListTimeId();
|
||||
if (const auto draft = cloudDraft()) {
|
||||
if (!Data::draftIsNull(draft)) {
|
||||
const auto draftResult = ParseDateTime(draft->date);
|
||||
if (draftResult > result) {
|
||||
return draftResult;
|
||||
}
|
||||
return std::max(result, draft->date);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -2182,7 +2179,7 @@ void History::setLastMessage(HistoryItem *item) {
|
||||
if (const auto feed = peer->feed()) {
|
||||
feed->updateLastMessage(item);
|
||||
}
|
||||
setChatsListDate(ItemDateTime(item));
|
||||
setChatsListTimeId(item->date());
|
||||
} else if (!_lastMessage || *_lastMessage) {
|
||||
_lastMessage = nullptr;
|
||||
updateChatListEntry();
|
||||
@ -2500,8 +2497,8 @@ HistoryService *History::insertJoinedMessage(bool unread) {
|
||||
inviter,
|
||||
flags);
|
||||
addNewInTheMiddle(_joinedMessage, blockIndex, itemIndex);
|
||||
const auto lastDate = chatsListDate();
|
||||
if (lastDate.isNull() || ParseDateTime(inviteDate) >= lastDate) {
|
||||
const auto lastDate = chatsListTimeId();
|
||||
if (!lastDate || inviteDate >= lastDate) {
|
||||
setLastMessage(_joinedMessage);
|
||||
if (unread) {
|
||||
newItemAdded(_joinedMessage);
|
||||
|
@ -445,7 +445,7 @@ private:
|
||||
not_null<Element*> view);
|
||||
void removeNotification(not_null<HistoryItem*> item);
|
||||
|
||||
QDateTime adjustChatListDate() const override;
|
||||
TimeId adjustChatListTimeId() const override;
|
||||
void changedInChatListHook(Dialogs::Mode list, bool added) override;
|
||||
void changedChatListPinHook() override;
|
||||
|
||||
|
@ -334,14 +334,14 @@ void Controller::showJumpToDate(Dialogs::Key chat, QDate requestedDate) {
|
||||
return history->blocks.front()->messages.front()->dateTime().date();
|
||||
}
|
||||
}
|
||||
} else if (!history->chatsListDate().isNull()) {
|
||||
return history->chatsListDate().date();
|
||||
} else if (history->chatsListTimeId() != 0) {
|
||||
return ParseDateTime(history->chatsListTimeId()).date();
|
||||
}
|
||||
} else if (const auto feed = chat.feed()) {
|
||||
/*if (chatScrollPosition(feed)) { // #TODO feeds save position
|
||||
|
||||
} else */if (!feed->chatsListDate().isNull()) {
|
||||
return feed->chatsListDate().date();
|
||||
} else */if (feed->chatsListTimeId() != 0) {
|
||||
return ParseDateTime(feed->chatsListTimeId()).date();
|
||||
}
|
||||
}
|
||||
return QDate::currentDate();
|
||||
@ -351,12 +351,12 @@ void Controller::showJumpToDate(Dialogs::Key chat, QDate requestedDate) {
|
||||
if (const auto channel = history->peer->migrateTo()) {
|
||||
history = App::historyLoaded(channel);
|
||||
}
|
||||
if (history && !history->chatsListDate().isNull()) {
|
||||
return history->chatsListDate().date();
|
||||
if (history && history->chatsListTimeId() != 0) {
|
||||
return ParseDateTime(history->chatsListTimeId()).date();
|
||||
}
|
||||
} else if (const auto feed = chat.feed()) {
|
||||
if (!feed->chatsListDate().isNull()) {
|
||||
return feed->chatsListDate().date();
|
||||
if (feed->chatsListTimeId() != 0) {
|
||||
return ParseDateTime(feed->chatsListTimeId()).date();
|
||||
}
|
||||
}
|
||||
return QDate::currentDate();
|
||||
|
Loading…
Reference in New Issue
Block a user