reaction listener

This commit is contained in:
nora 2021-06-21 13:49:11 +02:00
parent c41c3ff851
commit 51ecb30f61
2 changed files with 34 additions and 6 deletions

View file

@ -1,8 +1,10 @@
use crate::Handler;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serenity::framework::standard::{ use serenity::framework::standard::{
macros::{command, group}, macros::{command, group},
Args, CommandResult, Args, CommandResult,
}; };
use serenity::model::channel::ReactionType::Custom;
use serenity::model::prelude::*; use serenity::model::prelude::*;
use serenity::prelude::*; use serenity::prelude::*;
use std::collections::HashMap; use std::collections::HashMap;
@ -124,6 +126,26 @@ async fn autorole(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
Ok(()) Ok(())
} }
// listener
pub async fn handle_reaction(ctx: &Context, reaction: &Reaction) {
let data = ctx.data.read().await;
let mut auto_roles = data.get::<AutoRoleDataKey>().unwrap();
if let Custom { animated, id, name } = &reaction.emoji {
if let Some(role) = auto_roles.messages.get(&(*id, reaction.message_id)) {
match &reaction.member {
None => {
println!("Missing member on reaction");
// remove reaction
}
Some(member) => {
// add role
}
}
}
}
}
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct AutoRoleData { pub struct AutoRoleData {
messages: HashMap<(EmojiId, MessageId), RoleId>, messages: HashMap<(EmojiId, MessageId), RoleId>,

View file

@ -1,22 +1,28 @@
mod autorole;
mod commands;
mod general;
use std::collections::HashSet; use std::collections::HashSet;
use std::fs; use std::fs;
use crate::autorole::{AutoRoleData, AutoRoleDataKey, AUTOROLE_GROUP};
use crate::commands::MY_HELP;
use serenity::client::Context; use serenity::client::Context;
use serenity::framework::StandardFramework; use serenity::framework::StandardFramework;
use serenity::http::Http; use serenity::http::Http;
use serenity::model::id::UserId; use serenity::model::id::UserId;
use serenity::model::prelude::*;
use serenity::{async_trait, model::gateway::Ready, prelude::*}; use serenity::{async_trait, model::gateway::Ready, prelude::*};
use crate::autorole::{AutoRoleData, AutoRoleDataKey, AUTOROLE_GROUP};
use crate::commands::MY_HELP;
mod autorole;
mod commands;
mod general;
struct Handler; struct Handler;
#[async_trait] #[async_trait]
impl EventHandler for Handler { impl EventHandler for Handler {
async fn reaction_add(&self, ctx: Context, add_reaction: Reaction) {
autorole::handle_reaction(&ctx, &add_reaction)
}
async fn ready(&self, _: Context, ready: Ready) { async fn ready(&self, _: Context, ready: Ready) {
println!("{} is connected!", ready.user.name); println!("{} is connected!", ready.user.name);
} }