diff --git a/src/app.rs b/src/app.rs index 36c84eca..75ff5498 100644 --- a/src/app.rs +++ b/src/app.rs @@ -451,6 +451,10 @@ impl AppOp { pub fn member_clicked(&self, uid: String) { println!("member clicked: {}, {:?}", uid, self.members.get(&uid)); } + + pub fn send_message(&self, msg: String) { + self.backend.send_msg(self.active_room.clone(), msg).unwrap(); + } } /// State for the main thread. @@ -527,8 +531,8 @@ impl App { } theop.lock().unwrap().get_room_messages(); }, - Ok(backend::BKResponse::RoomMemberAvatar(_, _)) => { - }, + Ok(backend::BKResponse::RoomMemberAvatar(_, _)) => { }, + Ok(backend::BKResponse::SendMsg) => { }, // errors Ok(err) => { println!("Query error: {:?}", err); @@ -573,6 +577,32 @@ impl App { self.connect_room_treeview(); self.connect_member_treeview(); + + self.connect_send(); + } + + fn connect_send(&self) { + let send_button: gtk::ToolButton = self.gtk_builder.get_object("send_button") + .expect("Couldn't find send_button in ui file."); + let msg_entry: gtk::Entry = self.gtk_builder.get_object("msg_entry") + .expect("Couldn't find msg_entry in ui file."); + + let entry = msg_entry.clone(); + let mut op = self.op.clone(); + send_button.connect_clicked(move |btn| { + if let Some(text) = entry.get_text() { + op.lock().unwrap().send_message(text); + entry.set_text(""); + } + }); + + op = self.op.clone(); + msg_entry.connect_activate(move |entry| { + if let Some(text) = entry.get_text() { + op.lock().unwrap().send_message(text); + entry.set_text(""); + } + }); } fn connect_user_button(&self) { diff --git a/src/backend.rs b/src/backend.rs index fff1bed2..a21c6c17 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -112,6 +112,7 @@ pub struct BackendData { access_token: String, server_url: String, since: String, + msgid: i32, } pub struct Backend { @@ -131,6 +132,7 @@ pub enum BKResponse { RoomMessages(Vec), RoomMembers(Vec), RoomMemberAvatar(String, String), + SendMsg, //errors UserNameError(Error), @@ -143,6 +145,7 @@ pub enum BKResponse { RoomMessagesError(Error), RoomMembersError(Error), RoomMemberAvatarError(Error), + SendMsgError(Error), } #[derive(Debug)] @@ -177,6 +180,7 @@ impl Backend { access_token: String::from(""), server_url: String::from("https://matrix.org"), since: String::from(""), + msgid: 1, }; Backend { tx: tx, data: Arc::new(Mutex::new(data)) } } @@ -489,6 +493,37 @@ impl Backend { Ok(()) } + + pub fn send_msg(&self, roomid: String, msg: String) -> Result<(), Error> { + let baseu = self.get_base_url()?; + let tk = self.data.lock().unwrap().access_token.clone(); + let msgid; + + { + let mut data = self.data.lock().unwrap(); + data.msgid = data.msgid + 1; + msgid = data.msgid; + } + + let mut url = baseu.join("/_matrix/client/r0/rooms/")?; + url = url.join(&(roomid + "/"))?.join("send/m.room.message/")?; + url = url.join(&format!("{}", msgid))?; + url = url.join(&format!("?access_token={}", tk))?; + + let mut attrs: HashMap = HashMap::new(); + attrs.insert(String::from("body"), msg); + attrs.insert(String::from("msgtype"), String::from("m.text")); + + let tx = self.tx.clone(); + query!("put", &url, &attrs, + move |r: JsonValue| { + tx.send(BKResponse::SendMsg).unwrap(); + }, + |err| { tx.send(BKResponse::SendMsgError(err)).unwrap(); } + ); + + Ok(()) + } } fn get_rooms_from_json(r: JsonValue, userid: &str) -> Result, Error> {