mirror of
https://github.com/stoatchat/stoatchat.git
synced 2026-07-14 21:47:02 +00:00
71 lines
1.7 KiB
Rust
71 lines
1.7 KiB
Rust
use iso8601_timestamp::Timestamp;
|
|
|
|
use crate::{
|
|
events::client::EventV1,
|
|
models::{
|
|
server_member::{FieldsMember, PartialMember},
|
|
Member, Server,
|
|
},
|
|
Database, Result,
|
|
};
|
|
|
|
impl Member {
|
|
/// Update member data
|
|
pub async fn update<'a>(
|
|
&mut self,
|
|
db: &Database,
|
|
partial: PartialMember,
|
|
remove: Vec<FieldsMember>,
|
|
) -> Result<()> {
|
|
for field in &remove {
|
|
self.remove(field);
|
|
}
|
|
|
|
self.apply_options(partial.clone());
|
|
|
|
db.update_member(&self.id, &partial, remove.clone()).await?;
|
|
|
|
EventV1::ServerMemberUpdate {
|
|
id: self.id.clone(),
|
|
data: partial,
|
|
clear: remove,
|
|
}
|
|
.p(self.id.server.clone())
|
|
.await;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Get this user's current ranking
|
|
pub fn get_ranking(&self, server: &Server) -> i64 {
|
|
let mut value = i64::MAX;
|
|
for role in &self.roles {
|
|
if let Some(role) = server.roles.get(role) {
|
|
if role.rank < value {
|
|
value = role.rank;
|
|
}
|
|
}
|
|
}
|
|
|
|
value
|
|
}
|
|
|
|
/// Check whether this member is in timeout
|
|
pub fn in_timeout(&self) -> bool {
|
|
if let Some(timeout) = self.timeout {
|
|
*timeout > *Timestamp::now_utc()
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
|
|
pub fn remove(&mut self, field: &FieldsMember) {
|
|
match field {
|
|
FieldsMember::Avatar => self.avatar = None,
|
|
FieldsMember::Nickname => self.nickname = None,
|
|
FieldsMember::Roles => self.roles.clear(),
|
|
FieldsMember::Timeout => self.timeout = None,
|
|
}
|
|
}
|
|
}
|