use chrono::{DateTime, Utc};
use serde::{Serialize, Serializer};
use std::sync::Arc;
fn serialize_arc_bytes<S>(data: &Arc<[u8]>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_bytes(data)
}
use crate::chat::{
constants::message_codes::MessageCode,
types::{ChatType, DonationType, Emoticon, GiftType, MissionType, User},
};
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", content = "payload")]
pub enum Event {
Connected,
Disconnected(DisconnectedEvent),
BJStateChange,
Chat(ChatEvent),
Donation(DonationEvent),
Subscribe(SubscribeEvent),
Enter(UserEvent),
Exit(UserEvent),
Kick(UserEvent),
KickCancel(SimplifiedUserEvent),
Sticker(StickerEvent),
Gift(GiftEvent),
Mute(MuteEvent),
Black(SimplifiedUserEvent),
Freeze(FreezeEvent),
Notification(NotificationEvent),
ParticipantList(ParticipantListEvent),
MissionDonation(MissionEvent),
MissionTotal(MissionTotalEvent),
BattleMissionResult(BattleMissionResultEvent),
ChallengeMissionResult(ChallengeMissionResultEvent),
Unknown(MessageCode),
Slow(SlowEvent),
#[serde(serialize_with = "serialize_arc_bytes")]
Raw(Arc<[u8]>), Diagnostic(DiagnosticEvent),
}
#[derive(Debug, Clone, Serialize)]
pub struct EventMeta {
pub received_time: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize)]
pub struct ConnectedEvent {
#[serde(flatten)]
pub meta: EventMeta,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DisconnectedEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub reason: DisconnectReason,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum DisconnectReason {
Shutdown,
WebSocketClosed,
ConnectionFailed,
ProtocolError,
ChannelClosed,
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "kind", content = "payload")]
pub enum DiagnosticEvent {
RawFrame(RawFrameDiagnostic),
DecodedFrame(DecodedFrameDiagnostic),
UnknownCode(UnknownCodeDiagnostic),
ParseFailed(ParseFailedDiagnostic),
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RawFrameDiagnostic {
#[serde(flatten)]
pub meta: EventMeta,
pub byte_len: usize,
#[serde(serialize_with = "serialize_arc_bytes")]
pub raw: Arc<[u8]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DecodedFrameDiagnostic {
#[serde(flatten)]
pub meta: EventMeta,
pub code: MessageCode,
pub ret_code: u32,
pub field_count: usize,
pub body: Vec<String>,
#[serde(serialize_with = "serialize_arc_bytes")]
pub raw: Arc<[u8]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UnknownCodeDiagnostic {
#[serde(flatten)]
pub meta: EventMeta,
pub code: MessageCode,
pub ret_code: u32,
pub field_count: usize,
pub body: Vec<String>,
#[serde(serialize_with = "serialize_arc_bytes")]
pub raw: Arc<[u8]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ParseFailedDiagnostic {
#[serde(flatten)]
pub meta: EventMeta,
pub code: Option<MessageCode>,
pub body_field_count: Option<usize>,
pub field_index: Option<usize>,
pub expected_type: Option<String>,
pub reason: String,
#[serde(serialize_with = "serialize_arc_bytes")]
pub raw: Arc<[u8]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ChatEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub comment: String,
pub chat_type: ChatType,
pub user: User,
pub is_admin: bool,
pub emoticon: Option<Emoticon>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GiftEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub gift_type: GiftType,
pub sender_id: String,
pub sender_label: String,
pub receiver_id: String,
pub receiver_label: String,
pub gift_code: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DonationEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub from: String,
pub from_label: String,
pub amount: u32, pub fan_club_ordinal: u32, pub become_top_fan: bool,
pub donation_type: DonationType,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StickerEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub from: String,
pub from_label: String,
pub amount: u32, pub supporter_ordinal: u32, }
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MissionEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub from: String,
pub from_label: String,
pub amount: u32, pub mission_type: MissionType,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MissionTotalEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub mission_type: MissionType,
pub amount: u32,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ChallengeMissionResultEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub is_success: bool,
pub title: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BattleMissionResultEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub is_draw: bool,
pub winner: String,
pub title: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SubscribeEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub user_id: String,
pub label: String,
pub tier: u32,
pub renew: u32,
}
#[derive(Debug, Clone, Serialize)]
pub struct NotificationEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub message: String,
pub show: bool,
}
#[derive(Debug, Clone, Serialize)]
pub struct UserEvent {
#[serde(flatten)]
pub meta: EventMeta,
#[serde(flatten)]
pub user: User,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SimplifiedUserEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub user_id: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ParticipantListEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub result_code: String,
pub count: usize,
pub entries: Vec<User>,
}
#[derive(Debug, Clone)]
pub(crate) struct ParticipantListCompleteEvent {
pub(crate) meta: EventMeta,
pub(crate) result_code: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FreezeEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub freezed: bool,
pub limit_subscription_month: u32,
pub limit_balloons: u32,
pub targets: Vec<String>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MuteEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub user: User,
pub seconds: u32,
pub message: String,
pub by: String,
pub counts: u32,
pub superuser_type: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct SlowEvent {
#[serde(flatten)]
pub meta: EventMeta,
pub duration: u32,
}