summaryrefslogtreecommitdiffstats
path: root/gui
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--gui/Cargo.toml2
-rw-r--r--gui/src/app.rs19
-rw-r--r--gui/src/net.rs17
3 files changed, 22 insertions, 16 deletions
diff --git a/gui/Cargo.toml b/gui/Cargo.toml
index e216309..8dc09df 100644
--- a/gui/Cargo.toml
+++ b/gui/Cargo.toml
@@ -1,6 +1,6 @@
1[package] 1[package]
2name = "zagan-bet-gui" 2name = "zagan-bet-gui"
3version = "4.4.0" 3version = "5.0.0"
4edition = "2024" 4edition = "2024"
5license = "GPL-3.0-or-later" 5license = "GPL-3.0-or-later"
6description = "Desktop frontend for zagan-bet" 6description = "Desktop frontend for zagan-bet"
diff --git a/gui/src/app.rs b/gui/src/app.rs
index af64e5e..df8fec3 100644
--- a/gui/src/app.rs
+++ b/gui/src/app.rs
@@ -16,6 +16,7 @@ use zagan_bet::client::database;
16use zagan_bet::client::paths; 16use zagan_bet::client::paths;
17use zagan_bet::client::view::{Command, LobbyView, View}; 17use zagan_bet::client::view::{Command, LobbyView, View};
18use zagan_bet::history::PlayRecord; 18use zagan_bet::history::PlayRecord;
19use zagan_bet::protocol::Packet;
19use zagan_bet::version::{VERSION, is_newer}; 20use zagan_bet::version::{VERSION, is_newer};
20 21
21use crate::net::{Command as NetCommand, Connected, Event, Failure, Network}; 22use crate::net::{Command as NetCommand, Connected, Event, Failure, Network};
@@ -280,8 +281,8 @@ impl ZaganApp {
280 } 281 }
281 } 282 }
282 } 283 }
283 Effect::SendLine(line) => { 284 Effect::SendRequest { id, payload } => {
284 self.net.send(NetCommand::Send(line)); 285 self.net.send(NetCommand::Send { id, payload });
285 self.awaiting = Some(Instant::now()); 286 self.awaiting = Some(Instant::now());
286 } 287 }
287 Effect::Disconnect => { 288 Effect::Disconnect => {
@@ -355,17 +356,18 @@ impl ZaganApp {
355 failure, 356 failure,
356 message, 357 message,
357 } => self.failed(addr, failure, message), 358 } => self.failed(addr, failure, message),
358 Event::Line(line) => { 359 Event::Packet(packet) => match packet {
359 if self.core.is_async(&line) { 360 Packet::Event { body, .. } => {
360 if let Some(effects) = self.core.handle_async_line(&line) { 361 if let Some(effects) = self.core.handle_async_line(&body) {
361 self.apply(ctx, effects); 362 self.apply(ctx, effects);
362 } 363 }
363 } else { 364 }
365 Packet::Reply { id, body } => {
364 self.awaiting = None; 366 self.awaiting = None;
365 let effects = self.core.handle_reply(&line); 367 let effects = self.core.handle_reply_id(id, &body);
366 self.apply(ctx, effects); 368 self.apply(ctx, effects);
367 } 369 }
368 } 370 },
369 Event::Closed => { 371 Event::Closed => {
370 self.session = None; 372 self.session = None;
371 self.awaiting = None; 373 self.awaiting = None;
@@ -384,6 +386,7 @@ impl ZaganApp {
384 self.core 386 self.core
385 .set_host_info(Some(connected.addr.clone()), connected.fingerprint.clone()); 387 .set_host_info(Some(connected.addr.clone()), connected.fingerprint.clone());
386 self.core.set_logged_in(connected.user.clone()); 388 self.core.set_logged_in(connected.user.clone());
389 self.core.set_server_time(connected.server_time);
387 self.login.error = connected.auth_error.clone(); 390 self.login.error = connected.auth_error.clone();
388 self.login.user = connected.user.clone().unwrap_or_default(); 391 self.login.user = connected.user.clone().unwrap_or_default();
389 392
diff --git a/gui/src/net.rs b/gui/src/net.rs
index 7cba604..7882cd3 100644
--- a/gui/src/net.rs
+++ b/gui/src/net.rs
@@ -14,6 +14,7 @@ use eframe::egui;
14use rusqlite::Connection; 14use rusqlite::Connection;
15use zagan_bet::client::transport::{self, TlsStream, TransportError, TrustPrompt}; 15use zagan_bet::client::transport::{self, TlsStream, TransportError, TrustPrompt};
16use zagan_bet::client::{database, paths}; 16use zagan_bet::client::{database, paths};
17use zagan_bet::protocol::Packet;
17 18
18/// How often the worker checks the socket for pushes when idle. 19/// How often the worker checks the socket for pushes when idle.
19const POLL: Duration = Duration::from_millis(8); 20const POLL: Duration = Duration::from_millis(8);
@@ -24,7 +25,7 @@ const TRUST_TIMEOUT: Duration = Duration::from_secs(120);
24#[derive(Debug, Clone, PartialEq, Eq)] 25#[derive(Debug, Clone, PartialEq, Eq)]
25pub enum Command { 26pub enum Command {
26 Connect { addr: String }, 27 Connect { addr: String },
27 Send(String), 28 Send { id: u64, payload: String },
28 Disconnect, 29 Disconnect,
29 Stop, 30 Stop,
30} 31}
@@ -49,6 +50,7 @@ pub struct Connected {
49 pub latest: String, 50 pub latest: String,
50 pub url: String, 51 pub url: String,
51 pub elapsed_ms: f32, 52 pub elapsed_ms: f32,
53 pub server_time: u64,
52} 54}
53 55
54/// What the worker tells the UI. 56/// What the worker tells the UI.
@@ -65,7 +67,7 @@ pub enum Event {
65 failure: Failure, 67 failure: Failure,
66 message: String, 68 message: String,
67 }, 69 },
68 Line(String), 70 Packet(Packet),
69 Closed, 71 Closed,
70} 72}
71 73
@@ -164,6 +166,7 @@ fn worker(
164 latest: connected.latest, 166 latest: connected.latest,
165 url: connected.url, 167 url: connected.url,
166 elapsed_ms: connected.elapsed.as_secs_f64() as f32 * 1000.0, 168 elapsed_ms: connected.elapsed.as_secs_f64() as f32 * 1000.0,
169 server_time: connected.server_time,
167 })); 170 }));
168 stream = Some(connected.stream); 171 stream = Some(connected.stream);
169 } 172 }
@@ -177,9 +180,9 @@ fn worker(
177 } 180 }
178 ctx.request_repaint(); 181 ctx.request_repaint();
179 } 182 }
180 Ok(Command::Send(line)) => { 183 Ok(Command::Send { id, payload }) => {
181 if let Some(open) = &mut stream { 184 if let Some(open) = &mut stream {
182 if open.write_line(&line).is_err() { 185 if open.write_request(id, None, &payload).is_err() {
183 stream = None; 186 stream = None;
184 let _ = events.send(Event::Closed); 187 let _ = events.send(Event::Closed);
185 } 188 }
@@ -198,9 +201,9 @@ fn worker(
198 // Drain pushes and replies without blocking the command channel. 201 // Drain pushes and replies without blocking the command channel.
199 if let Some(open) = &mut stream { 202 if let Some(open) = &mut stream {
200 loop { 203 loop {
201 match open.read_available_line() { 204 match open.read_available_packet() {
202 Ok(Some(line)) => { 205 Ok(Some(packet)) => {
203 if events.send(Event::Line(line)).is_err() { 206 if events.send(Event::Packet(packet)).is_err() {
204 return; 207 return;
205 } 208 }
206 } 209 }