2020-09-01 14:34:50 +00:00
|
|
|
use regex_command_attr::command;
|
|
|
|
|
|
|
|
use serenity::{
|
|
|
|
client::Context,
|
|
|
|
model::{
|
|
|
|
channel::{
|
|
|
|
Message,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
framework::standard::CommandResult,
|
|
|
|
};
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
models::{
|
|
|
|
ChannelData,
|
2020-09-01 17:18:45 +00:00
|
|
|
GuildData,
|
2020-09-01 14:34:50 +00:00
|
|
|
UserData,
|
|
|
|
},
|
|
|
|
SQLPool,
|
|
|
|
time_parser::TimeParser,
|
|
|
|
};
|
|
|
|
|
|
|
|
use chrono::NaiveDateTime;
|
|
|
|
|
|
|
|
|
|
|
|
#[command]
|
|
|
|
async fn pause(ctx: &Context, msg: &Message, args: String) -> CommandResult {
|
|
|
|
let pool = ctx.data.read().await
|
|
|
|
.get::<SQLPool>().cloned().expect("Could not get SQLPool from data");
|
|
|
|
|
2020-09-01 16:07:51 +00:00
|
|
|
let user_data = UserData::from_id(&msg.author, &ctx, &pool).await.unwrap();
|
|
|
|
let mut channel = ChannelData::from_channel(msg.channel(&ctx).await.unwrap(), &pool).await.unwrap();
|
2020-09-01 14:34:50 +00:00
|
|
|
|
|
|
|
if args.len() == 0 {
|
|
|
|
channel.paused = !channel.paused;
|
|
|
|
channel.paused_until = None;
|
|
|
|
|
2020-09-01 16:07:51 +00:00
|
|
|
channel.commit_changes(&pool).await;
|
2020-09-01 14:34:50 +00:00
|
|
|
|
|
|
|
if channel.paused {
|
2020-09-01 16:07:51 +00:00
|
|
|
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "paused/paused_indefinite").await).await;
|
2020-09-01 14:34:50 +00:00
|
|
|
}
|
|
|
|
else {
|
2020-09-01 16:07:51 +00:00
|
|
|
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "paused/unpaused").await).await;
|
2020-09-01 14:34:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
let parser = TimeParser::new(args, user_data.timezone.parse().unwrap());
|
|
|
|
let pause_until = parser.timestamp();
|
|
|
|
|
|
|
|
match pause_until {
|
|
|
|
Ok(timestamp) => {
|
|
|
|
channel.paused = true;
|
|
|
|
channel.paused_until = Some(NaiveDateTime::from_timestamp(timestamp, 0));
|
|
|
|
|
2020-09-01 16:07:51 +00:00
|
|
|
channel.commit_changes(&pool).await;
|
2020-09-01 14:34:50 +00:00
|
|
|
|
2020-09-01 16:07:51 +00:00
|
|
|
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "paused/paused_until").await).await;
|
2020-09-01 14:34:50 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
Err(_) => {
|
2020-09-01 16:07:51 +00:00
|
|
|
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "paused/invalid_time").await).await;
|
2020-09-01 14:34:50 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
2020-09-01 17:18:45 +00:00
|
|
|
|
|
|
|
#[command]
|
|
|
|
async fn offset(ctx: &Context, msg: &Message, args: String) -> CommandResult {
|
|
|
|
let pool = ctx.data.read().await
|
|
|
|
.get::<SQLPool>().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(())
|
|
|
|
}
|