flare_im_core/client/
handlers.rs1use 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#[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 pub fn with_system_handler(sys_handler: S) -> Self
33 where M: Default {
34 Self::new(sys_handler, M::default())
35 }
36
37 pub fn with_message_handler(msg_handler: M) -> Self
39 where S: Default {
40 Self::new(S::default(), msg_handler)
41 }
42
43 pub async fn handle_command(&self, command: Command, data: Vec<u8>) -> Result<()> {
45 debug!("处理命令: {:?}", command);
46
47 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 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 pub async fn on_response(&self, msg: &Response) {
91 self.msg_handler.on_response(msg).await;
92 }
93
94 pub async fn handle_state_change(&self, state: ClientState) {
96 self.sys_handler.on_state_change(state).await;
97 }
98}
99
100pub 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}