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 VoiceChannel,
99 }
100
101 pub enum RemovalIntention {
103 Leave,
104 Kick,
105 Ban,
106 }
107
108 #[serde(untagged)]
110 pub enum MemberResponse {
111 Member(Member),
112 MemberWithRoles {
113 member: Member,
114 roles: HashMap<String, Role>,
115 },
116 }
117
118 #[cfg_attr(feature = "rocket", derive(FromForm))]
120 pub struct OptionsFetchAllMembers {
121 pub exclude_offline: Option<bool>,
123 }
124
125 pub struct AllMemberResponse {
127 pub members: Vec<Member>,
129 pub users: Vec<User>,
131 }
132
133 #[cfg_attr(feature = "validator", derive(Validate))]
135 pub struct DataMemberEdit {
136 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
138 pub nickname: Option<String>,
139 pub avatar: Option<String>,
141 pub roles: Option<Vec<String>>,
143 pub timeout: Option<Timestamp>,
145 pub can_publish: Option<bool>,
147 pub can_receive: Option<bool>,
149 pub voice_channel: Option<String>,
151 #[cfg_attr(feature = "serde", serde(default))]
153 pub remove: Vec<FieldsMember>,
154 }
155);