[feat] use eti game.db, commit not working, something is wrong with game.id in the client/frontend
This commit is contained in:
@ -1,11 +1,14 @@
|
||||
#![allow(clippy::doc_markdown)]
|
||||
|
||||
use std::{
|
||||
net::{IpAddr, SocketAddr},
|
||||
path::{Path, PathBuf},
|
||||
path::PathBuf,
|
||||
sync::Arc,
|
||||
};
|
||||
|
||||
use clap::Parser;
|
||||
use lanspread_db::db::GameDB;
|
||||
use lanspread_compat::eti::{self, EtiGame};
|
||||
use lanspread_db::db::{Game, GameDB};
|
||||
use lanspread_mdns::{
|
||||
DaemonEvent,
|
||||
MdnsAdvertiser,
|
||||
@ -15,18 +18,13 @@ use lanspread_mdns::{
|
||||
use lanspread_proto::{Message as _, Request, Response};
|
||||
use lanspread_utils::maybe_addr;
|
||||
use s2n_quic::Server as QuicServer;
|
||||
use testing::generate_test_db;
|
||||
use tokio::{io::AsyncWriteExt, sync::Mutex};
|
||||
use tracing_subscriber::EnvFilter;
|
||||
|
||||
mod testing;
|
||||
|
||||
static KEY_PEM: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../key.pem"));
|
||||
static CERT_PEM: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../cert.pem"));
|
||||
|
||||
pub(crate) struct Server {
|
||||
db_path: PathBuf,
|
||||
}
|
||||
pub(crate) struct Server;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct ServerCtx {
|
||||
@ -40,20 +38,14 @@ struct ConnectionCtx {
|
||||
}
|
||||
|
||||
impl Server {
|
||||
fn new<S: Into<PathBuf>>(db_path: S) -> Self {
|
||||
Server {
|
||||
db_path: db_path.into(),
|
||||
}
|
||||
}
|
||||
|
||||
async fn run(&mut self, addr: SocketAddr) -> eyre::Result<()> {
|
||||
async fn run(addr: SocketAddr, db: GameDB) -> eyre::Result<()> {
|
||||
let mut server = QuicServer::builder()
|
||||
.with_tls((CERT_PEM, KEY_PEM))?
|
||||
.with_io(addr)?
|
||||
.start()?;
|
||||
|
||||
let server_ctx = Arc::new(ServerCtx {
|
||||
handler: RequestHandler::new(&self.db_path)?,
|
||||
handler: RequestHandler::new(db),
|
||||
});
|
||||
|
||||
while let Some(mut connection) = server.accept().await {
|
||||
@ -126,11 +118,10 @@ struct RequestHandler {
|
||||
}
|
||||
|
||||
impl RequestHandler {
|
||||
fn new(db_path: &Path) -> eyre::Result<Self> {
|
||||
let db = GameDB::load_from_file(db_path)?;
|
||||
Ok(RequestHandler {
|
||||
db: Arc::new(Mutex::new(db)),
|
||||
})
|
||||
fn new(games: GameDB) -> RequestHandler {
|
||||
RequestHandler {
|
||||
db: Arc::new(Mutex::new(games)),
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle_request(&self, request: Request) -> Response {
|
||||
@ -141,7 +132,7 @@ impl RequestHandler {
|
||||
}
|
||||
Request::GetGame { id } => {
|
||||
let db = self.db.lock().await;
|
||||
match db.get_game_by_id(id) {
|
||||
match db.get_game_by_id(&id) {
|
||||
Some(game) => Response::Game(game.clone()),
|
||||
None => Response::GameNotFound(id),
|
||||
}
|
||||
@ -158,16 +149,33 @@ impl RequestHandler {
|
||||
}
|
||||
}
|
||||
|
||||
const GAME_DB_PATH: &str = "/home/pfs/shm/game.db";
|
||||
|
||||
#[derive(Debug, Parser)]
|
||||
struct Cli {
|
||||
/// The IP address to bind to.
|
||||
#[clap(long, default_value = "127.0.0.1")]
|
||||
/// IP address to bind to.
|
||||
#[clap(long)]
|
||||
ip: IpAddr,
|
||||
/// The listen port.
|
||||
#[clap(long, default_value = "13337")]
|
||||
/// Listen port.
|
||||
#[clap(long)]
|
||||
port: u16,
|
||||
/// Game database path (SQLite).
|
||||
#[clap(long)]
|
||||
db: PathBuf,
|
||||
}
|
||||
|
||||
fn eti_game_to_game(eti_game: EtiGame) -> Game {
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
#[allow(clippy::cast_sign_loss)]
|
||||
Game {
|
||||
id: eti_game.game_id,
|
||||
name: eti_game.game_title,
|
||||
description: eti_game.game_readme_de,
|
||||
release_year: eti_game.game_release,
|
||||
publisher: eti_game.game_publisher,
|
||||
max_players: eti_game.game_maxplayers,
|
||||
version: eti_game.game_version,
|
||||
genre: eti_game.genre_de,
|
||||
size: (eti_game.game_size * 1024.0 * 1024.0 * 1024.0) as u64,
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
@ -178,7 +186,9 @@ async fn main() -> eyre::Result<()> {
|
||||
|
||||
let cli = Cli::parse();
|
||||
|
||||
generate_test_db(GAME_DB_PATH);
|
||||
let eti_games = eti::get_games(&cli.db).await?;
|
||||
let games: Vec<Game> = eti_games.into_iter().map(eti_game_to_game).collect();
|
||||
let game_db = GameDB::from(games);
|
||||
|
||||
let mdns = MdnsAdvertiser::new(
|
||||
LANSPREAD_SERVICE_TYPE,
|
||||
@ -190,7 +200,7 @@ async fn main() -> eyre::Result<()> {
|
||||
while let Ok(event) = mdns.monitor.recv() {
|
||||
tracing::info!("mDNS: {:?}", &event);
|
||||
if let DaemonEvent::Error(e) = event {
|
||||
tracing::info!("Failed: {e}");
|
||||
tracing::error!("mDNS: {e}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -198,6 +208,5 @@ async fn main() -> eyre::Result<()> {
|
||||
|
||||
tracing::info!("Server listening on {}:{}", cli.ip, cli.port);
|
||||
|
||||
let mut server = Server::new(GAME_DB_PATH);
|
||||
server.run(SocketAddr::from((cli.ip, cli.port))).await
|
||||
Server::run(SocketAddr::from((cli.ip, cli.port)), game_db).await
|
||||
}
|
||||
|
@ -1,35 +0,0 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
use lanspread_db::db::GameDB;
|
||||
|
||||
pub(crate) fn generate_test_db<P: Into<PathBuf>>(db_path: P) {
|
||||
let db_path = db_path.into();
|
||||
|
||||
let mut db = GameDB::new();
|
||||
db.add_game(
|
||||
"Call of Duty 3",
|
||||
"A shooter game in war.",
|
||||
"call_of_duty.tar.zst",
|
||||
64,
|
||||
semver::Version::new(1, 0, 0),
|
||||
);
|
||||
db.add_game(
|
||||
"Counter-Strike Source",
|
||||
"Valve's iconic shooter.",
|
||||
"cstrike.tar.zst",
|
||||
32,
|
||||
semver::Version::new(1, 0, 0),
|
||||
);
|
||||
db.add_game(
|
||||
"Factorio",
|
||||
"Best game of all time, seriously.",
|
||||
"factorio.tar.zst",
|
||||
128,
|
||||
semver::Version::new(1, 0, 0),
|
||||
);
|
||||
|
||||
db.update_game(1, Some("Call of Duty 4"), None, None);
|
||||
db.save_to_file(&db_path).unwrap();
|
||||
}
|
Reference in New Issue
Block a user