Geoffrey-rs/geoffrey_models/src/models/player.rs

93 lines
2.1 KiB
Rust

use crate::models::CommandLevel;
use crate::GeoffreyDatabaseModel;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq)]
pub enum UserID {
DiscordUUID { discord_uuid: u64 },
MinecraftUUID { mc_uuid: String },
None,
}
impl Default for UserID {
fn default() -> Self {
Self::None
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq)]
pub struct Player {
pub id: Option<u64>,
pub name: String,
pub user_ids: Vec<UserID>,
pub auth_level: CommandLevel,
}
impl Player {
pub fn new(name: &str, user_id: UserID) -> Self {
Self {
id: None,
name: name.to_string(),
user_ids: vec![user_id],
auth_level: CommandLevel::REGISTERED,
}
}
pub fn has_user_id(&self, user_id: &UserID) -> bool {
self.user_ids.iter().any(|id| id == user_id)
}
}
impl GeoffreyDatabaseModel for Player {
fn id(&self) -> Option<u64> {
self.id
}
fn set_id(&mut self, id: u64) {
self.id = Some(id);
}
fn tree() -> String {
"player".to_string()
}
fn check_unique(&self, o: &Self) -> bool {
for user1_id in &self.user_ids {
if o.user_ids.contains(user1_id) {
return false;
}
}
true
}
}
#[cfg(test)]
mod tests {
use crate::models::player::{Player, UserID};
use crate::GeoffreyDatabaseModel;
#[test]
fn test_player_check_unique() {
let p1 = Player::new("CoolTest123", UserID::DiscordUUID { discord_uuid: 0u64 });
let p2 = Player::new("NotCoolTest123", UserID::DiscordUUID { discord_uuid: 1u64 });
assert!(p1.check_unique(&p2));
let p1 = Player::new(
"CoolTest123",
UserID::MinecraftUUID {
mc_uuid: "0".to_string(),
},
);
let p2 = Player::new(
"NotCoolTest123",
UserID::MinecraftUUID {
mc_uuid: "0".to_string(),
},
);
assert!(!p1.check_unique(&p2));
}
}