Skip to content

Commit

Permalink
add functions to ClientBuilder and SwarmBuilder for custom addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
mat-1 committed Apr 9, 2024
1 parent cadc560 commit b66b5b6
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 3 deletions.
21 changes: 21 additions & 0 deletions azalea/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ pub mod pathfinder;
pub mod prelude;
pub mod swarm;

use std::net::SocketAddr;

use app::Plugins;
pub use azalea_auth as auth;
pub use azalea_block as blocks;
Expand Down Expand Up @@ -189,6 +191,25 @@ where
}
self.swarm.start(address).await
}

/// Do the same as [`Self::start`], but allow passing in a custom resolved
/// address. This is useful if the address you're connecting to doesn't
/// resolve to anything, like if the server uses the address field to pass
/// custom data (like Bungeecord or Forge).
pub async fn start_with_custom_resolved_address(
mut self,
account: Account,
address: impl TryInto<ServerAddress>,
resolved_address: SocketAddr,
) -> Result<!, StartError> {
self.swarm.accounts = vec![account];
if self.swarm.states.is_empty() {
self.swarm.states = vec![S::default()];
}
self.swarm
.start_with_custom_resolved_address(address, resolved_address)
.await
}
}
impl Default for ClientBuilder<NoState> {
fn default() -> Self {
Expand Down
42 changes: 39 additions & 3 deletions azalea/src/swarm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,28 @@ where
///
/// [`ServerAddress`]: azalea_protocol::ServerAddress
pub async fn start(self, address: impl TryInto<ServerAddress>) -> Result<!, StartError> {
// convert the TryInto<ServerAddress> into a ServerAddress
let address: ServerAddress = match address.try_into() {
Ok(address) => address,
Err(_) => return Err(StartError::InvalidAddress),
};

// resolve the address
let resolved_address = resolver::resolve_address(&address).await?;

self.start_with_custom_resolved_address(address, resolved_address)
.await
}

/// Do the same as [`Self::start`], but allow passing in a custom resolved
/// address. This is useful if the address you're connecting to doesn't
/// resolve to anything, like if the server uses the address field to pass
/// custom data (like Bungeecord or Forge).
pub async fn start_with_custom_resolved_address(
self,
address: impl TryInto<ServerAddress>,
resolved_address: SocketAddr,
) -> Result<!, StartError> {
assert_eq!(
self.accounts.len(),
self.states.len(),
Expand All @@ -308,9 +330,6 @@ where
Err(_) => return Err(StartError::InvalidAddress),
};

// resolve the address
let resolved_address = resolver::resolve_address(&address).await?;

let instance_container = Arc::new(RwLock::new(InstanceContainer::default()));

// we can't modify the swarm plugins after this
Expand Down Expand Up @@ -528,6 +547,23 @@ impl Swarm {
let address = self.address.read().clone();
let resolved_address = *self.resolved_address.read();

self.add_with_custom_address(account, state, address, resolved_address)
.await
}
/// Add a new account to the swarm, using the given host and socket
/// address. This is useful if you want bots in the same swarm to connect to
/// different addresses. Usually you'll just want [`Self::add`] though.
///
/// # Errors
///
/// Returns an `Err` if the bot could not do a handshake successfully.
pub async fn add_with_custom_address<S: Component + Clone>(
&mut self,
account: &Account,
state: S,
address: ServerAddress,
resolved_address: SocketAddr,
) -> Result<Client, JoinError> {
let (bot, mut rx) = Client::start_client(
self.ecs_lock.clone(),
account,
Expand Down

0 comments on commit b66b5b6

Please sign in to comment.