1use crate::client::LavalinkClient;
2use crate::model::*;
3
4#[derive(Debug, Clone, Default)]
5#[cfg_attr(not(feature = "python"), derive(Hash))]
6pub struct Events {
7 pub raw: Option<fn(LavalinkClient, session_id: String, &serde_json::Value) -> BoxFuture<()>>,
9 pub ready: Option<fn(LavalinkClient, session_id: String, &Ready) -> BoxFuture<()>>,
11 pub player_update:
13 Option<fn(LavalinkClient, session_id: String, &PlayerUpdate) -> BoxFuture<()>>,
14 pub stats: Option<fn(LavalinkClient, session_id: String, &Stats) -> BoxFuture<()>>,
16 pub track_start: Option<fn(LavalinkClient, session_id: String, &TrackStart) -> BoxFuture<()>>,
18 pub track_end: Option<fn(LavalinkClient, session_id: String, &TrackEnd) -> BoxFuture<()>>,
21 pub track_exception:
23 Option<fn(LavalinkClient, session_id: String, &TrackException) -> BoxFuture<()>>,
24 pub track_stuck: Option<fn(LavalinkClient, session_id: String, &TrackStuck) -> BoxFuture<()>>,
26 pub websocket_closed:
28 Option<fn(LavalinkClient, session_id: String, &WebSocketClosed) -> BoxFuture<()>>,
29
30 #[cfg(feature = "python")]
31 pub(crate) event_handler: Option<crate::python::event::EventHandler>,
32}
33
34#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Serialize, Deserialize)]
35#[serde(rename_all = "camelCase")]
36#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
37pub struct Ready {
39 pub op: String,
40 pub session_id: String,
42 pub resumed: bool,
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
47#[serde(rename_all = "camelCase")]
48#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
49pub struct PlayerUpdate {
51 pub op: String,
52 #[serde(deserialize_with = "deserialize_number_from_string")]
53 pub guild_id: GuildId,
54 pub state: player::State,
56}
57
58#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
59#[serde(rename_all = "camelCase")]
60#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
61pub struct Stats {
63 #[serde(default)]
64 pub op: String,
65 pub players: u64,
67 pub playing_players: u64,
69 pub uptime: u64,
71 pub memory: Memory,
73 pub cpu: Cpu,
75 pub frame_stats: Option<FrameStats>,
79}
80
81#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
82#[serde(rename_all = "camelCase")]
83#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
84pub struct Cpu {
85 pub cores: u64,
86 pub system_load: f64,
87 pub lavalink_load: f64,
88}
89
90#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
91#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
92pub struct Memory {
93 pub free: u64,
94 pub used: u64,
95 pub allocated: u64,
96 pub reservable: u64,
97}
98
99#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
100#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
101pub struct FrameStats {
102 pub sent: u64,
104 pub nulled: u64,
106 pub deficit: i64,
111}
112
113#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
114#[serde(rename_all = "camelCase")]
115#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
116pub struct TrackStart {
118 pub op: String,
119 #[serde(rename = "type")]
120 pub event_type: String,
121 #[serde(deserialize_with = "deserialize_number_from_string")]
122 pub guild_id: GuildId,
123 pub track: track::TrackData,
125}
126
127#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
128#[serde(rename_all = "camelCase")]
129#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
130pub struct TrackEnd {
133 pub op: String,
134 #[serde(rename = "type")]
135 pub event_type: String,
136 #[serde(deserialize_with = "deserialize_number_from_string")]
137 pub guild_id: GuildId,
138 pub track: track::TrackData,
140 pub reason: TrackEndReason,
142}
143
144#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
145#[serde(rename_all = "camelCase")]
146#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all, eq, eq_int))]
147pub enum TrackEndReason {
149 Finished,
150 LoadFailed,
151 Stopped,
152 Replaced,
153 Cleanup,
154}
155
156impl From<TrackEndReason> for bool {
157 fn from(value: TrackEndReason) -> Self {
159 match value {
160 TrackEndReason::Finished => true,
161 TrackEndReason::LoadFailed => true,
162 TrackEndReason::Stopped => false,
163 TrackEndReason::Replaced => false,
164 TrackEndReason::Cleanup => false,
165 }
166 }
167}
168
169#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
170#[serde(rename_all = "camelCase")]
171#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
172pub struct TrackException {
174 pub op: String,
175 #[serde(rename = "type")]
176 pub event_type: String,
177 #[serde(deserialize_with = "deserialize_number_from_string")]
178 pub guild_id: GuildId,
179 pub track: track::TrackData,
181 pub exception: track::TrackError,
183}
184
185#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
186#[serde(rename_all = "camelCase")]
187#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
188pub struct TrackStuck {
190 pub op: String,
191 #[serde(rename = "type")]
192 pub event_type: String,
193 #[serde(deserialize_with = "deserialize_number_from_string")]
194 pub guild_id: GuildId,
195 pub track: track::TrackData,
197 pub threshold_ms: u64,
199}
200
201#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
202#[serde(rename_all = "camelCase")]
203#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
204pub struct WebSocketClosed {
206 pub op: String,
207 #[serde(rename = "type")]
208 pub event_type: String,
209 #[serde(deserialize_with = "deserialize_number_from_string")]
210 pub guild_id: GuildId,
211 pub code: u16,
216 pub reason: String,
218 pub by_remote: bool,
220}