58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
//! Discord channel adapter
|
|
|
|
use async_trait::async_trait;
|
|
use std::sync::Arc;
|
|
use tokio::sync::mpsc;
|
|
use zclaw_types::Result;
|
|
|
|
use crate::{Channel, ChannelConfig, ChannelStatus, IncomingMessage, OutgoingMessage};
|
|
|
|
/// Discord channel adapter
|
|
pub struct DiscordChannel {
|
|
config: ChannelConfig,
|
|
status: Arc<tokio::sync::RwLock<ChannelStatus>>,
|
|
}
|
|
|
|
impl DiscordChannel {
|
|
pub fn new(config: ChannelConfig) -> Self {
|
|
Self {
|
|
config,
|
|
status: Arc::new(tokio::sync::RwLock::new(ChannelStatus::Disconnected)),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl Channel for DiscordChannel {
|
|
fn config(&self) -> &ChannelConfig {
|
|
&self.config
|
|
}
|
|
|
|
async fn connect(&self) -> Result<()> {
|
|
let mut status = self.status.write().await;
|
|
*status = ChannelStatus::Connected;
|
|
Ok(())
|
|
}
|
|
|
|
async fn disconnect(&self) -> Result<()> {
|
|
let mut status = self.status.write().await;
|
|
*status = ChannelStatus::Disconnected;
|
|
Ok(())
|
|
}
|
|
|
|
async fn status(&self) -> ChannelStatus {
|
|
self.status.read().await.clone()
|
|
}
|
|
|
|
async fn send(&self, _message: OutgoingMessage) -> Result<String> {
|
|
// TODO: Implement Discord API send
|
|
Ok("discord_msg_id".to_string())
|
|
}
|
|
|
|
async fn receive(&self) -> Result<mpsc::Receiver<IncomingMessage>> {
|
|
let (tx, rx) = mpsc::channel(100);
|
|
// TODO: Implement Discord gateway
|
|
Ok(rx)
|
|
}
|
|
}
|