Changed event structures to keep persistent handles to resources

This commit is contained in:
rexy712 2020-01-03 21:20:30 -08:00
parent 9cf6905ea3
commit 4f5efa9ba9
8 changed files with 184 additions and 165 deletions

View File

@ -31,10 +31,10 @@ namespace matrix::sync{
class event
{
protected:
RJP_value* m_event;
RJP_value* m_type;
RJP_value* m_content;
public:
constexpr explicit event(RJP_value* ev):
m_event(ev){}
explicit event(RJP_value* ev);
constexpr event(const event&) = default;
~event(void) = default;
constexpr event& operator=(const event&) = default;
@ -66,10 +66,14 @@ namespace matrix::sync{
*/
class room_event : public room_event_base, public event
{
protected:
RJP_value* m_id;
RJP_value* m_sender;
RJP_value* m_unsigned;
RJP_value* m_redacts;
int m_origin_server_ts;
public:
constexpr room_event(RJP_value* ev, const raii::string_base& roomid):
room_event_base(roomid), event(ev){}
room_event(RJP_value* ev, const raii::string_base& roomid);
raii::static_string eventid(void)const&;
raii::rjp_string eventid(void)&&;
raii::static_string sender(void)const&;
@ -88,9 +92,11 @@ namespace matrix::sync{
*/
class room_state_event : public room_event
{
protected:
RJP_value* m_state_key;
RJP_value* m_prev_content;
public:
constexpr room_state_event(RJP_value* ev, const raii::string_base& roomid):
room_event(ev, roomid){}
room_state_event(RJP_value* ev, const raii::string_base& roomid);
raii::static_string state_key(void)const&;
raii::rjp_string state_key(void)&&;
@ -104,8 +110,7 @@ namespace matrix::sync{
class room_ephemeral_event : public room_event_base, public event
{
public:
constexpr room_ephemeral_event(RJP_value* ev, const raii::string_base& roomid):
room_event_base(roomid),event(ev){}
room_ephemeral_event(RJP_value* ev, const raii::string_base& roomid);
};
}

View File

@ -8,34 +8,61 @@ namespace matrix::json{
constexpr raii::static_string True(void){return "true"_ss;}
constexpr raii::static_string False(void){return "false"_ss;}
constexpr raii::static_string reason(void){return "reason"_ss;}
constexpr raii::static_string error(void){return "error"_ss;}
constexpr raii::static_string errcode(void){return "errcode"_ss;}
constexpr raii::static_string retry_after(void){return "retry_after_ms"_ss;}
namespace keys{
namespace message{
constexpr raii::static_string body(void){return "body"_ss;}
constexpr raii::static_string info(void){return "info"_ss;}
namespace infobody{
constexpr raii::static_string height(void){return "h"_ss;}
constexpr raii::static_string width(void){return "w"_ss;}
constexpr raii::static_string mimetype(void){return "mimetype"_ss;}
constexpr raii::static_string size(void){return "size"_ss;}
constexpr raii::static_string thumbinfo(void){return "thumbnail_info"_ss;}
namespace thumbnail{
constexpr raii::static_string height(void){return message::infobody::height();}
constexpr raii::static_string width(void){return message::infobody::width();}
constexpr raii::static_string mimetype(void){return message::infobody::mimetype();}
constexpr raii::static_string size(void){return message::infobody::size();}
constexpr raii::static_string error(void){return "error"_ss;}
constexpr raii::static_string errcode(void){return "errcode"_ss;}
constexpr raii::static_string retry_after(void){return "retry_after_ms"_ss;}
constexpr raii::static_string joined(void){return "joined"_ss;}
constexpr raii::static_string chunk(void){return "chunk"_ss;}
constexpr raii::static_string newversion(void){return "new_version"_ss;}
constexpr raii::static_string presence(void){return "presence"_ss;}
constexpr raii::static_string displayname(void){return "displayname"_ss;}
constexpr raii::static_string avatarurl(void){return "avatar_url"_ss;}
constexpr raii::static_string joinedrooms(void){return "joined_rooms"_ss;}
constexpr raii::static_string contenturi(void){return "content_uri"_ss;}
constexpr raii::static_string name(void){return "name"_ss;}
constexpr raii::static_string roomaliasname(void){return "room_alias_name"_ss;}
constexpr raii::static_string typing(void){return "typing"_ss;}
constexpr raii::static_string timeout(void){return "timeout"_ss;}
constexpr raii::static_string session(void){return "session"_ss;}
namespace event{
constexpr raii::static_string type(void){return "type"_ss;}
constexpr raii::static_string content(void){return "content"_ss;}
constexpr raii::static_string eventid(void){return "event_id"_ss;}
constexpr raii::static_string sender(void){return "sender"_ss;}
constexpr raii::static_string origin_server_ts(void){return "origin_server_ts"_ss;}
constexpr raii::static_string roomid(void){return "room_id"_ss;}
constexpr raii::static_string extra(void){return "unsigned"_ss;}
constexpr raii::static_string state_key(void){return "state_key"_ss;}
constexpr raii::static_string prev_content(void){return "prev_content"_ss;}
constexpr raii::static_string redacts(void){return "redacts"_ss;}
namespace contentbody{
constexpr raii::static_string body(void){return "body"_ss;}
constexpr raii::static_string info(void){return "info"_ss;}
namespace infobody{
constexpr raii::static_string height(void){return "h"_ss;}
constexpr raii::static_string width(void){return "w"_ss;}
constexpr raii::static_string mimetype(void){return "mimetype"_ss;}
constexpr raii::static_string size(void){return "size"_ss;}
constexpr raii::static_string thumbinfo(void){return "thumbnail_info"_ss;}
namespace thumbnail{
constexpr raii::static_string height(void){return infobody::height();}
constexpr raii::static_string width(void){return infobody::width();}
constexpr raii::static_string mimetype(void){return infobody::mimetype();}
constexpr raii::static_string size(void){return infobody::size();}
}
constexpr raii::static_string thumburl(void){return "thumbnail_url"_ss;}
}
constexpr raii::static_string thumburl(void){return "thumbnail_url"_ss;}
constexpr raii::static_string msgtype(void){return "msgtype"_ss;}
constexpr raii::static_string url(void){return "url"_ss;}
}
constexpr raii::static_string msgtype(void){return "msgtype"_ss;}
constexpr raii::static_string url(void){return "url"_ss;}
}
namespace auth{
constexpr raii::static_string type(void){return "type"_ss;}
constexpr raii::static_string type(void){return event::type();}
constexpr raii::static_string medium(void){return "medium"_ss;}
constexpr raii::static_string address(void){return "address"_ss;}
constexpr raii::static_string identifier(void){return "identifier"_ss;}
@ -67,27 +94,6 @@ namespace matrix::json{
constexpr raii::static_string password(void){return auth::password();}
}
}
namespace rooms{
constexpr raii::static_string joined(void){return "joined"_ss;}
constexpr raii::static_string eventid(void){return "event_id"_ss;}
constexpr raii::static_string chunk(void){return "chunk"_ss;}
constexpr raii::static_string newversion(void){return "new_version"_ss;}
}
namespace client{
constexpr raii::static_string presence(void){return "presence"_ss;}
constexpr raii::static_string displayname(void){return "displayname"_ss;}
constexpr raii::static_string avatarurl(void){return "avatar_url"_ss;}
constexpr raii::static_string roomid(void){return "room_id"_ss;}
constexpr raii::static_string joinedrooms(void){return "joined_rooms"_ss;}
constexpr raii::static_string contenturi(void){return "content_uri"_ss;}
constexpr raii::static_string name(void){return "name"_ss;}
constexpr raii::static_string roomaliasname(void){return "room_alias_name"_ss;}
constexpr raii::static_string typing(void){return "typing"_ss;}
constexpr raii::static_string timeout(void){return "timeout"_ss;}
}
namespace session{
constexpr raii::static_string session(void){return "session"_ss;}
}
}
namespace stdstrings{
namespace error{

View File

@ -45,19 +45,19 @@ namespace matrix{
return netreturn<void>(raii::string(), raii::string(), http_status());
}
netreturn<raii::rjp_string> client::get_presence(const raii::string_base& userid){
return _get_and_find(m_urls->presence(*m_ses, userid), json::keys::client::presence());
return _get_and_find(m_urls->presence(*m_ses, userid), json::keys::presence());
}
//networked getter
netreturn<raii::rjp_string> client::get_display_name(void)const{
return _get_and_find(m_urls->displayname(), json::keys::client::displayname());
return _get_and_find(m_urls->displayname(), json::keys::displayname());
}
netreturn<raii::rjp_string> client::get_profile_picture(void)const{
return _get_and_find(m_urls->profile_picture(), json::keys::client::avatarurl());
return _get_and_find(m_urls->profile_picture(), json::keys::avatarurl());
}
netreturn<raii::rjp_string> client::room_alias_to_id(const raii::string_base& alias)const{
auto tmp = m_curl.encode(alias, alias.length());
return _get_and_find(raii::string(m_urls->alias_lookup() + tmp), json::keys::client::roomid());
return _get_and_find(raii::string(m_urls->alias_lookup() + tmp), json::keys::event::roomid());
}
netreturn<std::vector<raii::rjp_string>> client::list_rooms(void)const{
raii::string reply = _get_curl(m_urls->room_list());
@ -69,7 +69,7 @@ namespace matrix{
if(!root)
return retval;
RJP_search_res res = rjp_search_member(root.get(), json::keys::client::joinedrooms(), 0);
RJP_search_res res = rjp_search_member(root.get(), json::keys::joinedrooms(), 0);
if(!res.value)
return retval;
@ -81,7 +81,7 @@ namespace matrix{
//room membership
netreturn<raii::rjp_string> client::create_room(const raii::string_base& name, const raii::string_base& alias)const{
return _post_and_find(json::_create_room(name, alias), m_urls->create_room(), raii::curl_llist(), json::keys::client::roomid());
return _post_and_find(json::_create_room(name, alias), m_urls->create_room(), raii::curl_llist(), json::keys::event::roomid());
}
roomcxn client::spawn_room(const raii::string_base& roomid)const{
return roomcxn(m_ses, roomid);
@ -225,7 +225,7 @@ namespace matrix{
netreturn<uploaded_file> retval = _create_netreturn(root, http_status());
if(!root)
return retval;
RJP_search_res res = rjp_search_member(root.get(), json::keys::client::contenturi(), 0);
RJP_search_res res = rjp_search_member(root.get(), json::keys::contenturi(), 0);
if(!res.value)
return retval;
retval.value().m_fileurl = res.value;

View File

@ -17,93 +17,92 @@
*/
#include "matrix/events.hpp"
#include "matrix/json_targets.hpp"
namespace matrix::sync{
//Event base
event::event(RJP_value* 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){}
raii::static_string event::type(void)const&{
RJP_search_res res = rjp_search_member(m_event, "type", 0);
return raii::static_string(rjp_value_string(res.value), rjp_value_string_length(res.value));
return raii::static_string(rjp_value_string(m_type), rjp_value_string_length(m_type));
}
raii::rjp_string event::type(void)&&{
RJP_search_res res = rjp_search_member(m_event, "type", 0);
return raii::rjp_string(res.value);
return raii::rjp_string(std::exchange(m_type, nullptr));
}
const RJP_value* event::content(void)const{
RJP_search_res res = rjp_search_member(m_event, "content", 0);
return res.value;
return m_content;
}
RJP_value* event::content(void){
RJP_search_res res = rjp_search_member(m_event, "content", 0);
return res.value;
return m_content;
}
//Room event
room_event::room_event(RJP_value* ev, const raii::string_base& roomid):
room_event_base(roomid), event(ev),
m_id(rjp_search_member(ev, json::keys::event::eventid(), 0).value),
m_sender(rjp_search_member(ev, json::keys::event::sender(), 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_origin_server_ts(rjp_value_integer(rjp_search_member(ev, json::keys::event::origin_server_ts(), 0).value)){}
raii::static_string room_event::eventid(void)const&{
RJP_search_res res = rjp_search_member(m_event, "event_id", 0);
return raii::static_string(rjp_value_string(res.value), rjp_value_string_length(res.value));
return raii::static_string(rjp_value_string(m_id), rjp_value_string_length(m_id));
}
raii::rjp_string room_event::eventid(void)&&{
RJP_search_res res = rjp_search_member(m_event, "event_id", 0);
return raii::rjp_string(res.value);
return raii::rjp_string(std::exchange(m_id, nullptr));
}
raii::static_string room_event::sender(void)const&{
RJP_search_res res = rjp_search_member(m_event, "sender", 0);
return raii::static_string(rjp_value_string(res.value), rjp_value_string_length(res.value));
return raii::static_string(rjp_value_string(m_sender), rjp_value_string_length(m_sender));
}
raii::rjp_string room_event::sender(void)&&{
RJP_search_res res = rjp_search_member(m_event, "sender", 0);
return raii::rjp_string(res.value);
return raii::rjp_string(std::exchange(m_sender, nullptr));
}
int room_event::origin_server_ts(void)const{
RJP_search_res res = rjp_search_member(m_event, "origin_server_ts", 0);
return rjp_value_integer(res.value);
return m_origin_server_ts;
}
const RJP_value* room_event::extra(void)const{
RJP_search_res res = rjp_search_member(m_event, "unsigned", 0);
return res.value;
return m_unsigned;
}
RJP_value* room_event::extra(void){
RJP_search_res res = rjp_search_member(m_event, "unsigned", 0);
return res.value;
return m_unsigned;
}
raii::static_string room_event::redacts(void)const&{
RJP_search_res res = rjp_search_member(m_event, "redacts", 0);
return raii::static_string(rjp_value_string(res.value), rjp_value_string_length(res.value));
if(!m_redacts)
return raii::static_string();
return raii::static_string(rjp_value_string(m_redacts), rjp_value_string_length(m_redacts));
}
raii::rjp_string room_event::redacts(void)&&{
RJP_search_res res = rjp_search_member(m_event, "redacts", 0);
return raii::rjp_string(res.value);
if(!m_redacts)
return raii::rjp_string();
return raii::rjp_string(std::exchange(m_redacts, nullptr));
}
//Room state event
room_state_event::room_state_event(RJP_value* ev, const raii::string_base& roomid):
room_event(ev, roomid),
m_state_key(rjp_search_member(ev, json::keys::event::state_key(), 0).value),
m_prev_content(rjp_search_member(ev, json::keys::event::prev_content(), 0).value)
{
if(!m_prev_content && m_unsigned){
m_prev_content = rjp_search_member(m_unsigned, json::keys::event::prev_content(), 0).value;
}
}
raii::static_string room_state_event::state_key(void)const&{
RJP_search_res res = rjp_search_member(m_event, "state_key", 0);
return raii::static_string(rjp_value_string(res.value), rjp_value_string_length(res.value));
return raii::static_string(rjp_value_string(m_state_key), rjp_value_string_length(m_state_key));
}
raii::rjp_string room_state_event::state_key(void)&&{
RJP_search_res res = rjp_search_member(m_event, "state_key", 0);
return raii::rjp_string(res.value);
return raii::rjp_string(std::exchange(m_state_key, nullptr));
}
raii::static_string room_state_event::prev_content(void)const&{
RJP_search_res res = rjp_search_member(m_event, "prev_content", 0);
if(res.value)
return raii::static_string(rjp_value_string(res.value), rjp_value_string_length(res.value));
res = rjp_search_member(m_event, "unsigned", 0);
if(!res.value)
return raii::static_string{};
res = rjp_search_member(res.value, "prev_content", 0);
return raii::static_string(rjp_value_string(res.value), rjp_value_string_length(res.value));
return raii::static_string(rjp_value_string(m_prev_content), rjp_value_string_length(m_prev_content));
}
raii::rjp_string room_state_event::prev_content(void)&&{
RJP_search_res res = rjp_search_member(m_event, "prev_content", 0);
if(res.value)
return raii::rjp_string(res.value);
res = rjp_search_member(m_event, "unsigned", 0);
if(!res.value)
return raii::static_string{};
res = rjp_search_member(res.value, "prev_content", 0);
return raii::rjp_string(res.value);
return raii::rjp_string(std::exchange(m_prev_content, nullptr));
}
room_ephemeral_event::room_ephemeral_event(RJP_value* ev, const raii::string_base& roomid):
room_event_base(roomid), event(ev){}
}

View File

@ -68,76 +68,76 @@ namespace matrix::json{
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(image.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::height(), raii::itostr(image.height())),
member(json::keys::message::infobody::mimetype(), quote(image.mimetype())),
member(json::keys::message::infobody::size(), raii::itostr(image.size())),
member(json::keys::message::infobody::thumbinfo(), object(
member(json::keys::message::infobody::thumbnail::height(), raii::itostr(image.thumb_height())),
member(json::keys::message::infobody::thumbnail::mimetype(), quote(image.thumb_mimetype())),
member(json::keys::message::infobody::thumbnail::size(), raii::itostr(image.thumb_size())),
member(json::keys::message::infobody::thumbnail::width(), raii::itostr(image.thumb_width()))
member(json::keys::event::contentbody::body(), quote(raii::json_escape(image.name()))),
member(json::keys::event::contentbody::info(), object(
member(json::keys::event::contentbody::infobody::height(), raii::itostr(image.height())),
member(json::keys::event::contentbody::infobody::mimetype(), quote(image.mimetype())),
member(json::keys::event::contentbody::infobody::size(), raii::itostr(image.size())),
member(json::keys::event::contentbody::infobody::thumbinfo(), object(
member(json::keys::event::contentbody::infobody::thumbnail::height(), raii::itostr(image.thumb_height())),
member(json::keys::event::contentbody::infobody::thumbnail::mimetype(), quote(image.thumb_mimetype())),
member(json::keys::event::contentbody::infobody::thumbnail::size(), raii::itostr(image.thumb_size())),
member(json::keys::event::contentbody::infobody::thumbnail::width(), raii::itostr(image.thumb_width()))
)),
member(json::keys::message::infobody::thumburl(), quote(raii::json_escape(*thumburl))),
member(json::keys::message::infobody::width(), raii::itostr(image.width()))
member(json::keys::event::contentbody::infobody::thumburl(), quote(raii::json_escape(*thumburl))),
member(json::keys::event::contentbody::infobody::width(), raii::itostr(image.width()))
)),
member(json::keys::message::msgtype(), quote("m.image"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(url)))
member(json::keys::event::contentbody::msgtype(), quote("m.image"_ss)),
member(json::keys::event::contentbody::url(), quote(raii::json_escape(url)))
));
}
raii::string _video_body(const uploaded_video& video){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(video.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::height(), raii::itostr(video.height())),
member(json::keys::message::infobody::mimetype(), quote(video.mimetype())),
member(json::keys::message::infobody::size(), raii::itostr(video.size())),
member(json::keys::message::infobody::thumbinfo(), object(
member(json::keys::message::infobody::thumbnail::height(), raii::itostr(video.thumb_height())),
member(json::keys::message::infobody::thumbnail::mimetype(), quote(video.thumb_mimetype())),
member(json::keys::message::infobody::thumbnail::size(), raii::itostr(video.thumb_size())),
member(json::keys::message::infobody::thumbnail::width(), raii::itostr(video.thumb_width()))
member(json::keys::event::contentbody::body(), quote(raii::json_escape(video.name()))),
member(json::keys::event::contentbody::info(), object(
member(json::keys::event::contentbody::infobody::height(), raii::itostr(video.height())),
member(json::keys::event::contentbody::infobody::mimetype(), quote(video.mimetype())),
member(json::keys::event::contentbody::infobody::size(), raii::itostr(video.size())),
member(json::keys::event::contentbody::infobody::thumbinfo(), object(
member(json::keys::event::contentbody::infobody::thumbnail::height(), raii::itostr(video.thumb_height())),
member(json::keys::event::contentbody::infobody::thumbnail::mimetype(), quote(video.thumb_mimetype())),
member(json::keys::event::contentbody::infobody::thumbnail::size(), raii::itostr(video.thumb_size())),
member(json::keys::event::contentbody::infobody::thumbnail::width(), raii::itostr(video.thumb_width()))
)),
member(json::keys::message::infobody::thumburl(), quote(raii::json_escape(video.thumb_url()))),
member(json::keys::message::infobody::width(), raii::itostr(video.width()))
member(json::keys::event::contentbody::infobody::thumburl(), quote(raii::json_escape(video.thumb_url()))),
member(json::keys::event::contentbody::infobody::width(), raii::itostr(video.width()))
)),
member(json::keys::message::msgtype(), quote("m.video"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(video.url())))
member(json::keys::event::contentbody::msgtype(), quote("m.video"_ss)),
member(json::keys::event::contentbody::url(), quote(raii::json_escape(video.url())))
));
}
raii::string _file_body(const uploaded_file& file){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(file.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::size(), raii::itostr(file.size()))
member(json::keys::event::contentbody::body(), quote(raii::json_escape(file.name()))),
member(json::keys::event::contentbody::info(), object(
member(json::keys::event::contentbody::infobody::size(), raii::itostr(file.size()))
)),
member(json::keys::message::msgtype(), quote("m.file"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(file.url())))
member(json::keys::event::contentbody::msgtype(), quote("m.file"_ss)),
member(json::keys::event::contentbody::url(), quote(raii::json_escape(file.url())))
));
}
raii::string _audio_body(const uploaded_audio& audio){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(audio.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::mimetype(), quote(audio.mimetype())),
member(json::keys::message::infobody::size(), raii::itostr(audio.size()))
member(json::keys::event::contentbody::body(), quote(raii::json_escape(audio.name()))),
member(json::keys::event::contentbody::info(), object(
member(json::keys::event::contentbody::infobody::mimetype(), quote(audio.mimetype())),
member(json::keys::event::contentbody::infobody::size(), raii::itostr(audio.size()))
)),
member(json::keys::message::msgtype(), quote("m.audio"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(audio.url())))
member(json::keys::event::contentbody::msgtype(), quote("m.audio"_ss)),
member(json::keys::event::contentbody::url(), quote(raii::json_escape(audio.url())))
));
}
raii::string _message_body(const raii::string_base& msg){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(msg))),
member(json::keys::message::msgtype(), quote("m.text"_ss))
member(json::keys::event::contentbody::body(), quote(raii::json_escape(msg))),
member(json::keys::event::contentbody::msgtype(), quote("m.text"_ss))
));
}
raii::string _login_password(const raii::string_base& username, const raii::string_base& password){
@ -166,32 +166,32 @@ namespace matrix::json{
raii::string _displayname_set(const raii::string_base& newname){
return raii::string(
object(
member(json::keys::client::displayname(), quote(raii::json_escape(newname)))
member(json::keys::displayname(), quote(raii::json_escape(newname)))
));
}
raii::string _avatar_set(const raii::string_base& mediaurl){
return raii::string(
object(
member(json::keys::client::avatarurl(), quote(raii::json_escape(mediaurl)))
member(json::keys::avatarurl(), quote(raii::json_escape(mediaurl)))
));
}
raii::string _presence_set(const raii::string_base& status){
return raii::string(
object(
member(json::keys::client::presence(), quote(status))
member(json::keys::presence(), quote(status))
));
}
raii::string _create_room(const raii::string_base& name, const raii::string_base& alias){
if(alias){
return raii::string(
object(
member(json::keys::client::name(), quote(raii::json_escape(name))),
member(json::keys::client::roomaliasname(), quote(raii::json_escape(alias)))
member(json::keys::name(), quote(raii::json_escape(name))),
member(json::keys::roomaliasname(), quote(raii::json_escape(alias)))
));
}else{
return raii::string(
object(
member(json::keys::client::name(), quote(raii::json_escape(name)))
member(json::keys::name(), quote(raii::json_escape(name)))
));
}
}
@ -211,8 +211,8 @@ namespace matrix::json{
raii::string _typing(bool active, int timeout){
return raii::string(
object(
member(json::keys::client::typing(), active ? json::True() : json::False()),
member(json::keys::client::timeout(), raii::itostr(timeout))
member(json::keys::typing(), active ? json::True() : json::False()),
member(json::keys::timeout(), raii::itostr(timeout))
));
}
raii::string _redact(const raii::string_base& reason){
@ -224,7 +224,7 @@ namespace matrix::json{
raii::string _room_upgrade(int version){
return raii::string(
object(
member(json::keys::rooms::newversion(), raii::itostr(version))
member(json::keys::newversion(), raii::itostr(version))
));
}
}

View File

@ -59,7 +59,7 @@ namespace matrix{
if(!resp) return _create_netreturn(resp, http_status());
raii::rjp_ptr root(rjp_parse(resp.get()));
if(!root) return _create_netreturn(root, http_status());
RJP_search_res res = rjp_search_member(root.get(), json::keys::rooms::joined(), 0);
RJP_search_res res = rjp_search_member(root.get(), json::keys::joined(), 0);
if(!res.value) return _create_netreturn(root, http_status());
for(RJP_value* mem = rjp_get_member(res.value);mem;mem = rjp_next_member(mem)){
@ -108,7 +108,7 @@ namespace matrix{
raii::rjp_ptr root(rjp_parse(reply));
netreturn<raii::rjp_string> retval = _create_netreturn(root, http_status());
retval.value() = _curl_reply_search(root, json::keys::rooms::eventid());
retval.value() = _curl_reply_search(root, json::keys::event::eventid());
return retval;
}
netreturn<raii::rjp_string> roomcxn::send_message(const raii::string_base& text)const{
@ -134,7 +134,7 @@ namespace matrix{
}
netreturn<raii::rjp_string> 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::rooms::eventid());
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());
}
netreturn<raii::rjp_string> roomcxn::redact_event(const raii::string_base& eventid)const{
return redact_event(eventid, "No reason given"_ss);
@ -146,7 +146,7 @@ namespace matrix{
if(!root.get()) _create_netreturn(root, http_status());
netreturn<sync::roomcxn_message_event_list> retval = _create_netreturn(root, http_status());
RJP_value* chunk = rjp_search_member(root.get(), json::keys::rooms::chunk(), 0).value;
RJP_value* chunk = rjp_search_member(root.get(), json::keys::chunk(), 0).value;
if(!chunk) return retval;
retval.value() = sync::roomcxn_message_event_list(root, rjp_get_element(chunk), m_roomid);
return retval;
@ -168,7 +168,7 @@ namespace matrix{
m_urls.repopulate(*m_ses, m_roomid);
}
netreturn<raii::rjp_string> roomcxn::upgrade(int version)const{
return _post_and_find(json::_room_upgrade(version), m_urls.upgrade(*m_ses, m_roomid), raii::curl_llist(), json::keys::rooms::eventid());
return _post_and_find(json::_room_upgrade(version), m_urls.upgrade(*m_ses, m_roomid), raii::curl_llist(), json::keys::event::eventid());
}
netreturn<raii::rjp_string> roomcxn::_send_message(const raii::string_base& msg)const{

View File

@ -88,7 +88,7 @@ namespace matrix{
return retval;
//attempt to change password via username/password login
RJP_search_res res = rjp_search_member(root.get(), json::keys::session::session(), 0);
RJP_search_res res = rjp_search_member(root.get(), json::keys::session(), 0);
raii::string request = json::_change_psk_password(m_ses->userid, newpass, oldpass, raii::rjp_string(res.value));
reply = _post_curl(request, rest::session_urls::password(*m_ses), raii::curl_llist());
return _create_netreturn(reply, http_status());

View File

@ -64,29 +64,38 @@ void write_to_auth_file(const char* filename, const matrix::auth_data& auth){
fp.write(output);
}
int main(){
matrix::session login_to_homeserver(void){
matrix::auth_data auth = read_auth_file("auth_file");
//login to homeserver
matrix::session ses(auth);
if(!ses.valid()){
fprintf(stderr, "Failed to init matrix session!\n");
return 1;
std::exit(1);
}
if(!auth.access_token){
auth.access_token = ses.access_token();
write_to_auth_file("auth_file", auth);
}
fprintf(stderr, "Succ\n");
return ses;
}
std::atomic_bool should_quit = false;
int main(){
matrix::session ses = login_to_homeserver();
auto client = ses.spawn_client();
auto sync_res = client.sync(0).value();
while(true){
sync_res = client.sync(30000, sync_res).value();
for(auto room : sync_res.room_join_events()){
auto r = client.spawn_room(room.roomid());
for(auto event : room.timeline_events()){
printf("%s\n", event.sender().get());
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);
}
}
}
}