Add individual event access to roomcxn. Add m.notice helper function for bots

This commit is contained in:
rexy712 2020-01-18 20:01:49 -08:00
parent cfe4d67bff
commit 341cbc5c6d
7 changed files with 45 additions and 3 deletions

View File

@ -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&;

View File

@ -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);

View File

@ -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;

View File

@ -69,13 +69,16 @@ namespace matrix{
//sending events
netreturn<raii::rjp_string> send_custom_event(const raii::string_base& event, const raii::string_base& eventtype)const;
netreturn<raii::rjp_string> send_message(const raii::string_base& text)const;
netreturn<raii::rjp_string> send_notice(const raii::string_base& text)const;
netreturn<raii::rjp_string> send_file(const uploaded_file& file)const;
netreturn<raii::rjp_string> send_image(const uploaded_image& image)const;
netreturn<raii::rjp_string> send_video(const uploaded_video& video)const;
netreturn<raii::rjp_string> send_audio(const uploaded_audio& audio)const;
netreturn<raii::rjp_string> forward_event(const sync::room_event&)const;
netreturn<void> send_typing(bool active, int timeout = 5000)const;
netreturn<void> send_read_receipt(const raii::string_base& eventid)const;
netreturn<sync::roomcxn_message_event_list> get_event(const raii::string_base& eventid)const;
netreturn<raii::rjp_string> redact_event(const raii::string_base& eventid, const raii::string_base& reason)const;
netreturn<raii::rjp_string> redact_event(const raii::string_base& eventid)const;

View File

@ -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(

View File

@ -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);
}

View File

@ -114,6 +114,9 @@ namespace matrix{
netreturn<raii::rjp_string> roomcxn::send_message(const raii::string_base& text)const{
return _send_message(json::_message_body(text));
}
netreturn<raii::rjp_string> roomcxn::send_notice(const raii::string_base& text)const{
return _send_message(json::_notice_body(text));
}
netreturn<raii::rjp_string> roomcxn::send_file(const uploaded_file& file)const{
return _send_message(json::_file_body(file));
}
@ -126,6 +129,10 @@ namespace matrix{
netreturn<raii::rjp_string> roomcxn::send_audio(const uploaded_audio& audio)const{
return _send_message(json::_audio_body(audio));
}
netreturn<raii::rjp_string> 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<void> 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<sync::roomcxn_message_event_list> 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<sync::roomcxn_message_event_list> retval = _create_netreturn(root, http_status());
retval.value() = sync::roomcxn_message_event_list(root, root.get(), m_roomid);
return retval;
}
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::event::eventid());
}