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,
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),
Join(SimplifiedUserEvent),
MissionDonation(MissionEvent),
MissionTotal(MissionTotalEvent),
BattleMissionResult(BattleMissionResultEvent),
ChallengeMissionResult(ChallengeMissionResultEvent),
Unknown(MessageCode),
Slow(SlowEvent),
#[serde(serialize_with = "serialize_arc_bytes")]
Raw(Arc<[u8]>), }
#[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 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 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,
}