diff --git a/.idea/dictionaries/jude.xml b/.idea/dictionaries/jude.xml
index 38d72d3..67a690d 100644
--- a/.idea/dictionaries/jude.xml
+++ b/.idea/dictionaries/jude.xml
@@ -2,6 +2,7 @@
reqwest
+ todos
webhooks
diff --git a/src/commands/todo_cmds.rs b/src/commands/todo_cmds.rs
index 154553c..9238adc 100644
--- a/src/commands/todo_cmds.rs
+++ b/src/commands/todo_cmds.rs
@@ -13,10 +13,133 @@ use serenity::{
framework::standard::CommandResult,
};
-enum TodoTarget {
- User(UserId),
- Channel(ChannelId),
- Guild(GuildId),
+use crate::SQLPool;
+use sqlx::MySqlPool;
+
+
+#[derive(Debug)]
+struct Todo {
+ id: u32,
+ user_id: Option,
+ guild_id: Option,
+ channel_id: Option,
+ value: String,
+}
+
+struct TodoTarget {
+ user: UserId,
+ guild: Option,
+ channel: Option,
+}
+
+impl TodoTarget {
+ pub async fn view(&self, pool: MySqlPool) -> Result, Box> {
+ Ok(if let Some(cid) = self.channel {
+ sqlx::query_as!(Todo,
+ "
+SELECT * FROM todos WHERE channel_id = (SELECT id FROM channels WHERE channel = ?)
+ ", cid.as_u64())
+ .fetch_all(&pool)
+ .await?
+ }
+ else if let Some(gid) = self.guild {
+ sqlx::query_as!(Todo,
+ "
+SELECT * FROM todos WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) AND channel_id IS NULL
+ ", gid.as_u64())
+ .fetch_all(&pool)
+ .await?
+ }
+ else {
+ sqlx::query_as!(Todo,
+ "
+SELECT * FROM todos WHERE user_id = (SELECT id FROM users WHERE user = ?)
+ ", self.user.as_u64())
+ .fetch_all(&pool)
+ .await?
+ })
+ }
+
+ pub async fn add(&self, value: String, pool: MySqlPool) -> Result<(), Box> {
+ if let (Some(cid), Some(gid)) = (self.channel, self.guild) {
+ sqlx::query!(
+ "
+INSERT INTO todos (user_id, guild_id, channel_id, value) VALUES (
+ (SELECT id FROM users WHERE user = ?),
+ (SELECT id FROM guilds WHERE guild = ?),
+ (SELECT id FROM channels WHERE channel = ?),
+ ?
+)
+ ", self.user.as_u64(), gid.as_u64(), cid.as_u64(), value)
+ .execute(&pool)
+ .await?;
+ }
+ else if let Some(gid) = self.guild {
+ sqlx::query!(
+ "
+INSERT INTO todos (user_id, guild_id, value) VALUES (
+ (SELECT id FROM users WHERE user = ?),
+ (SELECT id FROM guilds WHERE guild = ?),
+ ?
+)
+ ", self.user.as_u64(), gid.as_u64(), value)
+ .execute(&pool)
+ .await?;
+ }
+ else {
+ sqlx::query!(
+ "
+INSERT INTO todos (user_id, value) VALUES (
+ (SELECT id FROM users WHERE user = ?),
+ ?
+)
+ ", self.user.as_u64(), value)
+ .execute(&pool)
+ .await?;
+ }
+
+ Ok(())
+ }
+
+ pub async fn remove(&self, num: u32, pool: MySqlPool) -> Result<(), Box> {
+ sqlx::query!(
+ "
+DELETE FROM todos WHERE id = (SELECT id FROM (SELECT id FROM todos LIMIT ?,1) AS t)
+ ", num)
+ .execute(&pool)
+ .await?;
+
+ Ok(())
+ }
+
+ pub async fn clear(&self, pool: MySqlPool) -> Result<(), Box> {
+ if let Some(cid) = self.channel {
+ sqlx::query!(
+ "
+DELETE FROM todos WHERE channel_id = (SELECT id FROM channels WHERE channel = ?)
+ ", cid.as_u64())
+ .execute(&pool)
+ .await?;
+ }
+ else if let Some(gid) = self.guild {
+ sqlx::query!(
+ "
+DELETE FROM todos WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) AND channel_id IS NULL
+ ", gid.as_u64())
+ .execute(&pool)
+ .await?;
+ }
+ else {
+ sqlx::query!(
+ "
+DELETE FROM todos WHERE user_id = (SELECT id FROM users WHERE user = ?)
+ ", self.user.as_u64())
+ .execute(&pool)
+ .await?;
+ }
+
+ Ok(())
+ }
}
enum SubCommand {
@@ -32,16 +155,21 @@ async fn todo_parse(ctx: &Context, msg: &Message, args: String) -> CommandResult
let mut split = args.split(" ");
if let Some(target) = split.next() {
- target_opt = match target {
+ let target_opt = match target {
"user" =>
- TodoTarget::User(msg.author.id),
+ Some(TodoTarget {user: msg.author.id, guild: None, channel: None}),
"channel" =>
- TodoTarget::Channel(msg.channel_id),
+ if let Some(gid) = msg.guild_id {
+ Some(TodoTarget {user: msg.author.id, guild: Some(gid), channel: Some(msg.channel_id)})
+ }
+ else {
+ None
+ },
"server" | "guild" => {
if let Some(gid) = msg.guild_id {
- TodoTarget::Guild(gid)
+ Some(TodoTarget {user: msg.author.id, guild: Some(gid), channel: None})
}
else {
None
@@ -69,7 +197,7 @@ async fn todo_parse(ctx: &Context, msg: &Message, args: String) -> CommandResult
};
if let Some(subcommand) = subcommand_opt {
- todo(ctx, target, subcommand).await;
+ todo(ctx, target, subcommand, "".to_string()).await;
}
else {
let _ = msg.channel_id.say(&ctx, "Todo help").await;
@@ -88,6 +216,25 @@ async fn todo_parse(ctx: &Context, msg: &Message, args: String) -> CommandResult
Ok(())
}
-async fn todo(ctx: &Context, target: TodoTarget, subcommand: SubCommand) {
+async fn todo(ctx: &Context, target: TodoTarget, subcommand: SubCommand, extra: String) {
+ let pool = ctx.data.read().await
+ .get::().cloned().expect("Could not get SQLPool from data");
+ match subcommand {
+ SubCommand::View => {
+ println!("{:?}", target.view(pool).await.unwrap());
+ },
+
+ SubCommand::Add => {
+
+ },
+
+ SubCommand::Remove => {
+
+ },
+
+ SubCommand::Clear => {
+
+ },
+ }
}