Edit paid messages exceptions.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user