use crate::MessageSegment;
use serde::de::Error;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Message {
PrivateMessage(PrivateMessage),
GroupMessage(GroupMessage),
}
impl Serialize for Message {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
match self {
Message::PrivateMessage(m) => m.serialize(serializer),
Message::GroupMessage(m) => m.serialize(serializer),
}
}
}
impl<'de> Deserialize<'de> for Message {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = serde_json::Value::deserialize(deserializer)?;
match value["message_type"].as_str() {
Some("private") => serde_json::from_value(value)
.map(Message::PrivateMessage)
.map_err(D::Error::custom),
Some("group") => serde_json::from_value(value)
.map(Message::GroupMessage)
.map_err(D::Error::custom),
_ => Err(D::Error::custom("Invalid message_type")),
}
}
fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
where
D: serde::Deserializer<'de>,
{
let value = serde_json::Value::deserialize(deserializer)?;
*place = match value["message_type"].as_str() {
Some("private") => serde_json::from_value(value)
.map(Message::PrivateMessage)
.map_err(D::Error::custom)?,
Some("group") => serde_json::from_value(value)
.map(Message::GroupMessage)
.map_err(D::Error::custom)?,
_ => return Err(D::Error::custom("Invalid message_type")),
};
Ok(())
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct PrivateMessage {
pub time: i64,
pub self_id: i64,
pub post_type: String,
pub message_type: String,
pub sub_type: String,
pub message_id: i64,
pub user_id: i64,
pub message: Vec<MessageSegment>,
pub raw_message: String,
pub font: i64,
pub sender: PrivateMessageSender,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct PrivateMessageSender {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sex: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub age: Option<i32>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GroupMessage {
pub time: i64,
pub self_id: i64,
pub post_type: String,
pub message_type: String,
pub sub_type: String,
pub message_id: i64,
pub group_id: i64,
pub user_id: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub anonymous: Option<Anonymous>,
pub message: Vec<MessageSegment>,
pub raw_message: String,
pub font: i64,
pub sender: GroupMessageSender,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GroupMessageSender {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub card: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sex: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub age: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub area: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Anonymous {
pub id: i64,
pub name: String,
pub flag: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct PrivateMessageQuickOperation {
pub reply: Vec<MessageSegment>,
pub auto_escape: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GroupMessageQuickOperation {
pub reply: Vec<MessageSegment>,
pub auto_escape: bool,
pub at_sender: bool,
pub delete: bool,
pub kick: bool,
pub ban: bool,
pub ban_duration: i32,
}