From 712b3f481c3bb094f5ada431bc30512eb10d9f94 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sun, 17 Dec 2017 12:13:26 +0400 Subject: [PATCH] Move online phrase code from app module. Also fix possible assertion violation in online change timeout. --- Telegram/SourceFiles/app.cpp | 135 +------------ Telegram/SourceFiles/app.h | 8 - .../boxes/edit_participant_box.cpp | 3 +- Telegram/SourceFiles/boxes/peer_list_box.cpp | 7 +- .../chat_helpers/field_autocomplete.cpp | 10 +- .../SourceFiles/data/data_peer_values.cpp | 185 ++++++++++++++++++ Telegram/SourceFiles/data/data_peer_values.h | 9 + .../dialogs_search_from_controllers.cpp | 10 +- .../history/history_admin_log_filter.cpp | 5 +- .../history/history_top_bar_widget.cpp | 24 +-- .../info/profile/info_profile_cover.cpp | 9 +- .../info_profile_members_controllers.cpp | 7 +- .../profile/profile_block_group_members.cpp | 32 +-- .../profile/profile_channel_controllers.cpp | 7 +- 14 files changed, 265 insertions(+), 186 deletions(-) diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index fbe6a9e194..eb940db99a 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -128,7 +128,8 @@ namespace { LastPhotosList lastPhotos; using LastPhotosMap = QHash; LastPhotosMap lastPhotosMap; -} + +} // namespace namespace App { @@ -219,117 +220,6 @@ namespace { } } - TimeId onlineForSort(UserData *user, TimeId now) { - if (isServiceUser(user->id) || user->botInfo) { - return -1; - } - TimeId online = user->onlineTill; - if (online <= 0) { - switch (online) { - case 0: - case -1: return online; - - case -2: { - QDate yesterday(date(now).date()); - return int32(QDateTime(yesterday.addDays(-3)).toTime_t()) + (unixtime() - myunixtime()); - } break; - - case -3: { - QDate weekago(date(now).date()); - return int32(QDateTime(weekago.addDays(-7)).toTime_t()) + (unixtime() - myunixtime()); - } break; - - case -4: { - QDate monthago(date(now).date()); - return int32(QDateTime(monthago.addDays(-30)).toTime_t()) + (unixtime() - myunixtime()); - } break; - } - return -online; - } - return online; - } - - int32 onlineWillChangeIn(UserData *user, TimeId now) { - if (isServiceUser(user->id) || user->botInfo) { - return 86400; - } - return onlineWillChangeIn(user->onlineTill, now); - } - - int32 onlineWillChangeIn(TimeId online, TimeId now) { - if (online <= 0) { - if (-online > now) return std::max(-online - now, 86400); - return 86400; - } - if (online > now) { - return std::max(online - now, 86400); - } - int32 minutes = (now - online) / 60; - if (minutes < 60) { - return (minutes + 1) * 60 - (now - online); - } - int32 hours = (now - online) / 3600; - if (hours < 12) { - return (hours + 1) * 3600 - (now - online); - } - QDateTime dNow(date(now)), dTomorrow(dNow.date().addDays(1)); - return std::max(dNow.secsTo(dTomorrow), 86400LL); - } - - QString onlineText(UserData *user, TimeId now, bool precise) { - if (isNotificationsUser(user->id)) { - return lang(lng_status_service_notifications); - } else if (user->botInfo) { - return lang(lng_status_bot); - } else if (isServiceUser(user->id)) { - return lang(lng_status_support); - } - return onlineText(user->onlineTill, now, precise); - } - - QString onlineText(TimeId online, TimeId now, bool precise) { - if (online <= 0) { - switch (online) { - case 0: - case -1: return lang(lng_status_offline); - case -2: return lang(lng_status_recently); - case -3: return lang(lng_status_last_week); - case -4: return lang(lng_status_last_month); - } - return (-online > now) ? lang(lng_status_online) : lang(lng_status_recently); - } - if (online > now) { - return lang(lng_status_online); - } - QString when; - if (precise) { - QDateTime dOnline(date(online)), dNow(date(now)); - if (dOnline.date() == dNow.date()) { - return lng_status_lastseen_today(lt_time, dOnline.time().toString(cTimeFormat())); - } else if (dOnline.date().addDays(1) == dNow.date()) { - return lng_status_lastseen_yesterday(lt_time, dOnline.time().toString(cTimeFormat())); - } - return lng_status_lastseen_date_time(lt_date, dOnline.date().toString(qsl("dd.MM.yy")), lt_time, dOnline.time().toString(cTimeFormat())); - } - int32 minutes = (now - online) / 60; - if (!minutes) { - return lang(lng_status_lastseen_now); - } else if (minutes < 60) { - return lng_status_lastseen_minutes(lt_count, minutes); - } - int32 hours = (now - online) / 3600; - if (hours < 12) { - return lng_status_lastseen_hours(lt_count, hours); - } - QDateTime dOnline(date(online)), dNow(date(now)); - if (dOnline.date() == dNow.date()) { - return lng_status_lastseen_today(lt_time, dOnline.time().toString(cTimeFormat())); - } else if (dOnline.date().addDays(1) == dNow.date()) { - return lng_status_lastseen_yesterday(lt_time, dOnline.time().toString(cTimeFormat())); - } - return lng_status_lastseen_date(lt_date, dOnline.date().toString(qsl("dd.MM.yy"))); - } - namespace { // we should get a full restriction in "{fulltype}: {reason}" format and we // need to find a "-all" tag in {fulltype}, otherwise ignore this restriction @@ -354,27 +244,6 @@ namespace { } } - bool onlineColorUse(UserData *user, TimeId now) { - if (isServiceUser(user->id) || user->botInfo) { - return false; - } - return onlineColorUse(user->onlineTill, now); - } - - bool onlineColorUse(TimeId online, TimeId now) { - if (online <= 0) { - switch (online) { - case 0: - case -1: - case -2: - case -3: - case -4: return false; - } - return (-online > now); - } - return (online > now); - } - UserData *feedUser(const MTPUser &user) { UserData *data = nullptr; bool wasContact = false, minimal = false; diff --git a/Telegram/SourceFiles/app.h b/Telegram/SourceFiles/app.h index 480129879a..168bfb1325 100644 --- a/Telegram/SourceFiles/app.h +++ b/Telegram/SourceFiles/app.h @@ -52,14 +52,6 @@ namespace App { QString formatPhone(QString phone); - TimeId onlineForSort(UserData *user, TimeId now); - int32 onlineWillChangeIn(UserData *user, TimeId now); - int32 onlineWillChangeIn(TimeId online, TimeId now); - QString onlineText(UserData *user, TimeId now, bool precise = false); - QString onlineText(TimeId online, TimeId now, bool precise = false); - bool onlineColorUse(UserData *user, TimeId now); - bool onlineColorUse(TimeId online, TimeId now); - UserData *feedUser(const MTPUser &user); UserData *feedUsers(const MTPVector &users); // returns last user PeerData *feedChat(const MTPChat &chat); diff --git a/Telegram/SourceFiles/boxes/edit_participant_box.cpp b/Telegram/SourceFiles/boxes/edit_participant_box.cpp index ad9512e1b1..8896c7012f 100644 --- a/Telegram/SourceFiles/boxes/edit_participant_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_participant_box.cpp @@ -27,6 +27,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "styles/style_boxes.h" #include "ui/special_buttons.h" #include "boxes/calendar_box.h" +#include "data/data_peer_values.h" namespace { @@ -176,7 +177,7 @@ void EditParticipantBox::Inner::paintEvent(QPaintEvent *e) { auto seesAllMessages = (_user->botInfo->readsAllHistory || _hasAdminRights); return lang(seesAllMessages ? lng_status_bot_reads_all : lng_status_bot_not_reads_all); } - return App::onlineText(_user->onlineTill, unixtime()); + return Data::OnlineText(_user->onlineTill, unixtime()); }; p.setFont(st::contactsStatusFont); p.setPen(st::contactsStatusFg); diff --git a/Telegram/SourceFiles/boxes/peer_list_box.cpp b/Telegram/SourceFiles/boxes/peer_list_box.cpp index d4e9aad9f5..7fdf7aee46 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_box.cpp @@ -37,6 +37,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "lang/lang_keys.h" #include "observer_peer.h" #include "storage/file_download.h" +#include "data/data_peer_values.h" #include "window/themes/window_theme.h" PeerListBox::PeerListBox( @@ -357,12 +358,12 @@ void PeerListRow::refreshStatus() { setStatusText(lang(lng_saved_forward_here)); } else { auto time = unixtime(); - setStatusText(App::onlineText(user, time)); - if (App::onlineColorUse(user, time)) { + setStatusText(Data::OnlineText(user, time)); + if (Data::OnlineTextActive(user, time)) { _statusType = StatusType::Online; } _statusValidTill = getms() - + App::onlineWillChangeIn(user, time) * 1000LL; + + Data::OnlineChangeTimeout(user, time); } } else if (auto chat = peer()->asChat()) { if (!chat->amIn()) { diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp index e13b70f1e2..a68431d529 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp @@ -21,6 +21,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "chat_helpers/field_autocomplete.h" #include "data/data_document.h" +#include "data/data_peer_values.h" #include "mainwindow.h" #include "apiwrap.h" #include "storage/localstorage.h" @@ -191,7 +192,10 @@ void FieldAutocomplete::updateFiltered(bool resetScroll) { } } if (_chat) { - QMultiMap ordered; + auto ordered = QMultiMap>(); + const auto byOnline = [&](not_null user) { + return Data::SortByOnlineValue(user, now); + }; mrows.reserve(mrows.size() + (_chat->participants.empty() ? _chat->lastAuthors.size() : _chat->participants.size())); if (_chat->noParticipantInfo()) { Auth().api().requestFullPeer(_chat); @@ -200,7 +204,7 @@ void FieldAutocomplete::updateFiltered(bool resetScroll) { if (user->isInaccessible()) continue; if (!listAllSuggestions && filterNotPassedByName(user)) continue; if (indexOfInFirstN(mrows, user, recentInlineBots) >= 0) continue; - ordered.insertMulti(App::onlineForSort(user, now), user); + ordered.insertMulti(byOnline(user), user); } } for (const auto user : _chat->lastAuthors) { @@ -209,7 +213,7 @@ void FieldAutocomplete::updateFiltered(bool resetScroll) { if (indexOfInFirstN(mrows, user, recentInlineBots) >= 0) continue; mrows.push_back(user); if (!ordered.isEmpty()) { - ordered.remove(App::onlineForSort(user, now), user); + ordered.remove(byOnline(user), user); } } if (!ordered.isEmpty()) { diff --git a/Telegram/SourceFiles/data/data_peer_values.cpp b/Telegram/SourceFiles/data/data_peer_values.cpp index acef47a0db..11cb4b87ad 100644 --- a/Telegram/SourceFiles/data/data_peer_values.cpp +++ b/Telegram/SourceFiles/data/data_peer_values.cpp @@ -20,7 +20,67 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org */ #include "data/data_peer_values.h" +#include "lang/lang_keys.h" + namespace Data { +namespace { + +constexpr auto kMinOnlineChangeTimeout = TimeMs(1000); +constexpr auto kMaxOnlineChangeTimeout = 86400 * TimeMs(1000); + +int OnlinePhraseChangeInSeconds(TimeId online, TimeId now) { + if (online <= 0) { + if (-online > now) { + return (-online - now); + } + return std::numeric_limits::max(); + } + if (online > now) { + return online - now; + } + const auto minutes = (now - online) / 60; + if (minutes < 60) { + return (minutes + 1) * 60 - (now - online); + } + const auto hours = (now - online) / 3600; + if (hours < 12) { + return (hours + 1) * 3600 - (now - online); + } + const auto nowFull = ::date(now); + const auto tomorrow = QDateTime(nowFull.date().addDays(1)); + return static_cast(nowFull.secsTo(tomorrow)); +} + +base::optional OnlineTextSpecial(not_null user) { + if (isNotificationsUser(user->id)) { + return lang(lng_status_service_notifications); + } else if (user->botInfo) { + return lang(lng_status_bot); + } else if (isServiceUser(user->id)) { + return lang(lng_status_support); + } + return base::none; +} + +base::optional OnlineTextCommon(TimeId online, TimeId now) { + if (online <= 0) { + switch (online) { + case 0: + case -1: return lang(lng_status_offline); + case -2: return lang(lng_status_recently); + case -3: return lang(lng_status_last_week); + case -4: return lang(lng_status_last_month); + } + return (-online > now) + ? lang(lng_status_online) + : lang(lng_status_recently); + } else if (online > now) { + return lang(lng_status_online); + } + return base::none; +} + +} // namespace inline auto AdminRightsValue(not_null channel) { return channel->adminRightsValue(); @@ -123,4 +183,129 @@ rpl::producer CanWriteValue(not_null peer) { Unexpected("Bad peer value in CanWriteValue()"); } +TimeId SortByOnlineValue(not_null user, TimeId now) { + if (isServiceUser(user->id) || user->botInfo) { + return -1; + } + const auto online = user->onlineTill; + const auto fromDate = [](const QDate &date) { + const auto shift = (unixtime() - myunixtime()); + return static_cast(QDateTime(date).toTime_t()) + shift; + }; + if (online <= 0) { + switch (online) { + case 0: + case -1: return online; + + case -2: { + const auto recently = date(now).date().addDays(-3); + return fromDate(recently); + } break; + + case -3: { + const auto weekago = date(now).date().addDays(-7); + return fromDate(weekago); + } break; + + case -4: { + const auto monthago = date(now).date().addDays(-30); + return fromDate(monthago); + } break; + } + return -online; + } + return online; +} + +TimeMs OnlineChangeTimeout(TimeId online, TimeId now) { + const auto result = OnlinePhraseChangeInSeconds(online, now); + Assert(result >= 0); + return snap( + result * TimeMs(1000), + kMinOnlineChangeTimeout, + kMaxOnlineChangeTimeout); +} + +TimeMs OnlineChangeTimeout(not_null user, TimeId now) { + if (isServiceUser(user->id) || user->botInfo) { + return kMaxOnlineChangeTimeout; + } + return OnlineChangeTimeout(user->onlineTill, now); +} + +QString OnlineText(TimeId online, TimeId now) { + if (const auto common = OnlineTextCommon(online, now)) { + return *common; + } + const auto minutes = (now - online) / 60; + if (!minutes) { + return lang(lng_status_lastseen_now); + } else if (minutes < 60) { + return lng_status_lastseen_minutes(lt_count, minutes); + } + const auto hours = (now - online) / 3600; + if (hours < 12) { + return lng_status_lastseen_hours(lt_count, hours); + } + const auto onlineFull = ::date(online); + const auto nowFull = ::date(now); + if (onlineFull.date() == nowFull.date()) { + const auto onlineTime = onlineFull.time().toString(cTimeFormat()); + return lng_status_lastseen_today(lt_time, onlineTime); + } else if (onlineFull.date().addDays(1) == nowFull.date()) { + const auto onlineTime = onlineFull.time().toString(cTimeFormat()); + return lng_status_lastseen_yesterday(lt_time, onlineTime); + } + const auto date = onlineFull.date().toString(qsl("dd.MM.yy")); + return lng_status_lastseen_date(lt_date, date); +} + +QString OnlineText(not_null user, TimeId now) { + if (const auto special = OnlineTextSpecial(user)) { + return *special; + } + return OnlineText(user->onlineTill, now); +} + +QString OnlineTextFull(not_null user, TimeId now) { + if (const auto special = OnlineTextSpecial(user)) { + return *special; + } else if (const auto common = OnlineTextCommon(user->onlineTill, now)) { + return *common; + } + const auto onlineFull = ::date(user->onlineTill); + const auto nowFull = ::date(now); + if (onlineFull.date() == nowFull.date()) { + const auto onlineTime = onlineFull.time().toString(cTimeFormat()); + return lng_status_lastseen_today(lt_time, onlineTime); + } else if (onlineFull.date().addDays(1) == nowFull.date()) { + const auto onlineTime = onlineFull.time().toString(cTimeFormat()); + return lng_status_lastseen_yesterday(lt_time, onlineTime); + } + const auto date = onlineFull.date().toString(qsl("dd.MM.yy")); + const auto time = onlineFull.time().toString(cTimeFormat()); + return lng_status_lastseen_date_time(lt_date, date, lt_time, time); +} + +bool OnlineTextActive(TimeId online, TimeId now) { + if (online <= 0) { + switch (online) { + case 0: + case -1: + case -2: + case -3: + case -4: return false; + } + return (-online > now); + } + return (online > now); +} + +bool OnlineTextActive(not_null user, TimeId now) { + if (isServiceUser(user->id) || user->botInfo) { + return false; + } + return OnlineTextActive(user->onlineTill, now); +} + } // namespace Data diff --git a/Telegram/SourceFiles/data/data_peer_values.h b/Telegram/SourceFiles/data/data_peer_values.h index 8fc6b12723..3b53fd9539 100644 --- a/Telegram/SourceFiles/data/data_peer_values.h +++ b/Telegram/SourceFiles/data/data_peer_values.h @@ -121,4 +121,13 @@ rpl::producer CanWriteValue(ChatData *chat); rpl::producer CanWriteValue(ChannelData *channel); rpl::producer CanWriteValue(not_null peer); +TimeId SortByOnlineValue(not_null user, TimeId now); +TimeMs OnlineChangeTimeout(TimeId online, TimeId now); +TimeMs OnlineChangeTimeout(not_null user, TimeId now); +QString OnlineText(TimeId online, TimeId now); +QString OnlineText(not_null user, TimeId now); +QString OnlineTextFull(not_null user, TimeId now); +bool OnlineTextActive(TimeId online, TimeId now); +bool OnlineTextActive(not_null user, TimeId now); + } // namespace Data diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp b/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp index 49d7ba874c..6919b930c3 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp @@ -21,6 +21,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "dialogs/dialogs_search_from_controllers.h" #include "lang/lang_keys.h" +#include "data/data_peer_values.h" #include "observer_peer.h" #include "auth_session.h" #include "apiwrap.h" @@ -94,19 +95,22 @@ void ChatSearchFromController::rebuildRows() { auto wasEmpty = !delegate()->peerListFullRowsCount(); auto now = unixtime(); - QMultiMap ordered; + const auto byOnline = [&](not_null user) { + return Data::SortByOnlineValue(user, now); + }; + auto ordered = QMultiMap>(); if (_chat->noParticipantInfo()) { Auth().api().requestFullPeer(_chat); } else if (!_chat->participants.empty()) { for (const auto [user, version] : _chat->participants) { - ordered.insertMulti(App::onlineForSort(user, now), user); + ordered.insertMulti(byOnline(user), user); } } for_const (auto user, _chat->lastAuthors) { if (user->isInaccessible()) continue; appendRow(user); if (!ordered.isEmpty()) { - ordered.remove(App::onlineForSort(user, now), user); + ordered.remove(byOnline(user), user); } } if (!ordered.isEmpty()) { diff --git a/Telegram/SourceFiles/history/history_admin_log_filter.cpp b/Telegram/SourceFiles/history/history_admin_log_filter.cpp index 58f462bbcd..a834bd4cc3 100644 --- a/Telegram/SourceFiles/history/history_admin_log_filter.cpp +++ b/Telegram/SourceFiles/history/history_admin_log_filter.cpp @@ -24,6 +24,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "ui/widgets/checkbox.h" #include "ui/effects/ripple_animation.h" #include "lang/lang_keys.h" +#include "data/data_peer_values.h" namespace AdminLog { namespace { @@ -79,8 +80,8 @@ UserCheckbox::UserCheckbox(QWidget *parent, not_null user, bool check setChecked(!this->checked()); }); auto now = unixtime(); - _statusText = App::onlineText(_user, now); - _statusOnline = App::onlineColorUse(_user, now); + _statusText = Data::OnlineText(_user, now); + _statusOnline = Data::OnlineTextActive(_user, now); auto checkSize = _check->getSize(); _checkRect = { QPoint(_st.margin.left(), (st::contactsPhotoSize - checkSize.height()) / 2), checkSize }; } diff --git a/Telegram/SourceFiles/history/history_top_bar_widget.cpp b/Telegram/SourceFiles/history/history_top_bar_widget.cpp index c1bf605619..13431eb2aa 100644 --- a/Telegram/SourceFiles/history/history_top_bar_widget.cpp +++ b/Telegram/SourceFiles/history/history_top_bar_widget.cpp @@ -43,6 +43,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "window/window_controller.h" #include "window/window_peer_menu.h" #include "calls/calls_instance.h" +#include "data/data_peer_values.h" #include "observer_peer.h" #include "apiwrap.h" @@ -664,12 +665,12 @@ void HistoryTopBarWidget::updateOnlineDisplay() { if (!_historyPeer) return; QString text; - int32 t = unixtime(); + const auto now = unixtime(); bool titlePeerTextOnline = false; - if (auto user = _historyPeer->asUser()) { - text = App::onlineText(user, t); - titlePeerTextOnline = App::onlineColorUse(user, t); - } else if (auto chat = _historyPeer->asChat()) { + if (const auto user = _historyPeer->asUser()) { + text = Data::OnlineText(user, now); + titlePeerTextOnline = Data::OnlineTextActive(user, now); + } else if (const auto chat = _historyPeer->asChat()) { if (!chat->amIn()) { text = lang(lng_chat_status_unaccessible); } else if (chat->participants.empty()) { @@ -684,7 +685,7 @@ void HistoryTopBarWidget::updateOnlineDisplay() { auto online = 0; auto onlyMe = true; for (auto [user, v] : chat->participants) { - if (user->onlineTill > t) { + if (user->onlineTill > now) { ++online; if (onlyMe && user != App::self()) onlyMe = false; } @@ -707,7 +708,7 @@ void HistoryTopBarWidget::updateOnlineDisplay() { auto online = 0; bool onlyMe = true; for (auto &participant : std::as_const(channel->mgInfo->lastParticipants)) { - if (participant->onlineTill > t) { + if (participant->onlineTill > now) { ++online; if (onlyMe && participant != App::self()) { onlyMe = false; @@ -743,11 +744,10 @@ void HistoryTopBarWidget::updateOnlineDisplayTimer() { if (!_historyPeer) return; const auto now = unixtime(); - auto minIn = TimeId(86400); + auto minTimeout = TimeMs(86400); const auto handleUser = [&](not_null user) { - auto hisMinIn = App::onlineWillChangeIn(user, now); - Assert(hisMinIn >= 0 && hisMinIn <= 86400); - accumulate_min(minIn, hisMinIn); + auto hisTimeout = Data::OnlineChangeTimeout(user, now); + accumulate_min(minTimeout, hisTimeout); }; if (const auto user = _historyPeer->asUser()) { handleUser(user); @@ -757,7 +757,7 @@ void HistoryTopBarWidget::updateOnlineDisplayTimer() { } } else if (_historyPeer->isChannel()) { } - updateOnlineDisplayIn(minIn * 1000); + updateOnlineDisplayIn(minTimeout); } void HistoryTopBarWidget::updateOnlineDisplayIn(TimeMs timeout) { diff --git a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp index 56cd1d08c1..dff21f7906 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp @@ -23,6 +23,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include #include #include "data/data_photo.h" +#include "data/data_peer_values.h" #include "info/profile/info_profile_values.h" #include "info/info_controller.h" #include "info/info_memento.h" @@ -360,11 +361,11 @@ void Cover::refreshStatusText() { auto statusText = [&] { auto currentTime = unixtime(); if (auto user = _peer->asUser()) { - const auto result = App::onlineText(user, currentTime, true); - const auto showOnline = App::onlineColorUse(user, currentTime); - const auto updateIn = App::onlineWillChangeIn(user, currentTime); + const auto result = Data::OnlineTextFull(user, currentTime); + const auto showOnline = Data::OnlineTextActive(user, currentTime); + const auto updateIn = Data::OnlineChangeTimeout(user, currentTime); if (showOnline) { - _refreshStatusTimer.callOnce(updateIn * 1000LL); + _refreshStatusTimer.callOnce(updateIn); } return showOnline ? textcmdLink(1, result) diff --git a/Telegram/SourceFiles/info/profile/info_profile_members_controllers.cpp b/Telegram/SourceFiles/info/profile/info_profile_members_controllers.cpp index 06f0e37a42..ac6feb8ac3 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_members_controllers.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_members_controllers.cpp @@ -32,6 +32,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "boxes/confirm_box.h" #include "window/window_controller.h" #include "styles/style_info.h" +#include "data/data_peer_values.h" namespace Info { namespace Profile { @@ -141,8 +142,8 @@ void ChatMembersController::sortByOnline() { delegate()->peerListSortRows([now]( const PeerListRow &a, const PeerListRow &b) { - return App::onlineForSort(a.peer()->asUser(), now) > - App::onlineForSort(b.peer()->asUser(), now); + return Data::SortByOnlineValue(a.peer()->asUser(), now) > + Data::SortByOnlineValue(b.peer()->asUser(), now); }); refreshOnlineCount(); } @@ -214,7 +215,7 @@ void ChatMembersController::refreshOnlineCount() { while (right > left) { auto middle = (left + right) / 2; auto row = delegate()->peerListRowAt(middle); - if (App::onlineColorUse(row->peer()->asUser(), now)) { + if (Data::OnlineTextActive(row->peer()->asUser(), now)) { left = middle + 1; } else { right = middle; diff --git a/Telegram/SourceFiles/profile/profile_block_group_members.cpp b/Telegram/SourceFiles/profile/profile_block_group_members.cpp index 985b4f857f..5cd0f5d6dc 100644 --- a/Telegram/SourceFiles/profile/profile_block_group_members.cpp +++ b/Telegram/SourceFiles/profile/profile_block_group_members.cpp @@ -25,6 +25,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "boxes/confirm_box.h" #include "boxes/edit_participant_box.h" #include "ui/widgets/popup_menu.h" +#include "data/data_peer_values.h" #include "mainwidget.h" #include "apiwrap.h" #include "observer_peer.h" @@ -169,9 +170,11 @@ void GroupMembersWidget::refreshUserOnline(UserData *user) { _now = unixtime(); auto member = getMember(it.value()); - member->statusHasOnlineColor = !user->botInfo && App::onlineColorUse(user->onlineTill, _now); + member->statusHasOnlineColor = !user->botInfo && Data::OnlineTextActive(user->onlineTill, _now); member->onlineTill = user->onlineTill; - member->onlineForSort = user->isSelf() ? INT_MAX : App::onlineForSort(user, _now); + member->onlineForSort = user->isSelf() + ? std::numeric_limits::max() + : Data::SortByOnlineValue(user, _now); member->statusText = QString(); sortMembers(); @@ -276,9 +279,12 @@ void GroupMembersWidget::updateItemStatusText(Item *item) { member->statusText = lang(seesAllMessages ? lng_status_bot_reads_all : lng_status_bot_not_reads_all); member->onlineTextTill = _now + 86400; } else { - member->statusHasOnlineColor = App::onlineColorUse(member->onlineTill, _now); - member->statusText = App::onlineText(member->onlineTill, _now); - member->onlineTextTill = _now + App::onlineWillChangeIn(member->onlineTill, _now); + member->statusHasOnlineColor = Data::OnlineTextActive(member->onlineTill, _now); + member->statusText = Data::OnlineText(member->onlineTill, _now); + const auto changeInMs = Data::OnlineChangeTimeout( + member->onlineTill, + _now); + member->onlineTextTill = _now + TimeId(changeInMs / 1000); } } if (_updateOnlineAt <= _now || _updateOnlineAt > member->onlineTextTill) { @@ -365,7 +371,7 @@ void GroupMembersWidget::updateOnlineCount() { for_const (auto item, items()) { auto member = getMember(item); auto user = member->user(); - auto isOnline = !user->botInfo && App::onlineColorUse(member->onlineTill, _now); + auto isOnline = !user->botInfo && Data::OnlineTextActive(member->onlineTill, _now); if (member->statusHasOnlineColor != isOnline) { member->statusHasOnlineColor = isOnline; member->statusText = QString(); @@ -402,7 +408,8 @@ void GroupMembersWidget::fillChatMembers(ChatData *chat) { _sortByOnline = true; reserveItemsForSize(chat->participants.size()); - addUser(chat, App::self())->onlineForSort = INT_MAX; // Put me on the first place. + addUser(chat, App::self())->onlineForSort + = std::numeric_limits::max(); for (auto [user, v] : chat->participants) { if (!user->isSelf()) { addUser(chat, user); @@ -451,7 +458,8 @@ void GroupMembersWidget::fillMegagroupMembers(ChannelData *megagroup) { clearItems(); reserveItemsForSize(membersList.size()); if (megagroup->amIn()) { - addUser(megagroup, App::self())->onlineForSort = INT_MAX; + addUser(megagroup, App::self())->onlineForSort + = std::numeric_limits::max(); } } else if (membersList.size() >= itemsCount()) { if (addUsersToEnd(megagroup)) { @@ -517,9 +525,10 @@ GroupMembersWidget::Member *GroupMembersWidget::computeMember(UserData *user) { if (it == _membersByUser.cend()) { auto member = new Member(user); it = _membersByUser.insert(user, member); - member->statusHasOnlineColor = !user->botInfo && App::onlineColorUse(user->onlineTill, _now); + member->statusHasOnlineColor = !user->botInfo + && Data::OnlineTextActive(user->onlineTill, _now); member->onlineTill = user->onlineTill; - member->onlineForSort = App::onlineForSort(user, _now); + member->onlineForSort = Data::SortByOnlineValue(user, _now); } return it.value(); } @@ -538,7 +547,8 @@ void GroupMembersWidget::onUpdateOnlineDisplay() { } } auto member = getMember(item); - bool isOnline = !member->user()->botInfo && App::onlineColorUse(member->onlineTill, _now); + bool isOnline = !member->user()->botInfo + && Data::OnlineTextActive(member->onlineTill, _now); if (!isOnline) { changed = true; } diff --git a/Telegram/SourceFiles/profile/profile_channel_controllers.cpp b/Telegram/SourceFiles/profile/profile_channel_controllers.cpp index 92bcbc76d9..68e3c1dd17 100644 --- a/Telegram/SourceFiles/profile/profile_channel_controllers.cpp +++ b/Telegram/SourceFiles/profile/profile_channel_controllers.cpp @@ -32,6 +32,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "observer_peer.h" #include "dialogs/dialogs_indexed_list.h" +#include "data/data_peer_values.h" #include "ui/widgets/popup_menu.h" #include "window/window_controller.h" @@ -122,8 +123,8 @@ void ParticipantsBoxController::sortByOnline() { delegate()->peerListSortRows([now]( const PeerListRow &a, const PeerListRow &b) { - return App::onlineForSort(a.peer()->asUser(), now) > - App::onlineForSort(b.peer()->asUser(), now); + return Data::SortByOnlineValue(a.peer()->asUser(), now) > + Data::SortByOnlineValue(b.peer()->asUser(), now); }); refreshOnlineCount(); } @@ -137,7 +138,7 @@ void ParticipantsBoxController::refreshOnlineCount() { while (right > left) { auto middle = (left + right) / 2; auto row = delegate()->peerListRowAt(middle); - if (App::onlineColorUse(row->peer()->asUser(), now)) { + if (Data::OnlineTextActive(row->peer()->asUser(), now)) { left = middle + 1; } else { right = middle;