pub mod message;
pub mod notion;
mod permission;
pub mod request;
mod inner;
pub use permission::Permission;
use crate::bot::Bot;
use serde::{Deserialize, Serialize};
use strum::{Display, EnumString, IntoStaticStr};
#[derive(Clone, Deserialize, Serialize)]
#[serde(rename_all = "lowercase", tag = "type", content = "field0")]
pub enum Event {
Message(Box<message::MessageEvent>),
Notion(Box<notion::NotionEvent>),
Request(Box<request::RequestEvent>),
}
impl From<Event> for EventType {
fn from(event: Event) -> Self {
match event {
Event::Message(_) => EventType::Message,
Event::Notion(_) => EventType::Notion,
Event::Request(_) => EventType::Request,
}
}
}
impl From<&Event> for EventType {
fn from(event: &Event) -> Self {
match event {
Event::Message(_) => EventType::Message,
Event::Notion(_) => EventType::Notion,
Event::Request(_) => EventType::Request,
}
}
}
#[cfg(feature = "event")]
impl std::fmt::Debug for Event {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Event::Message(message_event) => f.debug_tuple("Message").field(message_event).finish(),
Event::Notion(notion_event) => f.debug_tuple("Notion").field(notion_event).finish(),
Event::Request(request_event) => f.debug_tuple("Request").field(request_event).finish(),
}
}
}
impl Event {
pub fn event_type(&self) -> EventType {
match self {
Event::Message(_) => EventType::Message,
Event::Notion(_) => EventType::Notion,
Event::Request(_) => EventType::Request,
}
}
pub fn is_message(&self) -> bool {
matches!(self, Event::Message(..))
}
pub fn is_notice(&self) -> bool {
matches!(self, Event::Notion(..))
}
pub fn is_request(&self) -> bool {
matches!(self, Event::Request(..))
}
}
#[derive(Debug, Clone, EnumString, Display, IntoStaticStr, PartialEq, Eq, PartialOrd, Ord)]
pub enum EventType {
#[strum(serialize = "message")]
Message,
#[strum(serialize = "notion")]
Notion,
#[strum(serialize = "request")]
Request,
#[strum(serialize = "unknown")]
Unknown,
}
pub trait EventBase: Send + Sync {
type ContactType;
type SenderType;
fn bot(&self) -> &Bot;
fn time(&self) -> u64;
fn event(&self) -> &str;
fn event_id(&self) -> &str;
fn sub_event(&self) -> &str;
fn self_id(&self) -> &str;
fn user_id(&self) -> &str;
fn contact(&self) -> Self::ContactType;
fn sender(&self) -> Self::SenderType;
fn is_friend(&self) -> bool;
fn is_group(&self) -> bool;
}