Skip to main content

kick_api/models/
live_chat.rs

1use serde::Deserialize;
2
3/// Pusher wire-format message (outer envelope)
4#[derive(Debug, Clone, Deserialize)]
5pub(crate) struct PusherMessage {
6    pub event: String,
7    pub data: String,
8    #[serde(default)]
9    pub channel: Option<String>,
10}
11
12/// A raw Pusher event received from the WebSocket.
13///
14/// Useful for debugging or handling event types beyond chat messages.
15#[derive(Debug, Clone)]
16pub struct PusherEvent {
17    /// The Pusher event name (e.g. `App\Events\ChatMessageEvent`)
18    pub event: String,
19    /// The channel this event was received on, if any
20    pub channel: Option<String>,
21    /// The raw JSON data payload (may need a second parse — Pusher double-encodes)
22    pub data: String,
23}
24
25/// A live chat message received over the Pusher WebSocket
26#[derive(Debug, Clone, Deserialize)]
27pub struct LiveChatMessage {
28    /// Unique message identifier
29    pub id: String,
30
31    /// The chatroom this message was sent in (may not be present in all payloads)
32    #[serde(default)]
33    pub chatroom_id: Option<u64>,
34
35    /// Message text content
36    pub content: String,
37
38    /// Message type (e.g. "message" or "reply")
39    #[serde(rename = "type")]
40    pub r#type: String,
41
42    /// ISO 8601 timestamp of when the message was created
43    #[serde(default)]
44    pub created_at: Option<String>,
45
46    /// The user who sent this message
47    pub sender: ChatSender,
48
49    /// Reply metadata, present when this message is a reply
50    #[serde(default)]
51    pub metadata: Option<ChatMessageMetadata>,
52}
53
54/// Metadata attached to a reply message
55#[derive(Debug, Clone, Deserialize)]
56pub struct ChatMessageMetadata {
57    /// The original message being replied to
58    #[serde(default)]
59    pub original_sender: Option<OriginalSender>,
60
61    /// The original message content
62    #[serde(default)]
63    pub original_message: Option<OriginalMessage>,
64}
65
66/// The sender of the message being replied to
67#[derive(Debug, Clone, Deserialize)]
68pub struct OriginalSender {
69    pub username: String,
70}
71
72/// The content of the message being replied to
73#[derive(Debug, Clone, Deserialize)]
74pub struct OriginalMessage {
75    pub content: String,
76}
77
78/// Sender information for a live chat message
79#[derive(Debug, Clone, Deserialize)]
80pub struct ChatSender {
81    /// Unique user identifier
82    pub id: u64,
83
84    /// Display username
85    pub username: String,
86
87    /// URL-friendly username slug
88    #[serde(default)]
89    pub slug: Option<String>,
90
91    /// Visual identity (color, badges)
92    pub identity: ChatIdentity,
93}
94
95/// Visual identity information for a chat sender
96#[derive(Debug, Clone, Deserialize)]
97pub struct ChatIdentity {
98    /// Username color hex code
99    pub color: String,
100
101    /// List of badges the user has
102    pub badges: Vec<ChatBadge>,
103}
104
105/// A badge displayed next to a user's name in chat
106#[derive(Debug, Clone, Deserialize)]
107pub struct ChatBadge {
108    /// Badge type identifier
109    #[serde(rename = "type")]
110    pub r#type: String,
111
112    /// Badge display text
113    pub text: String,
114
115    /// Optional count (e.g. subscription months)
116    #[serde(default)]
117    pub count: Option<u32>,
118}