diff --git a/doc/TODO b/doc/TODO index 435cad6..95f3337 100644 --- a/doc/TODO +++ b/doc/TODO @@ -25,7 +25,6 @@ matrix: sync: 3:filters room: - 10:query previous messages 3:message query filters 2:kick users 2:ban/unban users diff --git a/include/matrix/iterable.hpp b/include/matrix/iterable.hpp index dce05b7..f9bc76c 100644 --- a/include/matrix/iterable.hpp +++ b/include/matrix/iterable.hpp @@ -36,6 +36,8 @@ namespace matrix::sync{ protected: raii::rjp_array_iterator m_event; public: + constexpr event_iterator(void): + m_event(nullptr){} constexpr event_iterator(RJP_value* v): m_event(v){} constexpr event_iterator(const event_iterator& i): @@ -60,10 +62,12 @@ namespace matrix::sync{ template class room_event_iterator { - private: + protected: raii::rjp_array_iterator m_event; raii::static_string m_roomid; public: + constexpr room_event_iterator(void): + m_event(nullptr), m_roomid(){} constexpr room_event_iterator(RJP_value* v, const raii::string_base& roomid): m_event(v), m_roomid(roomid){} constexpr room_event_iterator(const room_event_iterator& i): @@ -99,6 +103,7 @@ namespace matrix::sync{ protected: iterator m_event; public: + constexpr iterable_event_base(void) = default; constexpr iterable_event_base(RJP_value* ev): m_event(ev){} constexpr iterable_event_base(const iterable_event_base& i): @@ -122,6 +127,7 @@ namespace matrix::sync{ protected: iterator m_event; public: + constexpr iterable_room_event_base(void) = default; constexpr iterable_room_event_base(RJP_value* ev, const raii::string_base& roomid): m_event(ev, roomid){} constexpr iterable_room_event_base(const iterable_room_event_base& i): @@ -159,8 +165,25 @@ namespace matrix::sync{ public: using iterable_room_event_base>::iterable_room_event_base; }; - - + template + class roomcxn_event_list_base : public iterable_room_event_base> + { + protected: + raii::rjp_ptr m_root; + public: + constexpr roomcxn_event_list_base(void) = default; + roomcxn_event_list_base(raii::rjp_ptr& root, RJP_value* event, const raii::string_base& roomid); + raii::static_string start_token(void)const&; + raii::rjp_string start_token(void)&&; + raii::static_string end_token(void)const&; + raii::rjp_string end_token(void)&&; + }; + extern template class roomcxn_event_list_base; + class roomcxn_message_event_list : public roomcxn_event_list_base + { + public: + using roomcxn_event_list_base::roomcxn_event_list_base; + }; } #endif diff --git a/include/matrix/roomcxn.hpp b/include/matrix/roomcxn.hpp index 06f210c..7b1eab3 100644 --- a/include/matrix/roomcxn.hpp +++ b/include/matrix/roomcxn.hpp @@ -24,6 +24,7 @@ #include "raii/string.hpp" #include "raii/rjp_string.hpp" #include "matrix/room_url_list.hpp" +#include "matrix/iterable.hpp" #include @@ -69,14 +70,17 @@ namespace matrix{ raii::rjp_string redact_event(const raii::string_base& eventid)const; //recieve events - raii::string get_events_forward(int amount); - raii::string get_events_backward(int amount); + 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); //meta stuff void regenerate_urls(void); 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; }; diff --git a/src/matrix/iterable.cpp b/src/matrix/iterable.cpp new file mode 100644 index 0000000..a62d642 --- /dev/null +++ b/src/matrix/iterable.cpp @@ -0,0 +1,47 @@ +/** + This file is a part of r0nk, atlas_moon, and 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 . +*/ + +#include "matrix/iterable.hpp" + +namespace matrix::sync{ + template + roomcxn_event_list_base::roomcxn_event_list_base(raii::rjp_ptr& root, RJP_value* event, const raii::string_base& roomid): + iterable_room_event_base>(event, roomid), + m_root(root.release()){} + template + raii::static_string roomcxn_event_list_base::start_token(void)const&{ + RJP_value* st = rjp_search_member(m_root.get(), "start", 0).value; + return raii::static_string(rjp_value_string(st), rjp_value_string_length(st)); + } + template + raii::rjp_string roomcxn_event_list_base::start_token(void)&&{ + return raii::rjp_string(rjp_search_member(m_root.get(), "start", 0).value); + } + template + raii::static_string roomcxn_event_list_base::end_token(void)const&{ + RJP_value* st = rjp_search_member(m_root.get(), "end", 0).value; + return raii::static_string(rjp_value_string(st), rjp_value_string_length(st)); + } + template + raii::rjp_string roomcxn_event_list_base::end_token(void)&&{ + return raii::rjp_string(rjp_search_member(m_root.get(), "end", 0).value); + } + + template class roomcxn_event_list_base; +} + diff --git a/src/matrix/roomcxn.cpp b/src/matrix/roomcxn.cpp index b4d9a15..aa7dcfc 100644 --- a/src/matrix/roomcxn.cpp +++ b/src/matrix/roomcxn.cpp @@ -109,11 +109,26 @@ namespace matrix{ raii::rjp_string roomcxn::redact_event(const raii::string_base& eventid)const{ return redact_event(eventid, "No reason given"_ss); } - raii::string roomcxn::get_events_forward(int amount){ - return _get_curl(m_urls.messages(m_ses->homeserver, m_ses->access_token, m_curl.encode(m_roomid), ""_ss, raii::static_string(), "f"_ss, amount)); + sync::roomcxn_message_event_list roomcxn::_get_events(int amount, raii::static_string direction, const raii::string_base& from, const raii::string_base& to){ + raii::string reply = _get_curl(m_urls.messages(m_ses->homeserver, m_ses->access_token, m_curl.encode(m_roomid), from, to, direction, amount)); + if(!reply) return {}; + raii::rjp_ptr root(rjp_parse(reply.get())); + if(!root.get()) return {}; + RJP_value* chunk = rjp_search_member(root.get(), "chunk", 0).value; + if(!chunk) return {}; + return sync::roomcxn_message_event_list(root, rjp_get_element(chunk), m_roomid); } - raii::string roomcxn::get_events_backward(int amount){ - return _get_curl(m_urls.messages(m_ses->homeserver, m_ses->access_token, m_curl.encode(m_roomid), ""_ss, raii::static_string(), "b"_ss, amount)); + sync::roomcxn_message_event_list roomcxn::get_events_forward(int amount){ + return _get_events(amount, "f"_ss, ""_ss, ""_ss); + } + sync::roomcxn_message_event_list roomcxn::get_events_backward(int amount){ + return _get_events(amount, "b"_ss, ""_ss, ""_ss); + } + sync::roomcxn_message_event_list roomcxn::get_events_forward(int amount, const raii::string_base& from, const raii::string_base& to){ + return _get_events(amount, "f"_ss, from, to); + } + sync::roomcxn_message_event_list roomcxn::get_events_backward(int amount, const raii::string_base& from, const raii::string_base& to){ + return _get_events(amount, "b"_ss, from, to); } void roomcxn::regenerate_urls(void){ diff --git a/src/test.cpp b/src/test.cpp index 9f6b4a5..bc91720 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -72,6 +72,15 @@ int main(){ std::atomic_bool should_quit = false; auto syn = ses.spawn_syncer(); + auto client = ses.spawn_client(); + auto room = client.spawn_room("!roomid:matrix.org"_ss); + auto reply = room.get_events_backward(5); + printf("%s\n", reply.start_token().get()); + printf("%s\n", reply.end_token().get()); + for(auto event : reply){ + printf("%s\n", event.eventid().get()); + } + syn.sync(0); //auto room = ses.spawn_client().spawn_room("!OwuhlJnHlsmyPwiLIH:rexy712.chickenkiller.com"_ss);