|
@@ -470,43 +470,54 @@ impl<'a> MessageApiRequest<'a> {
|
|
}
|
|
}
|
|
|
|
|
|
async fn acknowledge(gh_id: i64, mut words: impl Iterator<Item = &str>) -> anyhow::Result<String> {
|
|
async fn acknowledge(gh_id: i64, mut words: impl Iterator<Item = &str>) -> anyhow::Result<String> {
|
|
- let url = match words.next() {
|
|
|
|
- Some(url) => {
|
|
|
|
|
|
+ let filter = match words.next() {
|
|
|
|
+ Some(filter) => {
|
|
if words.next().is_some() {
|
|
if words.next().is_some() {
|
|
anyhow::bail!("too many words");
|
|
anyhow::bail!("too many words");
|
|
}
|
|
}
|
|
- url
|
|
|
|
|
|
+ filter
|
|
}
|
|
}
|
|
None => anyhow::bail!("not enough words"),
|
|
None => anyhow::bail!("not enough words"),
|
|
};
|
|
};
|
|
- let ident = if let Ok(number) = url.parse::<usize>() {
|
|
|
|
|
|
+ let ident = if let Ok(number) = filter.parse::<usize>() {
|
|
Identifier::Index(
|
|
Identifier::Index(
|
|
std::num::NonZeroUsize::new(number)
|
|
std::num::NonZeroUsize::new(number)
|
|
.ok_or_else(|| anyhow::anyhow!("index must be at least 1"))?,
|
|
.ok_or_else(|| anyhow::anyhow!("index must be at least 1"))?,
|
|
)
|
|
)
|
|
|
|
+ } else if filter == "all" || filter == "*" {
|
|
|
|
+ Identifier::All
|
|
} else {
|
|
} else {
|
|
- Identifier::Url(url)
|
|
|
|
|
|
+ Identifier::Url(filter)
|
|
};
|
|
};
|
|
match delete_ping(&mut crate::db::make_client().await?, gh_id, ident).await {
|
|
match delete_ping(&mut crate::db::make_client().await?, gh_id, ident).await {
|
|
Ok(deleted) => {
|
|
Ok(deleted) => {
|
|
- let mut resp = format!("Acknowledged:\n");
|
|
|
|
- for deleted in deleted {
|
|
|
|
- resp.push_str(&format!(
|
|
|
|
- " * [{}]({}){}\n",
|
|
|
|
- deleted
|
|
|
|
- .short_description
|
|
|
|
- .as_deref()
|
|
|
|
- .unwrap_or(&deleted.origin_url),
|
|
|
|
- deleted.origin_url,
|
|
|
|
- deleted
|
|
|
|
- .metadata
|
|
|
|
- .map_or(String::new(), |m| format!(" ({})", m)),
|
|
|
|
- ));
|
|
|
|
- }
|
|
|
|
|
|
+ let resp = if deleted.is_empty() {
|
|
|
|
+ format!(
|
|
|
|
+ "No notifications matched `{}`, so none were deleted.",
|
|
|
|
+ filter
|
|
|
|
+ )
|
|
|
|
+ } else {
|
|
|
|
+ let mut resp = String::from("Acknowledged:\n");
|
|
|
|
+ for deleted in deleted {
|
|
|
|
+ resp.push_str(&format!(
|
|
|
|
+ " * [{}]({}){}\n",
|
|
|
|
+ deleted
|
|
|
|
+ .short_description
|
|
|
|
+ .as_deref()
|
|
|
|
+ .unwrap_or(&deleted.origin_url),
|
|
|
|
+ deleted.origin_url,
|
|
|
|
+ deleted
|
|
|
|
+ .metadata
|
|
|
|
+ .map_or(String::new(), |m| format!(" ({})", m)),
|
|
|
|
+ ));
|
|
|
|
+ }
|
|
|
|
+ resp
|
|
|
|
+ };
|
|
|
|
+
|
|
Ok(serde_json::to_string(&Response { content: &resp }).unwrap())
|
|
Ok(serde_json::to_string(&Response { content: &resp }).unwrap())
|
|
}
|
|
}
|
|
Err(e) => Ok(serde_json::to_string(&Response {
|
|
Err(e) => Ok(serde_json::to_string(&Response {
|
|
- content: &format!("Failed to acknowledge {}: {:?}.", url, e),
|
|
|
|
|
|
+ content: &format!("Failed to acknowledge {}: {:?}.", filter, e),
|
|
})
|
|
})
|
|
.unwrap()),
|
|
.unwrap()),
|
|
}
|
|
}
|