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.",
"messageDeleted": "Die Nachricht ist in Slack gelöscht.",
"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.",
"runDeleteFailed": "Slack hat das Löschen abgelehnt.",
"tokenInvalid": "Ein Bot-Token beginnt mit xoxb oder xoxp.",
@@ -769,7 +769,7 @@
"messageDelete": "In Slack löschen",
"messageDeleting": "Wird 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.",
"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.",
+2 -2
View File
@@ -292,7 +292,7 @@
"reportRejected": "Slack rejected the message.",
"messageDeleted": "The message is deleted in Slack.",
"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.",
"runDeleteFailed": "Slack refused the deletion.",
"tokenInvalid": "A bot token starts with xoxb or xoxp.",
@@ -769,7 +769,7 @@
"messageDelete": "Delete in Slack",
"messageDeleting": "Deleting",
"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.",
"pathWebhook": "Sending through the webhook. Messages cannot be deleted afterwards, that needs a bot token.",
"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`}>
{run.deletedAt
? t('messageDeleted')
: run.sent && canDelete
? <MessageDeleteButton runId={run.id} hint={run.messageTs ? undefined : t('messageWebhook')} />
: run.sent ? t('messageNoToken') : '-'}
: !run.sent
? '-'
: !run.messageTs
? t('messageWebhook')
: canDelete
? <MessageDeleteButton runId={run.id} />
: t('messageNoToken')}
</td>
</tr>
))}
+4
View File
@@ -120,6 +120,10 @@ export async function performDeleteMessage(viewer: Viewer, formData: FormData):
return invalid('runNotSent')
}
if (!run.messageTs) {
return invalid('runNotDeletable')
}
const values = await readSettings(['slack.botToken', 'slack.channel'])
const token = values.get('slack.botToken')?.trim()
const channel = run.channel ?? values.get('slack.channel')?.trim()