diff --git a/src/main.rs b/src/main.rs index 47948a4..5050f81 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use serenity::framework::standard::{ }; use serenity::model::{ channel::Message, - id::{ChannelId, GuildId}, + id::{ChannelId, GuildId, UserId}, prelude::User, }; use serenity::prelude::*; @@ -18,11 +18,20 @@ use time::Duration; mod inbox; const APPLICATION_NAME: &str = "didgeridoo"; +const INBOX_OWNER: UserId = UserId(354694403798990848); lazy_static! { static ref INBOX: Inbox = Inbox(redis::Client::open("redis://127.0.0.1/").unwrap()); } +macro_rules! send_or_log { + ($e: expr) => { + if let Err(e) = $e { + eprintln!("Couldn’t send message because {:?}", e); + } + }; +} + #[group] #[commands(name, message, question, inbox)] struct Fluff; @@ -30,11 +39,9 @@ struct Handler; impl EventHandler for Handler { fn guild_ban_addition(&self, ctx: Context, guild_id: GuildId, _: User) { if guild_id == 427456811973738498 { - if let Err(e) = + send_or_log!( ChannelId(562731470423064587).say(&ctx, "Dies ist eine flauschige Diktatur!") - { - eprintln!("Couldn’t send message because {:?}", e); - } + ); } } } @@ -89,9 +96,42 @@ fn name(ctx: &mut Context, msg: &Message) -> CommandResult { Ok(()) } +#[command] +fn inbox(ctx: &mut Context, msg: &Message) -> CommandResult { + if msg.author.id != INBOX_OWNER { + send_or_log!(msg.reply(&ctx, "You don’t have the permission to do that")); + return Ok(()); + } + if let Some((_, name)) = msg.content.split_once(' ') { + let messages = INBOX.fetch_messages(name); + if messages.is_empty() { + send_or_log!(msg.reply(&ctx, format!("Keine neuen Nachrichten für {}.", name))); + return Ok(()); + } + let output = messages.into_iter().join("\n"); + send_or_log!(msg.reply(&ctx, output)); + } else { + send_or_log!(msg.reply(&ctx, "Kein Name für die Abfrage.")); + } + Ok(()) +} + #[command] fn message(ctx: &mut Context, msg: &Message) -> CommandResult { - InboxMessage::parse(&msg.content, msg.author.id) + message_internal(ctx, msg, &msg.content) +} + +#[command] +fn question(ctx: &mut Context, msg: &Message) -> CommandResult { + message_internal( + ctx, + msg, + &msg.content.replacen("!question", "!message Stream:", 1), + ) +} + +fn message_internal(ctx: &mut Context, msg: &Message, content: &str) -> CommandResult { + InboxMessage::parse(content, msg.author.id) .ok_or_else(|| { String::from( "Nachricht konnte nicht gesendet werden. @@ -101,70 +141,13 @@ z.B. “!message Lana: Hawwu!”", }) .and_then(|m| INBOX.queue_message(&m)) .map(|n| { - if let Err(e) = msg.reply( + send_or_log!(msg.reply( &ctx, &format!("Deine Nachricht wurde erfolgreich an {} gesendet", n), - ) { - eprintln!("Could not reply because of {:?}", e); - } + )); }) .map_err(|e| { - if let Err(e) = msg.reply(ctx, &e) { - eprintln!("Could not reply because of {:?}", e); - } + send_or_log!(msg.reply(&ctx, &e)); CommandError(e) }) } - -#[command] -fn inbox(ctx: &mut Context, msg: &Message) -> CommandResult { - if let Some((_, name)) = msg.content.split_once(' ') { - let messages = INBOX.fetch_messages(name); - if messages.is_empty() { - if let Err(e) = msg.reply(ctx, "Keine neuen Nachrichten für .") { - eprintln!("Could not reply because of {:?}", e); - } - return Ok(()); - } - let output = messages.into_iter().join("\n"); - if let Err(e) = msg.reply(ctx, output) { - eprintln!("Could not reply because of {:?}", e); - } - } else { - if let Err(e) = msg.reply(ctx, "Kein Name für die Abfrage.") { - eprintln!("Could not reply because of {:?}", e); - } - } - Ok(()) -} - -// TODO: remove copy paste -#[command] -fn question(ctx: &mut Context, msg: &Message) -> CommandResult { - InboxMessage::parse( - &msg.content.replacen("!question", "!message Stream:", 1), - msg.author.id, - ) - .ok_or_else(|| { - String::from( - "Nachricht konnte nicht gesendet werden. -Bitte achte auf die richtige Formulierung: “!message : ”, -z.B. “!message Lana: Hawwu!”", - ) - }) - .and_then(|m| INBOX.queue_message(&m)) - .map(|n| { - if let Err(e) = msg.reply( - &ctx, - &format!("Deine Nachricht wurde erfolgreich an {} gesendet", n), - ) { - eprintln!("Could not reply because of {:?}", e); - } - }) - .map_err(|e| { - if let Err(e) = msg.reply(ctx, &e) { - eprintln!("Could not reply because of {:?}", e); - } - CommandError(e) - }) -}