Compare commits

..

9 Commits

Author SHA1 Message Date
copygirl 9641101a45 Remove `on_connecting` observer 1 month ago
copygirl df684d3a02 Reorganize common exports into `prelude` module 1 month ago
copygirl 9b77a07aa5 Delay gameplay until assets loaded 1 month ago
copygirl 2c7d27311b Start local server by adding `(Linked, Started)` 1 month ago
copygirl e27d98b5e9 Fix `print_certificate_digest` running on local server 1 month ago
copygirl 7b6be6ca13 Don't clamp movement along Y axis 1 month ago
copygirl 92d72b1d7e Make `Args::parse` more pretty 1 month ago
copygirl 8eb1784260 Fix `.meta` files not found error on web 1 month ago
copygirl 54615c265d Parse arguments and cleanup networking 1 month ago
  1. 3
      client/src/args.rs
  2. 43
      common/src/network/client_webtransport.rs
  3. 1
      common/src/network/mod.rs

@ -1,6 +1,6 @@
use bevy::ecs::resource::Resource; use bevy::ecs::resource::Resource;
use clap::{Parser, Subcommand}; use clap::{Parser, Subcommand};
use common::network::DEFAULT_PORT; use common::network::{DEFAULT_ADDRESS, DEFAULT_PORT};
#[derive(Resource, Parser, Default, Debug)] #[derive(Resource, Parser, Default, Debug)]
#[command(version, about)] #[command(version, about)]
@ -22,6 +22,7 @@ pub enum Mode {
/// Connect to an existing server. /// Connect to an existing server.
Connect { Connect {
/// Address to connect to. /// Address to connect to.
#[arg(default_value = DEFAULT_ADDRESS)]
address: String, address: String,
/// Certificate digest provided by the server. /// Certificate digest provided by the server.
digest: String, digest: String,

@ -4,7 +4,7 @@ use bevy::prelude::*;
use lightyear::prelude::client::*; use lightyear::prelude::client::*;
use lightyear::prelude::*; use lightyear::prelude::*;
use crate::network::DEFAULT_PORT; use thiserror::Error;
pub struct ConnectWebTransportCommand { pub struct ConnectWebTransportCommand {
server_addr: SocketAddr, server_addr: SocketAddr,
@ -13,8 +13,9 @@ pub struct ConnectWebTransportCommand {
impl ConnectWebTransportCommand { impl ConnectWebTransportCommand {
pub fn new(server_addr: &str, certificate_digest: String) -> Result<Self> { pub fn new(server_addr: &str, certificate_digest: String) -> Result<Self> {
let server_addr = to_socket_addr_with_default_port(server_addr, super::DEFAULT_PORT)?;
Ok(Self { Ok(Self {
server_addr: resolve_addr(&server_addr, DEFAULT_PORT)?, server_addr,
certificate_digest, certificate_digest,
}) })
} }
@ -40,31 +41,23 @@ impl Command for ConnectWebTransportCommand {
// TODO: Move this to its own `utils` module? // TODO: Move this to its own `utils` module?
// FIXME: Hostname resolving does not work on web. // FIXME: Hostname resolving does not work on web.
fn resolve_addr(addr: &str, default_port: u16) -> Result<SocketAddr> { fn to_socket_addr_with_default_port(addr: &str, default_port: u16) -> Result<SocketAddr> {
let addr = with_default_port(addr, default_port); let has_port = match (addr.rfind(']'), addr.rfind(':')) {
let socket_addrs = addr.to_socket_addrs()?.collect::<Vec<_>>();
if let Some(ipv4) = socket_addrs.iter().find(|a| a.is_ipv4()) {
Ok(*ipv4) // Prefer first IPv4 address found..
} else if let Some(ipv6) = socket_addrs.first() {
Ok(*ipv6) // ..otherwise fallback to IPv6.
} else {
Err(std::io::Error::other("hostname could not be resolved").into())
}
}
fn with_default_port(addr: &str, default_port: u16) -> String {
if is_port_specified(addr) {
addr.to_string()
} else {
format!("{addr}:{default_port}")
}
}
fn is_port_specified(addr: &str) -> bool {
match (addr.rfind(']'), addr.rfind(':')) {
// This doesn't match colons within IPv6 brackets, like `[::1]`. // This doesn't match colons within IPv6 brackets, like `[::1]`.
(Some(bracket), Some(colon)) if bracket < colon => true, (Some(bracket), Some(colon)) if bracket < colon => true,
(None, Some(_)) => true, (None, Some(_)) => true,
_ => false, _ => false,
} };
let mut socket_addrs = if has_port {
addr.to_socket_addrs()
} else {
(addr, default_port).to_socket_addrs()
}?;
socket_addrs.next().ok_or(ResolveError.into())
} }
#[derive(Error, Debug)]
#[error("hostname could not be resolved to any address")]
pub struct ResolveError;

@ -10,3 +10,4 @@ pub use protocol::*;
pub use server::*; pub use server::*;
pub const DEFAULT_PORT: u16 = 13580; pub const DEFAULT_PORT: u16 = 13580;
pub const DEFAULT_ADDRESS: &str = "localhost:13580";

Loading…
Cancel
Save