This commit is contained in:
@@ -34,7 +34,22 @@ static THREADS: AtomicUsize = AtomicUsize::new(1);
|
||||
async fn main() {
|
||||
env_logger::init();
|
||||
|
||||
let (sender, mut receiver) = unbounded_channel();
|
||||
let record = env::var("RECORD")
|
||||
.ok()
|
||||
.and_then(|record| {
|
||||
record
|
||||
.parse()
|
||||
.inspect_err(|err| error!("Unable to parse record options: {err}"))
|
||||
.ok()
|
||||
})
|
||||
.unwrap_or(false);
|
||||
|
||||
let (sender, receiver) = if record {
|
||||
let (sender, receiver) = unbounded_channel();
|
||||
(Some(sender), Some(receiver))
|
||||
} else {
|
||||
(None, None)
|
||||
};
|
||||
|
||||
debug!("Creating routes");
|
||||
let app = Router::new()
|
||||
@@ -59,6 +74,7 @@ async fn main() {
|
||||
let port = env::var("PORT").unwrap_or_else(|_| "8000".into());
|
||||
let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await.unwrap();
|
||||
|
||||
if let Some(mut receiver) = receiver {
|
||||
debug!("Starting observer");
|
||||
tokio::spawn(async move {
|
||||
let mut games = HashMap::new();
|
||||
@@ -104,6 +120,7 @@ async fn main() {
|
||||
}
|
||||
warn!("Observer stopped");
|
||||
});
|
||||
}
|
||||
|
||||
debug!("Starting server");
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
@@ -139,10 +156,12 @@ enum RequestType {
|
||||
}
|
||||
|
||||
async fn start(
|
||||
State(sender): State<UnboundedSender<(RequestType, Request)>>,
|
||||
State(sender): State<Option<UnboundedSender<(RequestType, Request)>>>,
|
||||
Json(request): Json<Request>,
|
||||
) {
|
||||
if let Err(e) = sender.send((RequestType::Start, request.clone())) {
|
||||
if let Some(sender) = sender
|
||||
&& let Err(e) = sender.send((RequestType::Start, request.clone()))
|
||||
{
|
||||
warn!("Unable to observe request: {e}");
|
||||
}
|
||||
let board = Board::from(&request);
|
||||
@@ -151,11 +170,13 @@ async fn start(
|
||||
|
||||
#[allow(clippy::too_many_lines)]
|
||||
async fn get_move(
|
||||
State(sender): State<UnboundedSender<(RequestType, Request)>>,
|
||||
State(sender): State<Option<UnboundedSender<(RequestType, Request)>>>,
|
||||
Json(request): Json<Request>,
|
||||
) -> response::Json<Response> {
|
||||
let start = Instant::now();
|
||||
if let Err(e) = sender.send((RequestType::GetMove, request.clone())) {
|
||||
if let Some(sender) = sender
|
||||
&& let Err(e) = sender.send((RequestType::GetMove, request.clone()))
|
||||
{
|
||||
warn!("Unable to observe request: {e}");
|
||||
}
|
||||
let board = Game::from(&request);
|
||||
@@ -285,10 +306,12 @@ fn score_standard(board: &Board, id: u8) -> u32 {
|
||||
}
|
||||
|
||||
async fn end(
|
||||
State(sender): State<UnboundedSender<(RequestType, Request)>>,
|
||||
State(sender): State<Option<UnboundedSender<(RequestType, Request)>>>,
|
||||
Json(request): Json<Request>,
|
||||
) {
|
||||
if let Err(e) = sender.send((RequestType::End, request.clone())) {
|
||||
if let Some(sender) = sender
|
||||
&& let Err(e) = sender.send((RequestType::End, request.clone()))
|
||||
{
|
||||
warn!("Unable to observe request: {e}");
|
||||
}
|
||||
let board = Board::from(&request);
|
||||
|
Reference in New Issue
Block a user