summaryrefslogtreecommitdiff
path: root/src/events/pinboard.rs
diff options
context:
space:
mode:
authorseth <[email protected]>2024-08-09 23:35:41 -0400
committerGitHub <[email protected]>2024-08-09 23:35:41 -0400
commitb643a6a235b0c1c9902b97421f24eff2b0d0a5ac (patch)
tree350794c0e9330fb77367838313bc6bb97278a0aa /src/events/pinboard.rs
parent372780546b508684839916e5ad54c9e90456a94f (diff)
tree-wide: end of summer cleanup (#214)
* api: refactor & rename module to http * client: split from main.rs * tree-wide: use eyre::Report as error * nix: alejandra -> nixfmt * nix: start using treefmt-nix * nix: simplify flake * nix: refactor derivation & docker image * nix: remove overlay * ci: update & cleanup workflows * commands: assign all commands automatically * commands/copypasta: remove * http/teawie: update response struct for upstream rust rewrite * handlers: rename modules to events; flatten * crates: rename self to teawie-bot * nix: fenix -> rust-overlay i want a specific rust version grrrrrrr * ci: pin rust to 1.79 this is what our nix dev shell uses and what we can compile on. it seems the time crate doesn't like v1.80 of the compiler :( * ci: always run release gates * nix: fix static toolchain * nix: rust-overlay -> nixpkgs * ci: adopt actions-rust-lang actions * nix: use docker arch names for containers * crates/time: 0.3.30 -> 0.3.36 fixes building on rust 1.80.0
Diffstat (limited to 'src/events/pinboard.rs')
-rw-r--r--src/events/pinboard.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/events/pinboard.rs b/src/events/pinboard.rs
new file mode 100644
index 0000000..bb0dfe0
--- /dev/null
+++ b/src/events/pinboard.rs
@@ -0,0 +1,81 @@
+use crate::{client::Data, utils};
+
+use eyre::{eyre, Context as _, OptionExt as _, Result};
+use log::{debug, warn};
+use poise::serenity_prelude::{
+ ChannelId, Context, CreateAllowedMentions, CreateMessage, Message, MessageType, User,
+};
+
+pub async fn handle(ctx: &Context, message: &Message, data: &Data) -> Result<()> {
+ if message.kind != MessageType::PinsAdd {
+ return Ok(());
+ }
+
+ let gid = message.guild_id.unwrap_or_default();
+ let Some(storage) = &data.storage else {
+ warn!("Can't create PinBoard entry; no storage backend found!");
+ return Ok(());
+ };
+
+ let settings = storage.get_guild_settings(&gid).await?;
+
+ if !settings.pinboard_enabled {
+ debug!("PinBoard is disabled in {gid}, ignoring");
+ return Ok(());
+ }
+
+ let Some(target) = settings.pinboard_channel else {
+ debug!("PinBoard is disabled in {gid}, ignoring");
+ return Ok(());
+ };
+
+ if let Some(sources) = settings.pinboard_watch {
+ if !sources.contains(&message.channel_id) {
+ debug!(
+ "{} not listed in PinBoard settings for {gid}, ignoring",
+ message.channel_id
+ );
+
+ return Ok(());
+ }
+ }
+
+ let reference_id = message
+ .clone()
+ .message_reference
+ .ok_or_eyre("Couldn't get referenced message of pin!")?
+ .message_id
+ .ok_or_eyre("Couldn't get id of referenced message of pin!")?;
+
+ let pins = message
+ .channel_id
+ .pins(ctx)
+ .await
+ .wrap_err("Couldn't get a list of pins!?")?;
+
+ let pin = pins
+ .iter()
+ .find(|pin| pin.id == reference_id)
+ .ok_or_else(|| eyre!("Couldn't find a pin for message {reference_id}!"))?;
+
+ redirect(ctx, pin, &message.author, &target).await?;
+ pin.unpin(ctx).await?;
+
+ Ok(())
+}
+
+async fn redirect(ctx: &Context, pin: &Message, pinner: &User, target: &ChannelId) -> Result<()> {
+ let embed = utils::resolve_message_to_embed(ctx, pin).await;
+ let mentions = CreateAllowedMentions::new().empty_roles().empty_users();
+ let message = CreateMessage::default()
+ .allowed_mentions(mentions)
+ .content(format!("📌'd by {pinner} in {}", pin.link()))
+ .embed(embed);
+
+ target
+ .send_message(&ctx.http, message)
+ .await
+ .wrap_err("Couldn't redirect message")?;
+
+ Ok(())
+}