Add ability to query previous messages from matrix::roomcxn

This commit is contained in:
rexy712 2019-09-02 11:31:45 -07:00
parent cc0206ce2c
commit 47c2c590d3
6 changed files with 107 additions and 10 deletions

View File

@ -25,7 +25,6 @@ matrix:
sync: sync:
3:filters 3:filters
room: room:
10:query previous messages
3:message query filters 3:message query filters
2:kick users 2:kick users
2:ban/unban users 2:ban/unban users

View File

@ -36,6 +36,8 @@ namespace matrix::sync{
protected: protected:
raii::rjp_array_iterator m_event; raii::rjp_array_iterator m_event;
public: public:
constexpr event_iterator(void):
m_event(nullptr){}
constexpr event_iterator(RJP_value* v): constexpr event_iterator(RJP_value* v):
m_event(v){} m_event(v){}
constexpr event_iterator(const event_iterator& i): constexpr event_iterator(const event_iterator& i):
@ -60,10 +62,12 @@ namespace matrix::sync{
template<class T> template<class T>
class room_event_iterator class room_event_iterator
{ {
private: protected:
raii::rjp_array_iterator m_event; raii::rjp_array_iterator m_event;
raii::static_string m_roomid; raii::static_string m_roomid;
public: public:
constexpr room_event_iterator(void):
m_event(nullptr), m_roomid(){}
constexpr room_event_iterator(RJP_value* v, const raii::string_base& roomid): constexpr room_event_iterator(RJP_value* v, const raii::string_base& roomid):
m_event(v), m_roomid(roomid){} m_event(v), m_roomid(roomid){}
constexpr room_event_iterator(const room_event_iterator& i): constexpr room_event_iterator(const room_event_iterator& i):
@ -99,6 +103,7 @@ namespace matrix::sync{
protected: protected:
iterator m_event; iterator m_event;
public: public:
constexpr iterable_event_base(void) = default;
constexpr iterable_event_base(RJP_value* ev): constexpr iterable_event_base(RJP_value* ev):
m_event(ev){} m_event(ev){}
constexpr iterable_event_base(const iterable_event_base& i): constexpr iterable_event_base(const iterable_event_base& i):
@ -122,6 +127,7 @@ namespace matrix::sync{
protected: protected:
iterator m_event; iterator m_event;
public: public:
constexpr iterable_room_event_base(void) = default;
constexpr iterable_room_event_base(RJP_value* ev, const raii::string_base& roomid): constexpr iterable_room_event_base(RJP_value* ev, const raii::string_base& roomid):
m_event(ev, roomid){} m_event(ev, roomid){}
constexpr iterable_room_event_base(const iterable_room_event_base& i): constexpr iterable_room_event_base(const iterable_room_event_base& i):
@ -159,8 +165,25 @@ namespace matrix::sync{
public: public:
using iterable_room_event_base<detail::room_event_iterator<room_ephemeral_event>>::iterable_room_event_base; using iterable_room_event_base<detail::room_event_iterator<room_ephemeral_event>>::iterable_room_event_base;
}; };
template<class T>
class roomcxn_event_list_base : public iterable_room_event_base<detail::room_event_iterator<T>>
{
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<room_state_event>;
class roomcxn_message_event_list : public roomcxn_event_list_base<room_state_event>
{
public:
using roomcxn_event_list_base<room_state_event>::roomcxn_event_list_base;
};
} }
#endif #endif

View File

@ -24,6 +24,7 @@
#include "raii/string.hpp" #include "raii/string.hpp"
#include "raii/rjp_string.hpp" #include "raii/rjp_string.hpp"
#include "matrix/room_url_list.hpp" #include "matrix/room_url_list.hpp"
#include "matrix/iterable.hpp"
#include <vector> #include <vector>
@ -69,14 +70,17 @@ namespace matrix{
raii::rjp_string redact_event(const raii::string_base& eventid)const; raii::rjp_string redact_event(const raii::string_base& eventid)const;
//recieve events //recieve events
raii::string get_events_forward(int amount); sync::roomcxn_message_event_list get_events_forward(int amount);
raii::string get_events_backward(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 //meta stuff
void regenerate_urls(void); void regenerate_urls(void);
raii::rjp_string upgrade(int version)const; raii::rjp_string upgrade(int version)const;
private: 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; raii::rjp_string _send_message(const raii::string_base& msg)const;
}; };

47
src/matrix/iterable.cpp Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#include "matrix/iterable.hpp"
namespace matrix::sync{
template<class T>
roomcxn_event_list_base<T>::roomcxn_event_list_base(raii::rjp_ptr& root, RJP_value* event, const raii::string_base& roomid):
iterable_room_event_base<detail::room_event_iterator<T>>(event, roomid),
m_root(root.release()){}
template<class T>
raii::static_string roomcxn_event_list_base<T>::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<class T>
raii::rjp_string roomcxn_event_list_base<T>::start_token(void)&&{
return raii::rjp_string(rjp_search_member(m_root.get(), "start", 0).value);
}
template<class T>
raii::static_string roomcxn_event_list_base<T>::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<class T>
raii::rjp_string roomcxn_event_list_base<T>::end_token(void)&&{
return raii::rjp_string(rjp_search_member(m_root.get(), "end", 0).value);
}
template class roomcxn_event_list_base<room_state_event>;
}

View File

@ -109,11 +109,26 @@ namespace matrix{
raii::rjp_string roomcxn::redact_event(const raii::string_base& eventid)const{ raii::rjp_string roomcxn::redact_event(const raii::string_base& eventid)const{
return redact_event(eventid, "No reason given"_ss); return redact_event(eventid, "No reason given"_ss);
} }
raii::string roomcxn::get_events_forward(int 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){
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)); 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){ sync::roomcxn_message_event_list 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(), "b"_ss, 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){ void roomcxn::regenerate_urls(void){

View File

@ -72,6 +72,15 @@ int main(){
std::atomic_bool should_quit = false; std::atomic_bool should_quit = false;
auto syn = ses.spawn_syncer(); 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); syn.sync(0);
//auto room = ses.spawn_client().spawn_room("!OwuhlJnHlsmyPwiLIH:rexy712.chickenkiller.com"_ss); //auto room = ses.spawn_client().spawn_room("!OwuhlJnHlsmyPwiLIH:rexy712.chickenkiller.com"_ss);