#![doc = include_str!("README.md")]
use serde::{Deserialize, Serialize};
pub type Event = BaseEvent<EventContent>;
pub trait EventContentExt {
fn from_standard(content: EventContent) -> Self;
}
impl EventContentExt for EventContent {
fn from_standard(content: EventContent) -> Self {
content
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct BaseEvent<T> {
pub id: String,
#[serde(rename = "impl")]
pub r#impl: String,
pub platform: String,
pub self_id: String,
pub time: u64,
#[serde(flatten)]
pub content: T,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum EventContent {
Meta(Meta),
Message(Message),
Notice(Notice),
Request(Request),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum ExtendedContent<M, E, N, R> {
Meta(ExtendedMeta<M>),
Message(ExtendedMessage<E>),
Notice(ExtendedNotice<N>),
Request(ExtendedRequest<R>),
}
impl<M, E, N, R> EventContentExt for ExtendedContent<M, E, N, R> {
fn from_standard(content: EventContent) -> Self {
match content {
EventContent::Meta(m) => ExtendedContent::Meta(ExtendedMeta::Standard(m)),
EventContent::Message(m) => ExtendedContent::Message(ExtendedMessage::Standard(m)),
EventContent::Notice(m) => ExtendedContent::Notice(ExtendedNotice::Standard(m)),
EventContent::Request(m) => ExtendedContent::Request(ExtendedRequest::Standard(m)),
}
}
}
impl EventContent {
pub fn new_message_content(
ty: MessageEventType,
message_id: String,
message: crate::message::Message,
alt_message: String,
user_id: String,
) -> Self {
Self::Message(Message {
ty,
message_id,
message,
alt_message,
user_id,
sub_type: "".to_owned(),
})
}
pub fn private(
message_id: String,
message: crate::message::Message,
alt_message: String,
user_id: String,
) -> Self {
Self::new_message_content(
MessageEventType::Private,
message_id,
message,
alt_message,
user_id,
)
}
pub fn group(
message_id: String,
message: crate::message::Message,
alt_message: String,
user_id: String,
group_id: String,
) -> Self {
Self::new_message_content(
MessageEventType::Group { group_id },
message_id,
message,
alt_message,
user_id,
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "detail_type")]
#[serde(rename_all = "snake_case")]
pub enum Meta {
Heartbeat {
interval: u32,
status: crate::action_resp::StatusContent,
sub_type: String, },
}
impl Meta {
pub fn detail_type(&self) -> &str {
match self {
Meta::Heartbeat { .. } => "Heartbeat",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum ExtendedMeta<T> {
Standard(Meta),
Extended(T),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Message {
#[serde(flatten)]
pub ty: MessageEventType,
pub message_id: String,
pub message: crate::Message,
pub alt_message: String,
pub user_id: String,
pub(crate) sub_type: String, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum ExtendedMessage<T> {
Standard(Message),
Extended(T),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "detail_type")]
#[serde(rename_all = "snake_case")]
pub enum MessageEventType {
Private,
Group { group_id: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "detail_type")]
#[serde(rename_all = "snake_case")]
pub enum Notice {
GroupMemberIncrease {
sub_type: String,
group_id: String,
user_id: String,
operator_id: String,
},
GroupMemberDecrease {
sub_type: String,
group_id: String,
user_id: String,
operator_id: String,
},
GroupMemberBan {
sub_type: String, group_id: String,
user_id: String,
operator_id: String,
},
GroupMemberUnban {
sub_type: String, group_id: String,
user_id: String,
operator_id: String,
},
GroupAdminSet {
sub_type: String, group_id: String,
user_id: String,
operator_id: String,
},
GroupAdminUnset {
sub_type: String, group_id: String,
user_id: String,
operator_id: String,
},
GroupMessageDelete {
sub_type: String,
group_id: String,
message_id: String,
user_id: String,
operator_id: String,
},
FriendIncrease {
sub_type: String, user_id: String,
},
FriendDecrease {
sub_type: String, user_id: String,
},
PrivateMessageDelete {
sub_type: String, message_id: String,
user_id: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum ExtendedNotice<T> {
Standard(Notice),
Extended(T),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "detail_type")]
pub enum Request {
Empty { sub_type: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum ExtendedRequest<T> {
Standard(Request),
Extended(T),
}