mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-21 18:50:47 +03:00
Prevent new packs from overwriting the default pack by accident
This commit is contained in:
parent
4bf725379a
commit
7fab9a1d73
3 changed files with 47 additions and 1 deletions
|
@ -82,8 +82,10 @@ SingleImagePackModel *
|
|||
ImagePackListModel::newPack(bool inRoom)
|
||||
{
|
||||
ImagePackInfo info{};
|
||||
if (inRoom)
|
||||
if (inRoom) {
|
||||
info.source_room = room_id;
|
||||
info.state_key = SingleImagePackModel::unconflictingStatekey(room_id, "");
|
||||
}
|
||||
return new SingleImagePackModel(info);
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include <QFileInfo>
|
||||
#include <QMimeDatabase>
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include <mtx/responses/media.hpp>
|
||||
|
||||
#include "Cache_p.h"
|
||||
|
@ -237,6 +239,12 @@ SingleImagePackModel::setStatekey(QString val)
|
|||
auto val_ = val.toStdString();
|
||||
if (val_ != statekey_) {
|
||||
statekey_ = val_;
|
||||
|
||||
// prevent deleting current pack
|
||||
if (!roomid_.empty() && statekey_ != old_statekey_) {
|
||||
statekey_ = unconflictingStatekey(roomid_, statekey_);
|
||||
}
|
||||
|
||||
emit statekeyChanged();
|
||||
}
|
||||
}
|
||||
|
@ -290,6 +298,7 @@ SingleImagePackModel::save()
|
|||
tr("Failed to delete old image pack: %1")
|
||||
.arg(QString::fromStdString(e->matrix_error.error)));
|
||||
});
|
||||
old_statekey_ = statekey_;
|
||||
}
|
||||
|
||||
http::client()->send_state_event(
|
||||
|
@ -398,6 +407,7 @@ std::string
|
|||
SingleImagePackModel::unconflictingShortcode(const std::string &shortcode)
|
||||
{
|
||||
if (pack.images.count(shortcode)) {
|
||||
// more images won't fit in an event anyway
|
||||
for (int i = 0; i < 64'000; i++) {
|
||||
auto tempCode = shortcode + std::to_string(i);
|
||||
if (!pack.images.count(tempCode)) {
|
||||
|
@ -408,6 +418,38 @@ SingleImagePackModel::unconflictingShortcode(const std::string &shortcode)
|
|||
return shortcode;
|
||||
}
|
||||
|
||||
std::string
|
||||
SingleImagePackModel::unconflictingStatekey(const std::string &roomid, const std::string &key)
|
||||
{
|
||||
if (roomid.empty())
|
||||
return key;
|
||||
|
||||
std::unordered_set<std::string> statekeys;
|
||||
auto currentPacks =
|
||||
cache::client()->getStateEventsWithType<mtx::events::msc2545::ImagePack>(roomid);
|
||||
for (const auto &pack : currentPacks) {
|
||||
if (!pack.content.images.empty())
|
||||
statekeys.insert(pack.state_key);
|
||||
}
|
||||
auto defaultPack = cache::client()->getStateEvent<mtx::events::msc2545::ImagePack>(roomid);
|
||||
if (defaultPack && defaultPack->content.images.size()) {
|
||||
statekeys.insert(defaultPack->state_key);
|
||||
}
|
||||
|
||||
if (statekeys.count(key)) {
|
||||
// arbitrary count. More than 64k image packs in a room are unlikely and if you have that,
|
||||
// you probably know what you are doing :)
|
||||
for (int i = 0; i < 64'000; i++) {
|
||||
auto tempCode = key + std::to_string(i);
|
||||
if (!statekeys.count(tempCode)) {
|
||||
return tempCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
void
|
||||
SingleImagePackModel::addImageCb(std::string uri, std::string filename, mtx::common::ImageInfo info)
|
||||
{
|
||||
|
|
|
@ -71,6 +71,8 @@ public:
|
|||
Q_INVOKABLE void remove(int index);
|
||||
Q_INVOKABLE void setAvatar(QUrl file);
|
||||
|
||||
static std::string unconflictingStatekey(const std::string &roomid, const std::string &key);
|
||||
|
||||
signals:
|
||||
void globallyEnabledChanged();
|
||||
void statekeyChanged();
|
||||
|
|
Loading…
Reference in a new issue