add distinct identifying names. log errors in run_macro

This commit is contained in:
jude 2022-02-20 12:19:39 +00:00
parent 06c4deeaa9
commit 6ae2353c92
7 changed files with 102 additions and 40 deletions

2
Cargo.lock generated
View File

@ -1886,7 +1886,6 @@ checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
[[package]] [[package]]
name = "poise" name = "poise"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/kangalioo/poise?branch=master#38bcca284cbc9fb52cd770d7af64fbd4b3495cc8"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures-core", "futures-core",
@ -1901,7 +1900,6 @@ dependencies = [
[[package]] [[package]]
name = "poise_macros" name = "poise_macros"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/kangalioo/poise?branch=master#38bcca284cbc9fb52cd770d7af64fbd4b3495cc8"
dependencies = [ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",

View File

@ -5,7 +5,8 @@ authors = ["jellywx <judesouthworth@pm.me>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
poise = { git = "https://github.com/kangalioo/poise", branch = "master" } #poise = { git = "https://github.com/kangalioo/poise", branch = "master" }
poise = { path = "/home/jude/poise" }
dotenv = "0.15" dotenv = "0.15"
tokio = { version = "1", features = ["process", "full"] } tokio = { version = "1", features = ["process", "full"] }
reqwest = "0.11" reqwest = "0.11"

View File

@ -28,7 +28,7 @@ async fn timezone_autocomplete(ctx: Context<'_>, partial: String) -> Vec<String>
} }
/// Select your timezone /// Select your timezone
#[poise::command(slash_command)] #[poise::command(slash_command, identifying_name = "timezone")]
pub async fn timezone( pub async fn timezone(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Timezone to use from this list: https://gist.github.com/JellyWX/913dfc8b63d45192ad6cb54c829324ee"] #[description = "Timezone to use from this list: https://gist.github.com/JellyWX/913dfc8b63d45192ad6cb54c829324ee"]
@ -150,13 +150,23 @@ WHERE
} }
/// Record and replay command sequences /// Record and replay command sequences
#[poise::command(slash_command, rename = "macro", check = "guild_only")] #[poise::command(
slash_command,
rename = "macro",
check = "guild_only",
identifying_name = "macro_base"
)]
pub async fn macro_base(_ctx: Context<'_>) -> Result<(), Error> { pub async fn macro_base(_ctx: Context<'_>) -> Result<(), Error> {
Ok(()) Ok(())
} }
/// Start recording up to 5 commands to replay /// Start recording up to 5 commands to replay
#[poise::command(slash_command, rename = "record", check = "guild_only")] #[poise::command(
slash_command,
rename = "record",
check = "guild_only",
identifying_name = "record_macro"
)]
pub async fn record_macro( pub async fn record_macro(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Name for the new macro"] name: String, #[description = "Name for the new macro"] name: String,
@ -235,7 +245,7 @@ Please use `/macro finish` to end this recording before starting another.",
slash_command, slash_command,
rename = "finish", rename = "finish",
check = "guild_only", check = "guild_only",
identifying_name = "macro_finish" identifying_name = "finish_macro"
)] )]
pub async fn finish_macro(ctx: Context<'_>) -> Result<(), Error> { pub async fn finish_macro(ctx: Context<'_>) -> Result<(), Error> {
let key = (ctx.guild_id().unwrap(), ctx.author().id); let key = (ctx.guild_id().unwrap(), ctx.author().id);
@ -288,7 +298,12 @@ pub async fn finish_macro(ctx: Context<'_>) -> Result<(), Error> {
} }
/// List recorded macros /// List recorded macros
#[poise::command(slash_command, rename = "list", check = "guild_only")] #[poise::command(
slash_command,
rename = "list",
check = "guild_only",
identifying_name = "list_macro"
)]
pub async fn list_macro(ctx: Context<'_>) -> Result<(), Error> { pub async fn list_macro(ctx: Context<'_>) -> Result<(), Error> {
let macros = ctx.command_macros().await?; let macros = ctx.command_macros().await?;
@ -304,7 +319,12 @@ pub async fn list_macro(ctx: Context<'_>) -> Result<(), Error> {
} }
/// Run a recorded macro /// Run a recorded macro
#[poise::command(slash_command, rename = "run", check = "guild_only")] #[poise::command(
slash_command,
rename = "run",
check = "guild_only",
identifying_name = "run_macro"
)]
pub async fn run_macro( pub async fn run_macro(
ctx: poise::ApplicationContext<'_, Data, Error>, ctx: poise::ApplicationContext<'_, Data, Error>,
#[description = "Name of macro to run"] #[description = "Name of macro to run"]
@ -317,13 +337,17 @@ pub async fn run_macro(
for command in command_macro.commands { for command in command_macro.commands {
if let Some(action) = command.action { if let Some(action) = command.action {
(action)(poise::ApplicationContext { args: &command.options, ..ctx }) match (action)(poise::ApplicationContext { args: &command.options, ..ctx })
.await .await
.ok() {
.unwrap(); Ok(()) => {}
Err(e) => {
println!("{:?}", e);
}
}
} else { } else {
Context::Application(ctx) Context::Application(ctx)
.say(format!("Command \"{}\" failed to execute", command.command_name)) .say(format!("Command \"{}\" not found", command.command_name))
.await?; .await?;
} }
} }
@ -338,7 +362,12 @@ pub async fn run_macro(
} }
/// Delete a recorded macro /// Delete a recorded macro
#[poise::command(slash_command, rename = "delete", check = "guild_only")] #[poise::command(
slash_command,
rename = "delete",
check = "guild_only",
identifying_name = "delete_macro"
)]
pub async fn delete_macro( pub async fn delete_macro(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Name of macro to delete"] #[description = "Name of macro to delete"]

View File

@ -39,7 +39,7 @@ use crate::{
}; };
/// Pause all reminders on the current channel until a certain time or indefinitely /// Pause all reminders on the current channel until a certain time or indefinitely
#[poise::command(slash_command)] #[poise::command(slash_command, identifying_name = "pause")]
pub async fn pause( pub async fn pause(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "When to pause until"] until: Option<String>, #[description = "When to pause until"] until: Option<String>,
@ -90,7 +90,7 @@ pub async fn pause(
} }
/// Move all reminders in the current server by a certain amount of time. Times get added together /// Move all reminders in the current server by a certain amount of time. Times get added together
#[poise::command(slash_command)] #[poise::command(slash_command, identifying_name = "offset")]
pub async fn offset( pub async fn offset(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Number of hours to offset by"] hours: Option<isize>, #[description = "Number of hours to offset by"] hours: Option<isize>,
@ -147,7 +147,7 @@ WHERE FIND_IN_SET(channels.`channel`, ?)",
} }
/// Nudge all future reminders on this channel by a certain amount (don't use for DST! See `/offset`) /// Nudge all future reminders on this channel by a certain amount (don't use for DST! See `/offset`)
#[poise::command(slash_command)] #[poise::command(slash_command, identifying_name = "nudge")]
pub async fn nudge( pub async fn nudge(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Number of minutes to nudge new reminders by"] minutes: Option<isize>, #[description = "Number of minutes to nudge new reminders by"] minutes: Option<isize>,
@ -170,7 +170,7 @@ pub async fn nudge(
} }
/// View reminders on a specific channel /// View reminders on a specific channel
#[poise::command(slash_command)] #[poise::command(slash_command, identifying_name = "look")]
pub async fn look( pub async fn look(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Channel to view reminders on"] channel: Option<Channel>, #[description = "Channel to view reminders on"] channel: Option<Channel>,
@ -260,7 +260,7 @@ pub async fn look(
} }
/// Delete reminders /// Delete reminders
#[poise::command(slash_command, rename = "del")] #[poise::command(slash_command, rename = "del", identifying_name = "delete")]
pub async fn delete(ctx: Context<'_>) -> Result<(), Error> { pub async fn delete(ctx: Context<'_>) -> Result<(), Error> {
let timezone = ctx.timezone().await; let timezone = ctx.timezone().await;
@ -422,13 +422,13 @@ fn time_difference(start_time: NaiveDateTime) -> String {
} }
/// Manage timers /// Manage timers
#[poise::command(slash_command, rename = "timer")] #[poise::command(slash_command, rename = "timer", identifying_name = "timer_base")]
pub async fn timer_base(_ctx: Context<'_>) -> Result<(), Error> { pub async fn timer_base(_ctx: Context<'_>) -> Result<(), Error> {
Ok(()) Ok(())
} }
/// List the timers in this server or DM channel /// List the timers in this server or DM channel
#[poise::command(slash_command, rename = "list")] #[poise::command(slash_command, rename = "list", identifying_name = "list_timer")]
pub async fn list_timer(ctx: Context<'_>) -> Result<(), Error> { pub async fn list_timer(ctx: Context<'_>) -> Result<(), Error> {
let owner = ctx.guild_id().map(|g| g.0).unwrap_or_else(|| ctx.author().id.0); let owner = ctx.guild_id().map(|g| g.0).unwrap_or_else(|| ctx.author().id.0);
@ -452,7 +452,7 @@ pub async fn list_timer(ctx: Context<'_>) -> Result<(), Error> {
} }
/// Start a new timer from now /// Start a new timer from now
#[poise::command(slash_command, rename = "start")] #[poise::command(slash_command, rename = "start", identifying_name = "start_timer")]
pub async fn start_timer( pub async fn start_timer(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Name for the new timer"] name: String, #[description = "Name for the new timer"] name: String,
@ -482,7 +482,7 @@ pub async fn start_timer(
} }
/// Delete a timer /// Delete a timer
#[poise::command(slash_command, rename = "delete")] #[poise::command(slash_command, rename = "delete", identifying_name = "delete_timer")]
pub async fn delete_timer( pub async fn delete_timer(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Name of timer to delete"] name: String, #[description = "Name of timer to delete"] name: String,
@ -509,8 +509,8 @@ pub async fn delete_timer(
} }
/// Create a new reminder /// Create a new reminder
#[poise::command(slash_command)] #[poise::command(slash_command, identifying_name = "remind")]
pub(crate) async fn remind( pub async fn remind(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "A description of the time to set the reminder for"] time: String, #[description = "A description of the time to set the reminder for"] time: String,
#[description = "The message content to send"] content: String, #[description = "The message content to send"] content: String,

View File

@ -11,19 +11,29 @@ use crate::{
}; };
/// Manage todo lists /// Manage todo lists
#[poise::command(slash_command, rename = "todo")] #[poise::command(slash_command, rename = "todo", identifying_name = "todo_base")]
pub async fn todo_base(_ctx: Context<'_>) -> Result<(), Error> { pub async fn todo_base(_ctx: Context<'_>) -> Result<(), Error> {
Ok(()) Ok(())
} }
/// Manage the server todo list /// Manage the server todo list
#[poise::command(slash_command, rename = "server", check = "guild_only")] #[poise::command(
slash_command,
rename = "server",
check = "guild_only",
identifying_name = "todo_guild_base"
)]
pub async fn todo_guild_base(_ctx: Context<'_>) -> Result<(), Error> { pub async fn todo_guild_base(_ctx: Context<'_>) -> Result<(), Error> {
Ok(()) Ok(())
} }
/// Add an item to the server todo list /// Add an item to the server todo list
#[poise::command(slash_command, rename = "add")] #[poise::command(
slash_command,
rename = "add",
check = "guild_only",
identifying_name = "todo_guild_add"
)]
pub async fn todo_guild_add( pub async fn todo_guild_add(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "The task to add to the todo list"] task: String, #[description = "The task to add to the todo list"] task: String,
@ -44,7 +54,12 @@ VALUES ((SELECT id FROM guilds WHERE guild = ?), ?)",
} }
/// View and remove from the server todo list /// View and remove from the server todo list
#[poise::command(slash_command, rename = "view")] #[poise::command(
slash_command,
rename = "view",
check = "guild_only",
identifying_name = "todo_guild_view"
)]
pub async fn todo_guild_view(ctx: Context<'_>) -> Result<(), Error> { pub async fn todo_guild_view(ctx: Context<'_>) -> Result<(), Error> {
let values = sqlx::query!( let values = sqlx::query!(
"SELECT todos.id, value FROM todos "SELECT todos.id, value FROM todos
@ -71,13 +86,23 @@ WHERE guilds.guild = ?",
} }
/// Manage the channel todo list /// Manage the channel todo list
#[poise::command(slash_command, rename = "channel", check = "guild_only")] #[poise::command(
slash_command,
rename = "channel",
check = "guild_only",
identifying_name = "todo_channel_base"
)]
pub async fn todo_channel_base(_ctx: Context<'_>) -> Result<(), Error> { pub async fn todo_channel_base(_ctx: Context<'_>) -> Result<(), Error> {
Ok(()) Ok(())
} }
/// Add an item to the channel todo list /// Add an item to the channel todo list
#[poise::command(slash_command, rename = "add")] #[poise::command(
slash_command,
rename = "add",
check = "guild_only",
identifying_name = "todo_channel_add"
)]
pub async fn todo_channel_add( pub async fn todo_channel_add(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "The task to add to the todo list"] task: String, #[description = "The task to add to the todo list"] task: String,
@ -99,7 +124,12 @@ VALUES ((SELECT id FROM guilds WHERE guild = ?), (SELECT id FROM channels WHERE
} }
/// View and remove from the channel todo list /// View and remove from the channel todo list
#[poise::command(slash_command, rename = "view")] #[poise::command(
slash_command,
rename = "view",
check = "guild_only",
identifying_name = "todo_channel_view"
)]
pub async fn todo_channel_view(ctx: Context<'_>) -> Result<(), Error> { pub async fn todo_channel_view(ctx: Context<'_>) -> Result<(), Error> {
let values = sqlx::query!( let values = sqlx::query!(
"SELECT todos.id, value FROM todos "SELECT todos.id, value FROM todos
@ -127,13 +157,13 @@ WHERE channels.channel = ?",
} }
/// Manage your personal todo list /// Manage your personal todo list
#[poise::command(slash_command, rename = "user")] #[poise::command(slash_command, rename = "user", identifying_name = "todo_user_base")]
pub async fn todo_user_base(_ctx: Context<'_>) -> Result<(), Error> { pub async fn todo_user_base(_ctx: Context<'_>) -> Result<(), Error> {
Ok(()) Ok(())
} }
/// Add an item to your personal todo list /// Add an item to your personal todo list
#[poise::command(slash_command, rename = "add")] #[poise::command(slash_command, rename = "add", identifying_name = "todo_user_add")]
pub async fn todo_user_add( pub async fn todo_user_add(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "The task to add to the todo list"] task: String, #[description = "The task to add to the todo list"] task: String,
@ -154,7 +184,7 @@ VALUES ((SELECT id FROM users WHERE user = ?), ?)",
} }
/// View and remove from your personal todo list /// View and remove from your personal todo list
#[poise::command(slash_command, rename = "view")] #[poise::command(slash_command, rename = "view", identifying_name = "todo_user_view")]
pub async fn todo_user_view(ctx: Context<'_>) -> Result<(), Error> { pub async fn todo_user_view(ctx: Context<'_>) -> Result<(), Error> {
let values = sqlx::query!( let values = sqlx::query!(
"SELECT todos.id, value FROM todos "SELECT todos.id, value FROM todos

View File

@ -15,7 +15,7 @@ pub async fn guild_only(ctx: Context<'_>) -> Result<bool, Error> {
async fn macro_check(ctx: Context<'_>) -> bool { async fn macro_check(ctx: Context<'_>) -> bool {
if let Context::Application(app_ctx) = ctx { if let Context::Application(app_ctx) = ctx {
if let Some(guild_id) = ctx.guild_id() { if let Some(guild_id) = ctx.guild_id() {
if ctx.command().identifying_name != "macro_finish" { if ctx.command().identifying_name != "finish_macro" {
let mut lock = ctx.data().recording_macros.write().await; let mut lock = ctx.data().recording_macros.write().await;
if let Some(command_macro) = lock.get_mut(&(guild_id, ctx.author().id)) { if let Some(command_macro) = lock.get_mut(&(guild_id, ctx.author().id)) {

View File

@ -12,7 +12,7 @@ mod models;
mod time_parser; mod time_parser;
mod utils; mod utils;
use std::{collections::HashMap, env, sync::atomic::AtomicBool}; use std::{collections::HashMap, env, fmt::Formatter, sync::atomic::AtomicBool};
use chrono_tz::Tz; use chrono_tz::Tz;
use dotenv::dotenv; use dotenv::dotenv;
@ -45,6 +45,12 @@ pub struct Data {
is_loop_running: AtomicBool, is_loop_running: AtomicBool,
} }
impl std::fmt::Debug for Data {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "Data {{ .. }}")
}
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
env_logger::init(); env_logger::init();
@ -120,9 +126,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
Pool::connect(&env::var("DATABASE_URL").expect("No database URL provided")).await.unwrap(); Pool::connect(&env::var("DATABASE_URL").expect("No database URL provided")).await.unwrap();
let popular_timezones = sqlx::query!( let popular_timezones = sqlx::query!(
" "SELECT timezone FROM users GROUP BY timezone ORDER BY COUNT(timezone) DESC LIMIT 21"
SELECT timezone FROM users GROUP BY timezone ORDER BY COUNT(timezone) DESC LIMIT 21
"
) )
.fetch_all(&database) .fetch_all(&database)
.await .await