Add room_message_event and allow casting from room_state_event

This commit is contained in:
rexy712 2020-01-04 11:11:33 -08:00
parent 500c0eb6ee
commit bb12fcab13
4 changed files with 193 additions and 105 deletions

View File

@ -36,7 +36,8 @@ namespace matrix::sync{
RJP_value* m_content; RJP_value* m_content;
public: public:
explicit event(RJP_value* ev); explicit event(RJP_value* ev);
constexpr event(const event&) = default; event(const event&) = delete; //TODO
event(event&&)noexcept;
~event(void) = default; ~event(void) = default;
constexpr event& operator=(const event&) = default; constexpr event& operator=(const event&) = default;
@ -57,6 +58,10 @@ namespace matrix::sync{
protected: protected:
const raii::static_string m_roomid; const raii::static_string m_roomid;
public: 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): constexpr room_event_base(const raii::string_base& roomid):
m_roomid(roomid.get(), roomid.length()){} m_roomid(roomid.get(), roomid.length()){}
constexpr const raii::static_string& roomid(void)const{ constexpr const raii::static_string& roomid(void)const{
@ -77,6 +82,9 @@ namespace matrix::sync{
int m_origin_server_ts; int m_origin_server_ts;
public: public:
room_event(RJP_value* ev, const raii::string_base& roomid); 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::static_string eventid(void)const&;
raii::rjp_string eventid(void)&&; raii::rjp_string eventid(void)&&;
raii::static_string sender(void)const&; raii::static_string sender(void)const&;
@ -100,6 +108,8 @@ namespace matrix::sync{
RJP_value* m_prev_content; RJP_value* m_prev_content;
public: public:
room_state_event(RJP_value* ev, const raii::string_base& roomid); 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::static_string state_key(void)const&;
raii::rjp_string state_key(void)&&; raii::rjp_string state_key(void)&&;
@ -114,8 +124,45 @@ namespace matrix::sync{
{ {
public: public:
room_ephemeral_event(RJP_value* ev, const raii::string_base& roomid); 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<class>
struct uninstantiated_false{
static constexpr bool value = false;
};
}
template<class To, class From, bool = std::is_rvalue_reference<From&&>::value>
To event_cast(From&& from){
static_assert(detail::uninstantiated_false<From>::value);
}
template<>
matrix::sync::room_message_event event_cast<matrix::sync::room_message_event, matrix::sync::room_state_event, true>(matrix::sync::room_state_event&& from);
} }
#endif #endif

View File

@ -95,7 +95,6 @@ namespace matrix::json{
} }
} }
} }
namespace stdstrings{
namespace error{ namespace error{
} }
@ -163,7 +162,7 @@ namespace matrix::json{
constexpr raii::static_string power_levels(void){return "m.room.power_levels"_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 redaction(void){return "m.room.redaction"_ss;}
constexpr raii::static_string heroes(void){return "m.heroes"_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 message(void){return "m.room.message"_ss;}
constexpr raii::static_string sticker(void){return "m.sticker"_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;} [[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 name(void){return "m.room.name"_ss;}
@ -198,8 +197,6 @@ namespace matrix::json{
} }
} }
}
} }
#endif #endif

View File

@ -26,6 +26,10 @@ namespace matrix::sync{
m_event(ev), m_event(ev),
m_type(rjp_search_member(ev, json::keys::event::type(), 0).value), m_type(rjp_search_member(ev, json::keys::event::type(), 0).value),
m_content(rjp_search_member(ev, json::keys::event::content(), 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&{ raii::static_string event::type(void)const&{
return raii::static_string(rjp_value_string(m_type), rjp_value_string_length(m_type)); 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_unsigned(rjp_search_member(ev, json::keys::event::extra(), 0).value),
m_redacts(rjp_search_member(ev, json::keys::event::redacts(), 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)){} 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&{ raii::static_string room_event::eventid(void)const&{
return raii::static_string(rjp_value_string(m_id), rjp_value_string_length(m_id)); 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_ephemeral_event::room_ephemeral_event(RJP_value* ev, const raii::string_base& roomid):
room_event_base(roomid), event(ev){} 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_message_event, matrix::sync::room_state_event, true>(matrix::sync::room_state_event&& from){
return matrix::sync::room_message_event(std::move(from));
}
} }

View File

@ -22,6 +22,7 @@
#include "raii/string_base.hpp" #include "raii/string_base.hpp"
#include "matrix/sync_response.hpp" #include "matrix/sync_response.hpp"
#include "raii/util.hpp" #include "raii/util.hpp"
#include "matrix/json_targets.hpp"
#include <atomic> #include <atomic>
#include <thread> #include <thread>
@ -91,10 +92,15 @@ int main(){
for(auto room : sync_res.room_join_events()){ for(auto room : sync_res.room_join_events()){
auto r = client.spawn_room(room.roomid()); auto r = client.spawn_room(room.roomid());
for(auto event : room.timeline_events()){ for(auto event : room.timeline_events()){
if(event.sender() != client.userid()){ if(event.sender() == client.userid())
continue;
printf("%s : %s : %s\n", room.roomid().get(), event.type().get(), event.sender().get()); printf("%s : %s : %s\n", room.roomid().get(), event.type().get(), event.sender().get());
r.send_read_receipt(event.eventid()); r.send_read_receipt(event.eventid());
r.send_message("test"_ss); if(event.type() == matrix::json::events::room::message()){
auto message = matrix::event_cast<matrix::sync::room_message_event>(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());
} }
} }
} }