use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_repr::*;
use serde_with::{serde_as, TimestampSeconds};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize)]
pub struct ChatToken {
pub token: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "UPPERCASE")]
pub enum ChatSocketMessage {
Auth {
nonce: String,
data: ChatToken,
},
Response {
nonce: String,
},
Ping {
nonce: String,
},
Pong {
nonce: String,
data: PongMessageData,
},
Chat {
channel_info: Option<ChannelInfo>,
data: ChatMessageData,
},
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PongMessageData {
pub gap: u64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ChannelInfo {
pub channel_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ChatMessageData {
pub eid: String,
#[serde(default)]
pub chats: Vec<ChatMessage>,
}
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Eq, Debug)]
#[repr(u16)]
pub enum ChatMessageType {
Normal = 0,
Spell = 5,
MagicSuperCap = 6,
MagicColorful = 7,
MagicSpell = 8,
MagicBulletScreen = 9,
Subscription = 5001,
System = 5002,
Follow = 5003,
Welcome = 5004,
GiftSub = 5005,
GiftSubDetailed = 5006,
Event = 5007,
Raid = 5008,
CustomSpell = 5009,
}
#[serde_as]
#[derive(Debug, Serialize, Deserialize)]
pub struct ChatMessage {
#[serde(rename = "type")]
pub type_: ChatMessageType,
pub content: String,
pub nick_name: String,
pub avatar: Option<String>,
pub sub_lv: Option<String>,
#[serde(default)]
pub medals: Vec<String>,
#[serde(default)]
pub decos: Vec<String>,
#[serde(default)]
pub roles: Vec<String>,
pub message_id: String,
pub sender_id: Option<i64>,
#[serde_as(as = "TimestampSeconds<i64>")]
pub send_time: DateTime<Utc>,
#[serde(default)]
pub content_data: HashMap<String, serde_json::Value>,
pub custom_role: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SendChatMessagePayload {
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_id: Option<String>,
}