diff --git a/include/matrix/events.hpp b/include/matrix/events.hpp index a653d5c..19e8247 100644 --- a/include/matrix/events.hpp +++ b/include/matrix/events.hpp @@ -35,11 +35,12 @@ namespace matrix::sync{ RJP_value* m_type; RJP_value* m_content; public: + event(void) = default; explicit event(RJP_value* ev); event(const event&) = delete; //TODO event(event&&)noexcept; ~event(void) = default; - event& operator=(const event&) = default; + event& operator=(const event&); raii::static_string type(void)const&; raii::rjp_string type(void)&&; @@ -56,10 +57,13 @@ namespace matrix::sync{ class room_event_base { protected: - const raii::static_string m_roomid; + raii::static_string m_roomid; public: + room_event_base(void) = default; room_event_base(const room_event_base&) = delete; constexpr room_event_base(room_event_base&&) = default; + room_event_base& operator=(const room_event_base&) = default; + room_event_base& operator=(room_event_base&&) = default; constexpr room_event_base(const raii::string_base& roomid): m_roomid(roomid.get(), roomid.length()){} @@ -80,9 +84,12 @@ namespace matrix::sync{ RJP_value* m_redacts; int m_origin_server_ts; public: + room_event(void) = default; room_event(RJP_value* ev, const raii::string_base& roomid); room_event(const room_event&) = delete; //TODO room_event(room_event&&)noexcept; + room_event& operator=(const room_event&) = delete; + room_event& operator=(room_event&&); raii::static_string eventid(void)const&; raii::rjp_string eventid(void)&&; @@ -106,10 +113,13 @@ namespace matrix::sync{ RJP_value* m_state_key; RJP_value* m_prev_content; public: + room_state_event(void) = default; room_state_event(RJP_value* ev, const raii::string_base& roomid); room_state_event(const room_state_event&) = delete; //TODO - room_state_event(room_state_event&&)noexcept; + room_state_event(room_state_event&&); + room_state_event& operator=(const room_state_event&) = delete; + room_state_event& operator=(room_state_event&&); raii::static_string state_key(void)const&; raii::rjp_string state_key(void)&&; raii::static_string prev_content(void)const&; diff --git a/include/matrix/fat_strings.hpp b/include/matrix/fat_strings.hpp index fdd9902..7f1c968 100644 --- a/include/matrix/fat_strings.hpp +++ b/include/matrix/fat_strings.hpp @@ -35,6 +35,7 @@ namespace matrix::json{ raii::string _file_body(const uploaded_file& video); raii::string _audio_body(const uploaded_audio& audio); raii::string _message_body(const raii::string_base& text); + raii::string _notice_body(const raii::string_base& msg); raii::string _login_password(const raii::string_base& userid, const raii::string_base& password); raii::string _change_psk_password(const raii::string_base& userid, const raii::string_base& newpass, const raii::string_base& oldpass, const raii::string_base& session); diff --git a/include/matrix/rest/room_url_list.hpp b/include/matrix/rest/room_url_list.hpp index f986656..7a5df40 100644 --- a/include/matrix/rest/room_url_list.hpp +++ b/include/matrix/rest/room_url_list.hpp @@ -42,6 +42,7 @@ namespace matrix{ raii::string read_receipt(const session_info& session, const raii::string_base& roomid, const raii::string_base& eventid)const; raii::string send(const session_info& session, const raii::string_base& roomid, const raii::string_base& eventtype)const; raii::string redact(const session_info& session, const raii::string_base& roomid, const raii::string_base& eventid)const; + raii::string event(const session_info& session, const raii::string_base& roomid, const raii::string_base& eventid)const; const raii::string& typing(void)const; const raii::string& kick(void)const; const raii::string& ban(void)const; diff --git a/include/matrix/roomcxn.hpp b/include/matrix/roomcxn.hpp index 1072ce0..5437ded 100644 --- a/include/matrix/roomcxn.hpp +++ b/include/matrix/roomcxn.hpp @@ -69,13 +69,16 @@ namespace matrix{ //sending events netreturn send_custom_event(const raii::string_base& event, const raii::string_base& eventtype)const; netreturn send_message(const raii::string_base& text)const; + netreturn send_notice(const raii::string_base& text)const; netreturn send_file(const uploaded_file& file)const; netreturn send_image(const uploaded_image& image)const; netreturn send_video(const uploaded_video& video)const; netreturn send_audio(const uploaded_audio& audio)const; + netreturn forward_event(const sync::room_event&)const; netreturn send_typing(bool active, int timeout = 5000)const; netreturn send_read_receipt(const raii::string_base& eventid)const; + netreturn get_event(const raii::string_base& eventid)const; netreturn redact_event(const raii::string_base& eventid, const raii::string_base& reason)const; netreturn redact_event(const raii::string_base& eventid)const; diff --git a/src/matrix/fat_strings.cpp b/src/matrix/fat_strings.cpp index aab5d2c..8133c6b 100644 --- a/src/matrix/fat_strings.cpp +++ b/src/matrix/fat_strings.cpp @@ -140,6 +140,13 @@ namespace matrix::json{ member(json::keys::event::contentbody::msgtype(), quote("m.text"_ss)) )); } + raii::string _notice_body(const raii::string_base& msg){ + return raii::string( + object( + member(json::keys::event::contentbody::body(), quote(raii::json_escape(msg))), + member(json::keys::event::contentbody::msgtype(), quote("m.notice"_ss)) + )); + } raii::string _login_password(const raii::string_base& username, const raii::string_base& password){ return raii::string( object( diff --git a/src/matrix/rest/room_url_list.cpp b/src/matrix/rest/room_url_list.cpp index e97e5cf..277c4c3 100644 --- a/src/matrix/rest/room_url_list.cpp +++ b/src/matrix/rest/room_url_list.cpp @@ -49,6 +49,9 @@ namespace matrix{ raii::string room_url_list::redact(const session_info& session, const raii::string_base& roomid, const raii::string_base& eventid)const{ return raii::string(s_proto + session.homeserver + "/_matrix/client/r0/rooms/" + roomid + "/redact/" + eventid + "/0?access_token=" + session.access_token); } + raii::string room_url_list::event(const session_info& session, const raii::string_base& roomid, const raii::string_base& eventid)const{ + return raii::string(s_proto + session.homeserver + "/_matrix/client/r0/rooms/" + roomid + "/event/" + eventid + "?access_token=" + session.access_token); + } raii::string room_url_list::power_level(const session_info& session, const raii::string_base& roomid)const{ return raii::string(s_proto + session.homeserver + "/_matrix/client/r0/rooms/" + roomid + "/state/m.room.power_levels?access_token=" + session.access_token); } diff --git a/src/matrix/roomcxn.cpp b/src/matrix/roomcxn.cpp index 80ce5da..cf5c6ca 100644 --- a/src/matrix/roomcxn.cpp +++ b/src/matrix/roomcxn.cpp @@ -114,6 +114,9 @@ namespace matrix{ netreturn roomcxn::send_message(const raii::string_base& text)const{ return _send_message(json::_message_body(text)); } + netreturn roomcxn::send_notice(const raii::string_base& text)const{ + return _send_message(json::_notice_body(text)); + } netreturn roomcxn::send_file(const uploaded_file& file)const{ return _send_message(json::_file_body(file)); } @@ -126,6 +129,10 @@ namespace matrix{ netreturn roomcxn::send_audio(const uploaded_audio& audio)const{ return _send_message(json::_audio_body(audio)); } + netreturn roomcxn::forward_event(const sync::room_event& event)const{ + raii::rjp_string content = rjp_to_json(event.content()); + return send_custom_event(content, event.type()); + } netreturn roomcxn::send_typing(bool active, int timeout)const{ return _create_netreturn(_put_curl(json::_typing(active, timeout), m_urls.typing(), raii::curl_llist()), http_status()); } @@ -133,6 +140,16 @@ namespace matrix{ return _create_netreturn(_post_curl(raii::string(), m_urls.read_receipt(*m_ses, m_curl.encode(m_roomid), m_curl.encode(eventid)), raii::curl_llist()), http_status()); } + netreturn roomcxn::get_event(const raii::string_base& eventid)const{ + raii::string reply = _get_curl(m_urls.event(*m_ses, m_curl.encode(m_roomid), eventid)); + if(!reply) return _create_netreturn(reply, http_status()); + raii::rjp_ptr root(rjp_parse(reply.get())); + if(!root.get()) _create_netreturn(root, http_status()); + + netreturn retval = _create_netreturn(root, http_status()); + retval.value() = sync::roomcxn_message_event_list(root, root.get(), m_roomid); + return retval; + } netreturn roomcxn::redact_event(const raii::string_base& eventid, const raii::string_base& reason)const{ return _put_and_find(json::_redact(reason), m_urls.redact(*m_ses, m_curl.encode(m_roomid), m_curl.encode(eventid)), raii::curl_llist(), json::keys::event::eventid()); }