summaryrefslogtreecommitdiff
path: root/src/handlers/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers/event')
-rw-r--r--src/handlers/event/guild.rs26
-rw-r--r--src/handlers/event/message.rs35
-rw-r--r--src/handlers/event/mod.rs7
-rw-r--r--src/handlers/event/pinboard.rs22
-rw-r--r--src/handlers/event/reactboard.rs24
5 files changed, 86 insertions, 28 deletions
diff --git a/src/handlers/event/guild.rs b/src/handlers/event/guild.rs
new file mode 100644
index 0000000..b7a4028
--- /dev/null
+++ b/src/handlers/event/guild.rs
@@ -0,0 +1,26 @@
+use color_eyre::eyre::Result;
+use log::*;
+use poise::serenity_prelude::{Guild, UnavailableGuild};
+
+use crate::{Data, Settings};
+
+pub async fn handle_create(guild: &Guild, is_new: &bool, data: &Data) -> Result<()> {
+ if !is_new && Settings::from_redis(&data.redis, &guild.id).await.is_ok() {
+ debug!("Not recreating Redis key for {}", guild.id);
+ return Ok(());
+ }
+
+ info!("Creating new Redis key for {}", guild.id);
+ Settings::new_redis(&data.redis, &guild.id).await?;
+ Ok(())
+}
+
+pub async fn handle_delete(guild: &UnavailableGuild, data: &Data) -> Result<()> {
+ let redis = &data.redis;
+
+ info!("Deleting redis key for {}", guild.id);
+ let settings = Settings::from_redis(redis, &guild.id).await?;
+ settings.delete(redis).await?;
+
+ Ok(())
+}
diff --git a/src/handlers/event/message.rs b/src/handlers/event/message.rs
index cf619c5..0004caf 100644
--- a/src/handlers/event/message.rs
+++ b/src/handlers/event/message.rs
@@ -1,8 +1,7 @@
-use crate::Settings;
-use crate::{consts, Data};
+use crate::{consts, Data, Settings};
-use color_eyre::eyre::{Report, Result};
-use log::info;
+use color_eyre::eyre::{eyre, Report, Result};
+use log::*;
use poise::serenity_prelude::{Context, Message};
use poise::FrameworkContext;
@@ -12,35 +11,39 @@ pub async fn handle(
msg: &Message,
data: &Data,
) -> Result<()> {
- if should_echo(framework, msg, &data.settings) {
+ if should_echo(framework, msg, data).await? {
msg.reply(ctx, &msg.content).await?;
}
Ok(())
}
-fn should_echo(
+async fn should_echo(
_framework: FrameworkContext<'_, Data, Report>,
msg: &Message,
- settings: &Settings,
-) -> bool {
- let gid = msg.guild_id.unwrap_or_default();
+ data: &Data,
+) -> Result<bool> {
if msg.author.bot && msg.webhook_id.is_none() {
- info!("Not repeating another bot");
- return false;
+ debug!("Not repeating another bot");
+ return Ok(false);
}
- if !settings.is_guild_allowed(gid) {
- info!("Not echoing in guild {gid}");
- return false;
+ let gid = msg
+ .guild_id
+ .ok_or_else(|| eyre!("Couldn't get GuildId from {}!", msg.id))?;
+ let settings = Settings::from_redis(&data.redis, &gid).await?;
+
+ if !settings.optional_commands_enabled {
+ debug!("Not echoing in guild {gid}");
+ return Ok(false);
}
let content = &msg.content;
- content == "🗿"
+ Ok(content == "🗿"
|| consts::TEAMOJIS.contains(&content.as_str())
|| content.to_ascii_lowercase() == "moyai"
|| content
.to_ascii_lowercase()
- .contains("twitter's recommendation algorithm")
+ .contains("twitter's recommendation algorithm"))
}
diff --git a/src/handlers/event/mod.rs b/src/handlers/event/mod.rs
index a587c77..6dd5fe4 100644
--- a/src/handlers/event/mod.rs
+++ b/src/handlers/event/mod.rs
@@ -4,6 +4,7 @@ use color_eyre::eyre::{Report, Result};
use poise::serenity_prelude as serenity;
use poise::{Event, FrameworkContext};
+mod guild;
mod message;
mod pinboard;
mod reactboard;
@@ -27,6 +28,12 @@ pub async fn handle(
Event::ReactionAdd { add_reaction } => reactboard::handle(ctx, add_reaction, data).await?,
+ Event::GuildCreate { guild, is_new } => guild::handle_create(guild, is_new, data).await?,
+ Event::GuildDelete {
+ incomplete,
+ full: _,
+ } => guild::handle_delete(incomplete, data).await?,
+
_ => {}
}
diff --git a/src/handlers/event/pinboard.rs b/src/handlers/event/pinboard.rs
index 33d2680..21e8170 100644
--- a/src/handlers/event/pinboard.rs
+++ b/src/handlers/event/pinboard.rs
@@ -1,4 +1,4 @@
-use crate::{utils, Data};
+use crate::{utils, Data, Settings};
use color_eyre::eyre::{eyre, Context as _, Result};
use log::*;
@@ -6,9 +6,23 @@ use poise::serenity_prelude::model::prelude::*;
use poise::serenity_prelude::Context;
pub async fn handle(ctx: &Context, pin: &ChannelPinsUpdateEvent, data: &Data) -> Result<()> {
- if let Some(sources) = &data.settings.pinboard_sources {
+ let gid = pin.guild_id.unwrap_or_default();
+ let settings = Settings::from_redis(&data.redis, &gid).await?;
+
+ let target = if let Some(target) = settings.reactboard_channel {
+ target
+ } else {
+ debug!("PinBoard is disabled in {gid}, ignoring");
+ return Ok(());
+ };
+
+ if let Some(sources) = settings.pinboard_watch {
if !sources.contains(&pin.channel_id) {
- warn!("Can't access source of pin!");
+ debug!(
+ "{} not listed in PinBoard settings for {gid}, ignoring",
+ &pin.channel_id
+ );
+
return Ok(());
}
}
@@ -22,7 +36,7 @@ pub async fn handle(ctx: &Context, pin: &ChannelPinsUpdateEvent, data: &Data) ->
for pin in pins {
// We call `take` because it's supposed to be just for the latest message.
- redirect(ctx, &pin, pinner.take(), data.settings.pinboard_target).await?;
+ redirect(ctx, &pin, pinner.take(), target).await?;
pin.unpin(&ctx).await?;
}
diff --git a/src/handlers/event/reactboard.rs b/src/handlers/event/reactboard.rs
index 2a417da..2435976 100644
--- a/src/handlers/event/reactboard.rs
+++ b/src/handlers/event/reactboard.rs
@@ -1,4 +1,4 @@
-use crate::{utils, Data};
+use crate::{utils, Data, Settings};
use color_eyre::eyre::{eyre, Context as _, Result};
use log::*;
@@ -52,14 +52,24 @@ async fn send_to_reactboard(
msg: &Message,
data: &Data,
) -> Result<()> {
+ let gid = msg.guild_id.unwrap_or_default();
+ let settings = Settings::from_redis(&data.redis, &gid).await?;
+
// make sure everything is in order...
- if !data.settings.can_use_reaction(reaction) {
- info!("Reaction {} can't be used!", reaction.reaction_type);
+ let target = if let Some(target) = settings.reactboard_channel {
+ target
+ } else {
+ debug!("Reactboard is disabled in {gid}, ignoring");
+ return Ok(());
+ };
+
+ if !settings.can_use_reaction(&reaction.reaction_type) {
+ debug!("Reaction {} can't be used!", reaction.reaction_type);
return Ok(());
}
- if reaction.count < data.settings.reactboard_requirement.unwrap_or(5) {
- info!(
+ if reaction.count < settings.reactboard_requirement.unwrap_or(5) {
+ debug!(
"Ignoring message {} on reactboard, not enough reactions",
msg.id
);
@@ -137,9 +147,7 @@ async fn send_to_reactboard(
} else {
let embed = utils::resolve_message_to_embed(ctx, msg).await;
- let resp = data
- .settings
- .reactboard_target
+ let resp = target
.send_message(ctx, |m| {
m.allowed_mentions(|am| am.empty_parse())
.content(content)