Skip to main content

server_watchdog/application/event/
receiver.rs

1use 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}