ToDiscord@1
Der Node ToDiscord@1 postet eine Nachricht in einen Discord-Kanal über die Bot-API (POST /channels/{id}/messages). Er unterstützt einfachen Inhalt, ein einzelnes Embed und einen Dateianhang, der aus einer System.Reporting/FileSystemItem-Entität stammt. Um in einen Thread zu posten, übergeben Sie die Snowflake des Threads als channelId — Threads sind im Datenmodell von Discord Kanäle. Die Anmeldedaten stammen aus einer zentral verwalteten DiscordConfiguration-Entität; der Node schlägt sie namentlich über die pipeline-bezogene globale Konfiguration nach.
Adapter-Voraussetzungen
- Allgemeine Verfügbarkeit: Mesh Adapter.
- Eine
DiscordConfiguration-Entität muss existieren und der Pipeline zugeordnet sein (über die Standard-Uses-Assoziation). - Um Anhänge zu senden, muss der Tenant das CK-Paket
System.Reporting(den Eigentümer vonFileSystemItem) geladen haben. Dieselbe Einschränkung wie beiCreateFileSystemUpdate@1undGenerateAndStoreReport@1.
Node-Konfiguration
Zu den Feldern targetPath, targetValueWriteMode und targetValueKind siehe Überblick. Das Feld path wird in diesem Node nicht verwendet.
Konfigurationsoptionen
Die meisten benutzerorientierten Felder akzeptieren entweder einen literalen Wert oder einen JSONPath ({Field} oder {Field}Path). Wenn beide gesetzt sind, gewinnt der Pfad; wenn der Pfad zu leer aufgelöst wird, wird der Literalwert verwendet.
-
serverConfiguration (erforderlich): Name des globalen Konfigurationseintrags, der die
DiscordConfigurationenthält (Bot-Token + optionale Guild-ID). -
channelId / channelIdPath (eines erforderlich): Discord-Kanal-Snowflake-ID. Um einen Thread anzusprechen, übergeben Sie hier die Snowflake des Threads — Discord behandelt Threads als Kanäle.
-
content / contentPath (optional): Nachrichteninhalt.
-
embedTitle / embedTitlePath, embedDescription / embedDescriptionPath, embedColor / embedColorPath (optional): ein einzelnes Embed.
embedColorals Literal ist eine Ganzzahl (0xRRGGBB); die Pfadform akzeptiert auch#RRGGBBund einen Dezimal-String. -
attachmentFileSystemItemRtId / attachmentFileSystemItemRtIdPath (optional): RtId eines
System.Reporting/FileSystemItem, dessen gebundene Binärdaten der Nachricht angehängt werden. Der Node löst die Nutzdaten über dasContent.BinaryIdder Entität auf und wählt den an Discord gesendeten Dateinamen anhand der unten stehenden Rangfolge. -
attachmentFilename / attachmentFilenamePath (optional): expliziter Dateiname-Override. Wenn gesetzt, hat er Vorrang vor den eigenen Feldern des FileSystemItem. Nützlich, wenn der Aufrufer über Domänen-Metadaten einen besseren Namen hat (z. B. eine Rechnungsnummer), der sich nicht im FileSystemItem selbst widerspiegelt.
Dateiname-Rangfolge (höchste → niedrigste):
attachmentFilename→FileSystemItem.Name→FileSystemItem.Content.Filename. Die ersten beiden erfassen die Benutzerabsicht (das Label des Eintrags in einem Ordner);Content.Filenamesind Blob-Metadaten, die beim Ingest erfasst wurden und als Implementierungsdetail abweichen, wenn die Entität später umbenannt wird — daher ist es ein Fallback letzter Instanz. -
mentionPolicy (optional, Standard
None): steuert, welche Erwähnungssyntax im Nachrichteninhalt tatsächlich Benachrichtigungen auslöst. Discord-Erwähnungssyntax:<@USER_SNOWFLAKE>für einen Benutzer,<@&ROLE_SNOWFLAKE>für eine Rolle und die literalen Zeichenketten@everyone/@herefür die breiten Pings. Die Richtlinie ist eine Typ-Whitelist über die bereits im Inhalt vorhandene Syntax — sie schlägt niemanden namentlich nach. Werte:None— nichts löst eine Benachrichtigung aus. Erwähnungen im Inhalt werden weiterhin als „@username" dargestellt, aber kein Empfänger wird gepingt. Sicherer Standard für Pipelines, die vorgelagerte Daten wiedergeben, bei denen@everyoneoder verirrte<@id>versehentlich oder durch Injection auftreten können.Users— nur die<@id>-Syntax im Inhalt löst aus;<@&id>und@everyone/@herewerden dargestellt, pingen aber nicht.Roles— nur die<@&id>-Syntax löst aus.UsersAndRoles— Benutzer- und Rollen-Erwähnungen lösen aus;@everyone/@herewerden unterdrückt.All— alles Erwähnte löst aus; entspricht dem Discord-Standard, wennallowed_mentionsweggelassen wird.Custom— verwenden Sie allowedMentionsPath, um ein rohes Discord-allowed_mentions-Objekt bereitzustellen. Nötig, wenn Sie nur bestimmte Benutzer-/Rollen-Snowflakes pingen möchten (z. B.{"parse":[],"users":["111"]}) statt jeder Erwähnung dieses Typs im Inhalt.
-
allowedMentionsPath (optional): JSONPath, der zu einem rohen Discord-
allowed_mentions-Objekt aufgelöst wird. Wird nur konsultiert, wennmentionPolicyCustomist. Der Node bricht sofort ab, wenn der Pfad nicht gesetzt ist oder zu null aufgelöst wird. Die vollständige Objektform finden Sie in Discords Allowed-Mentions-Referenz. -
timeoutSeconds (optional, Standard
30): Timeout des HTTP-Requests. -
targetPath (optional, Standard leer): wenn gesetzt, wird die JSON-Antwort der Discord-API in diesen Pfad geschrieben. Nützlich, um die Nachrichten-
idfür spätere Änderungen zu erfassen; die Antwort trägt außerdemchannel_id,timestampund das vollständige Nachrichtenobjekt.
Mindestens eines von content, embed* oder attachment* muss zu einem Wert aufgelöst werden — Discord lehnt leere Nachrichten ab.
Anwendungsbeispiele
Eine einfache Nachricht posten
transformations:
- type: ToDiscord@1
description: Notify deploy channel
serverConfiguration: discord-main
channelId: '123456789012345678'
content: 'Deployment finished.'
Ein Embed posten und die Nachrichten-ID erfassen
transformations:
- type: ToDiscord@1
description: Post status + capture id for later update
serverConfiguration: discord-main
channelId: '123456789012345678'
embedTitle: 'Run started'
embedDescriptionPath: '$.status.description'
embedColor: 0x64CEB9
targetPath: '$.discordMsg'
Den Bereitschaftsbenutzer aus vorgelagerten Daten pingen
Die Pipeline hat die Snowflake eines Bereitschaftsbenutzers aufgelöst und interpoliert sie mithilfe der <@id>-Syntax von Discord in den Inhalt. Die Users-Richtlinie lässt die <@id> eine Benachrichtigung auslösen, während sie ein versehentliches @everyone weiterhin unterdrückt.
transformations:
- type: ToDiscord@1
description: Page the on-call
serverConfiguration: discord-main
channelId: '123456789012345678'
contentPath: '$.alert.message' # e.g. "Pager: <@111222333444555666> DB saturated"
mentionPolicy: Users
Kritischer Alarm, der @everyone pingt
Überschreiben Sie den sicheren Standard, um den gesamten Kanal zu benachrichtigen. @everyone ist in Discord eine literale Zeichenkette (keine spitzen Klammern, keine Snowflake).
transformations:
- type: ToDiscord@1
description: Wake everyone up
serverConfiguration: discord-main
channelId: '123456789012345678'
content: '@everyone production is down'
mentionPolicy: All
In einen Thread mit einem Dateianhang posten
Übergeben Sie die Snowflake des Threads als channelId — Discord behandelt Threads als Kanäle. GenerateAndStoreReport@1 schreibt eine FileSystemItem-RtId in den Datenkontext, was genau das ist, was attachmentFileSystemItemRtIdPath erwartet.
transformations:
- type: GenerateAndStoreReport@1
# ... produces $.reportRef.fileSystemRtId
- type: ToDiscord@1
description: Attach generated report to a thread
serverConfiguration: discord-main
channelId: '987654321098765432' # thread snowflake
content: 'Report ready.'
attachmentFileSystemItemRtIdPath: '$.reportRef.fileSystemRtId'
Eine Datei mit einem menschenlesbaren Dateiname-Override anhängen
Wenn das FileSystemItem mit einem GUID-artigen Namen gespeichert wurde, die Pipeline aber aus vorgelagerten Metadaten einen besseren Namen kennt, überschreiben Sie ihn beim Senden.
transformations:
- type: ToDiscord@1
description: Send invoice PDF with its issuer/invoice-number as the filename
serverConfiguration: discord-main
channelId: '123456789012345678'
content: 'New invoice flagged for review.'
attachmentFileSystemItemRtIdPath: '$.invoice.fileSystemItemRtId'
attachmentFilenamePath: '$.invoice.readableName' # e.g. "DemoEnergie-inv-20250930-abc.pdf"
Hinweise
- Rate-Limits (HTTP 429) werden als Fehler behandelt; die Exception enthält die von Discord bereitgestellten
Retry-After-Sekunden. Der Pipeline-Orchestrator ist für Retry/Backoff verantwortlich. - Der Bot-Token erscheint niemals in der Log-Ausgabe oder in Exception-Meldungen — nur im ausgehenden Header
Authorization: Bot {token}. - Der Node verwendet den benannten HttpClient
"Discord", unverändert (keine Polly-Richtlinien in v1).