use super::BaseEvent;
use crate::ExtendedMap;
#[cfg(feature = "impl")]
use crate::MessageAlt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MessageContent {
#[serde(flatten)]
pub ty: MessageEventType,
pub message_id: String,
pub message: crate::Message,
pub alt_message: String,
pub user_id: String,
pub sub_type: String,
#[serde(flatten)]
pub extra: ExtendedMap,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "detail_type", rename_all = "snake_case")]
pub enum MessageEventType {
Private,
Group { group_id: String },
}
impl MessageEventType {
pub fn group_id(&self) -> Option<&str> {
match self {
MessageEventType::Group { group_id } => Some(group_id),
_ => None,
}
}
}
#[cfg(feature = "impl")]
impl MessageContent {
pub fn new_group_message_content(
message: crate::Message,
message_id: String,
user_id: String,
group_id: String,
extra: ExtendedMap,
) -> Self {
Self {
ty: MessageEventType::Group { group_id },
message_id,
alt_message: message.alt(),
message,
user_id,
sub_type: "".to_owned(),
extra,
}
}
pub fn new_private_message_content(
message: crate::Message,
message_id: String,
user_id: String,
extra: ExtendedMap,
) -> Self {
Self {
ty: MessageEventType::Private,
message_id,
alt_message: message.alt(),
message,
user_id,
sub_type: "".to_owned(),
extra,
}
}
}
impl BaseEvent<MessageContent> {
pub fn group_id(&self) -> Option<&str> {
self.content.ty.group_id()
}
pub fn user_id(&self) -> &str {
&self.content.user_id
}
pub fn ty(&self) -> &MessageEventType {
&self.content.ty
}
pub fn message_id(&self) -> &str {
&self.content.message_id
}
pub fn message(&self) -> &crate::Message {
&self.content.message
}
pub fn alt_message(&self) -> &str {
&self.content.alt_message
}
pub fn sub_type(&self) -> &str {
&self.content.sub_type
}
pub fn extra(&self) -> &ExtendedMap {
&self.content.extra
}
}