[fractal] Get the list of direct rooms before update
- From: Christopher Davis <christopherdavis src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] Get the list of direct rooms before update
- Date: Thu, 11 Jul 2019 23:47:52 +0000 (UTC)
commit d5a85f436df908341cbe9843d8b2ef7b3866857e
Author: Daniel GarcĂa Moreno <dani danigm net>
Date: Sat Jul 6 10:24:12 2019 +0200
Get the list of direct rooms before update
We only get the list of direct rooms in the initial sync so that list is
not up to date. This patch reloads the direct rooms hashmap before
trying to update to avoid remove existing direct chat rooms.
Fix https://gitlab.gnome.org/GNOME/fractal/issues/203
fractal-matrix-api/src/backend/room.rs | 51 ++++++++++++++++++++++++++--------
1 file changed, 40 insertions(+), 11 deletions(-)
---
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index 4b87d2cd..9dfefbe4 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -6,6 +6,9 @@ use std::io::prelude::*;
use std::sync::mpsc::Sender;
use url::Url;
+use std::collections::HashMap;
+use std::sync::{Arc, Mutex};
+
use crate::error::Error;
use crate::globals;
use std::thread;
@@ -20,6 +23,7 @@ use crate::util::{client_url, media_url};
use crate::backend::types::BKCommand;
use crate::backend::types::BKResponse;
use crate::backend::types::Backend;
+use crate::backend::types::BackendData;
use crate::backend::types::RoomType;
use crate::types::ExtraContent;
@@ -583,6 +587,41 @@ pub fn new_room(
Ok(())
}
+pub fn update_direct_chats(url: Url, data: Arc<Mutex<BackendData>>, user: String, room: String) {
+ get!(
+ &url,
+ |r: JsonValue| {
+ let mut directs: HashMap<String, Vec<String>> = HashMap::new();
+ let direct_obj = r.as_object().unwrap();
+
+ direct_obj.iter().for_each(|(userid, rooms)| {
+ let roomlist: Vec<String> = rooms
+ .as_array()
+ .unwrap()
+ .iter()
+ .map(|x| x.as_str().unwrap().to_string())
+ .collect();
+ directs.insert(userid.clone(), roomlist);
+ });
+
+ if directs.contains_key(&user) {
+ if let Some(v) = directs.get_mut(&user) {
+ v.push(room)
+ };
+ } else {
+ directs.insert(user, vec![room]);
+ }
+ data.lock().unwrap().m_direct = directs.clone();
+
+ let attrs = json!(directs.clone());
+ put!(&url, &attrs, |_| {}, |err| error!("{:?}", err));
+ },
+ |err| {
+ error!("Can't set m.direct: {:?}", err);
+ }
+ );
+}
+
pub fn direct_chat(bk: &Backend, user: &Member, internal_id: String) -> Result<(), Error> {
let url = bk.url("createRoom", vec![])?;
let attrs = json!({
@@ -615,17 +654,7 @@ pub fn direct_chat(bk: &Backend, user: &Member, internal_id: String) -> Result<(
r.direct = true;
tx.send(BKResponse::NewRoom(r, internal_id)).unwrap();
- let directs = &mut data.lock().unwrap().m_direct;
- if directs.contains_key(&m.uid) {
- if let Some(v) = directs.get_mut(&m.uid) {
- v.push(id.clone())
- };
- } else {
- directs.insert(m.uid.clone(), vec![id.clone()]);
- }
-
- let attrs = json!(directs.clone());
- put!(&direct_url, &attrs, |_| {}, |err| error!("{:?}", err));
+ update_direct_chats(direct_url, data, m.uid.clone(), id);
},
|err| {
tx.send(BKResponse::NewRoomError(err, internal_id)).unwrap();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]