use crate::api::BotApi;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct C2CFriendData {
pub openid: String,
#[serde(default)]
pub timestamp: u64,
#[serde(default)]
pub nick: String,
#[serde(default)]
pub avatar: String,
}
impl C2CFriendData {
pub fn new(data: &serde_json::Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Serialize)]
pub struct C2CManageEvent {
#[serde(skip)]
api: BotApi,
pub event_id: Option<String>,
pub timestamp: Option<u64>,
pub openid: Option<String>,
pub nick: Option<String>,
pub avatar: Option<String>,
}
impl C2CManageEvent {
pub fn new(api: BotApi, event_id: Option<String>, data: &serde_json::Value) -> Self {
let wire: C2CManageWire = serde_json::from_value(data.clone()).unwrap_or_default();
Self {
api,
event_id,
timestamp: wire.timestamp,
openid: wire.openid,
nick: wire.nick,
avatar: wire.avatar,
}
}
pub fn api(&self) -> &BotApi {
&self.api
}
pub fn formatted_timestamp(&self) -> Option<String> {
self.timestamp.map(|ts| {
let datetime = chrono::DateTime::from_timestamp(ts as i64, 0).unwrap_or_default();
datetime.format("%Y-%m-%d %H:%M:%S").to_string()
})
}
}
#[derive(Debug, Default, Deserialize)]
struct C2CManageWire {
#[serde(default)]
timestamp: Option<u64>,
#[serde(default)]
openid: Option<String>,
#[serde(default)]
nick: Option<String>,
#[serde(default)]
avatar: Option<String>,
}
impl std::fmt::Display for C2CManageEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"C2CManageEvent {{ event_id: {:?}, timestamp: {:?}, openid: {:?}, nick: {:?}, avatar: {:?} }}",
self.event_id, self.timestamp, self.openid, self.nick, self.avatar
)
}
}