aionbot_adapter_onebot/
lib.rs

1pub extern crate aionbot_core;
2
3pub mod bot;
4pub mod event;
5pub mod models;
6pub mod ws;
7
8use std::{any::Any, sync::Arc};
9
10use aionbot_core::{
11    event::Event,
12    runtime::{Runtime, RuntimeStatus, StateManager},
13};
14use anyhow::Result;
15use event::OnebotEvent;
16use tokio::sync::broadcast::Receiver;
17use ws::Onebot;
18
19pub trait Adapter: Any {
20    fn reply(&self, message: &str) -> impl std::future::Future<Output = Result<()>> + Send;
21}
22
23impl Adapter for dyn Event {
24    async fn reply(&self, message: &str) -> Result<()> {
25        let event = unsafe { (self as *const dyn Event as *mut OnebotEvent).as_mut() }.unwrap();
26        let bot = event.bot.clone();
27
28        bot.send(event, message).await;
29        Ok(())
30    }
31}
32
33pub struct OnebotRuntime {
34    onebot: Option<Arc<Onebot>>,
35    state: Arc<StateManager>,
36    receiver: Option<Receiver<Box<OnebotEvent>>>,
37}
38
39impl Default for OnebotRuntime {
40    fn default() -> Self {
41        Self {
42            onebot: None,
43            state: Arc::new(StateManager::default()),
44            receiver: None,
45        }
46    }
47}
48
49impl Runtime for OnebotRuntime {
50    fn set_manager(mut self, manager: Arc<StateManager>) -> Self {
51        self.state = manager;
52        self
53    }
54
55    fn manager(&self) -> &StateManager {
56        &self.state
57    }
58
59    async fn prepare(&mut self) -> Result<()> {
60        log::debug!("Preparing for Onebot runtime...");
61        self.onebot = Some(ws::Onebot::new().listen(Default::default()).await?);
62        Ok(())
63    }
64
65    fn setup(&mut self, setup: Box<dyn FnOnce(&Self) + Send + Sync>) {
66        setup(self);
67    }
68
69    async fn finalize(&mut self) -> Result<()> {
70        log::debug!("Finalizing Onebot runtime..");
71        self.receiver = Some(self.onebot.as_ref().cloned().unwrap().subscribe().await);
72        Ok(())
73    }
74
75    async fn run(&mut self) -> Result<RuntimeStatus> {
76        log::debug!("Waiting for Onebot runtime event loop...");
77        let event = self.receiver.as_mut().unwrap().recv().await?;
78        log::debug!("Received Onebot event of type [{}].", event.event_type());
79        Ok(RuntimeStatus::Event(event))
80    }
81}