diff --git a/include/ircd/m/room.h b/include/ircd/m/room.h index 393e946cf..0c0ffed55 100644 --- a/include/ircd/m/room.h +++ b/include/ircd/m/room.h @@ -145,8 +145,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; + bool visible(const id::user &, const m::event *const & = nullptr) const; + bool visible(const id::node &, const m::event *const & = nullptr) const; room(const id &room_id, const string_view &event_id, diff --git a/ircd/m/m.cc b/ircd/m/m.cc index 4d8c6b858..373b17a74 100644 --- a/ircd/m/m.cc +++ b/ircd/m/m.cc @@ -2783,7 +2783,7 @@ ircd::m::visible(const event &event, at<"room_id"_>(event), at<"event_id"_>(event) }; - return room.visible(origin); + return room.visible(origin, &event); } bool @@ -2795,7 +2795,7 @@ ircd::m::visible(const event &event, at<"room_id"_>(event), at<"event_id"_>(event) }; - return room.visible(user_id); + return room.visible(user_id, &event); } /////////////////////////////////////////////////////////////////////////////// diff --git a/ircd/m/room.cc b/ircd/m/room.cc index e8f0c6e7d..c33217473 100644 --- a/ircd/m/room.cc +++ b/ircd/m/room.cc @@ -162,17 +162,33 @@ ircd::m::my(const room &room) // bool -ircd::m::room::visible(const m::user::id &user_id) +ircd::m::room::visible(const user::id &user_id, + const event *const &event_) const { - return true; + using prototype = bool (const room &, const user &, const event *const &); + + static import function + { + "m_room_history_visibility", "visible__user" + }; + + return function(*this, user_id, event_); } bool -ircd::m::room::visible(const m::node::id &origin) +ircd::m::room::visible(const node::id &node_id, + const event *const &event_) const { - return true; + using prototype = bool (const room &, const node &, const event *const &); + + static import function + { + "m_room_history_visibility", "visible__node" + }; + + return function(*this, node_id, event_); } bool diff --git a/modules/m_room_history_visibility.cc b/modules/m_room_history_visibility.cc index 86c1dbb7d..9f5cbd627 100644 --- a/modules/m_room_history_visibility.cc +++ b/modules/m_room_history_visibility.cc @@ -16,6 +16,33 @@ IRCD_MODULE "Matrix m.room.history_visibility" }; +namespace ircd::m +{ + extern hook::site visible_hook; +} + +decltype(ircd::m::visible_hook) +ircd::m::visible_hook +{ + { "name", "m.event.visible" } +}; + +extern "C" bool +_visible__user(const m::room &room, + const m::user &user, + const m::event *const &event) +{ + return true; +} + +extern "C" bool +_visible__node(const m::room &room, + const m::node &node, + const m::event *const &event) +{ + return true; +} + static void _changed_visibility(const m::event &event) {