Compare commits

..

10 Commits

Author SHA1 Message Date
copygirl 04c63abee2 Temporarily fix hostname resolving 1 month ago
copygirl 560d27466b Remove `on_connecting` observer 1 month ago
copygirl 93245c136e Reorganize common exports into `prelude` module 1 month ago
copygirl 765882b8b6 Delay gameplay until assets loaded 1 month ago
copygirl 058ed952fc Start local server by adding `(Linked, Started)` 1 month ago
copygirl ebd3c009fa Fix `print_certificate_digest` running on local server 1 month ago
copygirl 6d547242a0 Don't clamp movement along Y axis 1 month ago
copygirl 82716e8492 Make `Args::parse` more pretty 1 month ago
copygirl 88dcb9eea1 Fix `.meta` files not found error on web 1 month ago
copygirl 1715f51b35 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 clap::{Parser, Subcommand};
use common::network::{DEFAULT_ADDRESS, DEFAULT_PORT};
use common::network::DEFAULT_PORT;
#[derive(Resource, Parser, Default, Debug)]
#[command(version, about)]
@ -22,7 +22,6 @@ pub enum Mode {
/// Connect to an existing server.
Connect {
/// Address to connect to.
#[arg(default_value = DEFAULT_ADDRESS)]
address: String,
/// Certificate digest provided by the server.
digest: String,

@ -4,7 +4,7 @@ use bevy::prelude::*;
use lightyear::prelude::client::*;
use lightyear::prelude::*;
use thiserror::Error;
use crate::network::DEFAULT_PORT;
pub struct ConnectWebTransportCommand {
server_addr: SocketAddr,
@ -13,9 +13,8 @@ pub struct ConnectWebTransportCommand {
impl ConnectWebTransportCommand {
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 {
server_addr,
server_addr: resolve_addr(&server_addr, DEFAULT_PORT)?,
certificate_digest,
})
}
@ -41,23 +40,31 @@ impl Command for ConnectWebTransportCommand {
// TODO: Move this to its own `utils` module?
// FIXME: Hostname resolving does not work on web.
fn to_socket_addr_with_default_port(addr: &str, default_port: u16) -> Result<SocketAddr> {
let has_port = match (addr.rfind(']'), addr.rfind(':')) {
fn resolve_addr(addr: &str, default_port: u16) -> Result<SocketAddr> {
let addr = with_default_port(addr, default_port);
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]`.
(Some(bracket), Some(colon)) if bracket < colon => true,
(None, Some(_)) => true,
_ => 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,4 +10,3 @@ pub use protocol::*;
pub use server::*;
pub const DEFAULT_PORT: u16 = 13580;
pub const DEFAULT_ADDRESS: &str = "localhost:13580";

Loading…
Cancel
Save