Skip to content

Commit

Permalink
feat: use go-parse-duration for time parameters (#69)
Browse files Browse the repository at this point in the history
* feat: use `go-parse-duration` for time parameters

* revert: accidental parameter type change

* refactor: move `parse_duration` to `mod.rs`

* refactor: use functional approach to handle error

* refactor: remove unused import

---------

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
  • Loading branch information
Ushie and oSumAtrIX committed May 11, 2023
1 parent 5128258 commit 2379130
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 45 deletions.
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,4 @@ tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_leve
tracing-subscriber = "0.3.16"
hmac-sha256 = "1.1.6"
base64 = "0.21.0"
go-parse-duration = "0.1.1"
60 changes: 19 additions & 41 deletions src/commands/moderation.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,26 @@
use bson::{doc, Document};
use chrono::{Duration, Utc};
use chrono::Utc;
use mongodb::options::{UpdateModifications, UpdateOptions};
use poise::serenity_prelude::{
self as serenity, Mentionable, PermissionOverwrite, Permissions, UserId,
self as serenity,
Mentionable,
PermissionOverwrite,
Permissions,
UserId,
};
use tracing::{debug, error, trace};

use crate::db::model::{LockedChannel, Muted};
use crate::utils::bot::get_member;
use crate::utils::macros::to_user;
use crate::utils::moderation::{
ban_moderation, queue_unmute_member, respond_moderation, BanKind, ModerationKind,
ban_moderation,
queue_unmute_member,
respond_moderation,
BanKind,
ModerationKind,
};
use crate::utils::parse_duration;
use crate::{Context, Error};

/// Lock a channel.
Expand Down Expand Up @@ -89,14 +98,11 @@ pub async fn lock(ctx: Context<'_>) -> Result<(), Error> {
let permission = Permissions::SEND_MESSAGES & Permissions::ADD_REACTIONS;

if let Err(err) = channel
.create_permission(
http,
&PermissionOverwrite {
allow: permission_overwrite.allow & !permission,
deny: permission_overwrite.deny | permission,
kind: permission_overwrite.kind,
},
)
.create_permission(http, &PermissionOverwrite {
allow: permission_overwrite.allow & !permission,
deny: permission_overwrite.deny | permission,
kind: permission_overwrite.kind,
})
.await
{
error!("Failed to create the new permission: {:?}", err);
Expand Down Expand Up @@ -197,45 +203,17 @@ pub async fn unmute(
}

/// Mute a member.
#[allow(clippy::too_many_arguments)]
#[poise::command(slash_command)]
pub async fn mute(
ctx: Context<'_>,
#[description = "The member to mute"] member: UserId,
#[description = "Seconds"] seconds: Option<i64>,
#[description = "Minutes"] minutes: Option<i64>,
#[description = "Hours"] hours: Option<i64>,
#[description = "Days"] days: Option<i64>,
#[description = "Months"] months: Option<i64>,
#[description = "The duration of the mute"] duration: String,
#[description = "The reason of the mute"] reason: String,
) -> Result<(), Error> {
let user = to_user!(member, ctx);
let id = user.id;
let now = Utc::now();
let mut mute_duration = Duration::zero();

if let Some(seconds) = seconds {
mute_duration = mute_duration
.checked_add(&Duration::seconds(seconds))
.unwrap();
}
if let Some(minutes) = minutes {
mute_duration = mute_duration
.checked_add(&Duration::minutes(minutes))
.unwrap();
}
if let Some(hours) = hours {
mute_duration = mute_duration.checked_add(&Duration::hours(hours)).unwrap();
}
if let Some(days) = days {
mute_duration = mute_duration.checked_add(&Duration::days(days)).unwrap();
}
if let Some(months) = months {
const DAYS_IN_MONTH: i64 = 30;
mute_duration = mute_duration
.checked_add(&Duration::days(months * DAYS_IN_MONTH))
.unwrap();
}
let mute_duration = parse_duration(duration).map_err(|e| Error::from(format!("{:?}", e)))?;

let data = &mut *ctx.data().write().await;
let configuration = &data.configuration;
Expand Down
6 changes: 6 additions & 0 deletions src/utils/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use chrono::Duration;
use poise::serenity_prelude::{self as serenity, Member, RoleId};

pub mod autorespond;
Expand All @@ -9,3 +10,8 @@ pub mod macros;
pub mod media_channel;
pub mod moderation;
pub mod poll;

pub fn parse_duration(duration: String) -> Result<Duration, go_parse_duration::Error> {
let d = go_parse_duration::parse_duration(&duration)?;
Ok(Duration::nanoseconds(d))
}
9 changes: 5 additions & 4 deletions src/utils/moderation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ use crate::{Context, Error};
pub enum ModerationKind {
Mute(User, User, String, Option<String>, Option<Error>), /* User, Command author, Reason, Expires, Error */
Unmute(User, User, Option<Error>), // User, Command author, Error
Ban(User, User, Option<String>, Option<SerenityError>), // User, Command author, Reason, Error
Unban(User, User, Option<SerenityError>), // User, Command author, Error
Lock(GuildChannel, User, Option<Error>), // Channel name, Command author, Error
Unlock(GuildChannel, User, Option<Error>), // Channel name, Command author, Error
Ban(User, User, Option<String>, Option<SerenityError>), // User, Command author, Reason, Error
Unban(User, User, Option<SerenityError>), // User, Command author, Error
Lock(GuildChannel, User, Option<Error>), // Channel name, Command author, Error
Unlock(GuildChannel, User, Option<Error>), // Channel name, Command author, Error
}
pub enum BanKind {
Ban(User, Option<u8>, Option<String>), // User, Amount of days to delete messages, Reason
Expand Down Expand Up @@ -399,3 +399,4 @@ pub async fn mute_moderation(

Ok((is_currently_muted, removed_roles))
}

0 comments on commit 2379130

Please sign in to comment.