Add ability to query previous messages from matrix::roomcxn
This commit is contained in:
parent
cc0206ce2c
commit
47c2c590d3
1
doc/TODO
1
doc/TODO
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
47
src/matrix/iterable.cpp
Normal 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>;
|
||||||
|
}
|
||||||
|
|
||||||
@ -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){
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user