2023-05-01 08:29:29 +00:00
|
|
|
use std::collections::HashMap;
|
|
|
|
|
use std::{io, net::SocketAddr, str, sync::Arc};
|
|
|
|
|
use tokio::{net::UdpSocket, sync::mpsc};
|
2023-05-01 09:29:40 +00:00
|
|
|
use tracing::info;
|
2023-05-01 06:02:04 +00:00
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() -> io::Result<()> {
|
2023-05-01 09:29:40 +00:00
|
|
|
tracing_subscriber::fmt::try_init().unwrap();
|
|
|
|
|
|
|
|
|
|
let sock = UdpSocket::bind("0.0.0.0:1222".parse::<SocketAddr>().unwrap()).await?;
|
|
|
|
|
info!("listening to new connections");
|
|
|
|
|
|
2023-05-01 08:29:29 +00:00
|
|
|
let r = Arc::new(sock);
|
|
|
|
|
let s = r.clone();
|
|
|
|
|
let (tx, mut rx) = mpsc::channel::<(Vec<u8>, SocketAddr)>(1_000);
|
2023-05-01 09:52:22 +00:00
|
|
|
let mut storage = HashMap::<String, String>::new();
|
2023-05-01 08:29:29 +00:00
|
|
|
|
|
|
|
|
tokio::spawn(async move {
|
2023-05-01 09:29:40 +00:00
|
|
|
info!("Send back!");
|
2023-05-01 08:29:29 +00:00
|
|
|
while let Some((bytes, addr)) = rx.recv().await {
|
2023-05-01 08:38:14 +00:00
|
|
|
let _ = s.send_to(&bytes, &addr).await.unwrap();
|
2023-05-01 08:29:29 +00:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2023-05-01 06:02:04 +00:00
|
|
|
let mut buf = [0; 1024];
|
|
|
|
|
loop {
|
2023-05-01 09:29:40 +00:00
|
|
|
info!("Recv loop");
|
2023-05-01 08:29:29 +00:00
|
|
|
let (len, addr) = r.recv_from(&mut buf).await?;
|
|
|
|
|
let message = str::from_utf8(&buf[..len]).unwrap().trim_matches('\n');
|
|
|
|
|
|
2023-05-01 08:38:14 +00:00
|
|
|
if message.contains("version") {
|
|
|
|
|
let message = format!("version=gruberb 1.0");
|
|
|
|
|
tx.send((message.as_bytes().to_vec(), addr)).await.unwrap();
|
|
|
|
|
} else if message.contains("=") {
|
2023-05-01 09:52:22 +00:00
|
|
|
let (key, value) = message.split_once('=').unwrap();
|
2023-05-01 08:29:29 +00:00
|
|
|
storage
|
|
|
|
|
.insert(key.to_string(), value.to_string());
|
|
|
|
|
} else {
|
2023-05-01 09:52:22 +00:00
|
|
|
let value = storage.get(message).unwrap_or(&String::new()).clone();
|
2023-05-01 08:38:14 +00:00
|
|
|
let message = format!("{message}={value}");
|
|
|
|
|
tx.send((message.as_bytes().to_vec(), addr)).await.unwrap();
|
2023-05-01 08:29:29 +00:00
|
|
|
}
|
2023-05-01 06:02:04 +00:00
|
|
|
|
2023-05-01 08:29:29 +00:00
|
|
|
buf.fill(0);
|
2023-05-01 06:02:04 +00:00
|
|
|
}
|
|
|
|
|
}
|