diff --git a/include/ircd/m/event.h b/include/ircd/m/event.h index 2c8216e2c..7cf9042d3 100644 --- a/include/ircd/m/event.h +++ b/include/ircd/m/event.h @@ -27,6 +27,10 @@ namespace ircd::m bool exists(const id::event &); bool bad(const id::event &, uint64_t &); bool bad(const id::event &); + bool visible(const event &, const id::user &); + bool visible(const event &, const id::node &); + bool visible(const id::event &, const id::user &); + bool visible(const id::event &, const id::node &); // Depth comparison; expect unstable sorting. bool operator<(const event &, const event &); diff --git a/include/ircd/m/room.h b/include/ircd/m/room.h index d2fb93dd4..ee535c137 100644 --- a/include/ircd/m/room.h +++ b/include/ircd/m/room.h @@ -144,6 +144,8 @@ struct ircd::m::room // misc bool membership(const m::id::user &, const string_view &membership = "join") const; string_view membership(const mutable_buffer &out, const m::id::user &) const; + bool visible(const id::user &) const; + bool visible(const id::node &) const; room(const id &room_id, const string_view &event_id, const vm::copts *const &opts = nullptr) :room_id{room_id} diff --git a/ircd/m/m.cc b/ircd/m/m.cc index 40d1b281e..106f0cf87 100644 --- a/ircd/m/m.cc +++ b/ircd/m/m.cc @@ -2731,6 +2731,71 @@ ircd::m::exists(const id::room_alias &room_alias, return function(room_alias, remote_query); } +/////////////////////////////////////////////////////////////////////////////// +// +// m/event.h +// + +bool +ircd::m::visible(const event::id &event_id, + const node::id &origin) +{ + m::room::id::buf room_id + { + get(event_id, "room_id", room_id) + }; + + const m::event event + { + { "event_id", event_id }, + { "room_id", room_id } + }; + + return visible(event, origin); +} + +bool +ircd::m::visible(const event::id &event_id, + const user::id &user_id) +{ + m::room::id::buf room_id + { + get(event_id, "room_id", room_id) + }; + + const m::event event + { + { "event_id", event_id }, + { "room_id", room_id } + }; + + return visible(event, user_id); +} + +bool +ircd::m::visible(const event &event, + const node::id &origin) +{ + const m::room room + { + at<"room_id"_>(event), at<"event_id"_>(event) + }; + + return room.visible(origin); +} + +bool +ircd::m::visible(const event &event, + const user::id &user_id) +{ + const m::room room + { + at<"room_id"_>(event), at<"event_id"_>(event) + }; + + return room.visible(user_id); +} + /////////////////////////////////////////////////////////////////////////////// // // m/txn.h diff --git a/ircd/m/room.cc b/ircd/m/room.cc index 588eb0c33..1a8b29f55 100644 --- a/ircd/m/room.cc +++ b/ircd/m/room.cc @@ -161,6 +161,20 @@ ircd::m::my(const room &room) // room // +bool +ircd::m::room::visible(const m::user::id &user_id) +const +{ + return true; +} + +bool +ircd::m::room::visible(const m::node::id &origin) +const +{ + return true; +} + bool ircd::m::room::membership(const m::id::user &user_id, const string_view &membership)