lenra_app/
listener.rs

1// use async_trait::async_trait;
2use serde::{de::DeserializeOwned, Deserialize};
3use serde_json::Value;
4
5use crate::{
6    api::{Api, ApiParam},
7    from_opt_value, HandleParams, Handler, NamedRequest, RequestHandler, Result,
8};
9
10/** Lenra listener request */
11#[derive(Deserialize, Debug, PartialEq, Default)]
12pub struct ListenerRequest {
13    pub listener: String,
14    pub props: Option<Value>,
15    pub event: Option<Value>,
16    pub api: ApiParam,
17}
18
19impl NamedRequest for ListenerRequest {
20    fn name(&self) -> String {
21        self.listener.clone()
22    }
23}
24
25pub struct ListenerParams<P = Value, E = Value>
26where
27    P: DeserializeOwned + 'static,
28    E: DeserializeOwned + 'static,
29{
30    pub props: Option<P>,
31    pub event: Option<E>,
32    pub api: Api,
33}
34
35impl<P, E> HandleParams<ListenerRequest> for ListenerParams<P, E>
36where
37    P: DeserializeOwned + 'static,
38    E: DeserializeOwned + 'static,
39{
40    fn from_request(request: ListenerRequest) -> Self {
41        ListenerParams {
42            props: from_opt_value(request.props).unwrap(),
43            event: from_opt_value(request.event).unwrap(),
44            api: Api::new(request.api),
45        }
46    }
47}
48
49pub struct Listener {
50    name: String,
51    build_fn: Box<dyn Fn(ListenerRequest) -> Result<()>>,
52}
53
54impl RequestHandler<ListenerRequest, ()> for Listener {
55    fn name(&self) -> String {
56        self.name.clone()
57    }
58
59    fn handle(&self, request: ListenerRequest) -> Result<()> {
60        (self.build_fn)(request)
61    }
62
63    fn create(name: &str, build_fn: Box<dyn Fn(ListenerRequest) -> Result<()>>) -> Self {
64        Listener {
65            name: name.to_string(),
66            build_fn,
67        }
68    }
69}
70
71impl Handler<ListenerRequest, ()> for Listener {}
72
73pub enum SystemEvents {
74    OnEnvStart,
75    OnUserFirstJoin,
76    OnSessionStart,
77    OnSessionStop,
78    OnUserLeave,
79    OnEnvStop,
80}
81
82impl SystemEvents {
83    pub fn to_str(&self) -> &str {
84        match self {
85            SystemEvents::OnEnvStart => "onEnvStart",
86            SystemEvents::OnUserFirstJoin => "onUserFirstJoin",
87            SystemEvents::OnSessionStart => "onSessionStart",
88            SystemEvents::OnSessionStop => "onSessionStop",
89            SystemEvents::OnUserLeave => "onUserLeave",
90            SystemEvents::OnEnvStop => "onEnvStop",
91        }
92    }
93}