use crate::wire::{value_as_string, RawEventJson, WireMessage, WireSegment};
use nagisa_types::event::{
EmojiLike, FlashFilePhase, HonorKind, MemberDecreaseReason, NudgeDisplay,
OnlineFileDirection, RawEvent, ReactionKind,
};
use nagisa_types::prelude::*;
use nagisa_types::segment::{ContactKind, Forward, ForwardNode, MusicShare};
use serde_json::{Map, Value};
mod message;
mod meta_request;
mod notice;
mod segment;
use message::decode_message;
use meta_request::{decode_meta, decode_request};
use notice::decode_notice;
pub use segment::{decode_cq_string, decode_message_value, decode_segments};
const PROTO: Protocol = Protocol::OneBot11;
fn event_raw_value(ev: &RawEventJson) -> Value {
serde_json::to_value(ev).unwrap_or(Value::Null)
}
pub fn decode_event(ev: RawEventJson) -> Event {
match ev.post_type.as_deref() {
Some("message") | Some("message_sent") => decode_message(ev),
Some("notice") => decode_notice(ev),
Some("request") => decode_request(ev),
Some("meta_event") => decode_meta(ev),
_ => raw_event(&ev, "unknown"),
}
}
fn raw_event(ev: &RawEventJson, fallback_kind: &str) -> Event {
let kind = ev
.post_type
.clone()
.or_else(|| ev.notice_type.clone())
.unwrap_or_else(|| fallback_kind.to_string());
Event::Raw(RawEvent { protocol: PROTO, kind, raw: event_raw_value(ev) })
}
pub fn decode_event_batch(data: Value) -> Vec<Event> {
match data {
Value::Array(items) => items.into_iter().map(decode_event_value).collect(),
Value::Null => Vec::new(),
other @ Value::Object(_) => vec![decode_event_value(other)],
other => vec![Event::Raw(RawEvent {
protocol: PROTO,
kind: "undecodable".to_string(),
raw: other,
})],
}
}
pub fn decode_event_value(v: Value) -> Event {
match serde_json::from_value::<RawEventJson>(v.clone()) {
Ok(ev) => decode_event(ev),
Err(_) => Event::Raw(RawEvent {
protocol: PROTO,
kind: "undecodable".to_string(),
raw: v,
}),
}
}