mirror of
https://github.com/revanced/revanced-discord-bot.git
synced 2025-05-01 06:54:27 +02:00
feat: use go-parse-duration
for time parameters (#69)
* 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>
This commit is contained in:
parent
5128258e55
commit
2379130c5a
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -588,6 +588,12 @@ dependencies = [
|
|||||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "go-parse-duration"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "558b88954871f5e5b2af0e62e2e176c8bde7a6c2c4ed41b13d138d96da2e2cbd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h2"
|
name = "h2"
|
||||||
version = "0.3.16"
|
version = "0.3.16"
|
||||||
@ -1297,6 +1303,7 @@ dependencies = [
|
|||||||
"decancer",
|
"decancer",
|
||||||
"dirs",
|
"dirs",
|
||||||
"dotenv",
|
"dotenv",
|
||||||
|
"go-parse-duration",
|
||||||
"hmac-sha256",
|
"hmac-sha256",
|
||||||
"mongodb",
|
"mongodb",
|
||||||
"poise",
|
"poise",
|
||||||
|
@ -34,3 +34,4 @@ tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_leve
|
|||||||
tracing-subscriber = "0.3.16"
|
tracing-subscriber = "0.3.16"
|
||||||
hmac-sha256 = "1.1.6"
|
hmac-sha256 = "1.1.6"
|
||||||
base64 = "0.21.0"
|
base64 = "0.21.0"
|
||||||
|
go-parse-duration = "0.1.1"
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
use bson::{doc, Document};
|
use bson::{doc, Document};
|
||||||
use chrono::{Duration, Utc};
|
use chrono::Utc;
|
||||||
use mongodb::options::{UpdateModifications, UpdateOptions};
|
use mongodb::options::{UpdateModifications, UpdateOptions};
|
||||||
use poise::serenity_prelude::{
|
use poise::serenity_prelude::{
|
||||||
self as serenity, Mentionable, PermissionOverwrite, Permissions, UserId,
|
self as serenity,
|
||||||
|
Mentionable,
|
||||||
|
PermissionOverwrite,
|
||||||
|
Permissions,
|
||||||
|
UserId,
|
||||||
};
|
};
|
||||||
use tracing::{debug, error, trace};
|
use tracing::{debug, error, trace};
|
||||||
|
|
||||||
@ -10,8 +14,13 @@ use crate::db::model::{LockedChannel, Muted};
|
|||||||
use crate::utils::bot::get_member;
|
use crate::utils::bot::get_member;
|
||||||
use crate::utils::macros::to_user;
|
use crate::utils::macros::to_user;
|
||||||
use crate::utils::moderation::{
|
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};
|
use crate::{Context, Error};
|
||||||
|
|
||||||
/// Lock a channel.
|
/// Lock a channel.
|
||||||
@ -89,14 +98,11 @@ pub async fn lock(ctx: Context<'_>) -> Result<(), Error> {
|
|||||||
let permission = Permissions::SEND_MESSAGES & Permissions::ADD_REACTIONS;
|
let permission = Permissions::SEND_MESSAGES & Permissions::ADD_REACTIONS;
|
||||||
|
|
||||||
if let Err(err) = channel
|
if let Err(err) = channel
|
||||||
.create_permission(
|
.create_permission(http, &PermissionOverwrite {
|
||||||
http,
|
|
||||||
&PermissionOverwrite {
|
|
||||||
allow: permission_overwrite.allow & !permission,
|
allow: permission_overwrite.allow & !permission,
|
||||||
deny: permission_overwrite.deny | permission,
|
deny: permission_overwrite.deny | permission,
|
||||||
kind: permission_overwrite.kind,
|
kind: permission_overwrite.kind,
|
||||||
},
|
})
|
||||||
)
|
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
error!("Failed to create the new permission: {:?}", err);
|
error!("Failed to create the new permission: {:?}", err);
|
||||||
@ -197,45 +203,17 @@ pub async fn unmute(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Mute a member.
|
/// Mute a member.
|
||||||
#[allow(clippy::too_many_arguments)]
|
|
||||||
#[poise::command(slash_command)]
|
#[poise::command(slash_command)]
|
||||||
pub async fn mute(
|
pub async fn mute(
|
||||||
ctx: Context<'_>,
|
ctx: Context<'_>,
|
||||||
#[description = "The member to mute"] member: UserId,
|
#[description = "The member to mute"] member: UserId,
|
||||||
#[description = "Seconds"] seconds: Option<i64>,
|
#[description = "The duration of the mute"] duration: String,
|
||||||
#[description = "Minutes"] minutes: Option<i64>,
|
|
||||||
#[description = "Hours"] hours: Option<i64>,
|
|
||||||
#[description = "Days"] days: Option<i64>,
|
|
||||||
#[description = "Months"] months: Option<i64>,
|
|
||||||
#[description = "The reason of the mute"] reason: String,
|
#[description = "The reason of the mute"] reason: String,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let user = to_user!(member, ctx);
|
let user = to_user!(member, ctx);
|
||||||
let id = user.id;
|
let id = user.id;
|
||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
let mut mute_duration = Duration::zero();
|
let mute_duration = parse_duration(duration).map_err(|e| Error::from(format!("{:?}", e)))?;
|
||||||
|
|
||||||
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 data = &mut *ctx.data().write().await;
|
let data = &mut *ctx.data().write().await;
|
||||||
let configuration = &data.configuration;
|
let configuration = &data.configuration;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use chrono::Duration;
|
||||||
use poise::serenity_prelude::{self as serenity, Member, RoleId};
|
use poise::serenity_prelude::{self as serenity, Member, RoleId};
|
||||||
|
|
||||||
pub mod autorespond;
|
pub mod autorespond;
|
||||||
@ -9,3 +10,8 @@ pub mod macros;
|
|||||||
pub mod media_channel;
|
pub mod media_channel;
|
||||||
pub mod moderation;
|
pub mod moderation;
|
||||||
pub mod poll;
|
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))
|
||||||
|
}
|
||||||
|
@ -399,3 +399,4 @@ pub async fn mute_moderation(
|
|||||||
|
|
||||||
Ok((is_currently_muted, removed_roles))
|
Ok((is_currently_muted, removed_roles))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user