1use crate::model::*;
2
3#[derive(PartialEq, Debug, Clone, Serialize, Deserialize)]
4#[serde(rename_all = "camelCase")]
5#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
6pub struct Player {
8 #[serde(deserialize_with = "deserialize_number_from_string")]
9 pub guild_id: GuildId,
10 pub track: Option<track::TrackData>,
12 pub volume: u16,
14 pub paused: bool,
16 pub state: State,
18 pub filters: Option<Filters>,
20 pub voice: ConnectionInfo,
22}
23
24#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
27pub struct State {
28 pub time: u64,
30 pub position: u64,
32 pub connected: bool,
34 #[serde(deserialize_with = "deserialize_option_number")]
35 pub ping: Option<u32>,
39}
40
41#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Serialize, Deserialize)]
42#[serde(rename_all = "camelCase")]
43#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
44pub struct ConnectionInfo {
46 pub endpoint: String,
50 pub token: String,
54 pub session_id: String,
60}
61
62impl ConnectionInfo {
63 pub fn fix(&mut self) {
64 self.endpoint = self.endpoint.replace("wss://", "");
65 }
66}
67
68#[cfg(feature = "songbird")]
69use songbird_dep::ConnectionInfo as SongbirdConnectionInfo;
70
71#[cfg(feature = "songbird")]
72impl From<SongbirdConnectionInfo> for ConnectionInfo {
73 fn from(connection_info: SongbirdConnectionInfo) -> ConnectionInfo {
74 ConnectionInfo {
75 endpoint: connection_info.endpoint,
76 token: connection_info.token,
77 session_id: connection_info.session_id,
78 }
79 }
80}
81
82#[derive(PartialEq, Debug, Clone, Serialize, Deserialize, Default)]
83#[serde(rename_all = "camelCase")]
84#[cfg_attr(feature = "python", pyo3::pyclass)]
85pub struct Filters {
86 #[serde(skip_serializing_if = "Option::is_none")]
90 pub volume: Option<f64>,
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub equalizer: Option<Vec<Equalizer>>,
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub karaoke: Option<Karaoke>,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 pub timescale: Option<Timescale>,
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub tremolo: Option<TremoloVibrato>,
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub vibrato: Option<TremoloVibrato>,
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub rotation: Option<Rotation>,
109 #[serde(skip_serializing_if = "Option::is_none")]
111 pub distortion: Option<Distortion>,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub channel_mix: Option<ChannelMix>,
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub low_pass: Option<LowPass>,
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub plugin_filters: Option<serde_json::Value>,
121}
122
123#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
124#[serde(rename_all = "camelCase")]
125#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
126pub struct ChannelMix {
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub left_to_left: Option<f64>,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub left_to_right: Option<f64>,
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub right_to_left: Option<f64>,
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub right_to_right: Option<f64>,
140}
141
142#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
143#[serde(rename_all = "camelCase")]
144#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
145pub struct Distortion {
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub sin_offset: Option<f64>,
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub sin_scale: Option<f64>,
153 #[serde(skip_serializing_if = "Option::is_none")]
154 pub cos_offset: Option<f64>,
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub cos_scale: Option<f64>,
157 #[serde(skip_serializing_if = "Option::is_none")]
158 pub tan_offset: Option<f64>,
159 #[serde(skip_serializing_if = "Option::is_none")]
160 pub tan_scale: Option<f64>,
161 #[serde(skip_serializing_if = "Option::is_none")]
162 pub offset: Option<f64>,
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub scale: Option<f64>,
165}
166
167#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
168#[serde(rename_all = "camelCase")]
169#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
170pub struct Equalizer {
172 pub band: u8,
174 pub gain: f64,
179}
180
181#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
182#[serde(rename_all = "camelCase")]
183#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
184pub struct Karaoke {
186 #[serde(skip_serializing_if = "Option::is_none")]
188 pub level: Option<f64>,
189 #[serde(skip_serializing_if = "Option::is_none")]
191 pub mono_level: Option<f64>,
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub filter_band: Option<f64>,
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub filter_width: Option<f64>,
198}
199
200#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
201#[serde(rename_all = "camelCase")]
202#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
203pub struct LowPass {
205 #[serde(skip_serializing_if = "Option::is_none")]
209 pub smoothing: Option<f64>,
210}
211
212#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
213#[serde(rename_all = "camelCase")]
214#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
215pub struct Rotation {
219 #[serde(skip_serializing_if = "Option::is_none")]
223 pub rotation_hz: Option<f64>,
224}
225
226#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
227#[serde(rename_all = "camelCase")]
228#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
229pub struct Timescale {
233 #[serde(skip_serializing_if = "Option::is_none")]
235 pub speed: Option<f64>,
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub pitch: Option<f64>,
239 #[serde(skip_serializing_if = "Option::is_none")]
241 pub rate: Option<f64>,
242}
243
244#[derive(PartialEq, PartialOrd, Debug, Clone, Serialize, Deserialize, Default)]
245#[serde(rename_all = "camelCase")]
246#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))]
247pub struct TremoloVibrato {
253 #[serde(skip_serializing_if = "Option::is_none")]
256 pub frequency: Option<f64>,
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub depth: Option<f64>,
260}