1use super::File;
2
3use onechatsocial_permissions::OverrideField;
4use std::collections::{HashMap, HashSet};
5
6auto_derived!(
7 #[serde(tag = "channel_type")]
9 pub enum Channel {
10 SavedMessages {
12 #[cfg_attr(feature = "serde", serde(rename = "_id"))]
14 id: String,
15 user: String,
17 },
18 DirectMessage {
20 #[cfg_attr(feature = "serde", serde(rename = "_id"))]
22 id: String,
23
24 active: bool,
26 recipients: Vec<String>,
28 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
30 last_message_id: Option<String>,
31 },
32 Group {
34 #[cfg_attr(feature = "serde", serde(rename = "_id"))]
36 id: String,
37
38 name: String,
40 owner: String,
42 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
44 description: Option<String>,
45 recipients: Vec<String>,
47
48 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
50 icon: Option<File>,
51 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
53 last_message_id: Option<String>,
54
55 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
58 permissions: Option<i64>,
59
60 #[cfg_attr(
62 feature = "serde",
63 serde(skip_serializing_if = "crate::if_false", default)
64 )]
65 nsfw: bool,
66 },
67 TextChannel {
69 #[cfg_attr(feature = "serde", serde(rename = "_id"))]
71 id: String,
72 server: String,
74
75 name: String,
77 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
79 description: Option<String>,
80
81 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
83 icon: Option<File>,
84 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
86 last_message_id: Option<String>,
87
88 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
90 default_permissions: Option<OverrideField>,
91 #[cfg_attr(
93 feature = "serde",
94 serde(
95 default = "HashMap::<String, OverrideField>::new",
96 skip_serializing_if = "HashMap::<String, OverrideField>::is_empty"
97 )
98 )]
99 role_permissions: HashMap<String, OverrideField>,
100
101 #[cfg_attr(
103 feature = "serde",
104 serde(skip_serializing_if = "crate::if_false", default)
105 )]
106 nsfw: bool,
107 },
108 VoiceChannel {
110 #[cfg_attr(feature = "serde", serde(rename = "_id"))]
112 id: String,
113 server: String,
115
116 name: String,
118 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
119 description: Option<String>,
121 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
123 icon: Option<File>,
124
125 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
127 default_permissions: Option<OverrideField>,
128 #[cfg_attr(
130 feature = "serde",
131 serde(
132 default = "HashMap::<String, OverrideField>::new",
133 skip_serializing_if = "HashMap::<String, OverrideField>::is_empty"
134 )
135 )]
136 role_permissions: HashMap<String, OverrideField>,
137
138 #[cfg_attr(
140 feature = "serde",
141 serde(skip_serializing_if = "crate::if_false", default)
142 )]
143 nsfw: bool,
144 },
145 }
146
147 #[derive(Default)]
149 pub struct PartialChannel {
150 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
151 pub name: Option<String>,
152 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
153 pub owner: Option<String>,
154 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
155 pub description: Option<String>,
156 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
157 pub icon: Option<File>,
158 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
159 pub nsfw: Option<bool>,
160 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
161 pub active: Option<bool>,
162 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
163 pub permissions: Option<i64>,
164 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
165 pub role_permissions: Option<HashMap<String, OverrideField>>,
166 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
167 pub default_permissions: Option<OverrideField>,
168 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
169 pub last_message_id: Option<String>,
170 }
171
172 pub enum FieldsChannel {
174 Description,
175 Icon,
176 DefaultPermissions,
177 }
178
179 #[cfg_attr(feature = "validator", derive(validator::Validate))]
181 pub struct DataEditChannel {
182 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
184 pub name: Option<String>,
185
186 #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
188 pub description: Option<String>,
189
190 pub owner: Option<String>,
192
193 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))]
197 pub icon: Option<String>,
198
199 pub nsfw: Option<bool>,
201
202 pub archived: Option<bool>,
204
205 #[cfg_attr(feature = "serde", serde(default))]
207 pub remove: Option<Vec<FieldsChannel>>,
208 }
209
210 #[derive(Default)]
212 #[cfg_attr(feature = "validator", derive(validator::Validate))]
213 pub struct DataCreateGroup {
214 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
216 pub name: String,
217 #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
219 pub description: Option<String>,
220 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))]
222 pub icon: Option<String>,
223 #[cfg_attr(feature = "validator", validate(length(min = 0, max = 49)))]
227 #[serde(default)]
228 pub users: HashSet<String>,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub nsfw: Option<bool>,
232 }
233
234 #[derive(Default)]
236 pub enum LegacyServerChannelType {
237 #[default]
239 Text,
240 Voice,
242 }
243
244 #[derive(Default)]
246 #[cfg_attr(feature = "validator", derive(validator::Validate))]
247 pub struct DataCreateServerChannel {
248 #[serde(rename = "type", default = "LegacyServerChannelType::default")]
250 pub channel_type: LegacyServerChannelType,
251 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
253 pub name: String,
254 #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
256 pub description: Option<String>,
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub nsfw: Option<bool>,
260 }
261);
262
263impl Channel {
264 pub fn id(&self) -> &str {
266 match self {
267 Channel::DirectMessage { id, .. }
268 | Channel::Group { id, .. }
269 | Channel::SavedMessages { id, .. }
270 | Channel::TextChannel { id, .. }
271 | Channel::VoiceChannel { id, .. } => id,
272 }
273 }
274}