fix(slack): upgrade slack-morphism to 2.20 and adapt rich text rewriting

This commit is contained in:
End 2026-04-15 10:24:07 -07:00
parent c42500cef3
commit aa170e7e42
No known key found for this signature in database
5 changed files with 1026 additions and 801 deletions

1693
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -26,7 +26,7 @@ oauth2 = "5.0.0"
redact = "0.1.10"
rustls = "0.23.28"
serde = { version = "1.0.219", features = ["derive"] }
slack-morphism = { version = "2.12.0", features = ["axum"] }
slack-morphism = { version = "2.20.0", features = ["axum"] }
sqlx = { version = "0.8.6", features = [
"runtime-tokio",
"sqlite",

View file

@ -402,7 +402,7 @@ impl Member {
))
.opt_accessory(member.profile_picture_url.and_then(|url| Some(
SlackSectionBlockElement::Image(SlackBlockImageElement::new(
url.parse().ok()?,
url.parse::<url::Url>().ok()?.into(),
"Profile picture".into()
))
)))

View file

@ -342,34 +342,118 @@ fn rewrite_content(content: &mut SlackMessageContent, member: &models::DetectedM
if let Some(blocks) = &mut content.blocks {
for block in blocks {
if let SlackBlock::RichText(richtext) = block {
let elements = richtext["elements"].as_array_mut().unwrap();
let len = elements.len();
// The first and last elements would have the prefix and suffix respectively, so we can filter them
let first = elements.get_mut(0).unwrap();
let SlackBlock::RichText(richtext) = block else {
continue;
};
if let Some(first_text) = first.pointer_mut("/elements/0/text") {
if member.typ == trigger::Type::Prefix {
if let Some(new_text) = first_text
.as_str()
.and_then(|text| text.strip_prefix(&member.trigger_text))
.map(ToString::to_string)
{
*first_text = serde_json::Value::String(new_text);
}
}
}
match member.typ {
trigger::Type::Prefix => {
let Some(first) = richtext.elements.first_mut() else {
continue;
};
let last = elements.get_mut(len - 1).unwrap();
match first {
SlackRichTextElement::Section(section) => {
let Some(SlackRichTextInlineElement::Text(text)) =
section.elements.first_mut()
else {
continue;
};
if let Some(last_text) = last.pointer_mut("/elements/0/text") {
if member.typ == trigger::Type::Suffix {
if let Some(new_text) = last_text
.as_str()
.and_then(|text| text.strip_suffix(&member.trigger_text))
.map(ToString::to_string)
{
*last_text = serde_json::Value::String(new_text);
if let Some(new_text) = text.text.strip_prefix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
SlackRichTextElement::List(list) => {
let Some(first_section) = list.elements.first_mut() else {
continue;
};
let Some(SlackRichTextInlineElement::Text(text)) =
first_section.elements.first_mut()
else {
continue;
};
if let Some(new_text) = text.text.strip_prefix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
SlackRichTextElement::Preformatted(preformatted) => {
let Some(SlackRichTextInlineElement::Text(text)) =
preformatted.elements.first_mut()
else {
continue;
};
if let Some(new_text) = text.text.strip_prefix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
SlackRichTextElement::Quote(quote) => {
let Some(SlackRichTextInlineElement::Text(text)) =
quote.elements.first_mut()
else {
continue;
};
if let Some(new_text) = text.text.strip_prefix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
}
}
trigger::Type::Suffix => {
let Some(last) = richtext.elements.last_mut() else {
continue;
};
match last {
SlackRichTextElement::Section(section) => {
let Some(SlackRichTextInlineElement::Text(text)) =
section.elements.last_mut()
else {
continue;
};
if let Some(new_text) = text.text.strip_suffix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
SlackRichTextElement::List(list) => {
let Some(last_section) = list.elements.last_mut() else {
continue;
};
let Some(SlackRichTextInlineElement::Text(text)) =
last_section.elements.last_mut()
else {
continue;
};
if let Some(new_text) = text.text.strip_suffix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
SlackRichTextElement::Preformatted(preformatted) => {
let Some(SlackRichTextInlineElement::Text(text)) =
preformatted.elements.last_mut()
else {
continue;
};
if let Some(new_text) = text.text.strip_suffix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
SlackRichTextElement::Quote(quote) => {
let Some(SlackRichTextInlineElement::Text(text)) =
quote.elements.last_mut()
else {
continue;
};
if let Some(new_text) = text.text.strip_suffix(&member.trigger_text) {
text.text = new_text.to_string();
}
}
}
}

View file

@ -664,7 +664,7 @@ pub async fn info(
))
.opt_accessory(member.profile_picture_url.and_then(|url| Some(
SlackSectionBlockElement::Image(SlackBlockImageElement::new(
url.parse().ok()?,
url.parse::<url::Url>().ok()?.into(),
"Profile picture".into()
))
)))