add distinct identifying names. log errors in run_macro
This commit is contained in:
parent
06c4deeaa9
commit
6ae2353c92
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -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",
|
||||||
|
@ -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"
|
||||||
|
@ -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"]
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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)) {
|
||||||
|
12
src/main.rs
12
src/main.rs
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user