utils::resolve_message: use perms from behind pk proxy

This commit is contained in:
seth 2024-03-18 09:48:37 -04:00
parent af9938a3c6
commit 6bd5db7208
No known key found for this signature in database
GPG key ID: D31BD0D494BBEE86
2 changed files with 21 additions and 3 deletions

View file

@ -15,7 +15,7 @@ mod support_onboard;
pub async fn handle(
ctx: &Context,
event: &FullEvent,
_framework: FrameworkContext<'_, Data, Report>,
_: FrameworkContext<'_, Data, Report>,
data: &Data,
) -> Result<()> {
match event {

View file

@ -1,3 +1,4 @@
use crate::api::pluralkit;
use std::str::FromStr;
use eyre::{eyre, Context as _, Result};
@ -5,7 +6,7 @@ use log::{debug, trace};
use once_cell::sync::Lazy;
use poise::serenity_prelude::{
Cache, CacheHttp, ChannelId, ChannelType, Colour, Context, CreateEmbed, CreateEmbedAuthor,
CreateEmbedFooter, GuildChannel, Member, Message, MessageId, Permissions,
CreateEmbedFooter, GuildChannel, Member, Message, MessageId, Permissions, UserId,
};
use regex::Regex;
@ -22,6 +23,14 @@ fn find_first_image(message: &Message) -> Option<String> {
.map(|res| res.url.clone())
}
async fn find_real_author_id(message: &Message) -> UserId {
if let Ok(sender) = pluralkit::get_sender(message.id).await {
sender
} else {
message.author.id
}
}
async fn member_can_view_channel(
ctx: impl CacheHttp + AsRef<Cache>,
member: &Member,
@ -108,7 +117,16 @@ pub async fn from_message(ctx: &Context, msg: &Message) -> Result<Vec<CreateEmbe
debug!("Not resolving message in DM");
return Ok(Vec::new());
};
let author = guild_id.member(ctx, msg.author.id).await?;
// if the message was sent through pluralkit, we'll want
// to reference the Member of the unproxied account
let author_id = if msg.webhook_id.is_some() {
find_real_author_id(msg).await
} else {
msg.author.id
};
let author = guild_id.member(ctx, author_id).await?;
let matches = MESSAGE_PATTERN
.captures_iter(&msg.content)