2
0
mirror of https://github.com/telegramdesktop/tdesktop synced 2025-09-03 07:56:03 +00:00

Suggest premium on transfer speed limiting.

This commit is contained in:
John Preston
2024-03-28 13:47:06 +04:00
parent 0dd1a4973a
commit f65bc7c0bd
13 changed files with 262 additions and 17 deletions

View File

@@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "media/player/media_player_instance.h"
#include "media/view/media_view_open_common.h"
#include "data/data_document_resolver.h"
#include "data/data_download_manager.h"
#include "data/data_session.h"
#include "data/data_file_origin.h"
#include "data/data_folder.h"
@@ -64,6 +65,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/boxes/confirm_box.h"
#include "mainwidget.h"
#include "main/main_account.h"
#include "main/main_app_config.h"
#include "main/main_domain.h"
#include "main/main_session.h"
#include "main/main_session_settings.h"
@@ -74,6 +76,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "api/api_blocked_peers.h"
#include "support/support_helper.h"
#include "storage/file_upload.h"
#include "storage/download_manager_mtproto.h"
#include "window/themes/window_theme.h"
#include "window/window_peer_menu.h"
#include "window/window_session_controller_link_info.h"
@@ -90,20 +93,6 @@ namespace {
constexpr auto kCustomThemesInMemory = 5;
constexpr auto kMaxChatEntryHistorySize = 50;
[[nodiscard]] Ui::ChatThemeBubblesData PrepareBubblesData(
const Data::CloudTheme &theme,
Data::CloudThemeType type) {
const auto i = theme.settings.find(type);
return {
.colors = (i != end(theme.settings)
? i->second.outgoingMessagesColors
: std::vector<QColor>()),
.accent = (i != end(theme.settings)
? i->second.outgoingAccentColor
: std::optional<QColor>()),
};
}
class MainWindowShow final : public ChatHelpers::Show {
public:
explicit MainWindowShow(not_null<SessionController*> controller);
@@ -144,6 +133,29 @@ private:
};
[[nodiscard]] Ui::ChatThemeBubblesData PrepareBubblesData(
const Data::CloudTheme &theme,
Data::CloudThemeType type) {
const auto i = theme.settings.find(type);
return {
.colors = (i != end(theme.settings)
? i->second.outgoingMessagesColors
: std::vector<QColor>()),
.accent = (i != end(theme.settings)
? i->second.outgoingAccentColor
: std::optional<QColor>()),
};
}
[[nodiscard]] bool DownloadingDocument(not_null<DocumentData*> document) {
for (const auto id : Core::App().downloadManager().loadingList()) {
if (id->object.document == document.get()) {
return true;
}
}
return false;
}
MainWindowShow::MainWindowShow(not_null<SessionController*> controller)
: _window(base::make_weak(controller)) {
}
@@ -1192,6 +1204,16 @@ SessionController::SessionController(
}));
}, _lifetime);
session->downloader().nonPremiumDelays(
) | rpl::start_with_next([=](DocumentId id) {
checkNonPremiumLimitToastDownload(id);
}, _lifetime);
session->uploader().nonPremiumDelays(
) | rpl::start_with_next([=](FullMsgId id) {
checkNonPremiumLimitToastUpload(id);
}, _lifetime);
session->addWindow(this);
crl::on_main(this, [=] {
@@ -1200,6 +1222,50 @@ SessionController::SessionController(
});
}
bool SessionController::skipNonPremiumLimitToast(bool download) const {
if (session().premium()) {
return true;
}
const auto now = base::unixtime::now();
const auto last = download
? session().settings().lastNonPremiumLimitDownload()
: session().settings().lastNonPremiumLimitUpload();
const auto delay = session().account().appConfig().get<int>(
u"upload_premium_speedup_notify_period"_q,
3600);
return (last && now < last + delay && now > last - delay);
}
void SessionController::checkNonPremiumLimitToastDownload(DocumentId id) {
if (skipNonPremiumLimitToast(true)) {
return;
}
const auto document = session().data().document(id);
const auto visible = session().data().queryDocumentVisibility(document)
|| DownloadingDocument(document);
if (!visible) {
return;
}
content()->showNonPremiumLimitToast(true);
const auto now = base::unixtime::now();
session().settings().setLastNonPremiumLimitDownload(now);
session().saveSettingsDelayed();
}
void SessionController::checkNonPremiumLimitToastUpload(FullMsgId id) {
if (skipNonPremiumLimitToast(false)) {
return;
} else if (const auto item = session().data().message(id)) {
if (!session().data().queryItemVisibility(item)) {
return;
}
content()->showNonPremiumLimitToast(false);
const auto now = base::unixtime::now();
session().settings().setLastNonPremiumLimitUpload(now);
session().saveSettingsDelayed();
}
}
void SessionController::suggestArchiveAndMute() {
const auto weak = base::make_weak(this);
_window->show(Box([=](not_null<Ui::GenericBox*> box) {