Added netreturn class template for error handling of networked functions. Implemented invite, ban, unban, and kick

This commit is contained in:
rexy712
2019-10-19 08:55:05 -07:00
parent bb6c39a109
commit c2f4380aee
7 changed files with 283 additions and 78 deletions

View File

@@ -23,7 +23,9 @@
#include "raii/string.hpp"
#include "raii/rjp_string.hpp"
#include "raii/binary.hpp"
#include "raii/rjp_ptr.hpp"
#include "matrix/session_info.hpp"
#include "matrix/netreturn.hpp"
#include <memory> //shared_ptr
namespace matrix{
@@ -92,7 +94,11 @@ namespace matrix{
raii::rjp_string _post_and_find(const raii::string_base& data, const raii::string_base& url, const raii::curl_llist& header, const raii::string_base& target)const;
raii::rjp_string _get_and_find(const raii::string_base& url, const raii::string_base& search)const;
raii::rjp_string _curl_reply_search(const raii::string_base& reply, const raii::string_base& search)const;
raii::rjp_string _curl_reply_search(const raii::rjp_ptr& root, const raii::string_base& search)const;
void _set_curl_defaults(const raii::string_base& useragent)const;
static netreturn_base _create_netreturn(const raii::string_base& mxjson, int httpstatus);
static netreturn_base _create_netreturn(const raii::rjp_ptr& root, int httpstatus);
};
}

View File

@@ -0,0 +1,87 @@
/**
This file is a part of rexy's matrix client
Copyright (C) 2019 rexy712
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef MATRIX_NETRETURN_HPP
#define MATRIX_NETRETURN_HPP
#include "raii/rjp_string.hpp"
#include <utility> //std::forward
namespace matrix{
class netreturn_base
{
protected:
raii::rjp_string m_error = {};
raii::rjp_string m_errorcode = {};
int m_http_error = 200;
public:
constexpr netreturn_base(void) = default;
netreturn_base(const raii::rjp_string& error, const raii::rjp_string& errorcode, int httpstatus);
netreturn_base(const raii::rjp_string& error, raii::rjp_string&& errorcode, int httpstatus);
netreturn_base(raii::rjp_string&& error, const raii::rjp_string& errorcode, int httpstatus);
netreturn_base(raii::rjp_string&& error, raii::rjp_string&& errorcode, int httpstatus);
operator bool(void)const;
const raii::rjp_string mxerror(void)const;
const raii::rjp_string mxerrorcode(void)const;
int httpstatus(void)const;
};
template<class Retval>
class netreturn : public netreturn_base
{
public:
using value_type = Retval;
private:
Retval m_ret = {};
public:
constexpr netreturn(void) = default;
template<class Str1, class Str2, class Val>
netreturn(Str1&& error, Str2&& errorcode, int httpcode, Val&& val = Val()):
netreturn_base(std::forward<Str1>(error), std::forward<Str2>(errorcode), httpcode),
m_ret(std::forward<Val>(val)){}
netreturn(netreturn_base&& n):
netreturn_base(std::move(n)){}
netreturn(const netreturn_base& n):
netreturn_base(n){}
Retval& value(void){
return m_ret;
}
const Retval& value(void)const{
return m_ret;
}
};
template<>
class netreturn<void> : public netreturn_base
{
public:
using value_type = void;
public:
template<class Str1, class Str2>
netreturn(Str1&& error, Str2&& errorcode, int httpcode):
netreturn_base(std::forward<Str1>(error), std::forward<Str2>(errorcode), httpcode){}
netreturn(netreturn_base&& n):
netreturn_base(std::move(n)){}
netreturn(const netreturn_base& n):
netreturn_base(n){}
};
}
#endif

View File

@@ -25,6 +25,7 @@
#include "raii/rjp_string.hpp"
#include "matrix/room_url_list.hpp"
#include "matrix/iterable.hpp"
#include "matrix/netreturn.hpp"
#include <vector>
@@ -48,40 +49,48 @@ namespace matrix{
roomcxn& operator=(roomcxn&&) = default;
//membership
bool join_room(void)const;
bool leave_room(void)const;
[[deprecated("Use client::join_room instead")]]
bool accept_invite(void)const;
[[deprecated("Use client::leave_room instead")]]
bool reject_invite(void)const;
std::vector<raii::rjp_string> members(void)const;
netreturn<void> join(void)const;
netreturn<void> leave(void)const;
[[deprecated("Use roomcxn::join_room instead")]]
netreturn<void> accept_invite(void)const;
[[deprecated("Use roomcxn::leave_room instead")]]
netreturn<void> reject_invite(void)const;
netreturn<std::vector<raii::rjp_string>> members(void)const;
//member management
netreturn<void> invite(const raii::string_base& userid);
[[deprecated("Use roomcxn::kick instead")]]
netreturn<void> uninvite(const raii::string_base& userid, const raii::string_base& reason = raii::string());
netreturn<void> kick(const raii::string_base& userid, const raii::string_base& reason = raii::string());
netreturn<void> ban(const raii::string_base& userid, const raii::string_base& reason = raii::string());
netreturn<void> unban(const raii::string_base& userid);
//sending events
raii::rjp_string send_custom_event(const raii::string_base& event, const raii::string_base& eventtype)const;
raii::rjp_string send_message(const raii::string_base& text)const;
raii::rjp_string send_file(const uploaded_file& file)const;
raii::rjp_string send_image(const uploaded_image& image)const;
raii::rjp_string send_video(const uploaded_video& video)const;
raii::rjp_string send_audio(const uploaded_audio& audio)const;
bool send_typing(bool active, int timeout = 5000)const;
bool send_read_receipt(const raii::string_base& eventid)const;
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_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<void> send_typing(bool active, int timeout = 5000)const;
netreturn<void> send_read_receipt(const raii::string_base& eventid)const;
raii::rjp_string redact_event(const raii::string_base& eventid, const raii::string_base& reason)const;
raii::rjp_string redact_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;
//recieve events
sync::roomcxn_message_event_list get_events_forward(int amount);
sync::roomcxn_message_event_list get_events_backward(int amount);
sync::roomcxn_message_event_list get_events_forward(int amount, const raii::string_base& from, const raii::string_base& to);
sync::roomcxn_message_event_list get_events_backward(int amount, const raii::string_base& from, const raii::string_base& to);
netreturn<sync::roomcxn_message_event_list> get_events_forward(int amount);
netreturn<sync::roomcxn_message_event_list> get_events_backward(int amount);
netreturn<sync::roomcxn_message_event_list> get_events_forward(int amount, const raii::string_base& from, const raii::string_base& to);
netreturn<sync::roomcxn_message_event_list> get_events_backward(int amount, const raii::string_base& from, const raii::string_base& to);
//meta stuff
void regenerate_urls(void);
raii::rjp_string upgrade(int version)const;
netreturn<raii::rjp_string> upgrade(int version)const;
private:
sync::roomcxn_message_event_list _get_events(int amount, raii::static_string direction, const raii::string_base& from, const raii::string_base& to);
raii::rjp_string _send_message(const raii::string_base& msg)const;
netreturn<sync::roomcxn_message_event_list> _get_events(int amount, raii::static_string direction, const raii::string_base& from, const raii::string_base& to);
netreturn<raii::rjp_string> _send_message(const raii::string_base& msg)const;
};
}