use anyhow::Result;
use futures::prelude::*;
use structopt::StructOpt;
use tokio::time::{self, Duration};
use tsclientlib::sync::SyncConnection;
use tsclientlib::{Connection, DisconnectOptions, Identity};
#[derive(StructOpt, Debug)]
#[structopt(author, about)]
struct Args {
#[structopt(short = "a", long, default_value = "localhost")]
address: String,
#[structopt(short = "v", long, parse(from_occurrences))]
verbose: u8,
}
#[tokio::main]
async fn main() -> Result<()> { real_main().await }
async fn real_main() -> Result<()> {
let args = Args::from_args();
let con_config = Connection::build(args.address)
.log_commands(args.verbose >= 1)
.log_packets(args.verbose >= 2)
.log_udp_packets(args.verbose >= 3);
let id = Identity::new_from_str(
"MG0DAgeAAgEgAiAIXJBlj1hQbaH0Eq0DuLlCmH8bl+veTAO2+\
k9EQjEYSgIgNnImcmKo7ls5mExb6skfK2Tw+u54aeDr0OP1ITs\
C/50CIA8M5nmDBnmDM/gZ//4AAAAAAAAAAAAAAAAAAAAZRzOI").unwrap();
let con_config = con_config.identity(id);
let con: SyncConnection = con_config.connect()?.into();
let mut handle = con.get_handle();
tokio::spawn(con.for_each(|_| future::ready(())));
handle.wait_until_connected().await?;
let welcome_message = handle
.with_connection(|con| Result::<_>::Ok(con.get_state()?.server.welcome_message.clone()))
.await??;
println!("Server welcome message: {}", sanitize(&welcome_message));
time::sleep(Duration::from_secs(1)).await;
handle.disconnect(DisconnectOptions::new()).await?;
Ok(())
}
fn sanitize(s: &str) -> String {
s.chars()
.filter(|c| {
c.is_alphanumeric()
|| [' ', '\t', '.', ':', '-', '_', '"', '\'', '/', '(', ')', '[', ']', '{', '}']
.contains(c)
})
.collect()
}