server_watchdog/application/event/
receiver.rs1use std::error::Error;
2use std::sync::Arc;
3use async_trait::async_trait;
4use derive_new::new;
5use tokio::sync::mpsc::Receiver;
6use crate::application::client::MessageGateway;
7use crate::application::event::dto::EventMessage;
8use crate::application::worker::Worker;
9use crate::domain::chat::{Chat, ChatList};
10use crate::domain::config::EventSubscribeList;
11use crate::domain::file_accessor::{FileAccessor};
12
13#[derive(new)]
14pub struct EventManager {
15 rx: Receiver<EventMessage>,
16 message_gateway: Arc<dyn MessageGateway>,
17 chat_list_file_accessor: Arc<dyn FileAccessor<ChatList>>,
18 subscribe_file_accessor: Arc<dyn FileAccessor<EventSubscribeList>>,
19}
20
21#[async_trait]
22impl Worker for EventManager {
23 async fn on_tick(&mut self) -> bool {
24 if let Some(message) = self.rx.recv().await {
25 let _ = self.handle(message).await;
26 true
27 } else {
28 false
29 }
30 }
31
32 fn get_name(&self) -> &str {
33 "event_handler"
34 }
35
36 fn interval(&self) -> i32 {
37 5
38 }
39}
40
41impl EventManager {
42 pub async fn handle(&self, event_message: EventMessage)
43 -> Result<(), Box<dyn Error + Send + Sync>> {
44 let subscribe_list = self.subscribe_file_accessor.read().await?;
45 let chat_ids = match subscribe_list
46 .find_subscribe(event_message.event_name.as_str()) {
47 Some(value) => &value.chat_ids,
48 None => return Ok(())
49 };
50 let chats: Vec<Chat> = self.chat_list_file_accessor.read().await?
51 .chats
52 .into_iter()
53 .filter(|chat| {chat_ids.contains(&chat.id)})
54 .collect();
55 for chat in chats {
56 self.message_gateway.send_message(
57 chat.client_name.as_str(),
58 chat.identity.as_str(),
59 event_message.text.as_str()
60 ).await;
61 }
62 Ok(())
63 }
64}