summary refs log tree commit diff
path: root/src/Cache.cpp
diff options
context:
space:
mode:
authorDeepBlueV7.X <nicolas.werner@hotmail.de>2021-07-19 13:31:48 +0000
committerGitHub <noreply@github.com>2021-07-19 13:31:48 +0000
commit9a950c7f0e9a7daac926c78cf98a8b834c02d521 (patch)
treeaba0f1db0658228c81a482b93cf76e976d3ea31f /src/Cache.cpp
parentMerge pull request #646 from Nheko-Reborn/historical-key-sharing (diff)
parentMake scrolling sticker picker bearable (diff)
downloadnheko-9a950c7f0e9a7daac926c78cf98a8b834c02d521.tar.xz
Merge pull request #648 from Nheko-Reborn/stickers2
Stickers!
Diffstat (limited to 'src/Cache.cpp')
-rw-r--r--src/Cache.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/Cache.cpp b/src/Cache.cpp

index 7b6a6135..0bcf9fbf 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp
@@ -3382,6 +3382,75 @@ Cache::getChildRoomIds(const std::string &room_id) return roomids; } +std::vector<ImagePackInfo> +Cache::getImagePacks(const std::string &room_id, bool stickers) +{ + auto txn = ro_txn(env_); + std::vector<ImagePackInfo> infos; + + auto addPack = [&infos, stickers](const mtx::events::msc2545::ImagePack &pack) { + if (!pack.pack || (stickers ? pack.pack->is_sticker() : pack.pack->is_emoji())) { + ImagePackInfo info; + if (pack.pack) + info.packname = pack.pack->display_name; + + for (const auto &img : pack.images) { + if (img.second.overrides_usage() && + (stickers ? !img.second.is_sticker() : !img.second.is_emoji())) + continue; + + info.images.insert(img); + } + + if (!info.images.empty()) + infos.push_back(std::move(info)); + } + }; + + // packs from account data + if (auto accountpack = + getAccountData(txn, mtx::events::EventType::ImagePackInAccountData, "")) { + auto tmp = + std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePack>>( + &*accountpack); + if (tmp) + addPack(tmp->content); + } + + // packs from rooms, that were enabled globally + if (auto roomPacks = getAccountData(txn, mtx::events::EventType::ImagePackRooms, "")) { + auto tmp = + std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePackRooms>>( + &*roomPacks); + if (tmp) { + for (const auto &[room_id2, state_to_d] : tmp->content.rooms) { + // don't add stickers from this room twice + if (room_id2 == room_id) + continue; + + for (const auto &[state_id, d] : state_to_d) { + (void)d; + if (auto pack = + getStateEvent<mtx::events::msc2545::ImagePack>( + txn, room_id2, state_id)) + addPack(pack->content); + } + } + } + } + + // packs from current room + if (auto pack = getStateEvent<mtx::events::msc2545::ImagePack>(txn, room_id)) { + addPack(pack->content); + } + for (const auto &pack : + getStateEventsWithType<mtx::events::msc2545::ImagePack>(txn, room_id)) { + addPack(pack.content); + } + + return infos; +} + std::optional<mtx::events::collections::RoomAccountDataEvents> Cache::getAccountData(lmdb::txn &txn, mtx::events::EventType type, const std::string &room_id) {