Changed event structures to keep persistent handles to resources
This commit is contained in:
parent
9cf6905ea3
commit
4f5efa9ba9
@ -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);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@ -8,12 +8,38 @@ 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;}
|
||||
|
||||
namespace keys{
|
||||
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 keys{
|
||||
namespace message{
|
||||
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{
|
||||
@ -23,19 +49,20 @@ namespace matrix::json{
|
||||
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 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 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{
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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){}
|
||||
|
||||
}
|
||||
|
||||
@ -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))
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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{
|
||||
|
||||
@ -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());
|
||||
|
||||
17
src/test.cpp
17
src/test.cpp
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user