From 168717a78bb223809c3d204b042d013b7daae262 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Fri, 22 Dec 2023 04:57:21 +0100 Subject: [PATCH] feat: add method to send feedback to service --- examples/arsnova-client-tui.rs | 131 +++++++++++++++++++++++---------- examples/arsnova-client.gif | Bin 29698 -> 48763 bytes src/client.rs | 62 +++++++++++++++- 3 files changed, 154 insertions(+), 39 deletions(-) diff --git a/examples/arsnova-client-tui.rs b/examples/arsnova-client-tui.rs index a632c48..85509c1 100644 --- a/examples/arsnova-client-tui.rs +++ b/examples/arsnova-client-tui.rs @@ -64,6 +64,8 @@ async fn main() -> Result<(), ()> { let (tx, rx) = channel::(10); + let (fb_tx, fb_rx) = channel::(10); + let _ = tx .clone() .send(client.get_feedback(&cli.room).await.unwrap()) @@ -81,25 +83,43 @@ async fn main() -> Result<(), ()> { let l2 = create_ui(&mut terminal, &title, rx); - let l3 = tokio::spawn(async { + let l3 = tokio::spawn(async move { loop { if event::poll(std::time::Duration::from_millis(16)) .map_err(|_| ()) .is_ok() { if let event::Event::Key(key) = event::read().map_err(|_| ()).unwrap() { - if key.kind == KeyEventKind::Press && key.code == KeyCode::Esc { - break; + if key.kind == KeyEventKind::Press { + match key.code { + KeyCode::Esc => break, + KeyCode::Char('a') | KeyCode::Char('1') => { + let _ = fb_tx.send(0).await; + } + KeyCode::Char('b') | KeyCode::Char('2') => { + let _ = fb_tx.send(1).await; + } + KeyCode::Char('c') | KeyCode::Char('3') => { + let _ = fb_tx.send(2).await; + } + KeyCode::Char('d') | KeyCode::Char('4') => { + let _ = fb_tx.send(3).await; + } + _ => {} + }; } } } } }); + let l4 = client.register_feedback_receiver(&cli.room, fb_rx); + select! { _ = l1 => {}, _ = l2 => {}, _ = l3 => {}, + _ = l4 => {} } let _ = stdout().execute(LeaveAlternateScreen).map_err(|_| ()); @@ -113,40 +133,48 @@ async fn create_ui( title: &str, mut rx: Receiver, ) -> Result<(), ()> { - fn feedback_paragraph(feedback: &Feedback, idx: usize, width: usize) -> Paragraph<'static> { - let value = match idx { - 0 => feedback.very_good, - 1 => feedback.good, - 2 => feedback.bad, - 3 => feedback.very_bad, - _ => 0, + const ICONS: [&str; 4] = ["Super", "Gut", "Nicht so gut", "Schlecht"]; + + let feedback_paragraph = + |feedback: &Feedback, idx: usize, width: usize| -> Paragraph<'static> { + let value = match idx { + 0 => feedback.very_good, + 1 => feedback.good, + 2 => feedback.bad, + 3 => feedback.very_bad, + _ => 0, + }; + + let icons = ICONS + .iter() + .map(|icon| format!("{: <12}", icon)) + .collect::>(); + + let icon = match idx { + 0 => &icons[0], + 1 => &icons[1], + 2 => &icons[2], + 3 => &icons[3], + _ => " ", + }; + + let width = width - 24; + + let l = ((value as f32 / feedback.count_votes() as f32) * width as f32) as usize; + + match idx { + 0..=3 => Paragraph::new(Line::from(vec![ + Span::raw(format!("{} : ", icon)), + Span::raw(format!("[{: >5}] ", value)).dim(), + Span::raw("■".to_string().repeat(l).to_string()) + .green() + .on_black(), + Span::raw(" ".to_string().repeat(width - l).to_string()).on_black(), + ])), + _ => Paragraph::default(), + } }; - let icon = match idx { - 0 => "Super ", - 1 => "Gut ", - 2 => "Nicht so gut", - 3 => "Schlecht ", - _ => " ", - }; - - let width = width - 24; - - let l = ((value as f32 / feedback.count_votes() as f32) * width as f32) as usize; - - match idx { - 0..=3 => Paragraph::new(Line::from(vec![ - Span::raw(format!("{} : ", icon)), - Span::raw(format!("[{: >5}] ", value)).dim(), - Span::raw("■".to_string().repeat(l).to_string()) - .green() - .on_black(), - Span::raw(" ".to_string().repeat(width - l).to_string()).on_black(), - ])), - _ => Paragraph::default(), - } - } - loop { let feedback = match rx.recv().await { Some(feedback) => feedback, @@ -156,9 +184,11 @@ async fn create_ui( let _ = terminal.draw(|frame| { let layout = Layout::default() .direction(Direction::Vertical) - .constraints(vec![ + .constraints([ Constraint::Max(1), Constraint::Max(6), + Constraint::Max(2), + Constraint::Max(1), Constraint::Min(1), Constraint::Max(1), ]) @@ -185,12 +215,12 @@ async fn create_ui( Paragraph::new("Beenden mit ") .on_blue() .alignment(Alignment::Left), - layout[3], + layout[5], ); let feedback_layout = Layout::default() .direction(Direction::Vertical) - .constraints(vec![ + .constraints([ Constraint::Max(1), Constraint::Max(1), Constraint::Max(1), @@ -205,6 +235,31 @@ async fn create_ui( feedback_layout[idx], ) }); + + let button_layout = Layout::default() + .direction(Direction::Horizontal) + .constraints([ + Constraint::Percentage(25), + Constraint::Percentage(25), + Constraint::Percentage(25), + Constraint::Percentage(25), + Constraint::Min(0), + ]) + .split(layout[3]); + + ICONS.iter().enumerate().for_each(|(idx, label)| { + frame.render_widget( + Paragraph::new(Line::from(vec![ + Span::raw(format!(" {} ", idx + 1)) + .white() + .on_magenta() + .bold(), + Span::raw(format!("{: ^14}", label)).white().on_black(), + ])) + .alignment(Alignment::Center), + button_layout[idx], + ) + }); }); } } diff --git a/examples/arsnova-client.gif b/examples/arsnova-client.gif index 58171feca953517f79b870a4d19f0316b1257059..bf871b1d4bc3a64076ab8535a3828b66f43e7efe 100644 GIT binary patch literal 48763 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�^+ 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%0A3=}XTRaTdjf&pArFw7@1VUh9DCv`HbbTT`) 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 { } } + /// Register feedback channel receiver and send incoming feedback to service + /// + /// This method fails on connection or response errors and if + /// no room is available with given room ID. + pub async fn register_feedback_receiver( + &self, + short_id: &str, + mut receiver: Receiver, + ) -> Result<(), ClientError> { + let room_info = self.get_room_info(short_id).await?; + + let ws_url = self.api_url.replace("http", "ws"); + let (socket, _) = connect_async(Url::parse(&format!("{}/ws/websocket", ws_url)).unwrap()) + .await + .map_err(|_| ConnectionError)?; + + let (mut write, _) = socket.split(); + + let user_id = self.get_user_id().unwrap_or_default(); + + if write + .send(Message::Text( + WsConnectMessage::new(self.token.as_ref().unwrap()).to_string(), + )) + .await + .is_ok() + { + return match write + .send(Message::Text( + WsSubscribeMessage::new(&room_info.id).to_string(), + )) + .await + { + Ok(_) => loop { + if let Some(value) = receiver.recv().await { + let payload = json!({ + "type": "CreateFeedback", + "payload": { + "roomId": room_info.id, + "userId": user_id, + "value": value + } + }) + .to_string(); + + let _ = write + .send(Message::Text(format!( + "SEND\ndestination:/queue/feedback.command\ncontent-type:application/json\ncontent-length:{}\n\n{}\0", + payload.chars().count(), + payload, + ))).await; + }; + }, + Err(_) => Err(ConnectionError), + }; + } + + Err(ConnectionError) + } + /// Registers a handler to get notifications on feedback change. /// /// This is done by using websocket connections to ARSnova.