use serde::{Deserialize, Serialize};
use crate::event::{context::EventHeader, dispatcher::EventHandler};
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ImMessageReceiveV1 {
pub schema: String,
pub header: EventHeader,
pub event: P2ImMessageReceiveV1Data,
}
pub(crate) struct P2ImMessageReceiveV1ProcessorImpl<F>
where
F: Fn(P2ImMessageReceiveV1) + 'static,
{
f: F,
}
impl<F> EventHandler for P2ImMessageReceiveV1ProcessorImpl<F>
where
F: Fn(P2ImMessageReceiveV1) + 'static + Sync + Send,
{
fn handle(&self, payload: &[u8]) -> anyhow::Result<()> {
let message: P2ImMessageReceiveV1 = serde_json::from_slice(payload)?;
(self.f)(message);
Ok(())
}
}
impl<F> P2ImMessageReceiveV1ProcessorImpl<F>
where
F: Fn(P2ImMessageReceiveV1) + 'static,
{
pub(crate) fn new(f: F) -> Self {
P2ImMessageReceiveV1ProcessorImpl { f }
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ImMessageReceiveV1Data {
pub sender: EventSender,
pub message: EventMessage,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EventSender {
pub sender_id: UserId,
pub sender_type: String,
pub tenant_key: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserId {
pub union_id: String,
pub user_id: String,
pub open_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EventMessage {
pub message_id: String,
pub root_id: Option<String>,
pub parent_id: Option<String>,
pub create_time: String,
pub update_time: String,
pub chat_id: String,
pub thread_id: Option<String>,
pub chat_type: String,
pub message_type: String,
pub content: String,
pub mentions: Option<Vec<MentionEvent>>,
pub user_agent: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MentionEvent {
pub key: String,
pub id: UserId,
pub name: String,
pub tenant_key: String,
}
#[cfg(test)]
#[allow(unused_variables, unused_unsafe)]
mod test {
use serde_json::json;
use crate::event::context::EventContext;
#[test]
fn test_decode() {
let p1 = json!({"schema":"2.0","header":{"event_id":"7db4fd0bb90cfa6127e3aaa446d39b37","token
":"","create_time":"1719211482721","event_type":"im.message.receive_v1","tenant_key":"tenant_key","app_id":"app_id"},
"event":
{
"message":
{
"chat_id":"oc_84d53efe245072c16ba4b4ff597f52f3",
"chat_type":"group",
"content":"{\"text\":\"55u\"}",
"create_time":"1719211482485",
"message_id":"om_b1e37040d3f888af8a7e47affae94360",
"message_type":"text","update_time":"1719211482485"
},
"sender":
{
"sender_id":{
"open_id":"ou_b434284f852b1531071855b16d19f40b",
"union_id":"on_526dbf7b9ef1fda341aecb79a2481662",
"user_id":"aa5cf9d7"
},
"sender_type":"user",
"tenant_key":"133195a24e8f575d"
}
}});
let event_context: EventContext = serde_json::from_value(p1).unwrap();
assert_eq!(event_context.schema, Some("2.0".to_string()));
}
}