Edit paid messages exceptions.

This commit is contained in:
John Preston
2025-02-26 17:24:07 +04:00
parent 1684465e04
commit c6fd8bcb99
11 changed files with 184 additions and 48 deletions

View File

@@ -3148,7 +3148,7 @@ void Account::readSelf(
}
void Account::writeTrustedPeers() {
if (_trustedPeers.empty()) {
if (_trustedPeers.empty() && _trustedPayPerMessage.empty()) {
if (_trustedPeersKey) {
ClearKey(_trustedPeersKey, _basePath);
_trustedPeersKey = 0;
@@ -3160,7 +3160,10 @@ void Account::writeTrustedPeers() {
_trustedPeersKey = GenerateKey(_basePath);
writeMapQueued();
}
quint32 size = sizeof(qint32) + _trustedPeers.size() * sizeof(quint64);
quint32 size = sizeof(qint32)
+ _trustedPeers.size() * sizeof(quint64)
+ sizeof(qint32)
+ _trustedPayPerMessage.size() * (sizeof(quint64) + sizeof(qint32));
EncryptedDescriptor data(size);
data.stream << qint32(_trustedPeers.size());
for (const auto &[peerId, mask] : _trustedPeers) {
@@ -3170,6 +3173,10 @@ void Account::writeTrustedPeers() {
value |= (quint64(mask) << 56);
data.stream << value;
}
data.stream << qint32(_trustedPayPerMessage.size());
for (const auto &[peerId, stars] : _trustedPayPerMessage) {
data.stream << SerializePeerId(peerId) << qint32(stars);
}
FileWriteDescriptor file(_trustedPeersKey, _basePath);
file.writeEncrypted(data, _localKey);
@@ -3192,9 +3199,9 @@ void Account::readTrustedPeers() {
return;
}
qint32 size = 0;
trusted.stream >> size;
for (int i = 0; i < size; ++i) {
qint32 trustedCount = 0;
trusted.stream >> trustedCount;
for (int i = 0; i < trustedCount; ++i) {
auto value = quint64();
trusted.stream >> value;
const auto mask = base::flags<PeerTrustFlag>::from_raw(
@@ -3203,6 +3210,28 @@ void Account::readTrustedPeers() {
const auto peerId = DeserializePeerId(peerIdSerialized);
_trustedPeers.emplace(peerId, mask);
}
if (trusted.stream.atEnd()) {
return;
}
qint32 payPerMessageCount = 0;
trusted.stream >> payPerMessageCount;
const auto owner = _owner->sessionExists()
? &_owner->session().data()
: nullptr;
for (int i = 0; i < payPerMessageCount; ++i) {
auto value = quint64();
auto stars = qint32();
trusted.stream >> value >> stars;
const auto peerId = DeserializePeerId(value);
const auto peer = owner ? owner->peerLoaded(peerId) : nullptr;
const auto now = peer ? peer->starsPerMessage() : stars;
if (now > 0 && now <= stars) {
_trustedPayPerMessage.emplace(peerId, stars);
}
}
if (_trustedPayPerMessage.size() != payPerMessageCount) {
writeTrustedPeers();
}
}
void Account::markPeerTrustedOpenGame(PeerId peerId) {
@@ -3269,32 +3298,45 @@ bool Account::isPeerTrustedOpenWebView(PeerId peerId) {
&& ((i->second & PeerTrustFlag::OpenWebView) != 0);
}
void Account::markPeerTrustedPayForMessage(PeerId peerId) {
if (isPeerTrustedPayForMessage(peerId)) {
void Account::markPeerTrustedPayForMessage(
PeerId peerId,
int starsPerMessage) {
if (isPeerTrustedPayForMessage(peerId, starsPerMessage)) {
return;
}
const auto i = _trustedPeers.find(peerId);
if (i == end(_trustedPeers)) {
_trustedPeers.emplace(
peerId,
PeerTrustFlag::NoOpenGame | PeerTrustFlag::PayForMessage);
const auto i = _trustedPayPerMessage.find(peerId);
if (i == end(_trustedPayPerMessage)) {
_trustedPayPerMessage.emplace(peerId, starsPerMessage);
} else {
i->second |= PeerTrustFlag::PayForMessage;
i->second = starsPerMessage;
}
writeTrustedPeers();
}
bool Account::isPeerTrustedPayForMessage(PeerId peerId) {
bool Account::isPeerTrustedPayForMessage(
PeerId peerId,
int starsPerMessage) {
if (starsPerMessage <= 0) {
return true;
}
readTrustedPeers();
const auto i = _trustedPeers.find(peerId);
return (i != end(_trustedPeers))
&& ((i->second & PeerTrustFlag::PayForMessage) != 0);
const auto i = _trustedPayPerMessage.find(peerId);
return (i != end(_trustedPayPerMessage))
&& (i->second >= starsPerMessage);
}
void Account::clearPeerTrusted(PeerId peerId) {
const auto i = _trustedPeers.find(peerId);
if (i != end(_trustedPeers)) {
_trustedPeers.erase(i);
bool Account::peerTrustedPayForMessageRead() const {
return _trustedPeersRead;
}
bool Account::hasPeerTrustedPayForMessageEntry(PeerId peerId) const {
return _trustedPayPerMessage.contains(peerId);
}
void Account::clearPeerTrustedPayForMessage(PeerId peerId) {
const auto i = _trustedPayPerMessage.find(peerId);
if (i != end(_trustedPayPerMessage)) {
_trustedPayPerMessage.erase(i);
writeTrustedPeers();
}
}

View File

@@ -173,9 +173,13 @@ public:
[[nodiscard]] bool isPeerTrustedPayment(PeerId peerId);
void markPeerTrustedOpenWebView(PeerId peerId);
[[nodiscard]] bool isPeerTrustedOpenWebView(PeerId peerId);
void markPeerTrustedPayForMessage(PeerId peerId);
[[nodiscard]] bool isPeerTrustedPayForMessage(PeerId peerId);
void clearPeerTrusted(PeerId peerId);
void markPeerTrustedPayForMessage(PeerId peerId, int starsPerMessage);
[[nodiscard]] bool isPeerTrustedPayForMessage(
PeerId peerId,
int starsPerMessage);
[[nodiscard]] bool peerTrustedPayForMessageRead() const;
[[nodiscard]] bool hasPeerTrustedPayForMessageEntry(PeerId peerId) const;
void clearPeerTrustedPayForMessage(PeerId peerId);
void enforceModernStorageIdBots();
[[nodiscard]] Webview::StorageId resolveStorageIdBots();
@@ -210,7 +214,6 @@ private:
NoOpenGame = (1 << 0),
Payment = (1 << 1),
OpenWebView = (1 << 2),
PayForMessage = (1 << 3),
};
friend inline constexpr bool is_flag_type(PeerTrustFlag) { return true; };
@@ -329,6 +332,7 @@ private:
qint32 _cacheBigFileTotalTimeLimit = 0;
base::flat_map<PeerId, base::flags<PeerTrustFlag>> _trustedPeers;
base::flat_map<PeerId, int> _trustedPayPerMessage;
bool _trustedPeersRead = false;
bool _readingUserSettings = false;
bool _recentHashtagsAndBotsWereRead = false;