From 4bd24ff94c846ce2824a502712f41859bc75fe5a Mon Sep 17 00:00:00 2001 From: jude Date: Tue, 1 Sep 2020 18:18:45 +0100 Subject: [PATCH] offset command. fix for timeparser not doing negatives properly on specified fields --- src/commands/reminder_cmds.rs | 51 +++++++++++++++++++++++++++++++++++ src/main.rs | 4 +++ src/models.rs | 8 +++++- src/time_parser.rs | 2 +- 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/commands/reminder_cmds.rs b/src/commands/reminder_cmds.rs index a69de99..997030b 100644 --- a/src/commands/reminder_cmds.rs +++ b/src/commands/reminder_cmds.rs @@ -13,6 +13,7 @@ use serenity::{ use crate::{ models::{ ChannelData, + GuildData, UserData, }, SQLPool, @@ -65,3 +66,53 @@ async fn pause(ctx: &Context, msg: &Message, args: String) -> CommandResult { Ok(()) } + +#[command] +async fn offset(ctx: &Context, msg: &Message, args: String) -> CommandResult { + let pool = ctx.data.read().await + .get::().cloned().expect("Could not get SQLPool from data"); + + let user_data = UserData::from_id(&msg.author, &ctx, &pool).await.unwrap(); + + if args.len() == 0 { + let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "offset/help").await).await; + } + else { + let parser = TimeParser::new(args, user_data.timezone()); + + if let Ok(displacement) = parser.displacement() { + if let Some(guild) = msg.guild(&ctx).await { + let guild_data = GuildData::from_guild(guild, &pool).await.unwrap(); + + sqlx::query!( + " +UPDATE reminders + INNER JOIN `channels` + ON `channels`.id = reminders.channel_id + SET + reminders.`time` = reminders.`time` + ? + WHERE channels.guild_id = ? + ", displacement, guild_data.id) + .execute(&pool) + .await + .unwrap(); + } else { + sqlx::query!( + " +UPDATE reminders SET `time` = `time` + ? WHERE reminders.channel_id = ? + ", displacement, user_data.dm_channel) + .execute(&pool) + .await + .unwrap(); + } + + let response = user_data.response(&pool, "offset/success").await.replacen("{}", &displacement.to_string(), 1); + + let _ = msg.channel_id.say(&ctx, response).await; + } else { + let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "offset/invalid_time").await).await; + } + } + + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index 0d0f288..30f94d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -63,12 +63,16 @@ async fn main() -> Result<(), Box> { .add_command("donate", &info_cmds::DONATE_COMMAND) .add_command("dashboard", &info_cmds::DASHBOARD_COMMAND) .add_command("clock", &info_cmds::CLOCK_COMMAND) + .add_command("todo", &todo_cmds::TODO_PARSE_COMMAND) + .add_command("blacklist", &moderation_cmds::BLACKLIST_COMMAND) .add_command("timezone", &moderation_cmds::TIMEZONE_COMMAND) .add_command("prefix", &moderation_cmds::PREFIX_COMMAND) .add_command("lang", &moderation_cmds::LANGUAGE_COMMAND) + .add_command("pause", &reminder_cmds::PAUSE_COMMAND) + .add_command("offset", &reminder_cmds::OFFSET_COMMAND) .build(); let mut client = Client::new(&env::var("DISCORD_TOKEN").expect("Missing DISCORD_TOKEN from environment")) diff --git a/src/models.rs b/src/models.rs index 18e5eca..4dcea68 100644 --- a/src/models.rs +++ b/src/models.rs @@ -10,8 +10,10 @@ use serenity::{ use sqlx::MySqlPool; use chrono::NaiveDateTime; +use chrono_tz::Tz; + pub struct GuildData { - id: u32, + pub id: u32, guild: u64, pub name: String, pub prefix: String, @@ -198,4 +200,8 @@ SELECT value FROM strings WHERE (language = ? OR language = 'EN') AND name = ? O row.value.expect("No string with that name") } + + pub fn timezone(&self) -> Tz { + self.timezone.parse().unwrap() + } } diff --git a/src/time_parser.rs b/src/time_parser.rs index 8d7df4d..38422eb 100644 --- a/src/time_parser.rs +++ b/src/time_parser.rs @@ -172,7 +172,7 @@ impl TimeParser { } } - let full = seconds + (minutes * 60) + (hours * 3600) + (days * 86400) + current_buffer.parse::().unwrap() * + let full = (seconds + (minutes * 60) + (hours * 3600) + (days * 86400) + current_buffer.parse::().unwrap()) * if self.inverted { -1 } else { 1 }; Ok(full)