use {
std::sync::Arc,
tokio::time::{sleep, Duration},
};
use crate::{
builders::EditUser,
http::HttpClient,
models::{events::ClientEvent, Channel, Id, User},
ActionMessenger, Result,
};
#[cfg(feature = "cache")]
use crate::cache::Cache;
#[cfg(feature = "state")]
use crate::state::State;
#[derive(Debug, Clone)]
pub struct Context {
pub http_client: HttpClient,
#[cfg(feature = "cache")]
pub cache: Arc<Cache>,
#[cfg(feature = "state")]
pub state: State,
token: Arc<String>,
messenger: ActionMessenger,
}
impl Context {
pub(crate) fn new(token: impl Into<String>, messenger: ActionMessenger) -> Self {
let token = token.into();
let http_client = HttpClient::new(&token);
Self {
http_client,
#[cfg(feature = "cache")]
cache: Default::default(),
#[cfg(feature = "state")]
state: Default::default(),
token: Arc::new(token),
messenger,
}
}
pub fn token(&self) -> String {
self.token.as_ref().clone()
}
pub async fn user(&self) -> Result<User> {
self.http_client.get("users/@me").await
}
pub async fn edit(&self, builder: impl Into<EditUser>) -> Result {
self.http_client.patch("users/@me", builder.into()).await
}
pub async fn begin_typing(&self, channel_id: &Id) -> Result {
self.messenger
.send(ClientEvent::BeginTyping {
channel_id: channel_id.clone(),
})
.await
}
pub async fn end_typing(&self, channel_id: &Id) -> Result {
self.messenger
.send(ClientEvent::EndTyping {
channel_id: channel_id.clone(),
})
.await
}
pub async fn latency(&self) -> Duration {
loop {
match self.messenger.latency().await {
Some(latency) => return latency,
None => {
sleep(Duration::from_millis(150)).await;
continue;
}
};
}
}
pub async fn close(&self) -> Result {
self.messenger.close().await
}
pub async fn dm_channels(&self) -> Result<Vec<Channel>> {
self.http_client.get("users/dms").await
}
}