aboutsummaryrefslogblamecommitdiff
path: root/src/handler.rs
blob: 933bd728551e9abe4a2f390596b68974a600366b (plain) (tree)



































                                                                                                                                                                                                                             
use poise::serenity_prelude as serenity;

use crate::{Data, Error};
use crate::models::ReactionRole;

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 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::<u64>()?, add_reaction.user_id.unwrap().0).await?;
                let member_roles = member.roles;
                let role_id = serenity::RoleId(rrole.role_id.parse::<u64>()?);
                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::<u64>()?, add_reaction.user_id.unwrap().0, rrole.role_id.parse::<u64>()?, Some("Reaction Role")).await?;
                }

                let dm_chan = add_reaction.user_id.unwrap().create_dm_channel(&ctx.http).await?;
                dm_chan.say(ctx, format!("Toggled the role!")).await?;

                add_reaction.delete(&ctx.http).await?;

            },
            _ => (),
        }
    }


    Ok(())
}