reminder-bot/src/commands/reminder_cmds.rs

163 lines
5.1 KiB
Rust
Raw Normal View History

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,
GuildData,
2020-09-01 14:34:50 +00:00
UserData,
},
SQLPool,
time_parser::TimeParser,
};
use chrono::NaiveDateTime;
#[command]
2020-09-01 17:48:40 +00:00
#[supports_dm(false)]
#[permission_level(Restricted)]
2020-09-01 14:34:50 +00:00
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");
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;
channel.commit_changes(&pool).await;
2020-09-01 14:34:50 +00:00
if channel.paused {
2020-09-01 17:37:43 +00:00
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "pause/paused_indefinite").await).await;
2020-09-01 14:34:50 +00:00
}
else {
2020-09-01 17:37:43 +00:00
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "pause/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));
channel.commit_changes(&pool).await;
2020-09-01 14:34:50 +00:00
2020-09-01 17:37:43 +00:00
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "pause/paused_until").await).await;
2020-09-01 14:34:50 +00:00
},
Err(_) => {
2020-09-01 17:37:43 +00:00
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "pause/invalid_time").await).await;
2020-09-01 14:34:50 +00:00
},
}
}
Ok(())
}
#[command]
2020-09-01 17:48:40 +00:00
#[permission_level(Restricted)]
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(())
}
2020-09-01 17:37:43 +00:00
#[command]
2020-09-01 17:48:40 +00:00
#[permission_level(Restricted)]
2020-09-01 17:37:43 +00:00
async fn nudge(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();
let mut channel = ChannelData::from_channel(msg.channel(&ctx).await.unwrap(), &pool).await.unwrap();
if args.len() == 0 {
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "nudge/invalid_time").await).await;
}
else {
let parser = TimeParser::new(args, user_data.timezone.parse().unwrap());
let nudge_time = parser.displacement();
match nudge_time {
Ok(displacement) => {
if displacement < i16::MIN as i64 || displacement > i16::MAX as i64 {
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "nudge/invalid_time").await).await;
}
else {
channel.nudge = displacement as i16;
channel.commit_changes(&pool).await;
let response = user_data.response(&pool, "nudge/success").await.replacen("{}", &displacement.to_string(), 1);
let _ = msg.channel_id.say(&ctx, response).await;
}
},
Err(_) => {
let _ = msg.channel_id.say(&ctx, user_data.response(&pool, "nudge/invalid_time").await).await;
},
}
}
Ok(())
}