summary refs log tree commit diff
path: root/src/Cache.cc
diff options
context:
space:
mode:
authortwahm <39034410+twahm@users.noreply.github.com>2018-05-12 17:31:58 -0500
committermujx <mujx@users.noreply.github.com>2018-05-13 01:31:58 +0300
commit4bd43780d9497daa5e1af7f7a450d25c18377819 (patch)
tree95ef5443c02fb7f40a4c3d6bd5c42b7ccb980cb8 /src/Cache.cc
parentUse the correct avatar size for HiDPI displays (diff)
downloadnheko-4bd43780d9497daa5e1af7f7a450d25c18377819.tar.xz
Add read support for room access options (#324)
- Join rules
- Guest access
Diffstat (limited to 'src/Cache.cc')
-rw-r--r--src/Cache.cc54
1 files changed, 52 insertions, 2 deletions
diff --git a/src/Cache.cc b/src/Cache.cc

index 23d37f58..31e86a69 100644 --- a/src/Cache.cc +++ b/src/Cache.cc
@@ -30,7 +30,7 @@ //! Should be changed when a breaking change occurs in the cache format. //! This will reset client's data. -static const std::string CURRENT_CACHE_FORMAT_VERSION("2018.04.21"); +static const std::string CURRENT_CACHE_FORMAT_VERSION("2018.05.11"); static const lmdb::val NEXT_BATCH_KEY("next_batch"); static const lmdb::val CACHE_FORMAT_VERSION_KEY("cache_format_version"); @@ -550,7 +550,8 @@ Cache::roomsWithStateUpdates(const mtx::responses::Sync &res) RoomInfo Cache::singleRoomInfo(const std::string &room_id) { - auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY); + auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY); + auto statesdb = getStatesDb(txn, room_id); lmdb::val data; @@ -559,6 +560,8 @@ Cache::singleRoomInfo(const std::string &room_id) try { RoomInfo tmp = json::parse(std::string(data.data(), data.size())); tmp.member_count = getMembersDb(txn, room_id).size(txn); + tmp.join_rule = getRoomJoinRule(txn, statesdb); + tmp.guest_access = getRoomGuestAccess(txn, statesdb); txn.commit(); @@ -584,12 +587,15 @@ Cache::getRoomInfo(const std::vector<std::string> &rooms) for (const auto &room : rooms) { lmdb::val data; + auto statesdb = getStatesDb(txn, room); // Check if the room is joined. if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room), data)) { try { RoomInfo tmp = json::parse(std::string(data.data(), data.size())); tmp.member_count = getMembersDb(txn, room).size(txn); + tmp.join_rule = getRoomJoinRule(txn, statesdb); + tmp.guest_access = getRoomGuestAccess(txn, statesdb); room_info.emplace(QString::fromStdString(room), std::move(tmp)); } catch (const json::exception &e) { @@ -805,6 +811,50 @@ Cache::getRoomName(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb) return "Empty Room"; } +JoinRule +Cache::getRoomJoinRule(lmdb::txn &txn, lmdb::dbi &statesdb) +{ + using namespace mtx::events; + using namespace mtx::events::state; + + lmdb::val event; + bool res = lmdb::dbi_get( + txn, statesdb, lmdb::val(to_string(mtx::events::EventType::RoomJoinRules)), event); + + if (res) { + try { + StateEvent<JoinRules> msg = + json::parse(std::string(event.data(), event.size())); + return msg.content.join_rule; + } catch (const json::exception &e) { + qWarning() << e.what(); + } + } + return JoinRule::Knock; +} + +bool +Cache::getRoomGuestAccess(lmdb::txn &txn, lmdb::dbi &statesdb) +{ + using namespace mtx::events; + using namespace mtx::events::state; + + lmdb::val event; + bool res = lmdb::dbi_get( + txn, statesdb, lmdb::val(to_string(mtx::events::EventType::RoomGuestAccess)), event); + + if (res) { + try { + StateEvent<GuestAccess> msg = + json::parse(std::string(event.data(), event.size())); + return msg.content.guest_access == AccessState::CanJoin; + } catch (const json::exception &e) { + qWarning() << e.what(); + } + } + return false; +} + QString Cache::getRoomTopic(lmdb::txn &txn, lmdb::dbi &statesdb) {