Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create a new pull request by comparing changes across two branches #645

Merged
merged 12 commits into from
Aug 21, 2023
Merged
4 changes: 4 additions & 0 deletions Telegram/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,8 @@ PRIVATE
api/api_user_privacy.h
api/api_views.cpp
api/api_views.h
api/api_websites.cpp
api/api_websites.h
api/api_who_reacted.cpp
api/api_who_reacted.h
boxes/filters/edit_filter_box.cpp
Expand Down Expand Up @@ -1270,6 +1272,8 @@ PRIVATE
settings/settings_scale_preview.cpp
settings/settings_scale_preview.h
settings/settings_type.h
settings/settings_websites.cpp
settings/settings_websites.h
storage/details/storage_file_utilities.cpp
storage/details/storage_file_utilities.h
storage/details/storage_settings_scheme.cpp
Expand Down
Binary file added Telegram/Resources/icons/emoji/emoji_skin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Telegram/Resources/icons/emoji/emoji_skin@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Telegram/Resources/icons/emoji/emoji_skin@3x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Telegram/Resources/icons/menu/ip_address.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Telegram/Resources/icons/menu/ip_address@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Telegram/Resources/icons/menu/ip_address@3x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Telegram/Resources/icons/menu/payment_address.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 11 additions & 5 deletions Telegram/Resources/langs/lang.strings
Original file line number Diff line number Diff line change
Expand Up @@ -646,13 +646,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_sensitive_about" = "Display sensitive media in public channels on all your Telegram devices.";
"lng_settings_security_bots" = "Bots and websites";
"lng_settings_clear_payment_info" = "Clear Payment and Shipping Info";
"lng_settings_logged_in" = "Logged In with Telegram";
"lng_settings_logged_in_about" = "Websites where you've used Telegram to log in.";
"lng_settings_logged_in_title" = "Logged In with Telegram";
"lng_settings_logged_in" = "Connected websites";
"lng_settings_logged_in_title" = "Logged in with Telegram";
"lng_settings_logged_in_description" = "You can log in on websites that support signing in with Telegram.";
"lng_settings_disconnect_all" = "Disconnect All Websites";
"lng_settings_disconnect_all" = "Disconnect all websites";
"lng_settings_disconnect_title" = "Disconnect website";
"lng_settings_disconnect_sure" = "Are you sure you want to disconnect {domain}?";
"lng_settings_disconnect_block" = "Block {name}";
"lng_settings_disconnect_all_title" = "Disconnect websites";
"lng_settings_disconnect_all_sure" = "Are you sure you want to disconnect all websites where you logged in with Telegram?";
"lng_settings_disconnect" = "Disconnect";
"lng_settings_connected_title" = "Connected websites";
"lng_settings_connected_about" = "Click to disconnect from your Telegram account.";

"lng_settings_power_menu" = "Battery and Animations";
"lng_settings_power_title" = "Power Usage";
Expand Down Expand Up @@ -962,6 +966,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_sessions_terminate" = "Terminate Session";
"lng_sessions_application" = "Application";
"lng_sessions_system" = "System version";
"lng_sessions_browser" = "Browser";
"lng_sessions_ip" = "IP address";
"lng_sessions_location" = "Location";
"lng_sessions_location_about" = "This location is based only on the IP address and may not always be accurate.";
Expand Down Expand Up @@ -1807,6 +1812,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_emoji_set_active" = "Current set";
"lng_emoji_set_download" = "Download {size}";
"lng_emoji_set_loading" = "{percent}, {progress}";
"lng_emoji_color_all" = "Choose color for all emoji";

"lng_recent_stickers" = "Frequently used";
"lng_faved_stickers_add" = "Add to Favorites";
Expand Down
65 changes: 31 additions & 34 deletions Telegram/SourceFiles/api/api_authorizations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,26 +72,9 @@ Authorizations::Entry ParseEntry(const MTPDauthorization &data) {
appName,
appVer.isEmpty() ? QString() : (' ' + appVer));
result.ip = qs(data.vip());
if (!result.hash) {
result.active = tr::lng_status_online(tr::now);
} else {
const auto now = QDateTime::currentDateTime();
const auto lastTime = base::unixtime::parse(result.activeTime);
const auto nowDate = now.date();
const auto lastDate = lastTime.date();
if (lastDate == nowDate) {
result.active = QLocale().toString(
lastTime.time(),
QLocale::ShortFormat);
} else if (lastDate.year() == nowDate.year()
&& lastDate.weekNumber() == nowDate.weekNumber()) {
result.active = langDayOfWeek(lastDate);
} else {
result.active = QLocale().toString(
lastDate,
QLocale::ShortFormat);
}
}
result.active = result.hash
? Authorizations::ActiveDateString(result.activeTime)
: tr::lng_status_online(tr::now);
result.location = country;

