Skip to main content

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        /// Role icon
110        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
111        pub icon: Option<File>,
112    },
113    "PartialRole"
114);
115
116auto_derived!(
117    /// Optional fields on server object
118    pub enum FieldsServer {
119        Description,
120        Categories,
121        SystemMessages,
122        Icon,
123        Banner,
124    }
125
126    /// Optional fields on server object
127    pub enum FieldsRole {
128        Colour,
129        Icon,
130    }
131
132    /// Channel category
133    #[cfg_attr(feature = "validator", derive(Validate))]
134    pub struct Category {
135        /// Unique ID for this category
136        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
137        pub id: String,
138        /// Title for this category
139        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
140        pub title: String,
141        /// Channels in this category
142        pub channels: Vec<String>,
143    }
144
145    /// System message channel assignments
146    pub struct SystemMessageChannels {
147        /// ID of channel to send user join messages in
148        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
149        pub user_joined: Option<String>,
150        /// ID of channel to send user left messages in
151        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
152        pub user_left: Option<String>,
153        /// ID of channel to send user kicked messages in
154        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
155        pub user_kicked: Option<String>,
156        /// ID of channel to send user banned messages in
157        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
158        pub user_banned: Option<String>,
159    }
160
161    /// Information about new server to create
162    #[derive(Default)]
163    #[cfg_attr(feature = "validator", derive(Validate))]
164    pub struct DataCreateServer {
165        /// Server name
166        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
167        pub name: String,
168        /// Server description
169        #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
170        pub description: Option<String>,
171        /// Whether this server is age-restricted
172        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
173        pub nsfw: Option<bool>,
174    }
175
176    /// Information about new role to create
177    #[cfg_attr(feature = "validator", derive(Validate))]
178    pub struct DataCreateRole {
179        /// Role name
180        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
181        pub name: String,
182        /// Ranking position
183        ///
184        /// Smaller values take priority.
185        ///
186        /// **Removed** - no effect, use the edit server role positions route
187        pub rank: Option<i64>,
188    }
189
190    /// Response after creating new role
191    // TODO: remove this in favor of just Role
192    pub struct NewRoleResponse {
193        /// Id of the role
194        pub id: String,
195        /// New role
196        pub role: Role,
197    }
198
199    /// Information returned when creating server
200    pub struct CreateServerLegacyResponse {
201        /// Server object
202        pub server: Server,
203        /// Default channels
204        pub channels: Vec<Channel>,
205    }
206
207    /// Options when fetching server
208    #[cfg_attr(feature = "rocket", derive(FromForm))]
209    pub struct OptionsFetchServer {
210        /// Whether to include channels
211        pub include_channels: Option<bool>,
212    }
213
214    /// Fetch server information
215    #[serde(untagged)]
216    pub enum FetchServerResponse {
217        JustServer(Server),
218        ServerWithChannels {
219            #[serde(flatten)]
220            server: Server,
221            channels: Vec<Channel>,
222        },
223    }
224
225    /// New server information
226    #[cfg_attr(feature = "validator", derive(Validate))]
227    pub struct DataEditServer {
228        /// Server name
229        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
230        pub name: Option<String>,
231        /// Server description
232        #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
233        pub description: Option<String>,
234
235        /// Attachment Id for icon
236        pub icon: Option<String>,
237        /// Attachment Id for banner
238        pub banner: Option<String>,
239
240        /// Category structure for server
241        #[cfg_attr(feature = "validator", validate)]
242        pub categories: Option<Vec<Category>>,
243        /// System message configuration
244        pub system_messages: Option<SystemMessageChannels>,
245
246        /// Bitfield of server flags
247        #[cfg_attr(feature = "validator", serde(skip_serializing_if = "Option::is_none"))]
248        pub flags: Option<i32>,
249
250        // Whether this server is age-restricted
251        // nsfw: Option<bool>,
252        /// Whether this server is public and should show up on [Revolt Discover](https://rvlt.gg)
253        pub discoverable: Option<bool>,
254        /// Whether analytics should be collected for this server
255        ///
256        /// Must be enabled in order to show up on [Revolt Discover](https://rvlt.gg).
257        pub analytics: Option<bool>,
258
259        /// User id of the new owner
260        pub owner: Option<String>,
261
262        /// Fields to remove from server object
263        #[cfg_attr(feature = "serde", serde(default))]
264        pub remove: Vec<FieldsServer>,
265    }
266
267    /// New role information
268    #[cfg_attr(feature = "validator", derive(Validate))]
269    pub struct DataEditRole {
270        /// Role name
271        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
272        pub name: Option<String>,
273        /// Role colour
274        #[cfg_attr(
275            feature = "validator",
276            validate(length(min = 1, max = 128), regex = "RE_COLOUR")
277        )]
278        pub colour: Option<String>,
279        /// Whether this role should be displayed separately
280        pub hoist: Option<bool>,
281        /// Ranking position
282        ///
283        /// **Removed** - no effect, use the edit server role positions route
284        pub rank: Option<i64>,
285        /// Role icon
286        ///
287        /// Provide an Autumn attachment Id.
288        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))]
289        pub icon: Option<String>,
290        /// Fields to remove from role object
291        #[cfg_attr(feature = "serde", serde(default))]
292        pub remove: Vec<FieldsRole>,
293    }
294
295    /// New role permissions
296    pub struct DataSetServerRolePermission {
297        /// Allow / deny values for the role in this server.
298        pub permissions: Override,
299    }
300
301    /// Options when leaving a server
302    #[cfg_attr(feature = "rocket", derive(FromForm))]
303    pub struct OptionsServerDelete {
304        /// Whether to not send a leave message
305        pub leave_silently: Option<bool>,
306    }
307
308    /// New role positions
309    pub struct DataEditRoleRanks {
310        pub ranks: Vec<String>,
311    }
312);