aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-11-01 13:24:16 +0100
committerdec05eba <dec05eba@protonmail.com>2020-11-01 13:24:16 +0100
commit13935702620305c5baaf6403417cc75a9b706fea (patch)
treece603c498c69b3d8bc88f944d016961689df7856 /src
parent7292fe11254109266e7adb9937e5f0fa797711f6 (diff)
Matrix: create room immediately after receiving join response, instead of waiting for join sync message
Diffstat (limited to 'src')
-rw-r--r--src/plugins/Matrix.cpp61
1 files changed, 51 insertions, 10 deletions
diff --git a/src/plugins/Matrix.cpp b/src/plugins/Matrix.cpp
index b8c2f89..d143e9a 100644
--- a/src/plugins/Matrix.cpp
+++ b/src/plugins/Matrix.cpp
@@ -641,6 +641,9 @@ namespace QuickMedia {
if(sync_running)
return;
+ assert(!this->delegate);
+ this->delegate = delegate;
+
sync_running = true;
sync_thread = std::thread([this, delegate]() {
const rapidjson::Value *next_batch_json;
@@ -690,6 +693,7 @@ namespace QuickMedia {
program_kill_in_thread(sync_thread.get_id());
if(sync_thread.joinable())
sync_thread.join();
+ delegate = nullptr;
}
bool Matrix::is_initial_sync_finished() const {
@@ -871,11 +875,9 @@ namespace QuickMedia {
}
}
- auto invites_it = invites.find(room_id_str);
- if(invites_it != invites.end()) {
+ if(remove_invite(room_id_str)) {
// TODO: Show leave type and reason and who caused the invite to be removed
delegate->remove_invite(room_id_str);
- invites.erase(invites_it);
}
if(is_new_room)
@@ -1597,7 +1599,7 @@ namespace QuickMedia {
std::string room_id_str(room_id.GetString(), room_id.GetStringLength());
delegate->add_invite(room_id_str, invite);
- invites[room_id_str] = std::move(invite);
+ set_invite(room_id_str, std::move(invite));
break;
}
}
@@ -1617,11 +1619,9 @@ namespace QuickMedia {
continue;
std::string room_id_str(room_id.GetString(), room_id.GetStringLength());
- auto invites_it = invites.find(room_id_str);
- if(invites_it != invites.end()) {
+ if(remove_invite(room_id_str)) {
// TODO: Show leave type and reason and who caused the invite to be removed
delegate->remove_invite(room_id_str);
- invites.erase(invites_it);
}
const rapidjson::Value &timeline_json = GetMember(it.value, "timeline");
@@ -2532,6 +2532,7 @@ namespace QuickMedia {
}
PluginResult Matrix::join_room(const std::string &room_id) {
+ assert(delegate);
std::vector<CommandArg> additional_args = {
{ "-X", "POST" },
{ "-H", "content-type: application/json" },
@@ -2541,6 +2542,31 @@ namespace QuickMedia {
std::string server_response;
DownloadResult download_result = download_to_string(homeserver + "/_matrix/client/r0/join/" + room_id, server_response, std::move(additional_args), use_tor, true);
+ if(download_result == DownloadResult::OK) {
+ std::lock_guard<std::mutex> invite_lock(invite_mutex);
+ auto invite_it = invites.find(room_id);
+ if(invite_it != invites.end()) {
+ std::lock_guard<std::recursive_mutex> lock(room_data_mutex);
+ RoomData *room = get_room_by_id(room_id);
+ if(!room) {
+ auto new_room = std::make_unique<RoomData>();
+ new_room->id = room_id;
+ new_room->set_name(invite_it->second.room_name);
+ new_room->set_avatar_url(invite_it->second.room_avatar_url);
+ room = new_room.get();
+ add_room(std::move(new_room));
+
+ delegate->join_room(room);
+ room->acquire_room_lock();
+ std::set<std::string> &room_tags = room->get_tags_unsafe();
+ if(room_tags.empty()) {
+ room_tags.insert(OTHERS_ROOM_TAG);
+ delegate->room_add_tag(room, OTHERS_ROOM_TAG);
+ }
+ room->release_room_lock();
+ }
+ }
+ }
return download_result_to_plugin_result(download_result);
}
@@ -2604,7 +2630,7 @@ namespace QuickMedia {
}
RoomData* Matrix::get_room_by_id(const std::string &id) {
- std::lock_guard<std::mutex> lock(room_data_mutex);
+ std::lock_guard<std::recursive_mutex> lock(room_data_mutex);
auto room_it = room_data_by_id.find(id);
if(room_it == room_data_by_id.end())
return nullptr;
@@ -2612,14 +2638,14 @@ namespace QuickMedia {
}
void Matrix::add_room(std::unique_ptr<RoomData> room) {
- std::lock_guard<std::mutex> lock(room_data_mutex);
+ std::lock_guard<std::recursive_mutex> lock(room_data_mutex);
room->index = rooms.size();
room_data_by_id.insert(std::make_pair(room->id, room->index));
rooms.push_back(std::move(room));
}
void Matrix::remove_room(const std::string &room_id) {
- std::lock_guard<std::mutex> lock(room_data_mutex);
+ std::lock_guard<std::recursive_mutex> lock(room_data_mutex);
auto room_it = room_data_by_id.find(room_id);
if(room_it == room_data_by_id.end())
return;
@@ -2630,6 +2656,21 @@ namespace QuickMedia {
room_data_by_id.erase(room_it);
}
+ void Matrix::set_invite(const std::string &room_id, Invite invite) {
+ std::lock_guard<std::mutex> lock(invite_mutex);
+ invites[room_id] = std::move(invite);
+ }
+
+ bool Matrix::remove_invite(const std::string &room_id) {
+ std::lock_guard<std::mutex> lock(invite_mutex);
+ auto invites_it = invites.find(room_id);
+ if(invites_it != invites.end()) {
+ invites.erase(invites_it);
+ return true;
+ }
+ return false;
+ }
+
DownloadResult Matrix::download_json(rapidjson::Document &result, const std::string &url, std::vector<CommandArg> additional_args, bool use_browser_useragent, std::string *err_msg) const {
if(download_to_json(url, result, std::move(additional_args), use_tor, use_browser_useragent, err_msg == nullptr) != DownloadResult::OK) {
// Cant get error since we parse directory to json. TODO: Make this work somehow?