diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/commands.rs | 78 |
1 files changed, 63 insertions, 15 deletions
diff --git a/server/src/commands.rs b/server/src/commands.rs index 25b51bff..08b521ad 100644 --- a/server/src/commands.rs +++ b/server/src/commands.rs @@ -24,7 +24,7 @@ use crate::{ use anyhow::Result; use clap::{Parser, ValueEnum}; use hurrycurry_bot::algos::ALGO_CONSTRUCTORS; -use hurrycurry_protocol::{Menu, Message, PacketC, PlayerClass, PlayerID}; +use hurrycurry_protocol::{DocumentElement, Menu, Message, PacketC, PlayerClass, PlayerID}; use std::{fmt::Write, time::Duration}; #[derive(Parser)] @@ -43,6 +43,9 @@ enum Command { Top { /// Name of the map, default: current map: Option<String>, + /// Send text instead of document + #[arg(short, long)] + text: bool, }, #[clap(alias = "mapinfo")] Info { @@ -245,23 +248,68 @@ impl Server { algo, ))); } - Command::Top { map } => { + Command::Top { map, text } => { let mapname = map.as_ref().unwrap_or(&self.game.data.current_map); + if let Some(board) = self.scoreboard.get(mapname) { - let mut o = format!("Scoreboard for {}:\n", mapname); - for (i, entry) in board.best.iter().take(5).enumerate() { - writeln!( - o, - " {i}. {} points by {}", - entry.score.points, - entry.players.clone().join(", ") - ) - .unwrap(); + if text { + let mut o = format!("Scoreboard for {}:\n", mapname); + for (i, entry) in board.best.iter().take(5).enumerate() { + writeln!( + o, + " {i}. {} points by {}", + entry.score.points, + entry.players.clone().join(", ") + ) + .unwrap(); + } + replies.push(PacketC::ServerMessage { + message: Message::Text(o), + error: false, + }); + } else { + replies.push(PacketC::Menu(Menu::Document(DocumentElement::Document { + es: vec![DocumentElement::Page { + es: vec![ + DocumentElement::Par { + es: vec![DocumentElement::Text { + s: Message::Translation { + id: "c.menu.scoreboard".to_string(), + params: vec![], + }, + size: 30., + bold: false, + color: None, + font: None, + }], + }, + DocumentElement::List { + es: board + .best + .iter() + .take(5) + .enumerate() + .map(|(place, entry)| DocumentElement::Par { + es: vec![DocumentElement::Text { + s: trm!( + "c.menu.scoreboard.entry", + s = place.to_string(), + s = entry.score.points.to_string(), + s = entry.players.clone().join(", ") + ), + size: 15., + bold: false, + color: None, + font: None, + }], + }) + .collect(), + }, + ], + background: None, + }], + }))); } - replies.push(PacketC::ServerMessage { - message: Message::Text(o), - error: false, - }); } } Command::Info { map } => { |