flare_im_core/client/
handlers.rs

1use crate::client::client::ClientState;
2use crate::client::message_handler::MessageHandler;
3use crate::client::sys_handler::{ClientSystemHandler, DefClientSystemHandler};
4use flare_core::error::Result;
5use log::{debug, error};
6use flare_core::flare_net::net::{Command, Response};
7
8/// 客户端消息处理器
9#[derive(Default)]
10pub struct ClientMessageHandler<S , M >
11where
12    S: ClientSystemHandler + Send + Sync + 'static,
13    M: MessageHandler + Send + Sync + 'static,
14{
15    sys_handler: S,
16    msg_handler: M,
17}
18
19impl<S, M> ClientMessageHandler<S, M>
20where
21    S: ClientSystemHandler + Send + Sync + 'static,
22    M: MessageHandler + Send + Sync + 'static,
23{
24    pub fn new(sys_handler: S, msg_handler: M) -> Self {
25        Self {
26            sys_handler,
27            msg_handler,
28        }
29    }
30
31    /// 创建带自定义系统处理器的实例
32    pub fn with_system_handler(sys_handler: S) -> Self 
33    where M: Default {
34        Self::new(sys_handler, M::default())
35    }
36
37    /// 创建带自定义消息处理器的实例
38    pub fn with_message_handler(msg_handler: M) -> Self 
39    where S: Default {
40        Self::new(S::default(), msg_handler)
41    }
42
43    /// 处理命令
44    pub async fn handle_command(&self, command: Command, data: Vec<u8>) -> Result<()> {
45        debug!("处理命令: {:?}", command);
46        
47        // 先检查是否是系统命令
48        if self.sys_handler.supports_command(command) {
49            match command {
50                Command::LoginOut => self.sys_handler.login_out().await,
51                Command::SetBackground => self.sys_handler.set_background().await,
52                Command::SetLanguage => self.sys_handler.set_language().await,
53                Command::KickOnline => self.sys_handler.kick_online().await,
54                Command::Close => self.sys_handler.close().await,
55                _ => Ok(()),
56            }
57        }
58        // 再检查是否是消息命令
59        else if self.msg_handler.supports_command(command) {
60            match command {
61                Command::ServerPushMsg => {
62                    self.msg_handler.on_message(data).await;
63                    Ok(())
64                },
65                Command::ServerPushCustom => {
66                    self.msg_handler.on_custom_message(data).await;
67                    Ok(())
68                },
69                Command::ServerPushNotice => {
70                    self.msg_handler.on_notice_message(data).await;
71                    Ok(())
72                },
73                Command::ServerPushData => {
74                    self.msg_handler.on_data(data).await;
75                    Ok(())
76                },
77                Command::ServerAck => {
78                    self.msg_handler.on_ack_message(data).await;
79                    Ok(())
80                },
81                _ => Ok(()),
82            }
83        } else {
84            error!("Unsupported command: {:?}", command);
85            Ok(())
86        }
87    }
88
89    /// 处理响应
90    pub async fn on_response(&self, msg: &Response) {
91        self.msg_handler.on_response(msg).await;
92    }
93
94    /// 处理连接状态变化
95    pub async fn handle_state_change(&self, state: ClientState) {
96        self.sys_handler.on_state_change(state).await;
97    }
98}
99
100/// 默认消息处理器
101pub use crate::client::message_handler::DefMessageHandler;
102
103impl Default for ClientMessageHandler<DefClientSystemHandler, DefMessageHandler> {
104    fn default() -> Self {
105        Self::new(
106            DefClientSystemHandler::new(),
107            DefMessageHandler::new(),
108        )
109    }
110}