return result;
Expand Down Expand Up @@ -129,16 +112,15 @@ void Authorizations::reload() {
)).done([=](const MTPaccount_Authorizations &result) {
_requestId = 0;
_lastReceived = crl::now();
result.match([&](const MTPDaccount_authorizations &auths) {
_ttlDays = auths.vauthorization_ttl_days().v;
_list = (
auths.vauthorizations().v
) | ranges::views::transform([](const MTPAuthorization &d) {
return ParseEntry(d.c_authorization());
}) | ranges::to<List>;
refreshCallsDisabledHereFromCloud();
_listChanges.fire({});
});
const auto &data = result.data();
_ttlDays = data.vauthorization_ttl_days().v;
_list = ranges::views::all(
data.vauthorizations().v
) | ranges::views::transform([](const MTPAuthorization &auth) {
return ParseEntry(auth.data());
}) | ranges::to<List>;
refreshCallsDisabledHereFromCloud();
_listChanges.fire({});
}).fail([=] {
_requestId = 0;
}).send();
Expand Down Expand Up @@ -190,19 +172,21 @@ Authorizations::List Authorizations::list() const {
return _list;
}

auto Authorizations::listChanges() const
auto Authorizations::listValue() const
-> rpl::producer<Authorizations::List> {
return rpl::single(
list()
) | rpl::then(
_listChanges.events() | rpl::map([=] { return list(); }));
_listChanges.events() | rpl::map([=] { return list(); })
);
}

rpl::producer<int> Authorizations::totalChanges() const {
rpl::producer<int> Authorizations::totalValue() const {
return rpl::single(
total()
) | rpl::then(
_listChanges.events() | rpl::map([=] { return total(); }));
_listChanges.events() | rpl::map([=] { return total(); })
);
}

