mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 19:08:58 +03:00
Move sticker parsing and enable room stickers
This commit is contained in:
parent
8a1666bc88
commit
9d5ba4f681
5 changed files with 78 additions and 38 deletions
|
@ -38,8 +38,6 @@ Menu {
|
||||||
modal: true
|
modal: true
|
||||||
focus: true
|
focus: true
|
||||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||||
//height: columnView.implicitHeight + 4
|
|
||||||
//width: columnView.implicitWidth
|
|
||||||
width: stickersPerRow * stickerDimPad + 20
|
width: stickersPerRow * stickerDimPad + 20
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
|
|
@ -3382,11 +3382,73 @@ Cache::getChildRoomIds(const std::string &room_id)
|
||||||
return roomids;
|
return roomids;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<mtx::events::collections::RoomAccountDataEvents>
|
std::vector<ImagePackInfo>
|
||||||
Cache::getAccountData(mtx::events::EventType type, const std::string &room_id)
|
Cache::getImagePacks(const std::string &room_id, bool stickers)
|
||||||
{
|
{
|
||||||
auto txn = ro_txn(env_);
|
auto txn = ro_txn(env_);
|
||||||
return getAccountData(txn, type, room_id);
|
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))
|
||||||
|
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>
|
std::optional<mtx::events::collections::RoomAccountDataEvents>
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <mtx/events/join_rules.hpp>
|
#include <mtx/events/join_rules.hpp>
|
||||||
|
#include <mtx/events/mscs/image_packs.hpp>
|
||||||
|
|
||||||
namespace cache {
|
namespace cache {
|
||||||
enum class CacheVersion : int
|
enum class CacheVersion : int
|
||||||
|
@ -109,3 +110,9 @@ struct RoomSearchResult
|
||||||
std::string room_id;
|
std::string room_id;
|
||||||
RoomInfo info;
|
RoomInfo info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ImagePackInfo
|
||||||
|
{
|
||||||
|
std::string packname;
|
||||||
|
std::map<std::string, mtx::events::msc2545::PackImage> images;
|
||||||
|
};
|
||||||
|
|
|
@ -88,12 +88,6 @@ public:
|
||||||
//! Retrieve if the room is a space
|
//! Retrieve if the room is a space
|
||||||
bool getRoomIsSpace(lmdb::txn &txn, lmdb::dbi &statesdb);
|
bool getRoomIsSpace(lmdb::txn &txn, lmdb::dbi &statesdb);
|
||||||
|
|
||||||
//! retrieve a specific event from account data
|
|
||||||
//! pass empty room_id for global account data
|
|
||||||
std::optional<mtx::events::collections::RoomAccountDataEvents> getAccountData(
|
|
||||||
mtx::events::EventType type,
|
|
||||||
const std::string &room_id = "");
|
|
||||||
|
|
||||||
//! Get a specific state event
|
//! Get a specific state event
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::optional<mtx::events::StateEvent<T>> getStateEvent(const std::string &room_id,
|
std::optional<mtx::events::StateEvent<T>> getStateEvent(const std::string &room_id,
|
||||||
|
@ -231,6 +225,8 @@ public:
|
||||||
std::vector<std::string> getParentRoomIds(const std::string &room_id);
|
std::vector<std::string> getParentRoomIds(const std::string &room_id);
|
||||||
std::vector<std::string> getChildRoomIds(const std::string &room_id);
|
std::vector<std::string> getChildRoomIds(const std::string &room_id);
|
||||||
|
|
||||||
|
std::vector<ImagePackInfo> getImagePacks(const std::string &room_id, bool stickers);
|
||||||
|
|
||||||
//! Mark a room that uses e2e encryption.
|
//! Mark a room that uses e2e encryption.
|
||||||
void setEncryptedRoom(lmdb::txn &txn, const std::string &room_id);
|
void setEncryptedRoom(lmdb::txn &txn, const std::string &room_id);
|
||||||
bool isRoomEncrypted(const std::string &room_id);
|
bool isRoomEncrypted(const std::string &room_id);
|
||||||
|
|
|
@ -11,35 +11,12 @@ ImagePackModel::ImagePackModel(const std::string &roomId, bool stickers, QObject
|
||||||
: QAbstractListModel(parent)
|
: QAbstractListModel(parent)
|
||||||
, room_id(roomId)
|
, room_id(roomId)
|
||||||
{
|
{
|
||||||
auto accountpackV =
|
auto packs = cache::client()->getImagePacks(room_id, stickers);
|
||||||
cache::client()->getAccountData(mtx::events::EventType::ImagePackInAccountData);
|
|
||||||
auto enabledRoomPacksV =
|
|
||||||
cache::client()->getAccountData(mtx::events::EventType::ImagePackRooms);
|
|
||||||
|
|
||||||
std::optional<mtx::events::msc2545::ImagePack> accountPack;
|
for (const auto &pack : packs) {
|
||||||
if (accountpackV) {
|
QString packname = QString::fromStdString(pack.packname);
|
||||||
auto tmp =
|
|
||||||
std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePack>>(
|
|
||||||
&*accountpackV);
|
|
||||||
if (tmp)
|
|
||||||
accountPack = tmp->content;
|
|
||||||
}
|
|
||||||
// mtx::events::msc2545::ImagePackRooms *enabledRoomPacks = nullptr;
|
|
||||||
// if (enabledRoomPacksV)
|
|
||||||
// enabledRoomPacks =
|
|
||||||
// std::get_if<mtx::events::msc2545::ImagePackRooms>(&*enabledRoomPacksV);
|
|
||||||
|
|
||||||
if (accountPack && (!accountPack->pack || (stickers ? accountPack->pack->is_sticker()
|
|
||||||
: accountPack->pack->is_emoji()))) {
|
|
||||||
QString packname;
|
|
||||||
if (accountPack->pack)
|
|
||||||
packname = QString::fromStdString(accountPack->pack->display_name);
|
|
||||||
|
|
||||||
for (const auto &img : accountPack->images) {
|
|
||||||
if (img.second.overrides_usage() &&
|
|
||||||
(stickers ? !img.second.is_sticker() : !img.second.is_emoji()))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
for (const auto &img : pack.images) {
|
||||||
ImageDesc i{};
|
ImageDesc i{};
|
||||||
i.shortcode = QString::fromStdString(img.first);
|
i.shortcode = QString::fromStdString(img.first);
|
||||||
i.packname = packname;
|
i.packname = packname;
|
||||||
|
|
Loading…
Reference in a new issue