#![deny(unsafe_code)] #![allow(clippy::option_map_unit_fn)] #![deny(clippy::clone_on_ref_ptr)] use common::{clock::Clock, comp}; use std::{ io, sync::{mpsc, Arc}, thread, time::Duration, }; use tokio::runtime::Runtime; use tracing::{error, info}; use veloren_client::{addr::ConnectionArgs, Client, Event}; const TPS: u64 = 10; // Low value is okay, just reading messages. fn read_input() -> String { let mut buffer = String::new(); io::stdin() .read_line(&mut buffer) .expect("Failed to read input"); buffer.trim().to_string() } fn main() { // Initialize logging. common_frontend::init_stdout(None); info!("Starting chat-cli..."); // Set up an fps clock. let mut clock = Clock::new(Duration::from_secs_f64(1.0 / TPS as f64)); println!("Enter your username"); let username = read_input(); println!("Enter the server address"); let server_addr = read_input(); println!("Enter your password"); let password = read_input(); let runtime = Arc::new(Runtime::new().unwrap()); let runtime2 = Arc::clone(&runtime); // Create a client. let mut client = runtime .block_on(async { let addr = ConnectionArgs::resolve(&server_addr, false) .await .expect("dns resolve failed"); Client::new(addr, None, runtime2).await }) .expect("Failed to create client instance"); println!("Server info: {:?}", client.server_info()); println!("Players online: {:?}", client.get_players()); runtime .block_on(client.register(username, password, |provider| { provider == "https://auth.veloren.net" })) .unwrap(); let (tx, rx) = mpsc::channel(); thread::spawn(move || { loop { let msg = read_input(); tx.send(msg).unwrap(); } }); loop { for msg in rx.try_iter() { client.send_chat(msg) } let events = match client.tick(comp::ControllerInputs::default(), clock.dt(), |_| {}) { Ok(events) => events, Err(err) => { error!("Error: {:?}", err); break; }, }; const SHOW_NAME: bool = false; for event in events { match event { Event::Chat(m) => println!("{}", client.format_message(&m, SHOW_NAME)), Event::Disconnect => {}, // TODO Event::DisconnectionNotification(time) => { let message = match time { 0 => String::from("Goodbye!"), _ => format!("Connection lost. Kicking in {} seconds", time), }; println!("{}", message) }, _ => {}, } } // Clean up the server after a tick. client.cleanup(); // Wait for the next tick. clock.tick(); } }