From 01251573bcb0df29bd71fa8341b74bf9549f5034 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 15 Feb 2018 14:57:56 -0800 Subject: [PATCH] ircd::m: Add `redacts` to main event; add redact(room, ...) committer. --- include/ircd/m/README.md | 1 + include/ircd/m/dbs.h | 1 + include/ircd/m/event.h | 1 + include/ircd/m/name.h | 1 + include/ircd/m/room.h | 1 + ircd/m/dbs.cc | 21 +++++++++++++++++++++ ircd/m/event.cc | 2 ++ ircd/m/room.cc | 26 ++++++++++++++++++++++++++ 8 files changed, 54 insertions(+) diff --git a/include/ircd/m/README.md b/include/ircd/m/README.md index d88e0171c..d1679a6bb 100644 --- a/include/ircd/m/README.md +++ b/include/ircd/m/README.md @@ -38,6 +38,7 @@ origin origin_server_ts prev_events prev_state +redacts room_id sender signatures diff --git a/include/ircd/m/dbs.h b/include/ircd/m/dbs.h index 0d4d8f7e6..14043ed43 100644 --- a/include/ircd/m/dbs.h +++ b/include/ircd/m/dbs.h @@ -61,6 +61,7 @@ namespace ircd::m::dbs::desc extern const database::descriptor events_origin_server_ts; extern const database::descriptor events_prev_events; extern const database::descriptor events_prev_state; + extern const database::descriptor events_redacts; extern const database::descriptor events_room_id; extern const database::descriptor events_sender; extern const database::descriptor events_signatures; diff --git a/include/ircd/m/event.h b/include/ircd/m/event.h index 2026b2052..2e9809e91 100644 --- a/include/ircd/m/event.h +++ b/include/ircd/m/event.h @@ -54,6 +54,7 @@ struct ircd::m::event json::property, json::property, json::property, + json::property, json::property, json::property, json::property, diff --git a/include/ircd/m/name.h b/include/ircd/m/name.h index 63129ef6f..e492088e4 100644 --- a/include/ircd/m/name.h +++ b/include/ircd/m/name.h @@ -35,6 +35,7 @@ namespace ircd::m::name constexpr const char *const origin_server_ts {"origin_server_ts"}; constexpr const char *const prev_events {"prev_events"}; constexpr const char *const prev_state {"prev_state"}; + constexpr const char *const redacts {"redacts"}; constexpr const char *const room_id {"room_id"}; constexpr const char *const sender {"sender"}; constexpr const char *const signatures {"signatures"}; diff --git a/include/ircd/m/room.h b/include/ircd/m/room.h index 4e7019140..53afb1d0c 100644 --- a/include/ircd/m/room.h +++ b/include/ircd/m/room.h @@ -46,6 +46,7 @@ namespace ircd::m event::id::buf send(const room &, const m::id::user &sender, const string_view &type, const json::object &content); // [SET] Convenience sends + event::id::buf redact(const room &, const m::id::user &sender, const m::id::event &, const string_view &reason); event::id::buf message(const room &, const m::id::user &sender, const json::members &content); event::id::buf message(const room &, const m::id::user &sender, const string_view &body, const string_view &msgtype = "m.text"); event::id::buf membership(const room &, const m::id::user &, const string_view &membership); diff --git a/ircd/m/dbs.cc b/ircd/m/dbs.cc index d5e0c1605..262fe9212 100644 --- a/ircd/m/dbs.cc +++ b/ircd/m/dbs.cc @@ -565,6 +565,26 @@ ircd::m::dbs::desc::events_content } }; +const ircd::database::descriptor +ircd::m::dbs::desc::events_redacts +{ + // name + "redacts", + + // explanation + R"(### protocol note: + + ### developer note: + key is event_id + value is targeted event_id + )", + + // typing (key, value) + { + typeid(ircd::string_view), typeid(ircd::string_view) + } +}; + const ircd::database::descriptor ircd::m::dbs::desc::events_room_id { @@ -1104,6 +1124,7 @@ ircd::m::dbs::desc::events events_origin_server_ts, events_prev_events, events_prev_state, + events_redacts, events_room_id, events_sender, events_signatures, diff --git a/ircd/m/event.cc b/ircd/m/event.cc index 1b9fe0c5d..43f2c4f31 100644 --- a/ircd/m/event.cc +++ b/ircd/m/event.cc @@ -165,6 +165,7 @@ ircd::m::pretty(const event &event) "depth", "state_key", "membership", + "redacts", }; json::for_each(event, top_keys, out); @@ -295,6 +296,7 @@ ircd::m::pretty_oneline(const event &event) s << "*" << " "; out("membership", json::get<"membership"_>(event)); + out("redacts", json::get<"redacts"_>(event)); const json::object &contents{json::get<"content"_>(event)}; if(!contents.empty()) diff --git a/ircd/m/room.cc b/ircd/m/room.cc index 73f434a09..419cd0028 100644 --- a/ircd/m/room.cc +++ b/ircd/m/room.cc @@ -124,6 +124,32 @@ ircd::m::message(const room &room, return send(room, sender, "m.room.message", contents); } +ircd::m::event::id::buf +ircd::m::redact(const room &room, + const m::id::user &sender, + const m::id::event &event_id, + const string_view &reason) +{ + json::iov event; + json::iov::push push[] + { + { event, { "type", "m.room.redaction" }}, + { event, { "sender", sender }}, + { event, { "redacts", event_id }}, + }; + + json::iov content; + json::iov::set_if _reason + { + content, !empty(reason), + { + "reason", reason + } + }; + + return commit(room, event, content); +} + ircd::m::event::id::buf ircd::m::send(const room &room, const m::id::user &sender,