1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//! The [`Cluster`] is a manager for running and maintaing multiple shards,
//! bringing their event streams into one unified stream.
//!
//! # Examples
//!
//! Start a cluster of 10 shards and print when a shard is connected,
//! disconnected, and when new commands come in:
///
/// ```no_run
/// use twilight_gateway::{cluster::{Cluster, ClusterConfig}, Event};
/// use futures::StreamExt;
/// use std::env;
///
/// #[tokio::main]
/// async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
///     let token = env::var("DISCORD_TOKEN")?;
///     let cluster = Cluster::new(token).await?;
///
///     cluster.up().await;
///
///     let mut events = cluster.events().await;
///
///     while let Some((shard_id, event)) = events.next().await {
///         tokio::spawn(handle_event(cluster.clone(), shard_id, event));
///     }
///
///     println!("Cluster is now shutdown");
///
///     Ok(())
/// }
///
/// async fn handle_event(cluster: Cluster, shard_id: u64, event: Event) {
///     match event {
///         Event::ShardConnected { .. } => {
///             println!("Shard {} is now connected", shard_id);
///         },
///         Event::ShardDisconnected { .. } => {
///             println!("Shard {} is now disconnected", shard_id);
///         },
///         Event::MessageCreate(msg) if msg.content == "!latency" => {
///             if let Some(shard) = cluster.shard(shard_id).await {
///                 if let Ok(info) = shard.info().await {
///                     println!("Shard {}'s latency is {:?}", shard_id, info.latency());
///                 }
///             }
///         },
///         Event::MessageCreate(msg) if msg.content == "!shutdown" => {
///             println!("Got a shutdown request from shard {}", shard_id);
///
///             cluster.down().await;
///         },
///         _ => {},
///     }
/// }
/// ```
///
/// [`Cluster`]: struct.Cluster.html
pub mod config;
pub mod error;

mod r#impl;

pub use self::{
    config::ClusterConfig,
    error::{Error, Result},
    r#impl::Cluster,
};