aboutsummaryrefslogtreecommitdiff
path: root/src/handler.rs
blob: ef73f3631e04ae7af336f70f7723d6988068e746 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 current_user = ctx.http.get_current_user().await?;
                if add_reaction.user_id.unwrap() == current_user.id {
                    return Ok(());
                }
                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(())
}