@@ -28,11 +28,11 @@ async fn shutdown_signal() {
28
28
}
29
29
30
30
#[ derive( Clone ) ]
31
- struct ActionHandler (
32
- Arc < Mutex < parser:: Parser > > ,
33
- Arc < settings:: Settings > ,
34
- reqwest:: Client ,
35
- ) ;
31
+ struct ActionHandler {
32
+ parser : Arc < Mutex < parser:: Parser > > ,
33
+ settings : Arc < settings:: Settings > ,
34
+ client : reqwest:: Client ,
35
+ }
36
36
37
37
pub const SERIALIZE_OPTIONS : SerializeOptions = SerializeOptions :: new ( )
38
38
. skip_default_fields ( false )
@@ -58,29 +58,25 @@ impl WebSocketHandler for ActionHandler {
58
58
}
59
59
} )
60
60
. collect :: < String > ( ) ;
61
- event ! ( Level :: DEBUG , "{} {}" , direction_char, hex) ;
62
- let mut parser = self . 0 . lock ( ) . unwrap ( ) ;
63
- let parsed = parser. parse ( & buf) ;
61
+ debug ! ( "{} {}" , direction_char, hex) ;
62
+ let mut parser = self . parser . lock ( ) . unwrap ( ) ;
63
+ let parsed = parser. parse ( buf) ;
64
64
let parsed = match parsed {
65
65
Ok ( parsed) => parsed,
66
66
Err ( e) => {
67
- event ! ( Level :: ERROR , "Failed to parse message: {:?}" , e) ;
67
+ error ! ( "Failed to parse message: {:?}" , e) ;
68
68
return Some ( msg) ;
69
69
}
70
70
} ;
71
- event ! (
72
- Level :: INFO ,
73
- "拦截到: {}, {}, {:?}, {}" ,
74
- direction_char,
75
- parsed. id,
76
- parsed. msg_type,
77
- parsed. method_name
71
+ info ! (
72
+ "监听到: {}, {}, {:?}, {}" ,
73
+ direction_char, parsed. id, parsed. msg_type, parsed. method_name
78
74
) ;
79
75
if direction_char == '\u{2193}' {
80
76
return Some ( msg) ;
81
77
}
82
78
if let Err ( e) = self . send_message ( parsed) {
83
- event ! ( Level :: ERROR , "Failed to send message: {:?}" , e) ;
79
+ error ! ( "Failed to send message: {:?}" , e) ;
84
80
}
85
81
}
86
82
Some ( msg)
@@ -89,31 +85,30 @@ impl WebSocketHandler for ActionHandler {
89
85
90
86
impl ActionHandler {
91
87
fn send_message ( & self , mut parsed : LiqiMessage ) -> Result < ( ) , Box < dyn Error > > {
92
- let settings = self . 1 . clone ( ) ;
93
- let json_body: String ;
94
- event ! ( Level :: INFO , "Method: {}" , parsed. method_name) ;
95
- if settings
96
- . send_method
97
- . iter ( )
98
- . all ( |x| !parsed. method_name . contains ( x) )
99
- {
88
+ let settings = self . settings . clone ( ) ;
89
+ let json_data: JsonValue ;
90
+ if !settings. is_method ( & parsed. method_name ) {
100
91
return Ok ( ( ) ) ;
101
92
}
102
- if parsed. method_name . contains ( ".lq.ActionPrototype" ) {
103
- let name = parsed. data . get ( "name" ) . ok_or ( "No name field" ) ?. to_string ( ) ;
104
- event ! ( Level :: INFO , "Action: {}" , name) ;
105
- if settings. send_action . iter ( ) . all ( |x| !name. contains ( x) ) {
106
- event ! ( Level :: INFO , "Action {} not in send_action" , name) ;
93
+ if parsed. method_name == ".lq.ActionPrototype" {
94
+ let name = parsed
95
+ . data
96
+ . get ( "name" )
97
+ . ok_or ( "No name field" ) ?
98
+ . as_str ( )
99
+ . ok_or ( "name is not a string" ) ?
100
+ . to_owned ( ) ;
101
+ if !settings. is_action ( & name) {
107
102
return Ok ( ( ) ) ;
108
103
}
109
104
let data = parsed. data . get_mut ( "data" ) . ok_or ( "No data field" ) ?;
110
- if name. contains ( "ActionNewRound" ) {
105
+ if name == "ActionNewRound" {
111
106
data. as_object_mut ( )
112
107
. ok_or ( "data is not an object" ) ?
113
108
. insert ( "md5" . to_string ( ) , json ! ( RANDOM_MD5 ) ) ;
114
109
}
115
- json_body = serde_json :: to_string ( data) ? ;
116
- } else if parsed. method_name . contains ( ".lq.FastTest.syncGame" ) {
110
+ json_data = data. take ( ) ;
111
+ } else if parsed. method_name == ".lq.FastTest.syncGame" {
117
112
let game_restore = parsed
118
113
. data
119
114
. get ( "game_restore" )
@@ -124,30 +119,31 @@ impl ActionHandler {
124
119
. ok_or ( "actions is not an array" ) ?;
125
120
let mut actions: Vec < Action > = vec ! [ ] ;
126
121
for item in game_restore. iter ( ) {
127
- let action_name = item. get ( "name" ) . ok_or ( "No name field" ) ?. as_str ( ) . ok_or (
128
- "
129
- name is not a string
130
- " ,
131
- ) ?;
132
- let action_data = item. get ( "data" ) . ok_or ( "No data field" ) ?. as_str ( ) . unwrap_or (
133
- "
134
- data is not a string" ,
135
- ) ;
136
- if action_data. len ( ) == 0 {
122
+ let action_name = item
123
+ . get ( "name" )
124
+ . ok_or ( "No name field" ) ?
125
+ . as_str ( )
126
+ . ok_or ( "name is not a string" ) ?;
127
+ let action_data = item
128
+ . get ( "data" )
129
+ . ok_or ( "No data field" ) ?
130
+ . as_str ( )
131
+ . unwrap_or ( "data is not a string" ) ;
132
+ if action_data. is_empty ( ) {
137
133
let action = Action {
138
134
name : action_name. to_string ( ) ,
139
135
data : JsonValue :: Object ( Map :: new ( ) ) ,
140
136
} ;
141
137
actions. push ( action) ;
142
138
} else {
143
139
let b64 = BASE64_STANDARD . decode ( action_data) ?;
144
- let parser = self . 0 . lock ( ) . unwrap ( ) ;
140
+ let parser = self . parser . lock ( ) . unwrap ( ) ;
145
141
let action_type = parser
146
142
. pool
147
- . get_message_by_name ( & action_name)
143
+ . get_message_by_name ( action_name)
148
144
. ok_or ( "Invalid action type" ) ?;
149
145
let mut action_obj = DynamicMessage :: decode ( action_type, b64. as_ref ( ) ) ?;
150
- if action_name. contains ( ".lq.ActionNewRound" ) {
146
+ if action_name == ".lq.ActionNewRound" {
151
147
action_obj. set_field_by_name ( "md5" , Value :: String ( RANDOM_MD5 . to_string ( ) ) ) ;
152
148
}
153
149
let value: JsonValue = my_serialize ( action_obj) ?;
@@ -163,26 +159,22 @@ impl ActionHandler {
163
159
"sync_game_actions" . to_string ( ) ,
164
160
serde_json:: to_value ( actions) ?,
165
161
) ;
166
- json_body = serde_json :: to_string ( & map) ? ;
162
+ json_data = JsonValue :: Object ( map) ;
167
163
} else {
168
- json_body = serde_json :: to_string ( & parsed. data ) ? ;
164
+ json_data = parsed. data ;
169
165
}
170
166
171
167
// post data to API, no verification
172
- let client = self . 2 . clone ( ) ;
173
- let future = client
174
- . post ( & settings. api_url )
175
- . body ( json_body. to_owned ( ) )
176
- . send ( ) ;
168
+ let client = self . client . clone ( ) ;
169
+ let future = client. post ( & settings. api_url ) . json ( & json_data) . send ( ) ;
177
170
178
171
handle_future ( future) ;
179
- event ! ( Level :: INFO , "已发送: {}" , json_body ) ;
172
+ info ! ( "已发送: {}" , json_data ) ;
180
173
181
- let json_obj: JsonValue = serde_json:: from_str ( & json_body) ?;
182
- if let Some ( liqi_data) = json_obj. get ( "liqi" ) {
174
+ if let Some ( liqi_data) = json_data. get ( "liqi" ) {
183
175
let res = client. post ( & settings. api_url ) . json ( liqi_data) . send ( ) ;
184
176
handle_future ( res) ;
185
- event ! ( Level :: INFO , "已发送: {:?}" , liqi_data) ;
177
+ info ! ( "已发送: {:?}" , liqi_data) ;
186
178
}
187
179
188
180
Ok ( ( ) )
@@ -196,10 +188,10 @@ fn handle_future(
196
188
match future. await {
197
189
Ok ( res) => {
198
190
let body = res. text ( ) . await . unwrap_or_default ( ) ;
199
- event ! ( Level :: INFO , "小助手已接收: {}" , body) ;
191
+ info ! ( "小助手已接收: {}" , body) ;
200
192
}
201
193
Err ( e) => {
202
- event ! ( Level :: ERROR , "请求失败: {:?}" , e) ;
194
+ error ! ( "请求失败: {:?}" , e) ;
203
195
}
204
196
}
205
197
} ) ;
@@ -221,26 +213,27 @@ async fn main() {
221
213
222
214
// print red declaimer text
223
215
println ! (
224
- "{}" ,
225
216
"\x1b [31m
226
217
本项目完全免费开源,如果您购买了此程序,请立即退款!
227
218
项目地址: https://github.com/Xerxes-2/mahjong_helper_majsoul_hudsucker/
228
219
229
220
本程序仅供学习交流使用,严禁用于商业用途!
230
221
请遵守当地法律法规,对于使用本程序所产生的任何后果,作者概不负责!
231
- 请勿将本程序用于非法用途,否则后果自负!
232
222
\x1b [0m"
233
223
) ;
234
224
let parser = parser:: Parser :: new ( ) ;
235
225
let settings = settings:: Settings :: new ( ) ;
236
- if let Err ( e) = settings {
237
- error ! ( "{}" , e) ;
238
- // press any key to exit
239
- println ! ( "按任意键退出" ) ;
240
- let _ = std:: io:: stdin ( ) . read ( & mut [ 0u8 ] ) . unwrap ( ) ;
241
- return ;
242
- }
243
- let settings = settings. unwrap ( ) ;
226
+ let settings = match settings {
227
+ Ok ( settings) => settings,
228
+ Err ( e) => {
229
+ error ! ( "{}" , e) ;
230
+ // press any key to exit
231
+ println ! ( "按任意键退出" ) ;
232
+ let mut stdin = std:: io:: stdin ( ) ;
233
+ let _ = stdin. read ( & mut [ 0u8 ] ) . unwrap_or_default ( ) ;
234
+ return ;
235
+ }
236
+ } ;
244
237
let client = reqwest:: ClientBuilder :: new ( )
245
238
. danger_accept_invalid_certs ( true )
246
239
. build ( )
@@ -250,11 +243,11 @@ async fn main() {
250
243
. with_addr ( SocketAddr :: from ( ( [ 127 , 0 , 0 , 1 ] , 23410 ) ) )
251
244
. with_rustls_client ( )
252
245
. with_ca ( ca)
253
- . with_websocket_handler ( ActionHandler (
254
- Arc :: new ( Mutex :: new ( parser) ) ,
255
- Arc :: new ( settings) ,
246
+ . with_websocket_handler ( ActionHandler {
247
+ parser : Arc :: new ( Mutex :: new ( parser) ) ,
248
+ settings : Arc :: new ( settings) ,
256
249
client,
257
- ) )
250
+ } )
258
251
. with_graceful_shutdown ( shutdown_signal ( ) )
259
252
. build ( ) ;
260
253
0 commit comments