use super::{get_player_item_or_fail, user_error, UResult, UserVerb, UserVerbRef, VerbContext}; use crate::{ models::item::Urges, services::{combat::max_health, display::bar_n_of_m}, }; use ansi::ansi; use async_trait::async_trait; pub struct Verb; #[async_trait] impl UserVerb for Verb { async fn handle( self: &Self, ctx: &mut VerbContext, _verb: &str, _remaining: &str, ) -> UResult<()> { let player_item = get_player_item_or_fail(ctx).await?; let user = match ctx.user_dat { None => user_error("Log in first".to_owned())?, Some(user) => user, }; let mut msg = String::new(); let maxh = max_health(&player_item); msg.push_str(&format!( ansi!("Health [{}] [ {}/{} ]\n"), bar_n_of_m(player_item.health, maxh), player_item.health, maxh )); let (hunger, thirst, stress) = match player_item.urges.as_ref() { None => (0, 0, 0), Some(Urges { hunger, thirst, stress, }) => (hunger.value, thirst.value, stress.value), }; msg.push_str(&format!( ansi!("Hunger [{}] [ {}/{} ]\n"), bar_n_of_m((hunger / 200) as u64, 50), hunger / 100, 100 )); msg.push_str(&format!( ansi!("Thirst [{}] [ {}/{} ]\n"), bar_n_of_m((thirst / 200) as u64, 50), thirst / 100, 100 )); msg.push_str(&format!( ansi!("Stress [{}] [ {}/{} ]\n"), bar_n_of_m((stress / 200) as u64, 50), stress / 100, 100 )); msg.push_str(&format!( ansi!("Credits ${}\n"), user.credits )); ctx.trans.queue_for_session(ctx.session, Some(&msg)).await?; Ok(()) } } static VERB_INT: Verb = Verb; pub static VERB: UserVerbRef = &VERB_INT as UserVerbRef; #[cfg(test)] mod test { #[test] fn bar_n_of_m_works() { assert_eq!(super::bar_n_of_m(4, 7), "|||| "); assert_eq!(super::bar_n_of_m(8, 7), "|||||||"); assert_eq!(super::bar_n_of_m(8, 8), "||||||||"); assert_eq!(super::bar_n_of_m(0, 5), " "); } }