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