Skip to main content

wx_sdk/mp/event/msg_event/
mod.rs

1use roxmltree::Node;
2
3use crate::SdkResult;
4
5use self::{
6    event_click::ClickEvent,
7    event_guide::{GuideInviteResultEvent, GuideQrcodeScanEvent},
8    event_location::LocationEvent,
9    event_publishjob::PublishJobFinishEvent,
10    event_scan::{MenuScanEvent, ScanEvent},
11    event_send::{SendLocationEvent, SendPicsEvent},
12    event_sendjob::{MassSendJobFinishEvent, TemplateSendJobFinishEvent},
13    event_subscribe::SubScribeEvent,
14    event_view::ViewEvent,
15};
16
17use super::{xmlutil::get_text_from_root, ReceivedMessageParser};
18
19pub mod event_click;
20pub mod event_guide;
21pub mod event_location;
22pub mod event_publishjob;
23pub mod event_scan;
24pub mod event_send;
25pub mod event_sendjob;
26pub mod event_subscribe;
27pub mod event_view;
28
29const EVENT_SUBSCRIBE: &'static str = "subscribe";
30const EVENT_UNSUBSCRIBE: &'static str = "unsubscribe";
31const EVENT_SCAN: &'static str = "SCAN";
32const EVENT_LOCATION: &'static str = "LOCATION"; // 地理位置事件
33const EVENT_CLICK: &'static str = "CLICK";
34const EVENT_VIEW: &'static str = "VIEW";
35const EVENT_SCANCODE_PUSH: &'static str = "scancode_push";
36const EVENT_SCANCODE_WAITMSG: &'static str = "scancode_waitmsg";
37const EVENT_PIC_SYSPHOTO: &'static str = "pic_sysphoto";
38const EVENT_PIC_PHOTO_OR_ALBUM: &'static str = "pic_photo_or_album";
39const EVENT_PIC_WEIXIN: &'static str = "pic_weixin";
40const EVENT_LOCATION_SELECT: &'static str = "location_select";
41const EVENT_VIEW_MINIPROGRAM: &'static str = "view_miniprogram";
42const EVENT_TEMPLATESENDJOBFINISH: &'static str = "TEMPLATESENDJOBFINISH";
43const EVENT_MASSSENDJOBFINISH: &'static str = "MASSSENDJOBFINISH";
44const EVENT_GUIDE_INVITE_RESULT: &'static str = "guide_invite_result_event";
45const EVENT_GUIDE_QRCODE_SCAN: &'static str = "guide_qrcode_scan_event";
46const EVENT_PUBLISHJOBFINISH: &'static str = "PUBLISHJOBFINISH";
47
48pub enum EventMessage {
49    Subscribe,
50    UnSubscribe,
51    SubscribeScan(ScanEvent),
52    Scan(ScanEvent),
53    Location(LocationEvent),
54    Click(ClickEvent),
55    View(ViewEvent),
56    ViewMiniProgram(ViewEvent),
57    ScanCodePush(MenuScanEvent),
58    ScanCodeWaitMsg(MenuScanEvent),
59    PicSysPhoto(SendPicsEvent),
60    PicPhotoOrAlbum(SendPicsEvent),
61    PicWeixin(SendPicsEvent),
62    LocationSelect(SendLocationEvent),
63    TemplateSendJobFinish(TemplateSendJobFinishEvent),
64    MassSendJobFinish(MassSendJobFinishEvent),
65    GuideInviteResult(GuideInviteResultEvent),
66    GuideQrcodeScan(GuideQrcodeScanEvent),
67    PublishJobFinish(PublishJobFinishEvent),
68    UnhandledEvent(String),
69}
70
71impl ReceivedMessageParser for EventMessage {
72    type ReceivedMessage = Self;
73
74    fn from_xml(node: &Node) -> SdkResult<Self::ReceivedMessage> {
75        let event_type = get_text_from_root(node, "Event")?;
76        let event = match event_type {
77            EVENT_SUBSCRIBE => SubScribeEvent::from_xml(node)?,
78            EVENT_UNSUBSCRIBE => EventMessage::UnSubscribe,
79            EVENT_SCAN => EventMessage::Scan(ScanEvent::from_xml(node)?),
80            EVENT_LOCATION => EventMessage::Location(LocationEvent::from_xml(node)?),
81            EVENT_CLICK => EventMessage::Click(ClickEvent::from_xml(node)?),
82            EVENT_VIEW => EventMessage::View(ViewEvent::from_xml(node)?),
83            EVENT_VIEW_MINIPROGRAM => EventMessage::ViewMiniProgram(ViewEvent::from_xml(node)?),
84            EVENT_SCANCODE_PUSH => EventMessage::ScanCodePush(MenuScanEvent::from_xml(node)?),
85            EVENT_SCANCODE_WAITMSG => EventMessage::ScanCodeWaitMsg(MenuScanEvent::from_xml(node)?),
86            EVENT_PIC_SYSPHOTO => EventMessage::PicSysPhoto(SendPicsEvent::from_xml(node)?),
87            EVENT_PIC_PHOTO_OR_ALBUM => {
88                EventMessage::PicPhotoOrAlbum(SendPicsEvent::from_xml(node)?)
89            }
90            EVENT_PIC_WEIXIN => EventMessage::PicWeixin(SendPicsEvent::from_xml(node)?),
91            EVENT_LOCATION_SELECT => {
92                EventMessage::LocationSelect(SendLocationEvent::from_xml(node)?)
93            }
94            EVENT_MASSSENDJOBFINISH => {
95                EventMessage::MassSendJobFinish(MassSendJobFinishEvent::from_xml(node)?)
96            }
97            EVENT_TEMPLATESENDJOBFINISH => {
98                EventMessage::TemplateSendJobFinish(TemplateSendJobFinishEvent::from_xml(node)?)
99            }
100            EVENT_GUIDE_INVITE_RESULT => {
101                EventMessage::GuideInviteResult(GuideInviteResultEvent::from_xml(node)?)
102            }
103            EVENT_GUIDE_QRCODE_SCAN => {
104                EventMessage::GuideQrcodeScan(GuideQrcodeScanEvent::from_xml(node)?)
105            }
106            EVENT_PUBLISHJOBFINISH => {
107                EventMessage::PublishJobFinish(PublishJobFinishEvent::from_xml(node)?)
108            }
109            _ => EventMessage::UnhandledEvent(format!("unhandle this event type: {}", event_type)),
110        };
111        Ok(event)
112    }
113}
114
115impl EventMessage {
116    pub fn get_event_type(&self) -> &'static str {
117        match self {
118            EventMessage::Subscribe => EVENT_SUBSCRIBE,
119            EventMessage::UnSubscribe => EVENT_UNSUBSCRIBE,
120            EventMessage::SubscribeScan(_) => EVENT_SUBSCRIBE,
121            EventMessage::Scan(_) => EVENT_SCAN,
122            EventMessage::Location(_) => EVENT_LOCATION,
123            EventMessage::Click(_) => EVENT_CLICK,
124            EventMessage::View(_) => EVENT_VIEW,
125            EventMessage::ViewMiniProgram(_) => EVENT_VIEW_MINIPROGRAM,
126            EventMessage::ScanCodePush(_) => EVENT_SCANCODE_PUSH,
127            EventMessage::ScanCodeWaitMsg(_) => EVENT_SCANCODE_WAITMSG,
128            EventMessage::PicSysPhoto(_) => EVENT_PIC_SYSPHOTO,
129            EventMessage::PicPhotoOrAlbum(_) => EVENT_PIC_PHOTO_OR_ALBUM,
130            EventMessage::PicWeixin(_) => EVENT_PIC_WEIXIN,
131            EventMessage::LocationSelect(_) => EVENT_LOCATION_SELECT,
132            EventMessage::TemplateSendJobFinish(_) => EVENT_TEMPLATESENDJOBFINISH,
133            EventMessage::MassSendJobFinish(_) => EVENT_MASSSENDJOBFINISH,
134            EventMessage::GuideInviteResult(_) => EVENT_GUIDE_INVITE_RESULT,
135            EventMessage::GuideQrcodeScan(_) => EVENT_GUIDE_QRCODE_SCAN,
136            EventMessage::PublishJobFinish(_) => EVENT_PUBLISHJOBFINISH,
137            EventMessage::UnhandledEvent(_) => "UnhandledEvent",
138        }
139    }
140}