diff --git a/src/commands/todo_cmds.rs b/src/commands/todo_cmds.rs index 0de1d48..9f004e1 100644 --- a/src/commands/todo_cmds.rs +++ b/src/commands/todo_cmds.rs @@ -88,23 +88,46 @@ async fn todo(ctx: &Context, invoke: &mut CommandInvoke, args: CommandOptions) { .await; } None => { - let values = sqlx::query!( - // fucking braindead mysql use <=> instead of = for null comparison - "SELECT todos.id, value FROM todos + let values = if let Some(uid) = keys.0 { + sqlx::query!( + "SELECT todos.id, value FROM todos INNER JOIN users ON todos.user_id = users.id +WHERE users.user = ?", + uid, + ) + .fetch_all(&pool) + .await + .unwrap() + .iter() + .map(|row| (row.id as usize, row.value.clone())) + .collect::>() + } else if let Some(cid) = keys.1 { + sqlx::query!( + "SELECT todos.id, value FROM todos INNER JOIN channels ON todos.channel_id = channels.id +WHERE channels.channel = ?", + cid, + ) + .fetch_all(&pool) + .await + .unwrap() + .iter() + .map(|row| (row.id as usize, row.value.clone())) + .collect::>() + } else { + sqlx::query!( + "SELECT todos.id, value FROM todos INNER JOIN guilds ON todos.guild_id = guilds.id -WHERE users.user <=> ? AND channels.channel <=> ? AND guilds.guild <=> ?", - keys.0, - keys.1, - keys.2, - ) - .fetch_all(&pool) - .await - .unwrap() - .iter() - .map(|row| (row.id as usize, row.value.clone())) - .collect::>(); +WHERE guilds.guild = ?", + keys.2, + ) + .fetch_all(&pool) + .await + .unwrap() + .iter() + .map(|row| (row.id as usize, row.value.clone())) + .collect::>() + }; let resp = show_todo_page(&values, 0, keys.0, keys.1, keys.2); diff --git a/src/component_models/mod.rs b/src/component_models/mod.rs index 373e405..bf16b2b 100644 --- a/src/component_models/mod.rs +++ b/src/component_models/mod.rs @@ -164,19 +164,46 @@ impl ComponentDataModel { if Some(component.user.id.0) == pager.user_id || pager.user_id.is_none() { let pool = ctx.data.read().await.get::().cloned().unwrap(); - let values = sqlx::query!( - // fucking braindead mysql use <=> instead of = for null comparison - "SELECT id, value FROM todos WHERE user_id <=> ? AND channel_id <=> ? AND guild_id <=> ?", - pager.user_id, - pager.channel_id, - pager.guild_id, - ) - .fetch_all(&pool) - .await - .unwrap() - .iter() - .map(|row| (row.id as usize, row.value.clone())) - .collect::>(); + let values = if let Some(uid) = pager.user_id { + sqlx::query!( + "SELECT todos.id, value FROM todos + INNER JOIN users ON todos.user_id = users.id + WHERE users.user = ?", + uid, + ) + .fetch_all(&pool) + .await + .unwrap() + .iter() + .map(|row| (row.id as usize, row.value.clone())) + .collect::>() + } else if let Some(cid) = pager.channel_id { + sqlx::query!( + "SELECT todos.id, value FROM todos + INNER JOIN channels ON todos.channel_id = channels.id + WHERE channels.channel = ?", + cid, + ) + .fetch_all(&pool) + .await + .unwrap() + .iter() + .map(|row| (row.id as usize, row.value.clone())) + .collect::>() + } else { + sqlx::query!( + "SELECT todos.id, value FROM todos + INNER JOIN guilds ON todos.guild_id = guilds.id + WHERE guilds.guild = ?", + pager.guild_id, + ) + .fetch_all(&pool) + .await + .unwrap() + .iter() + .map(|row| (row.id as usize, row.value.clone())) + .collect::>() + }; let max_pages = max_todo_page(&values);