mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Update API scheme on layer 145.
This commit is contained in:
parent
e0513f7b7c
commit
0a3077b9a5
6 changed files with 122 additions and 18 deletions
|
@ -396,6 +396,7 @@ updateReadFeaturedEmojiStickers#fb4c496c = Update;
|
||||||
updateUserEmojiStatus#28373599 user_id:long emoji_status:EmojiStatus = Update;
|
updateUserEmojiStatus#28373599 user_id:long emoji_status:EmojiStatus = Update;
|
||||||
updateRecentEmojiStatuses#30f443db = Update;
|
updateRecentEmojiStatuses#30f443db = Update;
|
||||||
updateRecentReactions#6f7863f4 = Update;
|
updateRecentReactions#6f7863f4 = Update;
|
||||||
|
updateMoveStickerSetToTop#86fccf85 flags:# masks:flags.0?true emojis:flags.1?true stickerset:long = Update;
|
||||||
|
|
||||||
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
|
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
|
||||||
|
|
||||||
|
@ -1411,6 +1412,7 @@ paymentFormMethod#88f8f21b url:string title:string = PaymentFormMethod;
|
||||||
|
|
||||||
emojiStatusEmpty#2de11aae = EmojiStatus;
|
emojiStatusEmpty#2de11aae = EmojiStatus;
|
||||||
emojiStatus#929b619d document_id:long = EmojiStatus;
|
emojiStatus#929b619d document_id:long = EmojiStatus;
|
||||||
|
emojiStatusUntil#fa30a8c7 document_id:long until:int = EmojiStatus;
|
||||||
|
|
||||||
account.emojiStatusesNotModified#d08ce645 = account.EmojiStatuses;
|
account.emojiStatusesNotModified#d08ce645 = account.EmojiStatuses;
|
||||||
account.emojiStatuses#90c467d1 hash:long statuses:Vector<EmojiStatus> = account.EmojiStatuses;
|
account.emojiStatuses#90c467d1 hash:long statuses:Vector<EmojiStatus> = account.EmojiStatuses;
|
||||||
|
|
|
@ -2345,6 +2345,36 @@ void Updates::feedUpdate(const MTPUpdate &update) {
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case mtpc_updateMoveStickerSetToTop: {
|
||||||
|
const auto &d = update.c_updateMoveStickerSetToTop();
|
||||||
|
auto &stickers = session().data().stickers();
|
||||||
|
const auto isEmoji = d.is_emojis();
|
||||||
|
const auto setId = d.vstickerset().v;
|
||||||
|
auto &order = isEmoji
|
||||||
|
? stickers.emojiSetsOrderRef()
|
||||||
|
: stickers.setsOrderRef();
|
||||||
|
const auto i = ranges::find(order, setId);
|
||||||
|
if (i == order.end()) {
|
||||||
|
if (isEmoji) {
|
||||||
|
stickers.setLastEmojiUpdate(0);
|
||||||
|
session().api().updateCustomEmoji();
|
||||||
|
} else {
|
||||||
|
stickers.setLastUpdate(0);
|
||||||
|
session().api().updateStickers();
|
||||||
|
}
|
||||||
|
} else if (i != order.begin()) {
|
||||||
|
std::rotate(order.begin(), i, i + 1);
|
||||||
|
if (isEmoji) {
|
||||||
|
session().local().writeInstalledCustomEmoji();
|
||||||
|
} else {
|
||||||
|
session().local().writeInstalledStickers();
|
||||||
|
}
|
||||||
|
stickers.notifyUpdated(isEmoji
|
||||||
|
? Data::StickersType::Emoji
|
||||||
|
: Data::StickersType::Stickers);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
case mtpc_updateStickerSets: {
|
case mtpc_updateStickerSets: {
|
||||||
const auto &d = update.c_updateStickerSets();
|
const auto &d = update.c_updateStickerSets();
|
||||||
if (d.is_emojis()) {
|
if (d.is_emojis()) {
|
||||||
|
|
|
@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
#include "data/data_document.h"
|
#include "data/data_document.h"
|
||||||
#include "data/stickers/data_stickers.h"
|
#include "data/stickers/data_stickers.h"
|
||||||
|
#include "base/unixtime.h"
|
||||||
#include "base/timer_rpl.h"
|
#include "base/timer_rpl.h"
|
||||||
#include "base/call_delayed.h"
|
#include "base/call_delayed.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
@ -21,14 +22,7 @@ namespace {
|
||||||
|
|
||||||
constexpr auto kRefreshDefaultListEach = 60 * 60 * crl::time(1000);
|
constexpr auto kRefreshDefaultListEach = 60 * 60 * crl::time(1000);
|
||||||
constexpr auto kRecentRequestTimeout = 10 * crl::time(1000);
|
constexpr auto kRecentRequestTimeout = 10 * crl::time(1000);
|
||||||
|
constexpr auto kMaxTimeout = 6 * 60 * 60 * crl::time(1000);
|
||||||
[[nodiscard]] DocumentId Parse(const MTPEmojiStatus &status) {
|
|
||||||
return status.match([&](const MTPDemojiStatus &data) {
|
|
||||||
return DocumentId(data.vdocument_id().v);
|
|
||||||
}, [](const MTPDemojiStatusEmpty &) {
|
|
||||||
return DocumentId();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] std::vector<DocumentId> ListFromMTP(
|
[[nodiscard]] std::vector<DocumentId> ListFromMTP(
|
||||||
const MTPDaccount_emojiStatuses &data) {
|
const MTPDaccount_emojiStatuses &data) {
|
||||||
|
@ -36,11 +30,11 @@ constexpr auto kRecentRequestTimeout = 10 * crl::time(1000);
|
||||||
auto result = std::vector<DocumentId>();
|
auto result = std::vector<DocumentId>();
|
||||||
result.reserve(list.size());
|
result.reserve(list.size());
|
||||||
for (const auto &status : list) {
|
for (const auto &status : list) {
|
||||||
const auto id = Parse(status);
|
const auto parsed = ParseEmojiStatus(status);
|
||||||
if (!id) {
|
if (!parsed.id) {
|
||||||
LOG(("API Error: emojiStatusEmpty in account.emojiStatuses."));
|
LOG(("API Error: emojiStatusEmpty in account.emojiStatuses."));
|
||||||
} else {
|
} else {
|
||||||
result.push_back(id);
|
result.push_back(parsed.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -102,6 +96,62 @@ rpl::producer<> EmojiStatuses::defaultUpdates() const {
|
||||||
return _defaultUpdated.events();
|
return _defaultUpdated.events();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmojiStatuses::registerAutomaticClear(
|
||||||
|
not_null<UserData*> user,
|
||||||
|
TimeId until) {
|
||||||
|
if (!until) {
|
||||||
|
_clearing.remove(user);
|
||||||
|
if (_clearing.empty()) {
|
||||||
|
_clearingTimer.cancel();
|
||||||
|
}
|
||||||
|
} else if (auto &already = _clearing[user]; already != until) {
|
||||||
|
already = until;
|
||||||
|
const auto i = ranges::min_element(_clearing, {}, [](auto &&pair) {
|
||||||
|
return pair.second;
|
||||||
|
});
|
||||||
|
if (i->first == user) {
|
||||||
|
const auto now = base::unixtime::now();
|
||||||
|
if (now < until) {
|
||||||
|
const auto waitms = (until - now) * crl::time(1000);
|
||||||
|
_clearingTimer.callOnce(std::min(waitms, kMaxTimeout));
|
||||||
|
} else {
|
||||||
|
processClearing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmojiStatuses::processClearing() {
|
||||||
|
auto minWait = TimeId(0);
|
||||||
|
const auto now = base::unixtime::now();
|
||||||
|
auto clearing = base::take(_clearing);
|
||||||
|
for (auto i = begin(clearing); i != end(clearing);) {
|
||||||
|
const auto until = i->second;
|
||||||
|
if (now < until) {
|
||||||
|
const auto wait = (until - now);
|
||||||
|
if (!minWait || minWait > wait) {
|
||||||
|
minWait = wait;
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
} else {
|
||||||
|
i->first->setEmojiStatus(0, 0);
|
||||||
|
i = clearing.erase(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_clearing.empty()) {
|
||||||
|
_clearing = std::move(clearing);
|
||||||
|
} else {
|
||||||
|
for (const auto &[user, until] : clearing) {
|
||||||
|
_clearing.emplace(user, until);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minWait) {
|
||||||
|
_clearingTimer.callOnce(minWait * crl::time(1000));
|
||||||
|
} else {
|
||||||
|
_clearingTimer.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void EmojiStatuses::requestRecent() {
|
void EmojiStatuses::requestRecent() {
|
||||||
if (_recentRequestId) {
|
if (_recentRequestId) {
|
||||||
return;
|
return;
|
||||||
|
@ -172,4 +222,14 @@ bool EmojiStatuses::setting() const {
|
||||||
return _sentRequestId != 0;;
|
return _sentRequestId != 0;;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EmojiStatusData ParseEmojiStatus(const MTPEmojiStatus &status) {
|
||||||
|
return status.match([](const MTPDemojiStatus &data) {
|
||||||
|
return EmojiStatusData{ data.vdocument_id().v };
|
||||||
|
}, [](const MTPDemojiStatusUntil &data) {
|
||||||
|
return EmojiStatusData{ data.vdocument_id().v, data.vuntil().v };
|
||||||
|
}, [](const MTPDemojiStatusEmpty &) {
|
||||||
|
return EmojiStatusData();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Data
|
} // namespace Data
|
||||||
|
|
|
@ -48,6 +48,8 @@ public:
|
||||||
void set(DocumentId id);
|
void set(DocumentId id);
|
||||||
[[nodiscard]] bool setting() const;
|
[[nodiscard]] bool setting() const;
|
||||||
|
|
||||||
|
void registerAutomaticClear(not_null<UserData*> user, TimeId until);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void requestRecent();
|
void requestRecent();
|
||||||
void requestDefault();
|
void requestDefault();
|
||||||
|
@ -55,6 +57,8 @@ private:
|
||||||
void updateRecent(const MTPDaccount_emojiStatuses &data);
|
void updateRecent(const MTPDaccount_emojiStatuses &data);
|
||||||
void updateDefault(const MTPDaccount_emojiStatuses &data);
|
void updateDefault(const MTPDaccount_emojiStatuses &data);
|
||||||
|
|
||||||
|
void processClearing();
|
||||||
|
|
||||||
const not_null<Session*> _owner;
|
const not_null<Session*> _owner;
|
||||||
|
|
||||||
std::vector<DocumentId> _recent;
|
std::vector<DocumentId> _recent;
|
||||||
|
@ -72,8 +76,17 @@ private:
|
||||||
|
|
||||||
mtpRequestId _sentRequestId = 0;
|
mtpRequestId _sentRequestId = 0;
|
||||||
|
|
||||||
|
base::flat_map<not_null<UserData*>, crl::time> _clearing;
|
||||||
|
base::Timer _clearingTimer;
|
||||||
|
|
||||||
rpl::lifetime _lifetime;
|
rpl::lifetime _lifetime;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct EmojiStatusData {
|
||||||
|
DocumentId id = 0;
|
||||||
|
TimeId until = 0;
|
||||||
|
};
|
||||||
|
[[nodiscard]] EmojiStatusData ParseEmojiStatus(const MTPEmojiStatus &status);
|
||||||
|
|
||||||
} // namespace Data
|
} // namespace Data
|
||||||
|
|
|
@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
#include "data/data_changes.h"
|
#include "data/data_changes.h"
|
||||||
#include "data/data_peer_bot_command.h"
|
#include "data/data_peer_bot_command.h"
|
||||||
|
#include "data/data_emoji_statuses.h"
|
||||||
#include "ui/text/text_options.h"
|
#include "ui/text/text_options.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
|
@ -58,18 +59,16 @@ void UserData::setPhoto(const MTPUserProfilePhoto &photo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserData::setEmojiStatus(const MTPEmojiStatus &status) {
|
void UserData::setEmojiStatus(const MTPEmojiStatus &status) {
|
||||||
setEmojiStatus(status.match([&](const MTPDemojiStatus &data) {
|
const auto parsed = Data::ParseEmojiStatus(status);
|
||||||
return DocumentId(data.vdocument_id().v);
|
setEmojiStatus(parsed.id, parsed.until);
|
||||||
}, [&](const MTPDemojiStatusEmpty &) {
|
|
||||||
return DocumentId();
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserData::setEmojiStatus(DocumentId emojiStatusId) {
|
void UserData::setEmojiStatus(DocumentId emojiStatusId, TimeId until) {
|
||||||
if (_emojiStatusId != emojiStatusId) {
|
if (_emojiStatusId != emojiStatusId) {
|
||||||
_emojiStatusId = emojiStatusId;
|
_emojiStatusId = emojiStatusId;
|
||||||
session().changes().peerUpdated(this, UpdateFlag::EmojiStatus);
|
session().changes().peerUpdated(this, UpdateFlag::EmojiStatus);
|
||||||
}
|
}
|
||||||
|
owner().emojiStatuses().registerAutomaticClear(this, until);
|
||||||
}
|
}
|
||||||
|
|
||||||
DocumentId UserData::emojiStatusId() const {
|
DocumentId UserData::emojiStatusId() const {
|
||||||
|
|
|
@ -72,7 +72,7 @@ public:
|
||||||
const QString &newPhoneName,
|
const QString &newPhoneName,
|
||||||
const QString &newUsername);
|
const QString &newUsername);
|
||||||
|
|
||||||
void setEmojiStatus(DocumentId emojiStatusId);
|
void setEmojiStatus(DocumentId emojiStatusId, TimeId until = 0);
|
||||||
[[nodiscard]] DocumentId emojiStatusId() const;
|
[[nodiscard]] DocumentId emojiStatusId() const;
|
||||||
|
|
||||||
void setPhone(const QString &newPhone);
|
void setPhone(const QString &newPhone);
|
||||||
|
|
Loading…
Add table
Reference in a new issue