veloren/client/examples/chat-cli/main.rs
Christof Petig 3e0ca7d6d4 Load missing plugins from the server
individual commits combined here:
send active plugins
compute plugin sha hash
single position for defining Hash type
request plugins from the server
Server sending the plugin to the client
store received plugin in file and use it
handle plugin data at the right place
pass config_dir to client init
load local plugins
operational plugin caching
simplify the interface
clippy suggestions
remove artifacts
fix compilation of test world
ChangeLog entry
code quality fixes
improve readability
adapt to multiple systems
2024-03-14 00:46:18 +01:00

137 lines
3.5 KiB
Rust

#![deny(unsafe_code)]
#![deny(clippy::clone_on_ref_ptr)]
use client_i18n::LocalizationHandle;
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};
use voxygen_i18n_helpers::localize_chat_message;
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!("loading localisation");
let localisation = LocalizationHandle::load_expect("en");
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);
let addr = ConnectionArgs::Tcp {
prefer_ipv6: false,
hostname: server_addr,
};
// Create a client.
let mut client = runtime
.block_on(Client::new(
addr,
runtime2,
&mut None,
&username,
&password,
None,
|provider| provider == "https://auth.veloren.net",
&|_| {},
|_| {},
Default::default(),
))
.expect("Failed to create client instance");
println!("Server info: {:?}", client.server_info());
let mut player_printed = false;
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!(
"{}",
localize_chat_message(
m,
|msg| client.lookup_msg_context(msg),
&localisation.read(),
SHOW_NAME,
)
.1
),
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();
if !player_printed {
println!("Players online: {:?}", client.players().collect::<Vec<_>>());
player_printed = true;
}
}
}