revolt_models/v0/
server_members.rs

1use std::collections::HashMap;
2
3use super::{File, Role, User};
4
5use iso8601_timestamp::Timestamp;
6use once_cell::sync::Lazy;
7use regex::Regex;
8
9#[cfg(feature = "validator")]
10use validator::Validate;
11
12#[cfg(feature = "rocket")]
13use rocket::FromForm;
14
15/// Regex for valid role colours
16///
17/// Allows the use of named colours, rgb(a), variables and all gradients.
18///
19/// Flags:
20/// - Case-insensitive (`i`)
21///
22/// Source:
23/// ```regex
24/// VALUE = [a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+
25/// ADDITIONAL_VALUE = \d+deg
26/// STOP = ([ ]+(\d{1,3}%|0))?
27///
28/// ^(?:VALUE|(repeating-)?(linear|conic|radial)-gradient\((VALUE|ADDITIONAL_VALUE)STOP(,[ ]*(VALUE)STOP)+\))$
29/// ```
30pub static RE_COLOUR: Lazy<Regex> = Lazy::new(|| {
31    Regex::new(r"(?i)^(?:[a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+|(repeating-)?(linear|conic|radial)-gradient\(([a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+|\d+deg)([ ]+(\d{1,3}%|0))?(,[ ]*([a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+)([ ]+(\d{1,3}%|0))?)+\))$").unwrap()
32});
33
34auto_derived_partial!(
35    /// Server Member
36    pub struct Member {
37        /// Unique member id
38        #[cfg_attr(feature = "serde", serde(rename = "_id"))]
39        pub id: MemberCompositeKey,
40
41        /// Time at which this user joined the server
42        pub joined_at: Timestamp,
43
44        /// Member's nickname
45        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
46        pub nickname: Option<String>,
47        /// Avatar attachment
48        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
49        pub avatar: Option<File>,
50
51        /// Member's roles
52        #[cfg_attr(
53            feature = "serde",
54            serde(skip_serializing_if = "Vec::is_empty", default)
55        )]
56        pub roles: Vec<String>,
57        /// Timestamp this member is timed out until
58        #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
59        pub timeout: Option<Timestamp>,
60    },
61    "PartialMember"
62);
63
64auto_derived!(
65    /// Composite primary key consisting of server and user id
66    #[derive(Hash, Default)]
67    pub struct MemberCompositeKey {
68        /// Server Id
69        pub server: String,
70        /// User Id
71        pub user: String,
72    }
73
74    /// Optional fields on server member object
75    pub enum FieldsMember {
76        Nickname,
77        Avatar,
78        Roles,
79        Timeout,
80    }
81
82    /// Member removal intention
83    pub enum RemovalIntention {
84        Leave,
85        Kick,
86        Ban,
87    }
88
89    /// Member response
90    #[serde(untagged)]
91    pub enum MemberResponse {
92        Member(Member),
93        MemberWithRoles {
94            member: Member,
95            roles: HashMap<String, Role>,
96        },
97    }
98
99    /// Options for fetching all members
100    #[cfg_attr(feature = "rocket", derive(FromForm))]
101    pub struct OptionsFetchAllMembers {
102        /// Whether to exclude offline users
103        pub exclude_offline: Option<bool>,
104    }
105
106    /// Response with all members
107    pub struct AllMemberResponse {
108        /// List of members
109        pub members: Vec<Member>,
110        /// List of users
111        pub users: Vec<User>,
112    }
113
114    /// New member information
115    #[cfg_attr(feature = "validator", derive(Validate))]
116    pub struct DataMemberEdit {
117        /// Member nickname
118        #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
119        pub nickname: Option<String>,
120        /// Attachment Id to set for avatar
121        pub avatar: Option<String>,
122        /// Array of role ids
123        pub roles: Option<Vec<String>>,
124        /// Timestamp this member is timed out until
125        pub timeout: Option<Timestamp>,
126        /// Fields to remove from channel object
127        #[cfg_attr(feature = "validator", validate(length(min = 1)))]
128        pub remove: Option<Vec<FieldsMember>>,
129    }
130);