Skip to content

Commit 7520fe2

Browse files
committed
Refactor settings.rs and parser.rs for improved readability and maintainability
1 parent c04a23f commit 7520fe2

File tree

3 files changed

+95
-90
lines changed

3 files changed

+95
-90
lines changed

src/main.rs

+66-73
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ async fn shutdown_signal() {
2828
}
2929

3030
#[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+
}
3636

3737
pub const SERIALIZE_OPTIONS: SerializeOptions = SerializeOptions::new()
3838
.skip_default_fields(false)
@@ -58,29 +58,25 @@ impl WebSocketHandler for ActionHandler {
5858
}
5959
})
6060
.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);
6464
let parsed = match parsed {
6565
Ok(parsed) => parsed,
6666
Err(e) => {
67-
event!(Level::ERROR, "Failed to parse message: {:?}", e);
67+
error!("Failed to parse message: {:?}", e);
6868
return Some(msg);
6969
}
7070
};
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
7874
);
7975
if direction_char == '\u{2193}' {
8076
return Some(msg);
8177
}
8278
if let Err(e) = self.send_message(parsed) {
83-
event!(Level::ERROR, "Failed to send message: {:?}", e);
79+
error!("Failed to send message: {:?}", e);
8480
}
8581
}
8682
Some(msg)
@@ -89,31 +85,30 @@ impl WebSocketHandler for ActionHandler {
8985

9086
impl ActionHandler {
9187
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) {
10091
return Ok(());
10192
}
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) {
107102
return Ok(());
108103
}
109104
let data = parsed.data.get_mut("data").ok_or("No data field")?;
110-
if name.contains("ActionNewRound") {
105+
if name == "ActionNewRound" {
111106
data.as_object_mut()
112107
.ok_or("data is not an object")?
113108
.insert("md5".to_string(), json!(RANDOM_MD5));
114109
}
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" {
117112
let game_restore = parsed
118113
.data
119114
.get("game_restore")
@@ -124,30 +119,31 @@ impl ActionHandler {
124119
.ok_or("actions is not an array")?;
125120
let mut actions: Vec<Action> = vec![];
126121
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() {
137133
let action = Action {
138134
name: action_name.to_string(),
139135
data: JsonValue::Object(Map::new()),
140136
};
141137
actions.push(action);
142138
} else {
143139
let b64 = BASE64_STANDARD.decode(action_data)?;
144-
let parser = self.0.lock().unwrap();
140+
let parser = self.parser.lock().unwrap();
145141
let action_type = parser
146142
.pool
147-
.get_message_by_name(&action_name)
143+
.get_message_by_name(action_name)
148144
.ok_or("Invalid action type")?;
149145
let mut action_obj = DynamicMessage::decode(action_type, b64.as_ref())?;
150-
if action_name.contains(".lq.ActionNewRound") {
146+
if action_name == ".lq.ActionNewRound" {
151147
action_obj.set_field_by_name("md5", Value::String(RANDOM_MD5.to_string()));
152148
}
153149
let value: JsonValue = my_serialize(action_obj)?;
@@ -163,26 +159,22 @@ impl ActionHandler {
163159
"sync_game_actions".to_string(),
164160
serde_json::to_value(actions)?,
165161
);
166-
json_body = serde_json::to_string(&map)?;
162+
json_data = JsonValue::Object(map);
167163
} else {
168-
json_body = serde_json::to_string(&parsed.data)?;
164+
json_data = parsed.data;
169165
}
170166

171167
// 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();
177170

178171
handle_future(future);
179-
event!(Level::INFO, "已发送: {}", json_body);
172+
info!("已发送: {}", json_data);
180173

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") {
183175
let res = client.post(&settings.api_url).json(liqi_data).send();
184176
handle_future(res);
185-
event!(Level::INFO, "已发送: {:?}", liqi_data);
177+
info!("已发送: {:?}", liqi_data);
186178
}
187179

188180
Ok(())
@@ -196,10 +188,10 @@ fn handle_future(
196188
match future.await {
197189
Ok(res) => {
198190
let body = res.text().await.unwrap_or_default();
199-
event!(Level::INFO, "小助手已接收: {}", body);
191+
info!("小助手已接收: {}", body);
200192
}
201193
Err(e) => {
202-
event!(Level::ERROR, "请求失败: {:?}", e);
194+
error!("请求失败: {:?}", e);
203195
}
204196
}
205197
});
@@ -221,26 +213,27 @@ async fn main() {
221213

222214
// print red declaimer text
223215
println!(
224-
"{}",
225216
"\x1b[31m
226217
本项目完全免费开源,如果您购买了此程序,请立即退款!
227218
项目地址: https://github.com/Xerxes-2/mahjong_helper_majsoul_hudsucker/
228219
229220
本程序仅供学习交流使用,严禁用于商业用途!
230221
请遵守当地法律法规,对于使用本程序所产生的任何后果,作者概不负责!
231-
请勿将本程序用于非法用途,否则后果自负!
232222
\x1b[0m"
233223
);
234224
let parser = parser::Parser::new();
235225
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+
};
244237
let client = reqwest::ClientBuilder::new()
245238
.danger_accept_invalid_certs(true)
246239
.build()
@@ -250,11 +243,11 @@ async fn main() {
250243
.with_addr(SocketAddr::from(([127, 0, 0, 1], 23410)))
251244
.with_rustls_client()
252245
.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),
256249
client,
257-
))
250+
})
258251
.with_graceful_shutdown(shutdown_signal())
259252
.build();
260253

src/parser.rs

+11-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use prost_reflect::{DescriptorPool, DynamicMessage, MessageDescriptor};
33
use serde::Serialize;
44
use serde_json::Value as JsonValue;
55
use std::{collections::HashMap, error::Error};
6-
use tracing::*;
76

87
use crate::SERIALIZE_OPTIONS;
98

@@ -46,7 +45,8 @@ impl Parser {
4645
pub fn new() -> Self {
4746
let json_str = include_str!("liqi.json");
4847
let proto_json = serde_json::from_str(json_str).expect("Failed to parse liqi.json");
49-
let pool = DescriptorPool::decode(include_bytes!("liqi.desc").as_ref()).unwrap();
48+
let pool = DescriptorPool::decode(include_bytes!("liqi.desc").as_ref())
49+
.expect("Failed to decode liqi.desc");
5050
Self {
5151
total: 0,
5252
respond_type: HashMap::new(),
@@ -57,7 +57,7 @@ impl Parser {
5757

5858
pub fn parse(&mut self, buf: &[u8]) -> Result<LiqiMessage, Box<dyn Error>> {
5959
let msg_type_byte = buf[0];
60-
if msg_type_byte < 1 || msg_type_byte > 3 {
60+
if !(1..=3).contains(&msg_type_byte) {
6161
return Err("Invalid message type".into());
6262
}
6363
let msg_type = match msg_type_byte {
@@ -73,11 +73,11 @@ impl Parser {
7373
MessageType::Notify => {
7474
let blks = buf_to_blocks(&buf[1..]).ok_or("Failed to parse blocks")?;
7575
method_name = String::from_utf8(blks[0].data.clone())?;
76-
let method_name_list: Vec<&str> = method_name.split(".").collect();
76+
let method_name_list: Vec<&str> = method_name.split('.').collect();
7777
let message_name = method_name_list[2];
7878
let message_type = self
7979
.pool
80-
.get_message_by_name(&to_fqn(&message_name))
80+
.get_message_by_name(&to_fqn(message_name))
8181
.ok_or("Invalid message type")?;
8282
let dyn_msg = DynamicMessage::decode(message_type, blks[1].data.as_ref())?;
8383
data_obj = my_serialize(dyn_msg)?;
@@ -93,7 +93,7 @@ impl Parser {
9393
let my_decoded = decode(&decoded);
9494
let action_type = self
9595
.pool
96-
.get_message_by_name(&to_fqn(&action_name))
96+
.get_message_by_name(&to_fqn(action_name))
9797
.ok_or("Invalid action type")?;
9898
let action_msg = DynamicMessage::decode(action_type, my_decoded.as_ref())?;
9999
let action_obj = my_serialize(action_msg)?;
@@ -113,7 +113,7 @@ impl Parser {
113113
// ascii decode into method name, method_name = msg_block[0]["data"].decode()
114114
let method_block = &blocks[0];
115115
method_name = String::from_utf8(method_block.data.to_owned())?;
116-
let method_name_list: Vec<&str> = method_name.split(".").collect();
116+
let method_name_list: Vec<&str> = method_name.split('.').collect();
117117
let lq = method_name_list[1];
118118
let service = method_name_list[2];
119119
let rpc = method_name_list[3];
@@ -143,7 +143,7 @@ impl Parser {
143143
MessageType::Response => {
144144
msg_id = u16::from_le_bytes([buf[1], buf[2]]) as usize;
145145
let blocks = buf_to_blocks(&buf[3..]).ok_or("Failed to parse blocks")?;
146-
assert!(blocks[0].data.len() == 0);
146+
assert!(blocks[0].data.is_empty());
147147
let resp_type: MessageDescriptor;
148148
(method_name, resp_type) = self
149149
.respond_type
@@ -176,8 +176,6 @@ struct Block {
176176
}
177177

178178
fn buf_to_blocks(buf: &[u8]) -> Option<Vec<Block>> {
179-
let hex_str = buf.iter().map(|b| format!("{:02x}", b)).collect::<String>();
180-
event!(Level::DEBUG, "buf: {}", hex_str);
181179
let mut blocks = Vec::new();
182180
let mut i = 0;
183181
let l = buf.len();
@@ -228,13 +226,13 @@ fn parse_var_int(buf: &[u8], p: usize) -> (usize, usize) {
228226
}
229227

230228
fn decode(data: &[u8]) -> Vec<u8> {
231-
let keys = vec![0x84, 0x5E, 0x4E, 0x42, 0x39, 0xA2, 0x1F, 0x60, 0x1C];
229+
let keys = [0x84, 0x5E, 0x4E, 0x42, 0x39, 0xA2, 0x1F, 0x60, 0x1C];
232230
let mut data = data.to_vec();
233231
let k = keys.len();
234232
let d = data.len();
235233
for i in 0..d {
236-
let u = (23 ^ d) + 5 * i + keys[i % k] & 255;
234+
let u = ((23 ^ d) + 5 * i + keys[i % k]) & 255;
237235
data[i] ^= u as u8;
238236
}
239-
return data;
237+
data
240238
}

src/settings.rs

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use serde::Deserialize;
2-
use serde_json;
3-
use tracing::event;
2+
use std::collections::HashSet;
3+
use tracing::info;
44

55
#[derive(Deserialize, Debug)]
66
pub struct Settings {
@@ -10,6 +10,10 @@ pub struct Settings {
1010
pub send_action: Vec<String>,
1111
#[serde(rename(deserialize = "API_URL"))]
1212
pub api_url: String,
13+
#[serde(skip)]
14+
methods_set: HashSet<String>,
15+
#[serde(skip)]
16+
actions_set: HashSet<String>,
1317
}
1418

1519
impl Settings {
@@ -28,9 +32,19 @@ impl Settings {
2832
|_| std::fs::read_to_string("settings.json"),
2933
)
3034
.map_err(|e| format!("无法读取settings.json: {}", e))?;
31-
let settings: Settings =
35+
let mut settings: Settings =
3236
serde_json::from_str(&settings).map_err(|e| format!("无法解析settings.json: {}", e))?;
33-
event!(tracing::Level::INFO, "已载入配置: {:?}", settings);
37+
info!("已载入配置: {:?}", settings);
38+
settings.methods_set = settings.send_method.iter().cloned().collect();
39+
settings.actions_set = settings.send_action.iter().cloned().collect();
3440
Ok(settings)
3541
}
42+
43+
pub fn is_method(&self, method: &str) -> bool {
44+
self.methods_set.contains(method)
45+
}
46+
47+
pub fn is_action(&self, action: &str) -> bool {
48+
self.actions_set.contains(action)
49+
}
3650
}

0 commit comments

Comments
 (0)