summary refs log tree commit diff
path: root/src/Cache.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Cache.cc')
-rw-r--r--src/Cache.cc95
1 files changed, 92 insertions, 3 deletions
diff --git a/src/Cache.cc b/src/Cache.cc

index 7d044e8f..4e2f32a9 100644 --- a/src/Cache.cc +++ b/src/Cache.cc
@@ -33,6 +33,7 @@ Cache::Cache(const QString &userId) : env_{nullptr} , stateDb_{0} , roomDb_{0} + , invitesDb_{0} , isMounted_{false} , userId_{userId} {} @@ -86,9 +87,10 @@ Cache::setup() env_.open(statePath.toStdString().c_str()); } - auto txn = lmdb::txn::begin(env_); - stateDb_ = lmdb::dbi::open(txn, "state", MDB_CREATE); - roomDb_ = lmdb::dbi::open(txn, "rooms", MDB_CREATE); + auto txn = lmdb::txn::begin(env_); + stateDb_ = lmdb::dbi::open(txn, "state", MDB_CREATE); + roomDb_ = lmdb::dbi::open(txn, "rooms", MDB_CREATE); + invitesDb_ = lmdb::dbi::open(txn, "invites", MDB_CREATE); txn.commit(); @@ -174,6 +176,20 @@ Cache::removeRoom(const QString &roomid) txn.commit(); } +void +Cache::removeInvite(const QString &room_id) +{ + if (!isMounted_) + return; + + auto txn = lmdb::txn::begin(env_, nullptr, 0); + + lmdb::dbi_del( + txn, invitesDb_, lmdb::val(room_id.toUtf8(), room_id.toUtf8().size()), nullptr); + + txn.commit(); +} + QMap<QString, RoomState> Cache::states() { @@ -310,3 +326,76 @@ Cache::setCurrentFormat() txn.commit(); } + +std::map<std::string, mtx::responses::InvitedRoom> +Cache::invites() +{ + std::map<std::string, mtx::responses::InvitedRoom> invites; + + auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY); + auto cursor = lmdb::cursor::open(txn, invitesDb_); + + std::string room_id; + std::string payload; + + mtx::responses::InvitedRoom state; + + while (cursor.get(room_id, payload, MDB_NEXT)) { + state = nlohmann::json::parse(payload); + invites.emplace(room_id, state); + } + + if (invites.size() > 0) + qDebug() << "Retrieved" << invites.size() << "invites"; + + cursor.close(); + + txn.commit(); + + return invites; +} + +void +Cache::setInvites(const std::map<std::string, mtx::responses::InvitedRoom> &invites) +{ + if (!isMounted_) + return; + + using Aliases = mtx::events::StrippedEvent<mtx::events::state::Aliases>; + using Avatar = mtx::events::StrippedEvent<mtx::events::state::Avatar>; + using Member = mtx::events::StrippedEvent<mtx::events::state::Member>; + using Name = mtx::events::StrippedEvent<mtx::events::state::Name>; + using Topic = mtx::events::StrippedEvent<mtx::events::state::Topic>; + + try { + auto txn = lmdb::txn::begin(env_); + + for (auto it = invites.cbegin(); it != invites.cend(); ++it) { + nlohmann::json j; + + for (const auto &e : it->second.invite_state) { + if (mpark::holds_alternative<Name>(e)) { + j["invite_state"]["events"].push_back(mpark::get<Name>(e)); + } else if (mpark::holds_alternative<Topic>(e)) { + j["invite_state"]["events"].push_back(mpark::get<Topic>(e)); + } else if (mpark::holds_alternative<Avatar>(e)) { + j["invite_state"]["events"].push_back( + mpark::get<Avatar>(e)); + } else if (mpark::holds_alternative<Aliases>(e)) { + j["invite_state"]["events"].push_back( + mpark::get<Aliases>(e)); + } else if (mpark::holds_alternative<Member>(e)) { + j["invite_state"]["events"].push_back( + mpark::get<Member>(e)); + } + } + + lmdb::dbi_put(txn, invitesDb_, lmdb::val(it->first), lmdb::val(j.dump())); + } + + txn.commit(); + } catch (const lmdb::error &e) { + qCritical() << "setInvitedRooms: " << e.what(); + unmount(); + } +}