revolt_models/v0/
server_members.rs1use 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
15pub 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
34fn default_true() -> bool {
35 true
36}
37
38fn is_true(x: &bool) -> bool {
39 *x
40}
41
42auto_derived_partial!(
43 pub struct Member {
45 #[cfg_attr(feature = "serde", serde(rename = "_id"))]
47 pub id: MemberCompositeKey,
48
49 pub joined_at: Timestamp,
51
52 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
54 pub nickname: Option<String>,
55 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
57 pub avatar: Option<File>,
58
59 #[cfg_attr(
61 feature = "serde",
62 serde(skip_serializing_if = "Vec::is_empty", default)
63 )]
64 pub roles: Vec<String>,
65 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
67 pub timeout: Option<Timestamp>,
68
69 #[serde(skip_serializing_if = "is_true", default = "default_true")]
71 pub can_publish: bool,
72 #[serde(skip_serializing_if = "is_true", default = "default_true")]
74 pub can_receive: bool,
75 },
76 "PartialMember"
77);
78
79auto_derived!(
80 #[derive(Hash, Default)]
82 pub struct MemberCompositeKey {
83 pub server: String,
85 pub user: String,
87 }
88
89 pub enum FieldsMember {
91 Nickname,
92 Avatar,
93 Roles,
94 Timeout,
95 CanReceive,
96 CanPublish,
97 JoinedAt,
98 }
99
100 pub enum RemovalIntention {
102 Leave,
103 Kick,
104 Ban,
105 }
106
107 #[serde(untagged)]
109 pub enum MemberResponse {
110 Member(Member),
111 MemberWithRoles {
112 member: Member,
113 roles: HashMap<String, Role>,
114 },
115 }
116
117 #[cfg_attr(feature = "rocket", derive(FromForm))]
119 pub struct OptionsFetchAllMembers {
120 pub exclude_offline: Option<bool>,
122 }
123
124 pub struct AllMemberResponse {
126 pub members: Vec<Member>,
128 pub users: Vec<User>,
130 }
131
132 #[cfg_attr(feature = "validator", derive(Validate))]
134 pub struct DataMemberEdit {
135 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
137 pub nickname: Option<String>,
138 pub avatar: Option<String>,
140 pub roles: Option<Vec<String>>,
142 pub timeout: Option<Timestamp>,
144 pub can_publish: Option<bool>,
146 pub can_receive: Option<bool>,
148 pub voice_channel: Option<String>,
150 #[cfg_attr(feature = "serde", serde(default))]
152 pub remove: Vec<FieldsMember>,
153 }
154);