azalea::swarm

Struct Swarm

Source
pub struct Swarm {
    pub ecs_lock: Arc<Mutex<World>>,
    pub resolved_address: Arc<RwLock<SocketAddr>>,
    pub address: Arc<RwLock<ServerAddress>>,
    pub instance_container: Arc<RwLock<InstanceContainer>>,
    /* private fields */
}
Expand description

A swarm is a way to conveniently control many bots at once, while also being able to control bots at an individual level when desired.

Swarms are created from SwarmBuilder.

The S type parameter is the type of the state for individual bots. It’s used to make the Swarm::add function work.

Fields§

§ecs_lock: Arc<Mutex<World>>§resolved_address: Arc<RwLock<SocketAddr>>§address: Arc<RwLock<ServerAddress>>§instance_container: Arc<RwLock<InstanceContainer>>

Implementations§

Source§

impl Swarm

Make a bot Swarm.

§Examples

use azalea::{prelude::*, swarm::prelude::*};
use std::time::Duration;

#[derive(Default, Clone, Component)]
struct State {}

#[derive(Default, Clone, Resource)]
struct SwarmState {}

#[tokio::main]
async fn main() {
    let mut accounts = Vec::new();
    let mut states = Vec::new();

    for i in 0..10 {
        accounts.push(Account::offline(&format!("bot{i}")));
        states.push(State::default());
    }

    SwarmBuilder::new()
        .add_accounts(accounts.clone())
        .set_handler(handle)
        .set_swarm_handler(swarm_handle)
        .join_delay(Duration::from_millis(1000))
        .start("localhost")
        .await
        .unwrap();
}

async fn handle(bot: Client, event: Event, _state: State) -> anyhow::Result<()> {
    match &event {
        _ => {}
    }
    Ok(())
}

async fn swarm_handle(
    mut swarm: Swarm,
    event: SwarmEvent,
    _state: SwarmState,
) -> anyhow::Result<()> {
    match &event {
        SwarmEvent::Disconnect(account, join_opts) => {
            // automatically reconnect after 5 seconds
            tokio::time::sleep(Duration::from_secs(5)).await;
            swarm.add_with_opts(account, State::default(), join_opts).await?;
        }
        SwarmEvent::Chat(m) => {
            println!("{}", m.message().to_ansi());
        }
        _ => {}
    }
    Ok(())
}
Source

pub async fn add<S: Component + Clone>( &mut self, account: &Account, state: S, ) -> Result<Client, JoinError>

Add a new account to the swarm. You can remove it later by calling Client::disconnect.

§Errors

Returns an Err if the bot could not do a handshake successfully.

Source

pub async fn add_with_opts<S: Component + Clone>( &mut self, account: &Account, state: S, join_opts: &JoinOpts, ) -> Result<Client, JoinError>

Add a new account to the swarm, using custom options. 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.

Source

pub async fn add_and_retry_forever<S: Component + Clone>( &mut self, account: &Account, state: S, ) -> Client

Add a new account to the swarm, retrying if it couldn’t join. This will run forever until the bot joins or the task is aborted.

This does exponential backoff (though very limited), starting at 5 seconds and doubling up to 15 seconds.

Source

pub async fn add_and_retry_forever_with_opts<S: Component + Clone>( &mut self, account: &Account, state: S, opts: &JoinOpts, ) -> Client

Same as Self::add_and_retry_forever, but allow passing custom join options.

Trait Implementations§

Source§

impl Clone for Swarm

Source§

fn clone(&self) -> Swarm

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl IntoIterator for Swarm

Source§

fn into_iter(self) -> Self::IntoIter

Iterate over the bots in this swarm.

#[derive(Component, Clone)]
for bot in swarm {
    let state = bot.component::<State>();
    // ...
}
Source§

type Item = Client

The type of the elements being iterated over.
Source§

type IntoIter = IntoIter<<Swarm as IntoIterator>::Item>

Which kind of iterator are we turning this into?
Source§

impl Resource for Swarm
where Self: Send + Sync + 'static,

Auto Trait Implementations§

§

impl Freeze for Swarm

§

impl !RefUnwindSafe for Swarm

§

impl Send for Swarm

§

impl Sync for Swarm

§

impl Unpin for Swarm

§

impl !UnwindSafe for Swarm

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> AsAny for T
where T: Any,

§

fn as_any(&self) -> &(dyn Any + 'static)

§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

§

fn type_name(&self) -> &'static str

Gets the type name of self
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> Downcast for T
where T: AsAny + ?Sized,

§

fn is<T>(&self) -> bool
where T: AsAny,

Returns true if the boxed type is the same as T. Read more
§

fn downcast_ref<T>(&self) -> Option<&T>
where T: AsAny,

Forward to the method defined on the type Any.
§

fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: AsAny,

Forward to the method defined on the type Any.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

§

fn clone_type_data(&self) -> Box<dyn TypeData>

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more