2020-05-24 20:53:30 -04:00
|
|
|
use super::*;
|
2020-05-25 22:17:44 -04:00
|
|
|
use anyhow::{Context, Error, Result};
|
|
|
|
use futures::{channel::mpsc::*, future::try_join, lock::Mutex, prelude::*};
|
2020-05-24 23:14:25 -04:00
|
|
|
use serde_json::json;
|
2020-05-25 22:17:44 -04:00
|
|
|
use std::sync::Arc;
|
2020-05-24 20:53:30 -04:00
|
|
|
use stream::iter;
|
|
|
|
|
|
|
|
pub async fn greet<T>(sink: &mut T) -> Result<()>
|
2020-05-25 22:17:44 -04:00
|
|
|
where
|
|
|
|
T: Sink<ServerMessage, Error = Error> + Unpin,
|
2020-05-24 20:53:30 -04:00
|
|
|
{
|
|
|
|
let mut greeting = iter(vec![
|
|
|
|
ServerMessage::Meta {
|
|
|
|
m: Meta {
|
|
|
|
version: "Unstable",
|
|
|
|
helo: Some("Dedicated base2020 server".into()),
|
|
|
|
},
|
|
|
|
},
|
2020-05-26 23:32:28 -04:00
|
|
|
ServerMessage::SetState { u: Some(0), s: json!({}) },
|
2020-05-24 20:53:30 -04:00
|
|
|
])
|
|
|
|
.map(Ok);
|
|
|
|
|
2020-05-25 22:17:44 -04:00
|
|
|
sink.send_all(&mut greeting)
|
|
|
|
.await
|
|
|
|
.context("Greeting client")
|
|
|
|
}
|
|
|
|
|
2020-05-25 23:38:18 -04:00
|
|
|
pub struct Server {
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct Handle {
|
|
|
|
server: Arc<Mutex<Server>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Server {
|
|
|
|
pub fn create() -> Handle {
|
|
|
|
Handle {
|
|
|
|
server: Arc::new(Mutex::new(Server {
|
|
|
|
})),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn process_message(&mut self, player: usize, msg: ClientMessage) {
|
|
|
|
debug!("Client#{} message: {:?}", player, &msg);
|
|
|
|
}
|
|
|
|
}
|
2020-05-25 22:17:44 -04:00
|
|
|
where
|
|
|
|
{
|
2020-05-25 23:38:18 -04:00
|
|
|
|
2020-05-25 23:24:55 -04:00
|
|
|
pub async fn run_client(
|
2020-05-25 23:38:18 -04:00
|
|
|
handle: Handle,
|
2020-05-25 23:24:55 -04:00
|
|
|
source: &mut (impl Stream<Item = Result<ClientMessage, Error>> + Send + Unpin),
|
|
|
|
mut sink: &mut (impl Sink<ServerMessage, Error = Error> + Send + Unpin),
|
|
|
|
) -> Result<()> {
|
2020-05-25 22:17:44 -04:00
|
|
|
let output_task = async {
|
|
|
|
greet(&mut sink).await?;
|
|
|
|
Ok::<(), Error>(())
|
|
|
|
};
|
|
|
|
|
|
|
|
let input_task = async {
|
|
|
|
loop {
|
|
|
|
match source.next().await {
|
2020-05-25 23:38:18 -04:00
|
|
|
Some(Ok(msg)) => handle.server.lock().await.process_message(0, msg),
|
2020-05-25 22:17:44 -04:00
|
|
|
Some(Err(error)) => return Err(error),
|
|
|
|
None => break Ok(()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
try_join(output_task, input_task).await.map(|((), ())| ())
|
2020-05-24 20:53:30 -04:00
|
|
|
}
|