diff --git a/include/ircd/m/dbs.h b/include/ircd/m/dbs.h index c03e44b57..76821d5d0 100644 --- a/include/ircd/m/dbs.h +++ b/include/ircd/m/dbs.h @@ -29,7 +29,7 @@ namespace ircd::m::dbs extern db::index room_origins; // Lowlevel util - string_view room_origins_key(const mutable_buffer &out, const id::room &, const string_view &origin); + string_view room_origins_key(const mutable_buffer &out, const id::room &, const string_view &origin, const id::user &member); string_view room_events_key(const mutable_buffer &out, const id::room &, const uint64_t &depth, const id::event &); string_view room_events_key(const mutable_buffer &out, const id::room &, const uint64_t &depth); std::tuple room_events_key(const string_view &amalgam); diff --git a/ircd/m/dbs.cc b/ircd/m/dbs.cc index 84c95bb69..e23e8d5d9 100644 --- a/ircd/m/dbs.cc +++ b/ircd/m/dbs.cc @@ -244,7 +244,7 @@ ircd::m::dbs::_index__room_origins(db::txn &txn, thread_local char buf[512]; const string_view &key { - room_origins_key(buf, at<"room_id"_>(event), at<"origin"_>(event)) + room_origins_key(buf, at<"room_id"_>(event), at<"origin"_>(event), at<"state_key"_>(event)) }; const string_view &membership @@ -622,12 +622,14 @@ ircd::m::dbs::desc::events__room_origins__pfx ircd::string_view ircd::m::dbs::room_origins_key(const mutable_buffer &out, const id::room &room_id, - const string_view &origin) + const string_view &origin, + const id::user &member) { size_t len{0}; len = strlcpy(out, room_id); len = strlcat(out, ":::"); len = strlcat(out, origin); + len = strlcat(out, member); return { data(out), len }; } diff --git a/ircd/m/room.cc b/ircd/m/room.cc index f06c9ae87..80754c907 100644 --- a/ircd/m/room.cc +++ b/ircd/m/room.cc @@ -663,13 +663,33 @@ const dbs::room_origins }; - auto it(index.begin(room.room_id)); + auto it + { + index.begin(room.room_id) + }; + + string_view last; + char lastbuf[256]; for(; bool(it); ++it) { - const string_view &key(it->first); - const string_view &origin(split(key, ":::").second); //TODO: XXX + const string_view &key{it->first}; + const string_view &origin_member //TODO: XXX + { + split(key, ":::").second + }; + + const string_view &origin //TODO: XXX + { + split(origin_member, "@").first + }; + + if(origin == last) + continue; + if(view(origin)) return true; + + last = { lastbuf, copy(lastbuf, origin) }; } return false;