use super::*;
pub(super) fn decode_request(ev: RawEventJson) -> Event {
let token = RequestToken::onebot_flag(ev.flag.clone().unwrap_or_default());
let comment = ev.comment.clone().unwrap_or_default();
let initiator = Uin(ev.user_id.unwrap_or(0));
match ev.request_type.as_deref() {
Some("friend") => Event::Request(Request::Friend {
initiator,
initiator_uid: None,
comment,
via: "onebot".to_string(),
source_group: ev.group_id.or_else(|| ev.extra.get("source_group").and_then(Value::as_i64)).map(Uin),
target_user_id: None,
state: RequestState::Unknown,
time: (ev.time != 0).then_some(ev.time),
is_filtered: false,
token,
}),
Some("group") => {
let group = Uin(ev.group_id.unwrap_or(0));
if ev.sub_type.as_deref() == Some("invite") {
Event::Request(Request::GroupInvite { group, initiator, comment, source_group: None, token })
} else {
Event::Request(Request::GroupJoin {
group,
initiator,
comment,
invitor: ev.invitor_id.map(Uin),
is_filtered: false,
token,
})
}
}
_ => raw_event(&ev, "request"),
}
}
pub(super) fn decode_meta(ev: RawEventJson) -> Event {
match ev.meta_event_type.as_deref() {
Some("lifecycle") => match ev.sub_type.as_deref() {
Some("enable") => Event::Meta(Meta::BotOnline { reason: None }),
Some("disable") => Event::Meta(Meta::BotOffline),
Some("connect") => Event::Raw(RawEvent {
protocol: PROTO,
kind: "lifecycle_connect".to_string(),
raw: event_raw_value(&ev),
}),
_ => raw_event(&ev, "meta_event"),
},
Some("heartbeat") => Event::Meta(Meta::Heartbeat {
interval: ev.interval.unwrap_or(0),
status: heartbeat_status(ev.status.as_ref()),
}),
_ => raw_event(&ev, "meta_event"),
}
}
fn heartbeat_status(v: Option<&Value>) -> ImplStatus {
let raw = v.cloned().unwrap_or(Value::Null);
ImplStatus {
online: raw.get("online").and_then(Value::as_bool).unwrap_or(false),
good: raw.get("good").and_then(Value::as_bool).unwrap_or(false),
stat: crate::adapter::impl_stat_from(&raw),
raw,
}
}