use serde::{Deserialize, Serialize};
use crate::event::{context::EventHeader, dispatcher::EventHandler};
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ImChatUpdatedV1 {
pub schema: String,
pub header: EventHeader,
pub event: P2ImChatUpdatedV1Data,
}
pub(crate) struct P2ImChatUpdatedV1ProcessorImpl<F>
where
F: Fn(P2ImChatUpdatedV1) + 'static,
{
f: F,
}
impl<F> EventHandler for P2ImChatUpdatedV1ProcessorImpl<F>
where
F: Fn(P2ImChatUpdatedV1) + 'static + Sync + Send,
{
fn handle(&self, payload: &[u8]) -> anyhow::Result<()> {
let message: P2ImChatUpdatedV1 = serde_json::from_slice(payload)?;
(self.f)(message);
Ok(())
}
}
impl<F> P2ImChatUpdatedV1ProcessorImpl<F>
where
F: Fn(P2ImChatUpdatedV1) + 'static,
{
pub(crate) fn new(f: F) -> Self {
P2ImChatUpdatedV1ProcessorImpl { f }
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ImChatUpdatedV1Data {
pub chat_id: String,
pub chat_type: String,
pub operator: EventOperator,
#[serde(skip_serializing_if = "Option::is_none")]
pub before_change: Option<ChatUpdateInfo>,
pub after_change: ChatUpdateInfo,
pub update_time: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EventOperator {
pub operator_id: UserId,
#[serde(skip_serializing_if = "Option::is_none")]
pub operator_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ChatUpdateInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_settings: Option<ChatSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner_id: Option<UserId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub admin_ids: Option<Vec<UserId>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ChatSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub at_all_permission: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub add_member_permission: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub only_owner_add: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub share_allowed: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub history_enabled: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserId {
#[serde(skip_serializing_if = "Option::is_none")]
pub union_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
pub open_id: String,
}