Use InvokeAfter for all queries changing sticker sets.

This commit is contained in:
levlam 2022-02-06 00:16:16 +03:00
parent b845766bd1
commit f3bb075f62
4 changed files with 40 additions and 14 deletions

View File

@ -13,6 +13,8 @@
#include "td/utils/common.h"
#include <functional>
namespace td {
class ChainId {
@ -29,6 +31,9 @@ class ChainId {
ChainId(PollId poll_id) : id(static_cast<uint64>(poll_id.get())) {
}
ChainId(const string &str) : id(std::hash<string>()(str)) {
}
uint64 get() const {
return id;
}

View File

@ -1015,9 +1015,11 @@ class CreateNewStickerSetQuery final : public Td::ResultHandler {
flags |= telegram_api::stickers_createStickerSet::SOFTWARE_MASK;
}
send_query(G()->net_query_creator().create(telegram_api::stickers_createStickerSet(
flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, std::move(input_user), title, short_name,
nullptr, std::move(input_stickers), software)));
send_query(G()->net_query_creator().create(
telegram_api::stickers_createStickerSet(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/,
std::move(input_user), title, short_name, nullptr,
std::move(input_stickers), software),
{{short_name}}));
}
void on_result(BufferSlice packet) final {
@ -1046,8 +1048,10 @@ class AddStickerToSetQuery final : public Td::ResultHandler {
}
void send(const string &short_name, tl_object_ptr<telegram_api::inputStickerSetItem> &&input_sticker) {
send_query(G()->net_query_creator().create(telegram_api::stickers_addStickerToSet(
make_tl_object<telegram_api::inputStickerSetShortName>(short_name), std::move(input_sticker))));
send_query(G()->net_query_creator().create(
telegram_api::stickers_addStickerToSet(make_tl_object<telegram_api::inputStickerSetShortName>(short_name),
std::move(input_sticker)),
{{short_name}}));
}
void on_result(BufferSlice packet) final {
@ -1076,8 +1080,10 @@ class SetStickerSetThumbnailQuery final : public Td::ResultHandler {
}
void send(const string &short_name, tl_object_ptr<telegram_api::InputDocument> &&input_document) {
send_query(G()->net_query_creator().create(telegram_api::stickers_setStickerSetThumb(
make_tl_object<telegram_api::inputStickerSetShortName>(short_name), std::move(input_document))));
send_query(G()->net_query_creator().create(
telegram_api::stickers_setStickerSetThumb(make_tl_object<telegram_api::inputStickerSetShortName>(short_name),
std::move(input_document)),
{{short_name}}));
}
void on_result(BufferSlice packet) final {
@ -1105,9 +1111,9 @@ class SetStickerPositionQuery final : public Td::ResultHandler {
explicit SetStickerPositionQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
}
void send(tl_object_ptr<telegram_api::inputDocument> &&input_document, int32 position) {
void send(const string &short_name, tl_object_ptr<telegram_api::inputDocument> &&input_document, int32 position) {
send_query(G()->net_query_creator().create(
telegram_api::stickers_changeStickerPosition(std::move(input_document), position)));
telegram_api::stickers_changeStickerPosition(std::move(input_document), position), {{short_name}}));
}
void on_result(BufferSlice packet) final {
@ -1135,8 +1141,9 @@ class DeleteStickerFromSetQuery final : public Td::ResultHandler {
explicit DeleteStickerFromSetQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
}
void send(tl_object_ptr<telegram_api::inputDocument> &&input_document) {
send_query(G()->net_query_creator().create(telegram_api::stickers_removeStickerFromSet(std::move(input_document))));
void send(const string &short_name, tl_object_ptr<telegram_api::inputDocument> &&input_document) {
send_query(G()->net_query_creator().create(telegram_api::stickers_removeStickerFromSet(std::move(input_document)),
{{short_name}}));
}
void on_result(BufferSlice packet) final {
@ -6154,6 +6161,18 @@ void StickersManager::on_sticker_set_thumbnail_uploaded(int64 random_id, Result<
->send(pending_set_sticker_set_thumbnail->short_name, file_view.main_remote_location().as_input_document());
}
string StickersManager::get_sticker_set_short_name(FileId sticker_id) const {
string sticker_set_short_name;
const Sticker *s = get_sticker(sticker_id);
if (s != nullptr && s->set_id.is_valid()) {
const StickerSet *sticker_set = get_sticker_set(s->set_id);
if (sticker_set != nullptr) {
return sticker_set->short_name;
}
}
return string();
}
void StickersManager::set_sticker_position_in_set(const tl_object_ptr<td_api::InputFile> &sticker, int32 position,
Promise<Unit> &&promise) {
if (position < 0) {
@ -6173,7 +6192,7 @@ void StickersManager::set_sticker_position_in_set(const tl_object_ptr<td_api::In
}
td_->create_handler<SetStickerPositionQuery>(std::move(promise))
->send(file_view.main_remote_location().as_input_document(), position);
->send(get_sticker_set_short_name(file_id), file_view.main_remote_location().as_input_document(), position);
}
void StickersManager::remove_sticker_from_set(const tl_object_ptr<td_api::InputFile> &sticker,
@ -6191,7 +6210,7 @@ void StickersManager::remove_sticker_from_set(const tl_object_ptr<td_api::InputF
}
td_->create_handler<DeleteStickerFromSetQuery>(std::move(promise))
->send(file_view.main_remote_location().as_input_document());
->send(get_sticker_set_short_name(file_id), file_view.main_remote_location().as_input_document());
}
vector<FileId> StickersManager::get_attached_sticker_file_ids(const vector<int32> &int_file_ids) {

View File

@ -504,6 +504,8 @@ class StickersManager final : public Actor {
StickerSetId on_get_input_sticker_set(FileId sticker_file_id, tl_object_ptr<telegram_api::InputStickerSet> &&set_ptr,
MultiPromiseActor *load_data_multipromise_ptr = nullptr);
string get_sticker_set_short_name(FileId sticker_id) const;
void on_resolve_sticker_set_short_name(FileId sticker_file_id, const string &short_name);
int apply_installed_sticker_sets_order(bool is_masks, const vector<StickerSetId> &sticker_set_ids);

View File

@ -24,7 +24,7 @@ int64 NetQuery::get_my_id() {
}
void NetQuery::set_chain_ids(vector<ChainId> &&chain_ids) {
chain_ids_ = transform(chain_ids, [](ChainId chain_id) { return chain_id.get(); });
chain_ids_ = transform(chain_ids, [](ChainId chain_id) { return chain_id.get() == 0 ? 1 : chain_id.get(); });
td::unique(chain_ids_);
}