use crate::message::Message;
use crate::utils::{id_deserializer, option_id_deserializer};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum RecvItem {
Event(Event),
ApiResp(crate::api_resp::ApiResp),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(tag = "post_type")]
pub enum Event {
#[serde(rename = "message")]
Message(MessageEvent),
#[serde(rename = "notice")]
Notice(NoticeEvent),
#[serde(rename = "request")]
Request(RequestEvent),
#[serde(rename = "meta_event")]
Meta(MetaEvent),
#[serde(skip)]
Nonebot(NbEvent),
}
#[derive(Debug, Clone)]
pub enum NbEvent {
BotConnect { bot: crate::Bot },
BotDisconnect { bot: crate::Bot },
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(tag = "message_type")]
pub enum MessageEvent {
#[serde(rename = "private")]
Private(PrivateMessageEvent),
#[serde(rename = "group")]
Group(GroupMessageEvent),
}
impl MessageEvent {
#[allow(dead_code)]
pub fn get_time(&self) -> i64 {
match self {
MessageEvent::Private(p) => p.time,
MessageEvent::Group(g) => g.time,
}
}
#[allow(dead_code)]
pub fn get_raw_message(&self) -> &str {
match self {
MessageEvent::Private(p) => &p.raw_message,
MessageEvent::Group(g) => &g.raw_message,
}
}
#[allow(dead_code)]
pub fn set_raw_message(&mut self, new_raw_message: String) -> MessageEvent {
match self {
MessageEvent::Private(p) => {
p.raw_message = new_raw_message;
MessageEvent::Private(p.clone())
}
MessageEvent::Group(g) => {
g.raw_message = new_raw_message;
MessageEvent::Group(g.clone())
}
}
}
#[allow(dead_code)]
pub fn get_message(&self) -> &Vec<Message> {
match self {
MessageEvent::Private(p) => &p.message,
MessageEvent::Group(g) => &g.message,
}
}
#[allow(dead_code)]
pub fn get_sender_nickname(&self) -> &str {
match self {
MessageEvent::Private(p) => &p.sender.nickname,
MessageEvent::Group(g) => &g.sender.nickname,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PrivateMessageEvent {
pub time: i64,
#[serde(deserialize_with = "id_deserializer")]
pub self_id: String,
pub sub_type: String,
pub message_id: i32,
#[serde(deserialize_with = "id_deserializer")]
pub user_id: String,
pub message: Vec<Message>,
pub raw_message: String,
pub font: i32,
pub sender: PrivateSender,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PrivateSender {
#[serde(deserialize_with = "id_deserializer")]
pub user_id: String,
pub nickname: String,
pub sex: String,
pub age: i32,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct GroupMessageEvent {
pub time: i64,
#[serde(deserialize_with = "id_deserializer")]
pub self_id: String,
pub sub_type: String,
pub message_id: i32,
#[serde(deserialize_with = "id_deserializer")]
pub group_id: String,
#[serde(deserialize_with = "id_deserializer")]
pub user_id: String,
pub anonymous: Option<Anoymous>,
pub message: Vec<Message>,
pub raw_message: String,
pub font: i32,
pub sender: GroupSender,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct GroupSender {
#[serde(deserialize_with = "id_deserializer")]
pub user_id: String,
pub nickname: String,
pub card: String,
pub sex: String,
pub age: i32,
pub area: String,
pub level: String,
pub role: String,
pub title: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Anoymous {
#[serde(deserialize_with = "id_deserializer")]
pub id: String,
pub name: String,
pub flag: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct NoticeEvent {
pub time: i64,
#[serde(deserialize_with = "id_deserializer")]
pub self_id: String,
pub notice_type: String,
pub sub_type: Option<String>,
#[serde(deserialize_with = "option_id_deserializer")]
#[serde(default)]
pub group_id: Option<String>,
#[serde(deserialize_with = "option_id_deserializer")]
#[serde(default)]
pub operator_id: Option<String>,
#[serde(deserialize_with = "id_deserializer")]
pub user_id: String,
pub file: Option<File>,
pub duration: Option<i64>,
pub message_id: Option<i64>,
#[serde(deserialize_with = "option_id_deserializer")]
#[serde(default)]
pub target_id: Option<String>,
pub honor_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct File {
pub id: String,
pub name: String,
pub size: i64,
pub busid: i64,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RequestEvent {
pub time: i64,
#[serde(deserialize_with = "id_deserializer")]
pub self_id: String,
pub request_type: String,
#[serde(deserialize_with = "id_deserializer")]
pub user_id: String,
pub comment: String,
pub flag: String,
pub sub_type: Option<String>,
#[serde(deserialize_with = "option_id_deserializer")]
#[serde(default)]
pub group_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MetaEvent {
pub time: i64,
#[serde(deserialize_with = "id_deserializer")]
pub self_id: String,
pub meta_event_type: String,
pub sub_type: Option<String>,
pub status: Option<Status>,
pub interval: Option<i64>,
}
#[test]
fn de_test() {
let test_str = "{\"group_id\":101,\"message_id\":111,\"notice_type\":\"group_recall\",\"operator_id\":11,\"post_type\":\"notice\",\"self_id\":11,\"time\":1631193409,\"user_id\":11}\n";
let _meta: Event = serde_json::from_str(test_str).unwrap();
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Status {
pub online: Option<bool>,
pub good: bool,
}
pub trait UserId {
fn get_user_id(&self) -> String;
}
impl UserId for MessageEvent {
fn get_user_id(&self) -> String {
match self {
MessageEvent::Private(p) => p.user_id.to_string(),
MessageEvent::Group(g) => g.user_id.to_string(),
}
}
}
impl UserId for NoticeEvent {
fn get_user_id(&self) -> String {
self.user_id.clone()
}
}
impl UserId for RequestEvent {
fn get_user_id(&self) -> String {
self.user_id.clone()
}
}
pub trait SelfId {
fn get_self_id(&self) -> String;
}
impl SelfId for MessageEvent {
fn get_self_id(&self) -> String {
match self {
MessageEvent::Private(p) => p.self_id.clone(),
MessageEvent::Group(g) => g.self_id.clone(),
}
}
}
impl SelfId for RequestEvent {
fn get_self_id(&self) -> String {
self.self_id.clone()
}
}
impl SelfId for NoticeEvent {
fn get_self_id(&self) -> String {
self.self_id.clone()
}
}
impl SelfId for MetaEvent {
fn get_self_id(&self) -> String {
self.self_id.clone()
}
}
impl SelfId for Event {
fn get_self_id(&self) -> String {
match self {
Event::Message(e) => e.get_self_id(),
Event::Request(e) => e.get_self_id(),
Event::Notice(e) => e.get_self_id(),
Event::Meta(e) => e.get_self_id(),
Event::Nonebot(e) => match e {
NbEvent::BotConnect { bot } => bot.bot_id.clone(),
NbEvent::BotDisconnect { bot } => bot.bot_id.clone(),
},
}
}
}