From 6feadbcdf8f90338ed43ca1c00f72dc62da1ebcd Mon Sep 17 00:00:00 2001 From: rexy712 Date: Mon, 29 Jul 2019 15:15:09 -0700 Subject: [PATCH] ... Fixed it --- include/raii/rjp_string.hpp | 1 + src/matrix/room_url_list.cpp | 4 +-- src/matrix/roomcxn.cpp | 60 +++--------------------------------- src/raii/rjp_string.cpp | 28 +++++++++++++++++ 4 files changed, 35 insertions(+), 58 deletions(-) create mode 100644 src/raii/rjp_string.cpp diff --git a/include/raii/rjp_string.hpp b/include/raii/rjp_string.hpp index d79f529..eddecce 100644 --- a/include/raii/rjp_string.hpp +++ b/include/raii/rjp_string.hpp @@ -68,6 +68,7 @@ namespace raii{ return *this; } }; + rjp_string rjp_string_from_key(RJP_value* val); } diff --git a/src/matrix/room_url_list.cpp b/src/matrix/room_url_list.cpp index 7b9e582..455552b 100644 --- a/src/matrix/room_url_list.cpp +++ b/src/matrix/room_url_list.cpp @@ -28,7 +28,7 @@ namespace matrix{ m_ban(s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/ban?access_token=" + access_token), m_unban(s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/unban?access_token=" + access_token), m_invite(s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/invite?access_token=" + access_token), - m_members(s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/members?access_token=" + access_token), + m_members(s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/joined_members?access_token=" + access_token), m_upgrade(s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/upgrade?access_token=" + access_token){} const raii::string& room_url_list::join_room(void)const{ return m_join; @@ -77,7 +77,7 @@ namespace matrix{ m_ban = s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/ban?access_token=" + access_token; m_unban = s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/unban?access_token=" + access_token; m_invite = s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/invite?access_token=" + access_token; - m_members = s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/members?access_token=" + access_token; + m_members = s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/joined_members?access_token=" + access_token; m_upgrade = s_proto + homeserver + "/_matrix/client/r0/rooms/" + roomid + "/upgrade?access_token=" + access_token; } diff --git a/src/matrix/roomcxn.cpp b/src/matrix/roomcxn.cpp index af40cd6..3d8e6b0 100644 --- a/src/matrix/roomcxn.cpp +++ b/src/matrix/roomcxn.cpp @@ -47,71 +47,19 @@ namespace matrix{ return leave_room(); } - enum class membership_event_type{ - leave, - join, - invite, - inval - }; - static membership_event_type str_to_membership_event(const char* str){ - if(!strcmp(str, "leave")) - return membership_event_type::leave; - else if(!strcmp(str, "join")) - return membership_event_type::join; - else if(!strcmp(str, "invite")) - return membership_event_type::invite; - else - return membership_event_type::inval; - } std::vector roomcxn::members(void)const{ - struct user_info{ - RJP_int age; - membership_event_type op; - }; - struct string_comp{ - bool operator()(const raii::rjp_string& a, const raii::rjp_string& b)const{ - return strcmp(a, b); - } - }; std::vector retval; - std::map users; raii::string resp = _get_curl(m_urls.room_members()); if(!resp) return {}; raii::rjp_ptr root(rjp_parse(resp.get())); if(!root) return {}; - RJP_search_res res = rjp_search_member(root.get(), "chunk", 0); + RJP_search_res res = rjp_search_member(root.get(), "joined", 0); if(!res.value) return{}; - for(RJP_value* elem = rjp_get_element(res.value);elem;elem = rjp_next_element(elem)){ - raii::rjp_string userid; - RJP_int age = 0; - membership_event_type op = membership_event_type::inval; - for(RJP_value* mem = rjp_get_member(elem);mem;mem = rjp_next_member(mem)){ - if(!strcmp(rjp_member_name(mem), "state_key")){ - userid = mem; - }else if(!strcmp(rjp_member_name(mem), "age")){ - age = rjp_value_integer(mem); - }else if(!strcmp(rjp_member_name(mem), "content")){ - res = rjp_search_member(mem, "membership", 0); - if(!res.value) continue; - op = str_to_membership_event(rjp_value_string(res.value)); - } - if(age && userid && op != membership_event_type::inval){ - auto entry = users.find(userid); - if(entry != users.end() && entry->second.age > age){ - entry->second.age = age; - entry->second.op = op; - }else if(entry == users.end()){ - users.emplace(std::make_pair(raii::string(userid), user_info{age, op})); - } - break; - } - } - } - for(auto it = users.begin();it != users.end();++it){ - if(it->second.op == membership_event_type::join) - retval.push_back(std::move(it->first)); + for(RJP_value* mem = rjp_get_member(res.value);mem;mem = rjp_next_member(mem)){ + raii::rjp_string tmp = raii::rjp_string_from_key(mem); + retval.emplace_back(std::move(tmp)); } return retval; } diff --git a/src/raii/rjp_string.cpp b/src/raii/rjp_string.cpp new file mode 100644 index 0000000..6944435 --- /dev/null +++ b/src/raii/rjp_string.cpp @@ -0,0 +1,28 @@ +/** + 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 "raii/rjp_string.hpp" + +namespace raii{ + rjp_string rjp_string_from_key(RJP_value* val){ + char* key = rjp_member_name(val); + size_t len = rjp_member_name_length(val); + rjp_set_key(val, nullptr, 0); + return rjp_string(key, len); + } +}