use toml_edit::
{
Item,
Table,
Value,
};
use crate::
{
colors,
consts,
role::Role,
network::codes::MessageColors,
};
const COLOR_KEYS: [&str; 2] = ["username_color", "message_color"];
fn user_field(username: &str, key: &str) -> Option<String> {
super::get_data(&super::config_path(consts::SERVER_USERS_CONFIG)).get(username)?
.as_table_like()?.get(key)?.as_str().map(str::to_string)
}
fn write_user_field(username: &str, key: &str, value: Value) {
super::with_cached_mut(&super::config_path(consts::SERVER_USERS_CONFIG), |doc|
{
let users = doc.as_table_mut();
if users.get(username).and_then(Item::as_table_like).is_none()
{
users.insert(username, Item::Table(Table::new()));
}
users.get_mut(username).and_then(Item::as_table_like_mut)
.expect("User entry is not a table").insert(key, Item::Value(value));
});
}
pub fn len() -> usize {
super::get_data(&super::config_path(consts::SERVER_USERS_CONFIG)).len()
}
pub fn password(username: &str) -> Option<String> {
user_field(username, "password")
}
pub fn role(username: &str) -> Option<Role> {
user_field(username, "role")?.parse().ok()
}
pub fn colors(username: &str) -> MessageColors {
let mut codes = COLOR_KEYS.iter().map(|key| user_field(username, key).as_deref().and_then(colors::code));
MessageColors
{
username_color: codes.next().flatten(),
message_color: codes.next().flatten(),
}
}
pub fn set_color(username: &str, username_color: bool, code: u8)
{
let key = COLOR_KEYS[usize::from(!username_color)];
write_user_field(username, key, colors::name(Some(code)).into());
}
pub fn set_role(username: &str, role: Role) {
write_user_field(username, "role", role.name().into());
}
pub fn add(username: &str, hash: &str) -> bool {
let first_user = len() == 0;
write_user_field(username, "password", hash.into()); set_role(username, if first_user { Role::Owner } else { Role::User });
for key in COLOR_KEYS { write_user_field(username, key, colors::NONE.into()); }
first_user
}
pub fn contains(key: &str) -> bool {
super::get_data(&super::config_path(consts::SERVER_USERS_CONFIG)).get(key).is_some()
}
pub fn migrate() {
super::with_cached_mut(&super::config_path(consts::SERVER_USERS_CONFIG), |doc|
{
for (_, entry) in doc.as_table_mut().iter_mut()
{
let Some(user) = entry.as_table_like_mut() else { continue };
for key in COLOR_KEYS
{
if user.get(key).is_none() { user.insert(key, Item::Value(colors::NONE.into())); }
}
}
});
}