mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Added ability to delete and reorder mask sets.
Moved ApiWrap::stickerSetDisenabled and ApiWrap::stickersSaveOrder to ApiWrap::saveStickerSets as lambdas.
This commit is contained in:
parent
70f92a7817
commit
2bd3a8aaff
3 changed files with 130 additions and 86 deletions
|
@ -1872,14 +1872,63 @@ void ApiWrap::requestStickerSets() {
|
||||||
|
|
||||||
void ApiWrap::saveStickerSets(
|
void ApiWrap::saveStickerSets(
|
||||||
const Data::StickersSetsOrder &localOrder,
|
const Data::StickersSetsOrder &localOrder,
|
||||||
const Data::StickersSetsOrder &localRemoved) {
|
const Data::StickersSetsOrder &localRemoved,
|
||||||
for (auto requestId : base::take(_stickerSetDisenableRequests)) {
|
bool setsMasks) {
|
||||||
|
auto &setDisenableRequests = setsMasks
|
||||||
|
? _maskSetDisenableRequests
|
||||||
|
: _stickerSetDisenableRequests;
|
||||||
|
const auto reorderRequestId = [=]() -> mtpRequestId & {
|
||||||
|
return setsMasks
|
||||||
|
? _masksReorderRequestId
|
||||||
|
: _stickersReorderRequestId;
|
||||||
|
};
|
||||||
|
for (auto requestId : base::take(setDisenableRequests)) {
|
||||||
request(requestId).cancel();
|
request(requestId).cancel();
|
||||||
}
|
}
|
||||||
request(base::take(_stickersReorderRequestId)).cancel();
|
request(base::take(reorderRequestId())).cancel();
|
||||||
request(base::take(_stickersClearRecentRequestId)).cancel();
|
request(base::take(_stickersClearRecentRequestId)).cancel();
|
||||||
request(base::take(_stickersClearRecentAttachedRequestId)).cancel();
|
request(base::take(_stickersClearRecentAttachedRequestId)).cancel();
|
||||||
|
|
||||||
|
const auto stickersSaveOrder = [=] {
|
||||||
|
if (localOrder.size() < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QVector<MTPlong> mtpOrder;
|
||||||
|
mtpOrder.reserve(localOrder.size());
|
||||||
|
for (const auto setId : std::as_const(localOrder)) {
|
||||||
|
mtpOrder.push_back(MTP_long(setId));
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto flags = setsMasks
|
||||||
|
? MTPmessages_ReorderStickerSets::Flag::f_masks
|
||||||
|
: MTPmessages_ReorderStickerSets::Flags(0);
|
||||||
|
reorderRequestId() = request(MTPmessages_ReorderStickerSets(
|
||||||
|
MTP_flags(flags),
|
||||||
|
MTP_vector<MTPlong>(mtpOrder)
|
||||||
|
)).done([=](const MTPBool &result) {
|
||||||
|
reorderRequestId() = 0;
|
||||||
|
}).fail([=](const MTP::Error &error) {
|
||||||
|
reorderRequestId() = 0;
|
||||||
|
if (setsMasks) {
|
||||||
|
_session->data().stickers().setLastMasksUpdate(0);
|
||||||
|
updateMasks();
|
||||||
|
} else {
|
||||||
|
_session->data().stickers().setLastUpdate(0);
|
||||||
|
updateStickers();
|
||||||
|
}
|
||||||
|
}).send();
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto stickerSetDisenabled = [=](mtpRequestId requestId) {
|
||||||
|
auto &setDisenableRequests = setsMasks
|
||||||
|
? _maskSetDisenableRequests
|
||||||
|
: _stickerSetDisenableRequests;
|
||||||
|
setDisenableRequests.remove(requestId);
|
||||||
|
if (setDisenableRequests.empty()) {
|
||||||
|
stickersSaveOrder();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
auto writeInstalled = true,
|
auto writeInstalled = true,
|
||||||
writeRecent = false,
|
writeRecent = false,
|
||||||
writeCloudRecent = false,
|
writeCloudRecent = false,
|
||||||
|
@ -1889,7 +1938,16 @@ void ApiWrap::saveStickerSets(
|
||||||
auto &recent = _session->data().stickers().getRecentPack();
|
auto &recent = _session->data().stickers().getRecentPack();
|
||||||
auto &sets = _session->data().stickers().setsRef();
|
auto &sets = _session->data().stickers().setsRef();
|
||||||
|
|
||||||
_stickersOrder = localOrder;
|
auto &order = setsMasks
|
||||||
|
? _session->data().stickers().maskSetsOrder()
|
||||||
|
: _session->data().stickers().setsOrder();
|
||||||
|
auto &orderRef = setsMasks
|
||||||
|
? _session->data().stickers().maskSetsOrderRef()
|
||||||
|
: _session->data().stickers().setsOrderRef();
|
||||||
|
|
||||||
|
using Flag = MTPDstickerSet::Flag;
|
||||||
|
using ClientFlag = MTPDstickerSet_ClientFlag;
|
||||||
|
|
||||||
for (const auto removedSetId : localRemoved) {
|
for (const auto removedSetId : localRemoved) {
|
||||||
if ((removedSetId == Data::Stickers::CloudRecentSetId)
|
if ((removedSetId == Data::Stickers::CloudRecentSetId)
|
||||||
|| (removedSetId == Data::Stickers::CloudRecentAttachedSetId)) {
|
|| (removedSetId == Data::Stickers::CloudRecentAttachedSetId)) {
|
||||||
|
@ -1941,27 +1999,34 @@ void ApiWrap::saveStickerSets(
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!(set->flags & MTPDstickerSet::Flag::f_archived)) {
|
const auto archived = !!(set->flags & Flag::f_archived);
|
||||||
|
if (!archived) {
|
||||||
|
const auto featured = !!(set->flags & ClientFlag::f_featured);
|
||||||
|
const auto special = !!(set->flags & ClientFlag::f_special);
|
||||||
const auto setId = set->mtpInput();
|
const auto setId = set->mtpInput();
|
||||||
|
|
||||||
auto requestId = request(MTPmessages_UninstallStickerSet(setId)).done([this](const MTPBool &result, mtpRequestId requestId) {
|
auto requestId = request(MTPmessages_UninstallStickerSet(
|
||||||
|
setId
|
||||||
|
)).done([=](const MTPBool &result, mtpRequestId requestId) {
|
||||||
stickerSetDisenabled(requestId);
|
stickerSetDisenabled(requestId);
|
||||||
}).fail([this](const MTP::Error &error, mtpRequestId requestId) {
|
}).fail([=](const MTP::Error &error, mtpRequestId requestId) {
|
||||||
stickerSetDisenabled(requestId);
|
stickerSetDisenabled(requestId);
|
||||||
}).afterDelay(kSmallDelayMs).send();
|
}).afterDelay(kSmallDelayMs).send();
|
||||||
|
|
||||||
_stickerSetDisenableRequests.insert(requestId);
|
setDisenableRequests.insert(requestId);
|
||||||
|
|
||||||
int removeIndex = _session->data().stickers().setsOrder().indexOf(set->id);
|
const auto removeIndex = order.indexOf(set->id);
|
||||||
if (removeIndex >= 0) _session->data().stickers().setsOrderRef().removeAt(removeIndex);
|
if (removeIndex >= 0) {
|
||||||
if (!(set->flags & MTPDstickerSet_ClientFlag::f_featured)
|
orderRef.removeAt(removeIndex);
|
||||||
&& !(set->flags & MTPDstickerSet_ClientFlag::f_special)) {
|
}
|
||||||
|
if (!featured && !special) {
|
||||||
sets.erase(it);
|
sets.erase(it);
|
||||||
} else {
|
} else {
|
||||||
if (set->flags & MTPDstickerSet::Flag::f_archived) {
|
if (archived) {
|
||||||
writeArchived = true;
|
writeArchived = true;
|
||||||
}
|
}
|
||||||
set->flags &= ~(MTPDstickerSet::Flag::f_installed_date | MTPDstickerSet::Flag::f_archived);
|
set->flags &= ~(Flag::f_installed_date
|
||||||
|
| Flag::f_archived);
|
||||||
set->installDate = TimeId(0);
|
set->installDate = TimeId(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1970,51 +2035,55 @@ void ApiWrap::saveStickerSets(
|
||||||
|
|
||||||
// Clear all installed flags, set only for sets from order.
|
// Clear all installed flags, set only for sets from order.
|
||||||
for (auto &[id, set] : sets) {
|
for (auto &[id, set] : sets) {
|
||||||
if (!(set->flags & MTPDstickerSet::Flag::f_archived)) {
|
const auto archived = !!(set->flags & Flag::f_archived);
|
||||||
set->flags &= ~MTPDstickerSet::Flag::f_installed_date;
|
const auto masks = !!(set->flags & MTPDstickerSet::Flag::f_masks);
|
||||||
|
if (!archived && (setsMasks == masks)) {
|
||||||
|
set->flags &= ~Flag::f_installed_date;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &order = _session->data().stickers().setsOrderRef();
|
orderRef.clear();
|
||||||
order.clear();
|
for (const auto setId : std::as_const(localOrder)) {
|
||||||
for (const auto setId : std::as_const(_stickersOrder)) {
|
|
||||||
auto it = sets.find(setId);
|
auto it = sets.find(setId);
|
||||||
if (it != sets.cend()) {
|
if (it == sets.cend()) {
|
||||||
const auto set = it->second.get();
|
continue;
|
||||||
if ((set->flags & MTPDstickerSet::Flag::f_archived) && !localRemoved.contains(set->id)) {
|
}
|
||||||
const auto mtpSetId = set->mtpInput();
|
const auto set = it->second.get();
|
||||||
|
const auto archived = !!(set->flags & Flag::f_archived);
|
||||||
|
if (archived && !localRemoved.contains(set->id)) {
|
||||||
|
const auto mtpSetId = set->mtpInput();
|
||||||
|
|
||||||
const auto requestId = request(MTPmessages_InstallStickerSet(
|
const auto requestId = request(MTPmessages_InstallStickerSet(
|
||||||
mtpSetId,
|
mtpSetId,
|
||||||
MTP_boolFalse()
|
MTP_boolFalse()
|
||||||
)).done([=](
|
)).done([=](
|
||||||
const MTPmessages_StickerSetInstallResult &result,
|
const MTPmessages_StickerSetInstallResult &result,
|
||||||
mtpRequestId requestId) {
|
mtpRequestId requestId) {
|
||||||
stickerSetDisenabled(requestId);
|
stickerSetDisenabled(requestId);
|
||||||
}).fail([=](
|
}).fail([=](
|
||||||
const MTP::Error &error,
|
const MTP::Error &error,
|
||||||
mtpRequestId requestId) {
|
mtpRequestId requestId) {
|
||||||
stickerSetDisenabled(requestId);
|
stickerSetDisenabled(requestId);
|
||||||
}).afterDelay(kSmallDelayMs).send();
|
}).afterDelay(kSmallDelayMs).send();
|
||||||
|
|
||||||
_stickerSetDisenableRequests.insert(requestId);
|
setDisenableRequests.insert(requestId);
|
||||||
|
|
||||||
set->flags &= ~MTPDstickerSet::Flag::f_archived;
|
set->flags &= ~Flag::f_archived;
|
||||||
writeArchived = true;
|
writeArchived = true;
|
||||||
}
|
}
|
||||||
order.push_back(setId);
|
orderRef.push_back(setId);
|
||||||
set->flags |= MTPDstickerSet::Flag::f_installed_date;
|
set->flags |= Flag::f_installed_date;
|
||||||
if (!set->installDate) {
|
if (!set->installDate) {
|
||||||
set->installDate = base::unixtime::now();
|
set->installDate = base::unixtime::now();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it = sets.begin(); it != sets.cend();) {
|
for (auto it = sets.begin(); it != sets.cend();) {
|
||||||
const auto set = it->second.get();
|
const auto set = it->second.get();
|
||||||
if ((set->flags & MTPDstickerSet_ClientFlag::f_featured)
|
if ((set->flags & ClientFlag::f_featured)
|
||||||
|| (set->flags & MTPDstickerSet::Flag::f_installed_date)
|
|| (set->flags & Flag::f_installed_date)
|
||||||
|| (set->flags & MTPDstickerSet::Flag::f_archived)
|
|| (set->flags & Flag::f_archived)
|
||||||
|| (set->flags & MTPDstickerSet_ClientFlag::f_special)) {
|
|| (set->flags & ClientFlag::f_special)) {
|
||||||
++it;
|
++it;
|
||||||
} else {
|
} else {
|
||||||
it = sets.erase(it);
|
it = sets.erase(it);
|
||||||
|
@ -2022,9 +2091,12 @@ void ApiWrap::saveStickerSets(
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &storage = local();
|
auto &storage = local();
|
||||||
if (writeInstalled) {
|
if (writeInstalled && !setsMasks) {
|
||||||
storage.writeInstalledStickers();
|
storage.writeInstalledStickers();
|
||||||
}
|
}
|
||||||
|
if (writeInstalled && setsMasks) {
|
||||||
|
storage.writeInstalledMasks();
|
||||||
|
}
|
||||||
if (writeRecent) {
|
if (writeRecent) {
|
||||||
session().saveSettings();
|
session().saveSettings();
|
||||||
}
|
}
|
||||||
|
@ -2042,20 +2114,13 @@ void ApiWrap::saveStickerSets(
|
||||||
}
|
}
|
||||||
_session->data().stickers().notifyUpdated();
|
_session->data().stickers().notifyUpdated();
|
||||||
|
|
||||||
if (_stickerSetDisenableRequests.empty()) {
|
if (setDisenableRequests.empty()) {
|
||||||
stickersSaveOrder();
|
stickersSaveOrder();
|
||||||
} else {
|
} else {
|
||||||
requestSendDelayed();
|
requestSendDelayed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::stickerSetDisenabled(mtpRequestId requestId) {
|
|
||||||
_stickerSetDisenableRequests.remove(requestId);
|
|
||||||
if (_stickerSetDisenableRequests.empty()) {
|
|
||||||
stickersSaveOrder();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void ApiWrap::joinChannel(not_null<ChannelData*> channel) {
|
void ApiWrap::joinChannel(not_null<ChannelData*> channel) {
|
||||||
if (channel->amIn()) {
|
if (channel->amIn()) {
|
||||||
session().changes().peerUpdated(
|
session().changes().peerUpdated(
|
||||||
|
@ -2939,28 +3004,6 @@ void ApiWrap::gotWebPages(ChannelData *channel, const MTPmessages_Messages &resu
|
||||||
_session->data().sendWebPageGamePollNotifications();
|
_session->data().sendWebPageGamePollNotifications();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::stickersSaveOrder() {
|
|
||||||
if (_stickersOrder.size() < 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QVector<MTPlong> mtpOrder;
|
|
||||||
mtpOrder.reserve(_stickersOrder.size());
|
|
||||||
for (const auto setId : std::as_const(_stickersOrder)) {
|
|
||||||
mtpOrder.push_back(MTP_long(setId));
|
|
||||||
}
|
|
||||||
|
|
||||||
_stickersReorderRequestId = request(MTPmessages_ReorderStickerSets(
|
|
||||||
MTP_flags(0),
|
|
||||||
MTP_vector<MTPlong>(mtpOrder)
|
|
||||||
)).done([=](const MTPBool &result) {
|
|
||||||
_stickersReorderRequestId = 0;
|
|
||||||
}).fail([=](const MTP::Error &error) {
|
|
||||||
_stickersReorderRequestId = 0;
|
|
||||||
_session->data().stickers().setLastUpdate(0);
|
|
||||||
updateStickers();
|
|
||||||
}).send();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ApiWrap::updateStickers() {
|
void ApiWrap::updateStickers() {
|
||||||
const auto now = crl::now();
|
const auto now = crl::now();
|
||||||
requestStickers(now);
|
requestStickers(now);
|
||||||
|
|
|
@ -280,7 +280,8 @@ public:
|
||||||
void requestStickerSets();
|
void requestStickerSets();
|
||||||
void saveStickerSets(
|
void saveStickerSets(
|
||||||
const Data::StickersSetsOrder &localOrder,
|
const Data::StickersSetsOrder &localOrder,
|
||||||
const Data::StickersSetsOrder &localRemoved);
|
const Data::StickersSetsOrder &localRemoved,
|
||||||
|
bool setsMasks);
|
||||||
void updateStickers();
|
void updateStickers();
|
||||||
void updateMasks();
|
void updateMasks();
|
||||||
void requestRecentStickersForce(bool attached = false);
|
void requestRecentStickersForce(bool attached = false);
|
||||||
|
@ -545,9 +546,6 @@ private:
|
||||||
mtpRequestId req);
|
mtpRequestId req);
|
||||||
void gotStickerSet(uint64 setId, const MTPmessages_StickerSet &result);
|
void gotStickerSet(uint64 setId, const MTPmessages_StickerSet &result);
|
||||||
|
|
||||||
void stickerSetDisenabled(mtpRequestId requestId);
|
|
||||||
void stickersSaveOrder();
|
|
||||||
|
|
||||||
void requestStickers(TimeId now, bool masks = false);
|
void requestStickers(TimeId now, bool masks = false);
|
||||||
void requestRecentStickers(TimeId now, bool attached = false);
|
void requestRecentStickers(TimeId now, bool attached = false);
|
||||||
void requestRecentStickersWithHash(int32 hash, bool attached = false);
|
void requestRecentStickersWithHash(int32 hash, bool attached = false);
|
||||||
|
@ -688,7 +686,8 @@ private:
|
||||||
base::Timer _draftsSaveTimer;
|
base::Timer _draftsSaveTimer;
|
||||||
|
|
||||||
base::flat_set<mtpRequestId> _stickerSetDisenableRequests;
|
base::flat_set<mtpRequestId> _stickerSetDisenableRequests;
|
||||||
Data::StickersSetsOrder _stickersOrder;
|
base::flat_set<mtpRequestId> _maskSetDisenableRequests;
|
||||||
|
mtpRequestId _masksReorderRequestId = 0;
|
||||||
mtpRequestId _stickersReorderRequestId = 0;
|
mtpRequestId _stickersReorderRequestId = 0;
|
||||||
mtpRequestId _stickersClearRecentRequestId = 0;
|
mtpRequestId _stickersClearRecentRequestId = 0;
|
||||||
mtpRequestId _stickersClearRecentAttachedRequestId = 0;
|
mtpRequestId _stickersClearRecentAttachedRequestId = 0;
|
||||||
|
|
|
@ -944,12 +944,14 @@ void StickersBox::saveChanges() {
|
||||||
if (const auto widget = _installed.widget()) {
|
if (const auto widget = _installed.widget()) {
|
||||||
session().api().saveStickerSets(
|
session().api().saveStickerSets(
|
||||||
widget->getOrder(),
|
widget->getOrder(),
|
||||||
widget->getRemovedSets());
|
widget->getRemovedSets(),
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
if (const auto widget = _masks.widget()) {
|
if (const auto widget = _masks.widget()) {
|
||||||
session().api().saveStickerSets(
|
session().api().saveStickerSets(
|
||||||
widget->getOrder(),
|
widget->getOrder(),
|
||||||
widget->getRemovedSets());
|
widget->getRemovedSets(),
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue