Skip to content

Commit 53ddf4c

Browse files
committed
feat: 添加@我事件处理示例
1 parent 4b48f70 commit 53ddf4c

File tree

7 files changed

+132
-18
lines changed

7 files changed

+132
-18
lines changed

src-tauri/Cargo.lock

Lines changed: 33 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ ureq = { version = "2.10", features = ["json"] }
4242
rust_socketio = {version = "0.6.0", features = ["async"] }
4343
futures-util = "0.3.31"
4444
regex = "1"
45+
quickxml_to_serde = {version ="0.6.0", features = ["json_types", "regex_path"] }
4546

4647
[features]
4748
# this feature is used for production builds or when `devPath` points to the filesystem
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use async_trait::async_trait;
2+
use quickxml_to_serde::{xml_string_to_json, Config};
3+
4+
use crate::{handler::event_entity::{Event, EventHandler}, service::global_service::GLOBAL, wcferry::wcf};
5+
6+
/// 日志打印
7+
pub struct EventMessageHandler {
8+
pub id: String,
9+
}
10+
11+
#[async_trait]
12+
impl EventHandler for EventMessageHandler {
13+
async fn handle(&mut self, event: Event) {
14+
if let Event::ClientMessage(ref msg) = event {
15+
if msg.r#type == 1 {
16+
17+
log::debug!("[{}] 接收到事件推送:{:?}", self.id, msg);
18+
if !msg.content.contains("关键词") {
19+
return
20+
}
21+
22+
// 解析xml 判断是否是at自己的信息
23+
let mut is_at_me = false;
24+
25+
let global = GLOBAL.get().unwrap();
26+
let wechat_service = global.wechat_service.clone();
27+
let self_wx_id = wechat_service.lock().unwrap().get_self_wxid();
28+
29+
let json = xml_string_to_json(msg.xml.clone(), &Config::new_with_defaults()).unwrap();
30+
let msgsource = json.get("msgsource");
31+
if msgsource.is_some(){
32+
// 事件推送中包含 @某人,记录 @某人列表
33+
let at_user_list = msgsource.unwrap().get("atuserlist");
34+
if at_user_list.is_some() {
35+
36+
let at_user_list = at_user_list.unwrap();
37+
for at_user_item in at_user_list.as_str().unwrap().split(",") {
38+
if self_wx_id == at_user_item {
39+
is_at_me = true;
40+
}
41+
}
42+
}
43+
}
44+
45+
// 如果不是@我,则停止处理
46+
if !is_at_me {
47+
return;
48+
}
49+
log::debug!("[{}] 接收到事件有人@我:{:?}", self.id, msg);
50+
let wechat_service = global.wechat_service.clone();
51+
let text_msg = wcf::TextMsg{
52+
msg: format!("@{} {}",msg.sender.clone()," 事件推送有人at我".to_string()),
53+
receiver: msg.roomid.clone(),
54+
aters: msg.sender.clone()
55+
};
56+
log::debug!("发送的文本信息 -- {:?}",text_msg);
57+
wechat_service.lock().unwrap().send_text(text_msg);
58+
}
59+
}
60+
}
61+
}
62+
63+
64+
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod log_message_handler;
22
pub mod console_message_handler;
33
pub mod http_message_handler;
4-
pub mod socketio_message_handler;
4+
pub mod socketio_message_handler;
5+
pub mod event_message_handler;

src-tauri/src/service/global_service.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{fs, sync::{Arc, Mutex, OnceLock, RwLock}};
22

33
use rand::Rng;
44

5-
use crate::{handler::{message::{http_message_handler::HttpMessageHandler, log_message_handler::LogMessageHandler, socketio_message_handler::SocketIOMessageHandler}, msg_event_mgr::MsgEventBus, startup::service_handler::HttpServerHandler, startup_event_mgr::StartUpEventBus}, service::http_server_service::HttpServerService, wechat_config::WechatConfig};
5+
use crate::{handler::{message::{event_message_handler::EventMessageHandler, http_message_handler::HttpMessageHandler, log_message_handler::LogMessageHandler, socketio_message_handler::SocketIOMessageHandler}, msg_event_mgr::MsgEventBus, startup::service_handler::HttpServerHandler, startup_event_mgr::StartUpEventBus}, service::http_server_service::HttpServerService, wechat_config::WechatConfig};
66

77
use super::{socketio_service::SocketIOService, wechat_service::WechatService};
88

@@ -66,11 +66,17 @@ pub fn initialize_global() {
6666
msg_event_bus.subscribe(http_handler);
6767

6868

69-
// socketIO 消息转发
70-
let socket_io_handler = Box::new(SocketIOMessageHandler {
71-
id: rng.gen::<u32>().to_string(),
72-
});
73-
msg_event_bus.subscribe(socket_io_handler);
69+
// 事件处理
70+
let event_msg_handler = Box::new(EventMessageHandler {
71+
id: "@事件处理器".to_string(),
72+
});
73+
msg_event_bus.subscribe(event_msg_handler);
74+
75+
// socketIO 消息转发
76+
let socket_io_handler = Box::new(SocketIOMessageHandler {
77+
id: rng.gen::<u32>().to_string(),
78+
});
79+
msg_event_bus.subscribe(socket_io_handler);
7480

7581

7682
log::info!("-------------------微信消息监听初始化 结束--------------------------------");

src-tauri/src/service/wechat_service.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::sync::{Arc, Mutex};
22

3-
use crate::wcferry::{wcf::RichText, WeChat};
3+
use crate::wcferry::{wcf::{self, RichText}, WeChat};
44

55
pub struct WechatService {
66
pub wechat : Option<Arc<Mutex<WeChat>>>,
@@ -13,10 +13,29 @@ impl WechatService {
1313
WechatService { wechat }
1414
}
1515

16+
// 发送富文本信息
1617
pub fn send_rich_text(&mut self, msg: RichText) {
1718
if let Some(wc) = &self.wechat {
1819
let wcc = wc.lock().unwrap();
1920
let _ = wcc.send_rich_text(msg);
2021
}
2122
}
23+
24+
// 获取自身的 wxid
25+
pub fn get_self_wxid(&mut self) -> String {
26+
if let Some(wc) = &self.wechat {
27+
let wcc = wc.lock().unwrap();
28+
return wcc.get_self_wxid().unwrap_or("".to_string());
29+
}
30+
"".to_string()
31+
}
32+
33+
// 发送文本信息
34+
pub fn send_text(&mut self, content: wcf::TextMsg) {
35+
if let Some(wc) = &self.wechat {
36+
let wcc = wc.lock().unwrap();
37+
let _ = wcc.send_text(content);
38+
}
39+
}
40+
2241
}

src/components.d.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,18 @@ declare module 'vue' {
1212
ElAutoResizer: typeof import('element-plus/es')['ElAutoResizer']
1313
ElAvatar: typeof import('element-plus/es')['ElAvatar']
1414
ElButton: typeof import('element-plus/es')['ElButton']
15-
ElCard: typeof import('element-plus/es')['ElCard']
16-
ElCol: typeof import('element-plus/es')['ElCol']
1715
ElContainer: typeof import('element-plus/es')['ElContainer']
1816
ElFooter: typeof import('element-plus/es')['ElFooter']
19-
ElForm: typeof import('element-plus/es')['ElForm']
20-
ElFormItem: typeof import('element-plus/es')['ElFormItem']
2117
ElHeader: typeof import('element-plus/es')['ElHeader']
22-
ElInput: typeof import('element-plus/es')['ElInput']
23-
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
2418
ElMain: typeof import('element-plus/es')['ElMain']
2519
ElMenu: typeof import('element-plus/es')['ElMenu']
2620
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
2721
ElOption: typeof import('element-plus/es')['ElOption']
28-
ElRow: typeof import('element-plus/es')['ElRow']
2922
ElSelect: typeof import('element-plus/es')['ElSelect']
3023
ElSpace: typeof import('element-plus/es')['ElSpace']
3124
ElSwitch: typeof import('element-plus/es')['ElSwitch']
3225
ElTable: typeof import('element-plus/es')['ElTable']
3326
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
34-
ElTabPane: typeof import('element-plus/es')['ElTabPane']
35-
ElTabs: typeof import('element-plus/es')['ElTabs']
3627
ElText: typeof import('element-plus/es')['ElText']
3728
Home: typeof import('./components/Home.vue')['default']
3829
JsonFormat: typeof import('./components/tools/JsonFormat.vue')['default']

0 commit comments

Comments
 (0)