From bb12fcab13db80185b9ed439b74b65615ef45d9f Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sat, 4 Jan 2020 11:11:33 -0800 Subject: [PATCH] Add room_message_event and allow casting from room_state_event --- include/matrix/events.hpp | 49 +++++++- include/matrix/json_targets.hpp | 197 ++++++++++++++++---------------- src/matrix/events.cpp | 38 ++++++ src/test.cpp | 14 ++- 4 files changed, 193 insertions(+), 105 deletions(-) diff --git a/include/matrix/events.hpp b/include/matrix/events.hpp index 7c86b4f..8b6d2fb 100644 --- a/include/matrix/events.hpp +++ b/include/matrix/events.hpp @@ -36,7 +36,8 @@ namespace matrix::sync{ RJP_value* m_content; public: explicit event(RJP_value* ev); - constexpr event(const event&) = default; + event(const event&) = delete; //TODO + event(event&&)noexcept; ~event(void) = default; constexpr event& operator=(const event&) = default; @@ -57,6 +58,10 @@ namespace matrix::sync{ protected: const raii::static_string m_roomid; public: + constexpr room_event_base(void) = default; + room_event_base(const room_event_base&) = delete; + constexpr room_event_base(room_event_base&&) = default; + constexpr room_event_base(const raii::string_base& roomid): m_roomid(roomid.get(), roomid.length()){} constexpr const raii::static_string& roomid(void)const{ @@ -77,6 +82,9 @@ namespace matrix::sync{ int m_origin_server_ts; public: room_event(RJP_value* ev, const raii::string_base& roomid); + room_event(const room_event&) = delete; //TODO + room_event(room_event&&)noexcept; + raii::static_string eventid(void)const&; raii::rjp_string eventid(void)&&; raii::static_string sender(void)const&; @@ -100,6 +108,8 @@ namespace matrix::sync{ RJP_value* m_prev_content; public: 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; raii::static_string state_key(void)const&; raii::rjp_string state_key(void)&&; @@ -114,8 +124,45 @@ namespace matrix::sync{ { public: room_ephemeral_event(RJP_value* ev, const raii::string_base& roomid); + room_ephemeral_event(const room_ephemeral_event&) = delete; //TODO + room_ephemeral_event(room_ephemeral_event&&) = default; }; + + //Specialized event for room messages + class room_message_event : public room_event + { + protected: + RJP_value* m_body; + RJP_value* m_type; + public: + room_message_event(RJP_value* ev, const raii::string_base& roomid); + room_message_event(const room_message_event&) = delete; + room_message_event(room_message_event&&); + room_message_event(room_event&&)noexcept; + + raii::static_string body(void)const&; + raii::rjp_string body(void)&&; + + raii::static_string msgtype(void)const&; + raii::rjp_string msgtype(void)&&; + }; + +} +namespace matrix{ + namespace detail{ + template + struct uninstantiated_false{ + static constexpr bool value = false; + }; + } + template::value> + To event_cast(From&& from){ + static_assert(detail::uninstantiated_false::value); + } + template<> + matrix::sync::room_message_event event_cast(matrix::sync::room_state_event&& from); + } #endif diff --git a/include/matrix/json_targets.hpp b/include/matrix/json_targets.hpp index 402f1d0..a12268f 100644 --- a/include/matrix/json_targets.hpp +++ b/include/matrix/json_targets.hpp @@ -95,111 +95,108 @@ namespace matrix::json{ } } } - namespace stdstrings{ - namespace error{ + namespace error{ + } + namespace events{ + constexpr raii::static_string homeserver(void){return "m.homeserver"_ss;} + constexpr raii::static_string identity_server(void){return "m.identity_server"_ss;} + constexpr raii::static_string presence(void){return "m.presence"_ss;} + constexpr raii::static_string direct(void){return "m.direct"_ss;} + constexpr raii::static_string ignored_user_list(void){return "m.ignored_user_list"_ss;} + constexpr raii::static_string joined_member_count(void){return "m.joined_member_count"_ss;} + constexpr raii::static_string invited_member_count(void){return "m.invited_member_count"_ss;} + + namespace key{ + constexpr raii::static_string verification_request(void){return "m.key.verification.request"_ss;} + constexpr raii::static_string verification_start(void){return "m.key.verification.start"_ss;} + constexpr raii::static_string verification_cancel(void){return "m.key.verification.cancel"_ss;} + constexpr raii::static_string verification_accept(void){return "m.key.verification.accept"_ss;} + constexpr raii::static_string verification_key(void){return "m.key.verification.key"_ss;} + constexpr raii::static_string verification_mac(void){return "m.key.verification.mac"_ss;} } - namespace events{ - constexpr raii::static_string homeserver(void){return "m.homeserver"_ss;} - constexpr raii::static_string identity_server(void){return "m.identity_server"_ss;} - constexpr raii::static_string presence(void){return "m.presence"_ss;} - constexpr raii::static_string direct(void){return "m.direct"_ss;} - constexpr raii::static_string ignored_user_list(void){return "m.ignored_user_list"_ss;} - constexpr raii::static_string joined_member_count(void){return "m.joined_member_count"_ss;} - constexpr raii::static_string invited_member_count(void){return "m.invited_member_count"_ss;} + namespace login{ + constexpr raii::static_string password(void){return "m.login.password"_ss;} + constexpr raii::static_string recaptcha(void){return "m.login.recaptcha"_ss;} + constexpr raii::static_string oauth2(void){return "m.login.oauth2"_ss;} + constexpr raii::static_string email(void){return "m.login.email.identity"_ss;} + constexpr raii::static_string msisdn(void){return "m.login.msisdn"_ss;} + constexpr raii::static_string token(void){return "m.login.token"_ss;} + constexpr raii::static_string dummy(void){return "m.login.dummy"_ss;} + } + namespace id{ + constexpr raii::static_string user(void){return "m.id.user"_ss;} + constexpr raii::static_string thirdparty(void){return "m.id.thirdparty"_ss;} + constexpr raii::static_string phone(void){return "m.id.phone"_ss;} + } + namespace rule{ + constexpr raii::static_string rules(void){return "m.push_rules"_ss;} + constexpr raii::static_string master(void){return ".m.rule.master"_ss;} + constexpr raii::static_string suppress_notices(void){return ".m.rule.suppress_notices"_ss;} + constexpr raii::static_string invite_for_me(void){return ".m.rule.invite_for_me"_ss;} + constexpr raii::static_string member_event(void){return ".m.rule.member_event"_ss;} + constexpr raii::static_string contains_displayname(void){return ".m.rule.contains_display_name"_ss;} + constexpr raii::static_string tombstone(void){return ".m.rule.tombstone"_ss;} + constexpr raii::static_string roomnotif(void){return ".m.rule.roomnotif"_ss;} + constexpr raii::static_string contains_username(void){return ".m.rule.contains_user_name"_ss;} + constexpr raii::static_string call(void){return ".m.rule.call"_ss;} + constexpr raii::static_string encrypted_one_to_one(void){return ".m.rule.encrypted_room_one_to_one"_ss;} + constexpr raii::static_string message(void){return ".m.rule.message"_ss;} + constexpr raii::static_string encrypted(void){return ".m.rule.encrypted"_ss;} + } + namespace e2e{ + constexpr raii::static_string curve_aes_sha2(void){return "m.olm.v1.curve25519-aes-sha2"_ss;} + constexpr raii::static_string aes_sha2(void){return "m.megolm.v1.aes-sha2"_ss;} + constexpr raii::static_string encryption(void){return "m.room.encryption"_ss;} + constexpr raii::static_string key(void){return "m.room_key"_ss;} + constexpr raii::static_string key_request(void){return "m.room_key_request"_ss;} + constexpr raii::static_string forwarded_key(void){return "m.forwarded_room_key"_ss;} + constexpr raii::static_string dummy(void){return "m.dummy"_ss;} + } + namespace room{ + constexpr raii::static_string aliases(void){return "m.room.aliases"_ss;} + constexpr raii::static_string canonical_alias(void){return "m.room.canonical_alias"_ss;} + constexpr raii::static_string create(void){return "m.room.create"_ss;} + constexpr raii::static_string join_rules(void){return "m.room.join_rules"_ss;} + constexpr raii::static_string member(void){return "m.room.member"_ss;} + constexpr raii::static_string power_levels(void){return "m.room.power_levels"_ss;} + constexpr raii::static_string redaction(void){return "m.room.redaction"_ss;} + constexpr raii::static_string heroes(void){return "m.heroes"_ss;} + constexpr raii::static_string message(void){return "m.room.message"_ss;} + constexpr raii::static_string sticker(void){return "m.sticker"_ss;} + [[deprecated]] constexpr raii::static_string message_feedback(void){return "m.room.message.feedback"_ss;} + constexpr raii::static_string name(void){return "m.room.name"_ss;} + constexpr raii::static_string topic(void){return "m.room.topic"_ss;} + constexpr raii::static_string avatar(void){return "m.room.avatar"_ss;} + constexpr raii::static_string pinned_events(void){return "m.room.pinned_events"_ss;} + constexpr raii::static_string typing(void){return "m.typing"_ss;} + constexpr raii::static_string receipt(void){return "m.receipt"_ss;} + constexpr raii::static_string fully_read(void){return "m.fully_read"_ss;} + constexpr raii::static_string history_visibility(void){return "m.room.history_visibility"_ss;} + constexpr raii::static_string third_party_invite(void){return "m.room.third_party_invite"_ss;} + constexpr raii::static_string guest_access(void){return "m.room.guest_access"_ss;} + constexpr raii::static_string tag(void){return "m.tag"_ss;} + constexpr raii::static_string server_acl(void){return "m.room.server_acl"_ss;} + } + namespace msgtype{ + constexpr raii::static_string text(void){return "m.text"_ss;} + constexpr raii::static_string emote(void){return "m.emote"_ss;} + constexpr raii::static_string notice(void){return "m.notice"_ss;} + constexpr raii::static_string image(void){return "m.image"_ss;} + constexpr raii::static_string file(void){return "m.file"_ss;} + constexpr raii::static_string audio(void){return "m.audio"_ss;} + constexpr raii::static_string location(void){return "m.location"_ss;} + constexpr raii::static_string video(void){return "m.video"_ss;} + constexpr raii::static_string server_notice(void){return "m.server_notice"_ss;} + } + namespace call{ + constexpr raii::static_string invite(void){return "m.call.invite"_ss;} + constexpr raii::static_string candidates(void){return "m.call.candidates"_ss;} + constexpr raii::static_string answer(void){return "m.call.answer"_ss;} + constexpr raii::static_string hangup(void){return "m.call.hangup"_ss;} - namespace key{ - constexpr raii::static_string verification_request(void){return "m.key.verification.request"_ss;} - constexpr raii::static_string verification_start(void){return "m.key.verification.start"_ss;} - constexpr raii::static_string verification_cancel(void){return "m.key.verification.cancel"_ss;} - constexpr raii::static_string verification_accept(void){return "m.key.verification.accept"_ss;} - constexpr raii::static_string verification_key(void){return "m.key.verification.key"_ss;} - constexpr raii::static_string verification_mac(void){return "m.key.verification.mac"_ss;} - } - namespace login{ - constexpr raii::static_string password(void){return "m.login.password"_ss;} - constexpr raii::static_string recaptcha(void){return "m.login.recaptcha"_ss;} - constexpr raii::static_string oauth2(void){return "m.login.oauth2"_ss;} - constexpr raii::static_string email(void){return "m.login.email.identity"_ss;} - constexpr raii::static_string msisdn(void){return "m.login.msisdn"_ss;} - constexpr raii::static_string token(void){return "m.login.token"_ss;} - constexpr raii::static_string dummy(void){return "m.login.dummy"_ss;} - } - namespace id{ - constexpr raii::static_string user(void){return "m.id.user"_ss;} - constexpr raii::static_string thirdparty(void){return "m.id.thirdparty"_ss;} - constexpr raii::static_string phone(void){return "m.id.phone"_ss;} - } - namespace rule{ - constexpr raii::static_string rules(void){return "m.push_rules"_ss;} - constexpr raii::static_string master(void){return ".m.rule.master"_ss;} - constexpr raii::static_string suppress_notices(void){return ".m.rule.suppress_notices"_ss;} - constexpr raii::static_string invite_for_me(void){return ".m.rule.invite_for_me"_ss;} - constexpr raii::static_string member_event(void){return ".m.rule.member_event"_ss;} - constexpr raii::static_string contains_displayname(void){return ".m.rule.contains_display_name"_ss;} - constexpr raii::static_string tombstone(void){return ".m.rule.tombstone"_ss;} - constexpr raii::static_string roomnotif(void){return ".m.rule.roomnotif"_ss;} - constexpr raii::static_string contains_username(void){return ".m.rule.contains_user_name"_ss;} - constexpr raii::static_string call(void){return ".m.rule.call"_ss;} - constexpr raii::static_string encrypted_one_to_one(void){return ".m.rule.encrypted_room_one_to_one"_ss;} - constexpr raii::static_string message(void){return ".m.rule.message"_ss;} - constexpr raii::static_string encrypted(void){return ".m.rule.encrypted"_ss;} - } - namespace e2e{ - constexpr raii::static_string curve_aes_sha2(void){return "m.olm.v1.curve25519-aes-sha2"_ss;} - constexpr raii::static_string aes_sha2(void){return "m.megolm.v1.aes-sha2"_ss;} - constexpr raii::static_string encryption(void){return "m.room.encryption"_ss;} - constexpr raii::static_string key(void){return "m.room_key"_ss;} - constexpr raii::static_string key_request(void){return "m.room_key_request"_ss;} - constexpr raii::static_string forwarded_key(void){return "m.forwarded_room_key"_ss;} - constexpr raii::static_string dummy(void){return "m.dummy"_ss;} - } - namespace room{ - constexpr raii::static_string aliases(void){return "m.room.aliases"_ss;} - constexpr raii::static_string canonical_alias(void){return "m.room.canonical_alias"_ss;} - constexpr raii::static_string create(void){return "m.room.create"_ss;} - constexpr raii::static_string join_rules(void){return "m.room.join_rules"_ss;} - constexpr raii::static_string member(void){return "m.room.member"_ss;} - constexpr raii::static_string power_levels(void){return "m.room.power_levels"_ss;} - constexpr raii::static_string redaction(void){return "m.room.redaction"_ss;} - constexpr raii::static_string heroes(void){return "m.heroes"_ss;} - constexpr raii::static_string room_message(void){return "m.room.message"_ss;} - constexpr raii::static_string sticker(void){return "m.sticker"_ss;} - [[deprecated]] constexpr raii::static_string message_feedback(void){return "m.room.message.feedback"_ss;} - constexpr raii::static_string name(void){return "m.room.name"_ss;} - constexpr raii::static_string topic(void){return "m.room.topic"_ss;} - constexpr raii::static_string avatar(void){return "m.room.avatar"_ss;} - constexpr raii::static_string pinned_events(void){return "m.room.pinned_events"_ss;} - constexpr raii::static_string typing(void){return "m.typing"_ss;} - constexpr raii::static_string receipt(void){return "m.receipt"_ss;} - constexpr raii::static_string fully_read(void){return "m.fully_read"_ss;} - constexpr raii::static_string history_visibility(void){return "m.room.history_visibility"_ss;} - constexpr raii::static_string third_party_invite(void){return "m.room.third_party_invite"_ss;} - constexpr raii::static_string guest_access(void){return "m.room.guest_access"_ss;} - constexpr raii::static_string tag(void){return "m.tag"_ss;} - constexpr raii::static_string server_acl(void){return "m.room.server_acl"_ss;} - } - namespace msgtype{ - constexpr raii::static_string text(void){return "m.text"_ss;} - constexpr raii::static_string emote(void){return "m.emote"_ss;} - constexpr raii::static_string notice(void){return "m.notice"_ss;} - constexpr raii::static_string image(void){return "m.image"_ss;} - constexpr raii::static_string file(void){return "m.file"_ss;} - constexpr raii::static_string audio(void){return "m.audio"_ss;} - constexpr raii::static_string location(void){return "m.location"_ss;} - constexpr raii::static_string video(void){return "m.video"_ss;} - constexpr raii::static_string server_notice(void){return "m.server_notice"_ss;} - } - namespace call{ - constexpr raii::static_string invite(void){return "m.call.invite"_ss;} - constexpr raii::static_string candidates(void){return "m.call.candidates"_ss;} - constexpr raii::static_string answer(void){return "m.call.answer"_ss;} - constexpr raii::static_string hangup(void){return "m.call.hangup"_ss;} - - } } } - } #endif diff --git a/src/matrix/events.cpp b/src/matrix/events.cpp index 886a58a..61162eb 100644 --- a/src/matrix/events.cpp +++ b/src/matrix/events.cpp @@ -26,6 +26,10 @@ namespace matrix::sync{ m_event(ev), m_type(rjp_search_member(ev, json::keys::event::type(), 0).value), m_content(rjp_search_member(ev, json::keys::event::content(), 0).value){} + event::event(event&& ev)noexcept: + m_event(std::exchange(ev.m_event, nullptr)), + m_type(std::exchange(ev.m_type, nullptr)), + m_content(std::exchange(ev.m_content, nullptr)){} raii::static_string event::type(void)const&{ return raii::static_string(rjp_value_string(m_type), rjp_value_string_length(m_type)); } @@ -53,6 +57,13 @@ namespace matrix::sync{ m_unsigned(rjp_search_member(ev, json::keys::event::extra(), 0).value), m_redacts(rjp_search_member(ev, json::keys::event::redacts(), 0).value), m_origin_server_ts(rjp_value_integer(rjp_search_member(ev, json::keys::event::origin_server_ts(), 0).value)){} + room_event::room_event(room_event&& ev)noexcept: + room_event_base(std::move(ev)), event(std::move(ev)), + m_id(std::exchange(ev.m_id, nullptr)), + m_sender(std::exchange(ev.m_sender, nullptr)), + m_unsigned(std::exchange(ev.m_unsigned, nullptr)), + m_redacts(std::exchange(ev.m_redacts, nullptr)), + m_origin_server_ts(ev.m_origin_server_ts){} raii::static_string room_event::eventid(void)const&{ return raii::static_string(rjp_value_string(m_id), rjp_value_string_length(m_id)); } @@ -112,4 +123,31 @@ namespace matrix::sync{ room_ephemeral_event::room_ephemeral_event(RJP_value* ev, const raii::string_base& roomid): room_event_base(roomid), event(ev){} + //Room message event + room_message_event::room_message_event(RJP_value* ev, const raii::string_base& roomid): + room_event(ev, roomid), + m_body(rjp_search_member(m_content, json::keys::event::contentbody::body(), 0).value), + m_type(rjp_search_member(m_content, json::keys::event::contentbody::msgtype(), 0).value){} + room_message_event::room_message_event(room_event&& ev)noexcept: + room_event(std::move(ev)), + m_body(rjp_search_member(m_content, json::keys::event::contentbody::body(), 0).value), + m_type(rjp_search_member(m_content, json::keys::event::contentbody::msgtype(), 0).value){} + raii::static_string room_message_event::body(void)const&{ + return raii::static_string(rjp_value_string(m_body), rjp_value_string_length(m_body)); + } + raii::rjp_string room_message_event::body(void)&&{ + return raii::rjp_string(m_body); + } + raii::static_string room_message_event::msgtype(void)const&{ + return raii::static_string(rjp_value_string(m_type), rjp_value_string_length(m_type)); + } + raii::rjp_string room_message_event::msgtype(void)&&{ + return raii::rjp_string(m_type); + } +} +namespace matrix{ + template<> + matrix::sync::room_message_event event_cast(matrix::sync::room_state_event&& from){ + return matrix::sync::room_message_event(std::move(from)); + } } diff --git a/src/test.cpp b/src/test.cpp index b92d89c..fb8f7cc 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -22,6 +22,7 @@ #include "raii/string_base.hpp" #include "matrix/sync_response.hpp" #include "raii/util.hpp" +#include "matrix/json_targets.hpp" #include #include @@ -91,10 +92,15 @@ int main(){ for(auto room : sync_res.room_join_events()){ auto r = client.spawn_room(room.roomid()); for(auto event : room.timeline_events()){ - if(event.sender() != client.userid()){ - printf("%s : %s : %s\n", room.roomid().get(), event.type().get(), event.sender().get()); - r.send_read_receipt(event.eventid()); - r.send_message("test"_ss); + if(event.sender() == client.userid()) + continue; + printf("%s : %s : %s\n", room.roomid().get(), event.type().get(), event.sender().get()); + r.send_read_receipt(event.eventid()); + if(event.type() == matrix::json::events::room::message()){ + auto message = matrix::event_cast(std::move(event)); + if(message.msgtype() == matrix::json::events::msgtype::text()) + r.send_message(raii::string("\"" + message.body() + "\" what a nigger thing to say"_ss)); + printf("message body: %s\n", message.body().get()); } } }