revolt_models/v0/
servers.rs

1use super::{Channel, File, RE_COLOUR};
2
3use revolt_permissions::{Override, OverrideField};
4use std::collections::HashMap;
5
6#[cfg(feature = "validator")]
7use validator::Validate;
8
9#[cfg(feature = "rocket")]
10use rocket::FromForm;
11
12auto_derived_partial!(
13    /// Server
14    pub struct Server {
15        /// Unique Id
16        #[cfg_attr(feature = "serde", serde(rename = "_id"))]
17        pub id: String,
18        /// User id of the owner
19        pub owner: String,
20
21        /// Name of the server
22        pub name: String,
23        /// Description for the server
24        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
25        pub description: Option<String>,
26
27        /// Channels within this server
28        // TODO: investigate if this is redundant and can be removed
29        pub channels: Vec<String>,
30        /// Categories for this server
31        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
32        pub categories: Option<Vec<Category>>,
33        /// Configuration for sending system event messages
34        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
35        pub system_messages: Option<SystemMessageChannels>,
36
37        /// Roles for this server
38        #[cfg_attr(
39            feature = "serde",
40            serde(
41                default = "HashMap::<String, Role>::new",
42                skip_serializing_if = "HashMap::<String, Role>::is_empty"
43            )
44        )]
45        pub roles: HashMap<String, Role>,
46        /// Default set of server and channel permissions
47        pub default_permissions: i64,
48
49        /// Icon attachment
50        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
51        pub icon: Option<File>,
52        /// Banner attachment
53        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
54        pub banner: Option<File>,
55
56        /// Bitfield of server flags
57        #[cfg_attr(
58            feature = "serde",
59            serde(skip_serializing_if = "crate::if_zero_u32", default)
60        )]
61        pub flags: u32,
62
63        /// Whether this server is flagged as not safe for work
64        #[cfg_attr(
65            feature = "serde",
66            serde(skip_serializing_if = "crate::if_false", default)
67        )]
68        pub nsfw: bool,
69        /// Whether to enable analytics
70        #[cfg_attr(
71            feature = "serde",
72            serde(skip_serializing_if = "crate::if_false", default)
73        )]
74        pub analytics: bool,
75        /// Whether this server should be publicly discoverable
76        #[cfg_attr(
77            feature = "serde",
78            serde(skip_serializing_if = "crate::if_false", default)
79        )]
80        pub discoverable: bool,
81    },
82    "PartialServer"
83);
84
85auto_derived_partial!(
86    /// Role
87    pub struct Role {
88        /// Unique Id
89        #[cfg_attr(feature = "serde", serde(rename = "_id"))]
90        pub id: String,
91        /// Role name
92        pub name: String,
93        /// Permissions available to this role
94        pub permissions: OverrideField,
95        /// Colour used for this role
96        ///
97        /// This can be any valid CSS colour
98        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
99        pub colour: Option<String>,
100        /// Whether this role should be shown separately on the member sidebar
101        #[cfg_attr(
102            feature = "serde",
103            serde(skip_serializing_if = "crate::if_false", default)
104        )]
105        pub hoist: bool,
106        /// Ranking of this role
107        #[cfg_attr(feature = "serde", serde(default))]
108        pub rank: i64,
109    },
110    "PartialRole"
111);
112
113auto_derived!(
114    /// Optional fields on server object
115    pub enum FieldsServer {
116        Description,
117        Categories,
118        SystemMessages,
119        Icon,
120        Banner,
121    }
122
123    /// Optional fields on server object
124    pub enum FieldsRole {
125        Colour,
126    }
127
128    /// Channel category
129    #[cfg_attr(feature = "validator", derive(Validate))]
130    pub struct Category {
131        /// Unique ID for this category
132        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
133        pub id: String,
134        /// Title for this category
135        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
136        pub title: String,
137        /// Channels in this category
138        pub channels: Vec<String>,
139    }
140
141    /// System message channel assignments
142    pub struct SystemMessageChannels {
143        /// ID of channel to send user join messages in
144        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
145        pub user_joined: Option<String>,
146        /// ID of channel to send user left messages in
147        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
148        pub user_left: Option<String>,
149        /// ID of channel to send user kicked messages in
150        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
151        pub user_kicked: Option<String>,
152        /// ID of channel to send user banned messages in
153        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
154        pub user_banned: Option<String>,
155    }
156
157    /// Information about new server to create
158    #[derive(Default)]
159    #[cfg_attr(feature = "validator", derive(Validate))]
160    pub struct DataCreateServer {
161        /// Server name
162        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
163        pub name: String,
164        /// Server description
165        #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
166        pub description: Option<String>,
167        /// Whether this server is age-restricted
168        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
169        pub nsfw: Option<bool>,
170    }
171
172    /// Information about new role to create
173    #[cfg_attr(feature = "validator", derive(Validate))]
174    pub struct DataCreateRole {
175        /// Role name
176        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
177        pub name: String,
178        /// Ranking position
179        ///
180        /// Smaller values take priority.
181        ///
182        /// **Removed** - no effect, use the edit server role positions route
183        pub rank: Option<i64>,
184    }
185
186    /// Response after creating new role
187    // TODO: remove this in favor of just Role
188    pub struct NewRoleResponse {
189        /// Id of the role
190        pub id: String,
191        /// New role
192        pub role: Role,
193    }
194
195    /// Information returned when creating server
196    pub struct CreateServerLegacyResponse {
197        /// Server object
198        pub server: Server,
199        /// Default channels
200        pub channels: Vec<Channel>,
201    }
202
203    /// Options when fetching server
204    #[cfg_attr(feature = "rocket", derive(FromForm))]
205    pub struct OptionsFetchServer {
206        /// Whether to include channels
207        pub include_channels: Option<bool>,
208    }
209
210    /// Fetch server information
211    #[serde(untagged)]
212    pub enum FetchServerResponse {
213        JustServer(Server),
214        ServerWithChannels {
215            #[serde(flatten)]
216            server: Server,
217            channels: Vec<Channel>,
218        },
219    }
220
221    /// New server information
222    #[cfg_attr(feature = "validator", derive(Validate))]
223    pub struct DataEditServer {
224        /// Server name
225        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
226        pub name: Option<String>,
227        /// Server description
228        #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
229        pub description: Option<String>,
230
231        /// Attachment Id for icon
232        pub icon: Option<String>,
233        /// Attachment Id for banner
234        pub banner: Option<String>,
235
236        /// Category structure for server
237        #[cfg_attr(feature = "validator", validate)]
238        pub categories: Option<Vec<Category>>,
239        /// System message configuration
240        pub system_messages: Option<SystemMessageChannels>,
241
242        /// Bitfield of server flags
243        #[cfg_attr(feature = "validator", serde(skip_serializing_if = "Option::is_none"))]
244        pub flags: Option<i32>,
245
246        // Whether this server is age-restricted
247        // nsfw: Option<bool>,
248        /// Whether this server is public and should show up on [Revolt Discover](https://rvlt.gg)
249        pub discoverable: Option<bool>,
250        /// Whether analytics should be collected for this server
251        ///
252        /// Must be enabled in order to show up on [Revolt Discover](https://rvlt.gg).
253        pub analytics: Option<bool>,
254
255        /// Fields to remove from server object
256        #[cfg_attr(feature = "serde", serde(default))]
257        pub remove: Vec<FieldsServer>,
258    }
259
260    /// New role information
261    #[cfg_attr(feature = "validator", derive(Validate))]
262    pub struct DataEditRole {
263        /// Role name
264        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
265        pub name: Option<String>,
266        /// Role colour
267        #[cfg_attr(
268            feature = "validator",
269            validate(length(min = 1, max = 128), regex = "RE_COLOUR")
270        )]
271        pub colour: Option<String>,
272        /// Whether this role should be displayed separately
273        pub hoist: Option<bool>,
274        /// Ranking position
275        ///
276        /// **Removed** - no effect, use the edit server role positions route
277        pub rank: Option<i64>,
278        /// Fields to remove from role object
279        #[cfg_attr(feature = "serde", serde(default))]
280        pub remove: Vec<FieldsRole>,
281    }
282
283    /// New role permissions
284    pub struct DataSetServerRolePermission {
285        /// Allow / deny values for the role in this server.
286        pub permissions: Override,
287    }
288
289    /// Options when leaving a server
290    #[cfg_attr(feature = "rocket", derive(FromForm))]
291    pub struct OptionsServerDelete {
292        /// Whether to not send a leave message
293        pub leave_silently: Option<bool>,
294    }
295
296    /// New role positions
297    pub struct DataEditRoleRanks {
298        pub ranks: Vec<String>,
299    }
300);