use poise::serenity_prelude as serenity; use crate::models::*; use crate::{Data, Error}; use tracing::info; /** * Handles specific events, including ReactionAdd, which is needed for the reaction role handler to * function properly */ pub async fn event_handler( ctx: &serenity::Context, event: &poise::Event<'_>, data: &Data, ) -> Result<(), Error> { { let pool = data.pg.lock().unwrap().clone(); match event { poise::Event::ReactionAdd { add_reaction } => { let current_user = ctx.http.get_current_user().await?; if add_reaction.user_id.unwrap() == current_user.id { return Ok(()); } // This fetches the role and lets us query extra data including role ID let rrole = sqlx::query_as!( ReactionRole, "SELECT * FROM reaction_roles WHERE message_id=$1 AND reaction=$2", add_reaction.message_id.0.to_string(), add_reaction.emoji.to_string() ) .fetch_one(&pool) .await?; let member = ctx .http .get_member( rrole.guild_id.parse::()?, add_reaction.user_id.unwrap().0, ) .await?; // Honestly, not really needed. let member_roles = member.roles; let role_id = serenity::RoleId(rrole.role_id.parse::()?); if member_roles.contains(&role_id) { ctx.http .remove_member_role( member.guild_id.0, member.user.id.0, role_id.0, Some("Reaction Role Menu"), ) .await?; } else { ctx.http .add_member_role( rrole.guild_id.parse::()?, add_reaction.user_id.unwrap().0, rrole.role_id.parse::()?, Some("Reaction Role"), ) .await?; } if let Ok(dm_chan) = add_reaction .user_id .unwrap() .create_dm_channel(&ctx.http) .await { dm_chan.say(ctx, format!("Toggled the role!")).await?; } else { info!("Could not DM user, but we did the role anyways"); } add_reaction.delete(&ctx.http).await?; }, poise::Event::Message { new_message } => { let current_user = ctx.http.get_current_user().await?; if new_message.author.id.0 != current_user.id.0 { // This message does *not* belong to the bot println!("Message from not-bot"); let filters = sqlx::query_as::<_, MessageFilter>( "SELECT * FROM message_filter WHERE guild_id=$1") .bind(new_message.guild_id.unwrap().0.to_string()) .fetch_all(&pool) .await?; } }, _ => (), } } Ok(()) }