tenebrous-dicebot/src/commands/management.rs

85 lines
2.2 KiB
Rust
Raw Normal View History

use super::{Command, Execution, ExecutionResult};
use crate::context::Context;
2021-05-22 14:52:32 +00:00
use crate::db::Users;
2021-05-22 23:12:17 +00:00
use crate::error::BotError::{AccountDoesNotExist, AuthenticationError, PasswordCreationError};
use crate::logic::hash_password;
use crate::models::{AccountStatus, User};
use async_trait::async_trait;
pub struct RegisterCommand(pub String);
#[async_trait]
impl Command for RegisterCommand {
fn name(&self) -> &'static str {
"register user account"
}
fn is_secure(&self) -> bool {
true
}
async fn execute(&self, ctx: &Context<'_>) -> ExecutionResult {
2021-05-22 14:52:32 +00:00
let pw_hash = hash_password(&self.0).map_err(|e| PasswordCreationError(e))?;
let user = User {
username: ctx.username.to_owned(),
password: Some(pw_hash),
account_status: AccountStatus::Registered,
..Default::default()
2021-05-22 14:52:32 +00:00
};
ctx.db.upsert_user(&user).await?;
Execution::success(format!(
"User account registered/updated. Please log in to external applications \
with username {} and the password you set.",
ctx.username
))
}
}
2021-05-22 22:25:00 +00:00
pub struct CheckCommand(pub String);
#[async_trait]
impl Command for CheckCommand {
fn name(&self) -> &'static str {
"check user password"
}
fn is_secure(&self) -> bool {
true
}
async fn execute(&self, ctx: &Context<'_>) -> ExecutionResult {
let user = ctx.db.authenticate_user(&ctx.username, &self.0).await?;
match user {
Some(_) => Execution::success("Password is correct!".to_string()),
None => Err(AuthenticationError.into()),
}
}
}
2021-05-22 23:12:17 +00:00
pub struct UnregisterCommand;
#[async_trait]
impl Command for UnregisterCommand {
fn name(&self) -> &'static str {
"unregister user account"
}
fn is_secure(&self) -> bool {
true
}
async fn execute(&self, ctx: &Context<'_>) -> ExecutionResult {
let user = ctx.db.get_user(&ctx.username).await?;
match user {
Some(_) => {
ctx.db.delete_user(&ctx.username).await?;
Execution::success("Your user account has been removed.".to_string())
}
None => Err(AccountDoesNotExist.into()),
}
}
}