void Authorizations::updateTTL(int days) {
Expand Down Expand Up @@ -254,6 +238,19 @@ rpl::producer<bool> Authorizations::callsDisabledHereChanges() const {
return _callsDisabledHere.changes();
}

QString Authorizations::ActiveDateString(TimeId active) {
const auto now = QDateTime::currentDateTime();
const auto lastTime = base::unixtime::parse(active);
const auto nowDate = now.date();
const auto lastDate = lastTime.date();
return (lastDate == nowDate)
? QLocale().toString(lastTime.time(), QLocale::ShortFormat)
: (lastDate.year() == nowDate.year()
&& lastDate.weekNumber() == nowDate.weekNumber())
? langDayOfWeek(lastDate)
: QLocale().toString(lastDate, QLocale::ShortFormat);
}

int Authorizations::total() const {
return ranges::count_if(
_list,
Expand Down
6 changes: 4 additions & 2 deletions Telegram/SourceFiles/api/api_authorizations.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ class Authorizations final {
[[nodiscard]] crl::time lastReceivedTime();

[[nodiscard]] List list() const;
[[nodiscard]] rpl::producer<List> listChanges() const;
[[nodiscard]] rpl::producer<List> listValue() const;
[[nodiscard]] int total() const;
[[nodiscard]] rpl::producer<int> totalChanges() const;
[[nodiscard]] rpl::producer<int> totalValue() const;

void updateTTL(int days);
[[nodiscard]] rpl::producer<int> ttlDays() const;
Expand All @@ -53,6 +53,8 @@ class Authorizations final {
[[nodiscard]] rpl::producer<bool> callsDisabledHereValue() const;
[[nodiscard]] rpl::producer<bool> callsDisabledHereChanges() const;

[[nodiscard]] static QString ActiveDateString(TimeId active);

private:
void refreshCallsDisabledHereFromCloud();

Expand Down
138 changes: 138 additions & 0 deletions Telegram/SourceFiles/api/api_websites.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.

For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_websites.h"

#include "api/api_authorizations.h"
#include "api/api_blocked_peers.h"
#include "apiwrap.h"
#include "data/data_session.h"
#include "data/data_user.h"
#include "main/main_session.h"

namespace Api {
namespace {

constexpr auto TestApiId = 17349;
constexpr auto SnapApiId = 611335;
constexpr auto DesktopApiId = 2040;

Websites::Entry ParseEntry(
not_null<Data::Session*> owner,
const MTPDwebAuthorization &data) {
auto result = Websites::Entry{
.hash = data.vhash().v,
.bot = owner->user(data.vbot_id()),
.platform = qs(data.vplatform()),
.domain = qs(data.vdomain()),
.browser = qs(data.vbrowser()),
.ip = qs(data.vip()),
.location = qs(data.vregion()),
};
result.activeTime = data.vdate_active().v
? data.vdate_active().v
: data.vdate_created().v;
result.active = Authorizations::ActiveDateString(result.activeTime);
return result;
}

} // namespace

Websites::Websites(not_null<ApiWrap*> api)
: _session(&api->session())
, _api(&api->instance()) {
}

void Websites::reload() {
if (_requestId) {
return;
}

_requestId = _api.request(MTPaccount_GetWebAuthorizations(
)).done([=](const MTPaccount_WebAuthorizations &result) {
_requestId = 0;
_lastReceived = crl::now();
const auto owner = &_session->data();
const auto &data = result.data();
owner->processUsers(data.vusers());
_list = ranges::views::all(
data.vauthorizations().v
) | ranges::views::transform([&](const MTPwebAuthorization &auth) {
return ParseEntry(owner, auth.data());
}) | ranges::to<List>;
_listChanges.fire({});
}).fail([=] {
_requestId = 0;
}).send();
}

void Websites::cancelCurrentRequest() {
_api.request(base::take(_requestId)).cancel();
}

void Websites::requestTerminate(
Fn<void(const MTPBool &result)> &&done,
Fn<void(const MTP::Error &error)> &&fail,
std::optional<uint64> hash,
UserData *botToBlock) {
const auto send = [&](auto request) {
_api.request(
std::move(request)
).done([=, done = std::move(done)](const MTPBool &result) {
done(result);
if (hash) {
_list.erase(
ranges::remove(_list, *hash, &Entry::hash),
end(_list));
} else {
_list.clear();
}
_listChanges.fire({});
}).fail(
std::move(fail)
).send();
};
if (hash) {
send(MTPaccount_ResetWebAuthorization(MTP_long(*hash)));
if (botToBlock) {
botToBlock->session().api().blockedPeers().block(botToBlock);
}
} else {
send(MTPaccount_ResetWebAuthorizations());
}
}

Websites::List Websites::list() const {
return _list;
}

auto Websites::listValue() const
-> rpl::producer<Websites::List> {
return rpl::single(
list()
) | rpl::then(
_listChanges.events() | rpl::map([=] { return list(); })
);
}

rpl::producer<int> Websites::totalValue() const {
return rpl::single(
total()
) | rpl::then(
_listChanges.events() | rpl::map([=] { return total(); })
);
}

int Websites::total() const {
return _list.size();
}

crl::time Websites::lastReceivedTime() {
return _lastReceived;
}

} // namespace Api
62 changes: 62 additions & 0 deletions Telegram/SourceFiles/api/api_websites.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.

For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once

#include "mtproto/sender.h"

class ApiWrap;

namespace Main {
class Session;
} // namespace Main

namespace Api {

class Websites final {
public:
explicit Websites(not_null<ApiWrap*> api);

struct Entry {
uint64 hash = 0;

not_null<UserData*> bot;
TimeId activeTime = 0;
QString active, platform, domain, browser, ip, location;
};
using List = std::vector<Entry>;

void reload();
void cancelCurrentRequest();
void requestTerminate(
Fn<void(const MTPBool &result)> &&done,
Fn<void(const MTP::Error &error)> &&fail,
std::optional<uint64> hash = std::nullopt,
UserData *botToBlock = nullptr);

[[nodiscard]] crl::time lastReceivedTime();

[[nodiscard]] List list() const;
[[nodiscard]] rpl::producer<List> listValue() const;
[[nodiscard]] int total() const;
[[nodiscard]] rpl::producer<int> totalValue() const;

private:
not_null<Main::Session*> _session;

MTP::Sender _api;
mtpRequestId _requestId = 0;

List _list;
rpl::event_stream<> _listChanges;

crl::time _lastReceived = 0;
rpl::lifetime _lifetime;

};

} // namespace Api
Loading
Loading