mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
6c6b9181a5
* use version of shred that has an added SendDispatcher so we can construct the dispatcher and send it between threads (only State to remain sendable) * move closure for adding systems from State::tick to the creation functions * this does mean some voxygen systems always run instead of just in the session state, but that should not cause issues and we can always configure them to do nothing if needed
135 lines
3.4 KiB
Rust
135 lines
3.4 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,
|
|
|provider| provider == "https://auth.veloren.net",
|
|
&|_| {},
|
|
|_| {},
|
|
))
|
|
.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;
|
|
}
|
|
}
|
|
}
|