aionbot_adapter_onebot/
lib.rs1pub 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}