Stop offering deletion Slack refuses

chat.delete only removes what the bot posted itself, so webhook messages
answer cant_delete_message no matter how the id is found. Runs without a
stored id now say so instead of leading into a dead end.
This commit is contained in:
Matthias G
2026-08-03 13:19:20 +02:00
parent 7e2a00842e
commit 78ff7d2c3f
4 changed files with 15 additions and 7 deletions
+2 -2
View File
@@ -292,7 +292,7 @@
"reportRejected": "Slack hat die Nachricht abgelehnt.", "reportRejected": "Slack hat die Nachricht abgelehnt.",
"messageDeleted": "Die Nachricht ist in Slack gelöscht.", "messageDeleted": "Die Nachricht ist in Slack gelöscht.",
"runUnknown": "Diesen Lauf gibt es nicht.", "runUnknown": "Diesen Lauf gibt es nicht.",
"runNotDeletable": "Dieser Lauf ging über den Webhook, dafür gibt es keine Nachrichtenkennung.", "runNotDeletable": "Diese Nachricht kam vom Webhook. Slack erlaubt dem Bot nur zu löschen, was er selbst gepostet hat.",
"runNoToken": "Ohne Bot-Token lässt sich in Slack nichts löschen.", "runNoToken": "Ohne Bot-Token lässt sich in Slack nichts löschen.",
"runDeleteFailed": "Slack hat das Löschen abgelehnt.", "runDeleteFailed": "Slack hat das Löschen abgelehnt.",
"tokenInvalid": "Ein Bot-Token beginnt mit xoxb oder xoxp.", "tokenInvalid": "Ein Bot-Token beginnt mit xoxb oder xoxp.",
@@ -769,7 +769,7 @@
"messageDelete": "In Slack löschen", "messageDelete": "In Slack löschen",
"messageDeleting": "Wird gelöscht", "messageDeleting": "Wird gelöscht",
"messageDeleted": "Gelöscht", "messageDeleted": "Gelöscht",
"messageWebhook": "Über Webhook, Kennung wird gesucht", "messageWebhook": "Über Webhook, nur in Slack löschbar",
"pathBot": "Versand über den Bot-Token. Nachrichten lassen sich hier wieder löschen.", "pathBot": "Versand über den Bot-Token. Nachrichten lassen sich hier wieder löschen.",
"pathWebhook": "Versand über den Webhook. Nachrichten lassen sich danach nicht mehr löschen, dafür braucht es einen Bot-Token.", "pathWebhook": "Versand über den Webhook. Nachrichten lassen sich danach nicht mehr löschen, dafür braucht es einen Bot-Token.",
"pathNone": "Noch kein Weg hinterlegt, es geht nichts raus.", "pathNone": "Noch kein Weg hinterlegt, es geht nichts raus.",
+2 -2
View File
@@ -292,7 +292,7 @@
"reportRejected": "Slack rejected the message.", "reportRejected": "Slack rejected the message.",
"messageDeleted": "The message is deleted in Slack.", "messageDeleted": "The message is deleted in Slack.",
"runUnknown": "That run does not exist.", "runUnknown": "That run does not exist.",
"runNotDeletable": "That run went through the webhook, so there is no message id.", "runNotDeletable": "That message came from the webhook. Slack only lets the bot delete what it posted itself.",
"runNoToken": "Without a bot token nothing can be deleted in Slack.", "runNoToken": "Without a bot token nothing can be deleted in Slack.",
"runDeleteFailed": "Slack refused the deletion.", "runDeleteFailed": "Slack refused the deletion.",
"tokenInvalid": "A bot token starts with xoxb or xoxp.", "tokenInvalid": "A bot token starts with xoxb or xoxp.",
@@ -769,7 +769,7 @@
"messageDelete": "Delete in Slack", "messageDelete": "Delete in Slack",
"messageDeleting": "Deleting", "messageDeleting": "Deleting",
"messageDeleted": "Deleted", "messageDeleted": "Deleted",
"messageWebhook": "Sent by webhook, id will be looked up", "messageWebhook": "Sent by webhook, only deletable in Slack",
"pathBot": "Sending through the bot token. Messages can be deleted from here.", "pathBot": "Sending through the bot token. Messages can be deleted from here.",
"pathWebhook": "Sending through the webhook. Messages cannot be deleted afterwards, that needs a bot token.", "pathWebhook": "Sending through the webhook. Messages cannot be deleted afterwards, that needs a bot token.",
"pathNone": "No route stored yet, nothing goes out.", "pathNone": "No route stored yet, nothing goes out.",
+7 -3
View File
@@ -126,9 +126,13 @@ export default async function AdminSettingsPage() {
<td className={`${cellClass} max-w-72`}> <td className={`${cellClass} max-w-72`}>
{run.deletedAt {run.deletedAt
? t('messageDeleted') ? t('messageDeleted')
: run.sent && canDelete : !run.sent
? <MessageDeleteButton runId={run.id} hint={run.messageTs ? undefined : t('messageWebhook')} /> ? '-'
: run.sent ? t('messageNoToken') : '-'} : !run.messageTs
? t('messageWebhook')
: canDelete
? <MessageDeleteButton runId={run.id} />
: t('messageNoToken')}
</td> </td>
</tr> </tr>
))} ))}
+4
View File
@@ -120,6 +120,10 @@ export async function performDeleteMessage(viewer: Viewer, formData: FormData):
return invalid('runNotSent') return invalid('runNotSent')
} }
if (!run.messageTs) {
return invalid('runNotDeletable')
}
const values = await readSettings(['slack.botToken', 'slack.channel']) const values = await readSettings(['slack.botToken', 'slack.channel'])
const token = values.get('slack.botToken')?.trim() const token = values.get('slack.botToken')?.trim()
const channel = run.channel ?? values.get('slack.channel')?.trim() const channel = run.channel ?? values.get('slack.channel')?.trim()