chorus/examples/gateway_observers.rs

63 lines
2.1 KiB
Rust
Raw Normal View History

2023-07-11 19:20:27 +02:00
use async_trait::async_trait;
use chorus::gateway::{GatewayCapable, GatewayHandleCapable};
2023-05-28 17:41:50 +02:00
use chorus::{
self,
gateway::{Gateway, Observer},
types::{GatewayIdentifyPayload, GatewayReady},
};
2023-06-19 10:27:32 +02:00
use std::{sync::Arc, time::Duration};
2023-06-20 14:42:50 +02:00
use tokio::{self, time::sleep};
2023-05-28 17:41:50 +02:00
// This example creates a simple gateway connection and a basic observer struct
// Due to certain limitations all observers must impl debug
#[derive(Debug)]
pub struct ExampleObserver {}
// This struct can observe GatewayReady events when subscribed, because it implements the trait Observer<GatewayReady>.
// The Observer trait can be implemented for a struct for a given websocketevent to handle observing it
// One struct can be an observer of multiple websocketevents, if needed
2023-07-11 19:20:27 +02:00
#[async_trait]
2023-05-28 17:41:50 +02:00
impl Observer<GatewayReady> for ExampleObserver {
// After we subscribe to an event this function is called every time we receive it
2023-07-11 19:20:27 +02:00
async fn update(&self, _data: &GatewayReady) {
2023-05-28 17:41:50 +02:00
println!("Observed Ready!");
}
}
#[tokio::main(flavor = "current_thread")]
2023-05-28 17:41:50 +02:00
async fn main() {
// Find the gateway websocket url of the server we want to connect to
let websocket_url_spacebar = "wss://gateway.old.server.spacebar.chat/".to_string();
// Initiate the gateway connection
let gateway = Gateway::get_handle(websocket_url_spacebar).await.unwrap();
2023-05-28 17:41:50 +02:00
// Create an instance of our observer
let observer = ExampleObserver {};
2023-06-20 14:42:50 +02:00
// Share ownership of the observer with the gateway
let shared_observer = Arc::new(observer);
2023-05-28 17:41:50 +02:00
// Subscribe our observer to the Ready event on this gateway
// From now on observer.update(data) will be called every time we receive the Ready event
gateway
.events
.lock()
.await
.session
.ready
2023-06-20 14:42:50 +02:00
.subscribe(shared_observer);
2023-05-28 17:41:50 +02:00
// Authenticate so we will receive any events
let token = "SecretToken".to_string();
let mut identify = GatewayIdentifyPayload::common();
identify.token = token;
gateway.send_identify(identify).await;
// Do something on the main thread so we don't quit
2023-06-19 10:27:32 +02:00
loop {
sleep(Duration::MAX).await;
}
2023-05-28 17:41:50 +02:00
}