[{"data":1,"prerenderedAt":1014},["ShallowReactive",2],{"guide:workflows-deep":3},{"id":4,"slug":5,"status":6,"visibility":7,"required_feature":8,"category":9,"tags":15,"level":20,"icon":14,"cover_url":21,"default_locale":22,"locales":23,"title":25,"summary":28,"reading_minutes":31,"sort_order":32,"published_at":33,"updated_at":34,"blocks":35,"linked_guides":1013},6,"workflows-deep","published","public",null,{"id":10,"slug":11,"name":12,"icon":14},2,"workflows",{"en":13,"fr":13},"Workflows","ph:flow-arrow",[11,16,17,18,19],"variables","conditions","webhooks","widgets","advanced","https://d1lvjaji8qt9t1.cloudfront.net/media/a2dba2a1-60c1-40fa-aef1-0ec0a161b762.png","fr",[22,24],"en",{"en":26,"fr":27},"Workflows in depth","Workflows en profondeur",{"en":29,"fr":30},"How the engine runs a workflow: triggers, variables, conditions, webhook calls, testing and widgets, with the traps that break a scenario without any error message.","Comment le moteur exécute un workflow : déclencheurs, variables, conditions, appels webhook, tests et widgets, avec les pièges qui font échouer un scénario sans message d'erreur.",21,10,"2026-10-25T20:25:24Z","2026-10-29T09:51:28Z",[36,42,49,58,64,69,74,112,117,122,186,195,200,208,213,218,223,287,292,298,318,327,332,337,342,347,355,360,365,370,375,380,385,390,428,433,438,443,448,531,539,547,552,557,565,570,576,581,589,621,626,631,636,641,646,649,654,659,666,671,676,684,689,694,702,710,715,720,725,730,735,740,785,790,795,855,860,884,892,897,902,907,912,917,922,927,932,937,969,974,979,984],{"id":37,"text":38,"type":41},"wfd-intro",{"en":39,"fr":40},"A workflow reacts to an event: a Twitch follow, a member joining your Discord server, a call sent by a third-party service. The engine starts at the trigger and runs the connected nodes one by one, carrying the event's data along. The game integration guides point here for everything about the editor.","Un workflow réagit à un événement : un follow sur Twitch, un membre qui rejoint votre serveur Discord, un appel envoyé par un service tiers. Le moteur part du déclencheur et exécute les nœuds reliés, un par un, en transportant les données de l'événement. Les guides d'intégration de jeux renvoient ici pour tout ce qui concerne l'éditeur.","paragraph",{"id":43,"kind":44,"text":45,"type":48},"wfd-blk-001","info",{"en":46,"fr":47},"Workflows are created from the [Workflows](dashboard:/workflows) page of the dashboard. Names in quotes are the labels shown in the editor.","Les workflows se créent depuis la page [Workflows](dashboard:/workflows) du dashboard. Les noms entre guillemets sont les libellés affichés dans l'éditeur.","callout",{"id":50,"type":51,"title":52,"summary":55},"wfd-part-model","part",{"en":53,"fr":54},"The model","Le modèle",{"en":56,"fr":57},"One trigger, connected nodes, data flowing through.","Un déclencheur, des nœuds reliés, des données qui circulent.",{"id":59,"text":60,"type":63,"level":10},"wfd-model",{"en":61,"fr":62},"One trigger, nodes, data","Un déclencheur, des nœuds, des données","heading",{"id":65,"text":66,"type":41},"wfd-blk-002",{"en":67,"fr":68},"Every chain starts from a trigger, its entry point. The following nodes are connected by arrows: actions (send a message, call a URL), conditions (pick a branch) and waits. When the event happens, the engine follows the arrows from the trigger and runs each node it reaches.","Chaque chaîne part d'un déclencheur, son point d'entrée. Les nœuds suivants sont reliés par des flèches : des actions (envoyer un message, appeler une URL), des conditions (choisir une branche) et des attentes. Quand l'événement arrive, le moteur suit les flèches depuis le déclencheur et exécute chaque nœud rencontré.",{"id":70,"text":71,"type":41},"wfd-blk-003",{"en":72,"fr":73},"Data travels with the run. Twitch's “New follower” trigger provides `{user_name}`, and a Discord “Send a message” placed after it can write `{user_name} now follows the channel`. Each action adds its own outputs for the next nodes: after a “Webhook / API call”, `{webhook_response_status}` holds the HTTP code received.","Les données voyagent avec l'exécution. Le déclencheur « Nouveau follower » de Twitch fournit `{user_name}`, et un « Envoyer un message » Discord placé après peut écrire `{user_name} suit maintenant la chaîne`. Chaque action ajoute ses propres sorties pour les nœuds suivants : après un « Appel webhook / API », `{webhook_response_status}` contient le code HTTP reçu.",{"id":75,"type":76,"steps":77,"caption":109},"wfd-blk-004","flow",[78,86,94,101],{"kind":79,"label":80,"detail":83},"trigger",{"en":81,"fr":82},"New follower (Twitch)","Nouveau follower (Twitch)",{"en":84,"fr":85},"provides `{user_name}`","fournit `{user_name}`",{"kind":87,"label":88,"detail":91},"action",{"en":89,"fr":90},"Send a message (Discord)","Envoyer un message (Discord)",{"en":92,"fr":93},"`{user_name} now follows the channel`","`{user_name} suit maintenant la chaîne`",{"kind":87,"label":95,"detail":98},{"en":96,"fr":97},"Webhook / API call","Appel webhook / API",{"en":99,"fr":100},"POST to your service's URL","POST vers l'URL de votre service",{"kind":102,"label":103,"detail":106},"external",{"en":104,"fr":105},"Your service","Votre service",{"en":107,"fr":108},"receives `{\"user_name\":\"Alex\"}`","reçoit `{\"user_name\":\"Alex\"}`",{"en":110,"fr":111},"A Twitch follow announced on Discord, then forwarded to your service.","Un follow Twitch annoncé sur Discord, puis transmis à votre service.",{"id":113,"text":114,"type":41},"wfd-blk-005",{"en":115,"fr":116},"A node can have several outgoing arrows: each branch runs, one after the other. The graph itself never loops. A node reached a second time through a cycle makes the branch fail, and a node where two paths converge runs only once per trigger. To repeat an action, let the called service do the repeating or chain several nodes.","Un nœud peut avoir plusieurs flèches sortantes : chaque branche s'exécute, l'une après l'autre. Le graphe, lui, ne boucle jamais. Un nœud atteint une seconde fois par un cycle fait échouer la branche, et un nœud vers lequel convergent deux chemins ne s'exécute qu'une fois par déclenchement. Pour répéter une action, confiez la répétition au service appelé ou posez plusieurs nœuds à la suite.",{"id":118,"text":119,"type":63,"level":10},"wfd-triggers",{"en":120,"fr":121},"Choosing the trigger","Choisir le déclencheur",{"id":123,"head":124,"rows":134,"type":185},"wfd-blk-006",[125,128,131],{"en":126,"fr":127},"Trigger","Déclencheur",{"en":129,"fr":130},"When it fires","Quand il part",{"en":132,"fr":133},"Example","Exemple",[135,145,155,165,175],[136,139,142],{"en":137,"fr":138},"Network event: “Member joined”, “New follower”, “Command received”…","Événement réseau : « Membre rejoint », « Nouveau follower », « Commande reçue »…",{"en":140,"fr":141},"When the connected network reports the event.","Quand le réseau connecté signale l'événement.",{"en":143,"fr":144},"Welcome a new Discord member.","Accueillir un nouveau membre Discord.",[146,149,152],{"en":147,"fr":148},"“Manual trigger”","« Déclenchement manuel »",{"en":150,"fr":151},"When you click “Run now” in the editor.","Quand vous cliquez sur « Exécuter maintenant » dans l'éditeur.",{"en":153,"fr":154},"Test a chain with “Simulated variables”, without waiting for a real event.","Tester une chaîne avec des « Variables simulées », sans attendre un vrai événement.",[156,159,162],{"en":157,"fr":158},"“Incoming webhook”","« Webhook entrant »",{"en":160,"fr":161},"When a third-party service sends a POST to the URL generated for this trigger.","Quand un service tiers envoie un POST sur l'URL générée pour ce déclencheur.",{"en":163,"fr":164},"A game server reporting the end of a match.","Un serveur de jeu qui signale la fin d'une partie.",[166,169,172],{"en":167,"fr":168},"“Scheduled (cron)”","« Planification (cron) »",{"en":170,"fr":171},"At fixed times, from a cron expression. Without a “Timezone”, times are in UTC.","À heure fixe, selon une expression cron. Sans « Fuseau horaire », l'heure est en UTC.",{"en":173,"fr":174},"`0 9 * * 1`: every Monday at 9 AM.","`0 9 * * 1` : chaque lundi à 9 h.",[176,179,182],{"en":177,"fr":178},"“Sub-workflow entry”","« Entrée de sous-workflow »",{"en":180,"fr":181},"When another workflow calls it with “Call a workflow”, or when a message button targets it.","Quand un autre workflow l'appelle avec « Appeler un workflow », ou quand un bouton de message la cible.",{"en":183,"fr":184},"A “Warn the moderators” routine shared by several workflows.","Une routine « Prévenir les modérateurs » partagée par plusieurs workflows.","table",{"id":187,"kind":188,"text":189,"type":48,"title":192},"wfd-blk-007","tip",{"en":190,"fr":191},"Some triggers have a built-in filter. Twitch's “Command received” offers “Filter on command (without !)”: with `ticket`, only `!ticket` starts the workflow. The match is exact, lowercase and without the “!”. An empty filter lets everything through.","Certains déclencheurs ont un filtre intégré. « Commande reçue » (Twitch) propose « Filtrer sur la commande (sans !) » : avec `ticket`, seul `!ticket` lance le workflow. La comparaison est exacte, en minuscules et sans le « ! ». Un filtre vide laisse tout passer.",{"en":193,"fr":194},"Filter at the trigger","Filtrer dès le déclencheur",{"id":196,"kind":188,"text":197,"type":48},"wfd-blk-008",{"en":198,"fr":199},"A single workflow can hold several triggers, each with its own branch: “Member joined” to welcome people, and a daily “Scheduled (cron)” to post a recap. Each run starts from one trigger only.","Un même workflow peut porter plusieurs déclencheurs, chacun avec sa branche : « Membre rejoint » pour accueillir, et une « Planification (cron) » quotidienne pour publier un récapitulatif. Chaque exécution part d'un seul déclencheur.",{"id":201,"type":51,"title":202,"summary":205},"wfd-part-variables",{"en":203,"fr":204},"Variables","Les variables",{"en":206,"fr":207},"What the engine replaces, and what it leaves as is.","Ce que le moteur remplace, et ce qu'il laisse tel quel.",{"id":209,"text":210,"type":63,"level":10},"wfd-variables",{"en":211,"fr":212},"Writing a variable","Écrire une variable",{"id":214,"text":215,"type":41},"wfd-blk-009",{"en":216,"fr":217},"A variable is written between braces: `{user_name}`. At run time, the engine replaces it with its value in every text field of a node: message, URL, body, headers. Names depend on the trigger: `{user_name}` for “New follower” (Twitch), `{username}` for “Member joined” (Discord), `{chatter_name}` for “Command received”.","Une variable s'écrit entre accolades : `{user_name}`. À l'exécution, le moteur la remplace par sa valeur dans tous les champs texte d'un nœud : message, URL, corps, en-têtes. Les noms dépendent du déclencheur : `{user_name}` pour « Nouveau follower » (Twitch), `{username}` pour « Membre rejoint » (Discord), `{chatter_name}` pour « Commande reçue ».",{"id":219,"text":220,"type":41},"wfd-blk-010",{"en":221,"fr":222},"In a node's configuration, the “Available variables (Parent trigger)” panel lists what the trigger and previous nodes provide. Click a variable to insert it instead of retyping it: a typo leaves the name verbatim in the result.","Dans la configuration d'un nœud, le panneau « Variables disponibles (Trigger parent) » liste ce que fournissent le déclencheur et les nœuds précédents. Cliquez sur une variable pour l'insérer au lieu de la recopier : une faute de frappe laisse le nom en clair dans le résultat.",{"id":224,"head":225,"rows":233,"type":185},"wfd-blk-011",[226,229,230],{"en":227,"fr":228},"Form","Forme",{"en":132,"fr":133},{"en":231,"fr":232},"Result","Résultat",[234,242,251,260,269,278],[235,237,239],{"en":236,"fr":236},"Simple",{"en":238,"fr":238},"`{bits}`",{"en":240,"fr":241},"The value as is: `500`.","La valeur telle quelle : `500`.",[243,246,248],{"en":244,"fr":245},"Path in an object","Chemin dans un objet",{"en":247,"fr":247},"`{payload.user.email}`",{"en":249,"fr":250},"The `email` field of the `user` object received by an “Incoming webhook”.","Le champ `email` de l'objet `user` reçu par un « Webhook entrant ».",[252,255,257],{"en":253,"fr":254},"List item","Élément de liste",{"en":256,"fr":256},"`{webhook_response.data.0.title}`",{"en":258,"fr":259},"The `title` of the first item (`.0`) of the JSON response.","Le `title` du premier élément (`.0`) de la réponse JSON.",[261,264,266],{"en":262,"fr":263},"System variable","Variable système",{"en":265,"fr":265},"`{@date}`",{"en":267,"fr":268},"The server date, in UTC, as YYYY-MM-DD.","La date du serveur, en UTC, au format AAAA-MM-JJ.",[270,273,275],{"en":271,"fr":272},"System with argument","Système avec argument",{"en":274,"fr":274},"`{@discord_relative:joined_at}`",{"en":276,"fr":277},"A relative date that Discord displays as “3 minutes ago”, computed from the `joined_at` field.","Une date relative que Discord affiche « il y a 3 minutes », calculée à partir du champ `joined_at`.",[279,282,284],{"en":280,"fr":281},"Fill","Remplissage",{"en":283,"fr":283},"`{thumbnail_url | width:1280 height:720}`",{"en":285,"fr":286},"The value of `thumbnail_url`, in which `{width}` and `{height}` become 1280 and 720.","La valeur de `thumbnail_url`, dans laquelle `{width}` et `{height}` deviennent 1280 et 720.",{"id":288,"text":289,"type":41},"wfd-blk-012",{"en":290,"fr":291},"System variables available everywhere: `{@now}` (ISO date and time), `{@date}`, `{@time}` (HH:MM), `{@datetime}` (DD/MM/YYYY HH:MM), `{@timestamp}` (Unix timestamp), `{@year}`, `{@month}`, `{@day}`, `{@discord_date}`, `{@discord_relative}` and `{@uuid}`, a different identifier each time it is replaced. Times are the server's, in UTC, except with `{@discord_date}` and `{@discord_relative}`: Discord shows the first in each reader's timezone and the second as a relative duration, such as “3 minutes ago”.","Variables système disponibles partout : `{@now}` (date et heure ISO), `{@date}`, `{@time}` (HH:MM), `{@datetime}` (JJ/MM/AAAA HH:MM), `{@timestamp}` (horodatage Unix), `{@year}`, `{@month}`, `{@day}`, `{@discord_date}`, `{@discord_relative}` et `{@uuid}`, un identifiant différent à chaque remplacement. Les heures sont celles du serveur, en UTC, sauf avec `{@discord_date}` et `{@discord_relative}` : Discord affiche la première dans le fuseau de chaque lecteur et la seconde en durée relative, comme « il y a 3 minutes ».",{"id":293,"text":294,"type":63,"level":297},"wfd-var-rules",{"en":295,"fr":296},"What the engine does with your braces","Ce que le moteur fait de vos accolades",3,{"id":299,"type":300,"items":301,"ordered":317},"wfd-blk-013","list",[302,305,308,311,314],{"en":303,"fr":304},"An unknown key stays written as is: a typo like `{usre_name}` shows up verbatim in the sent message. Visible braces in a result almost always point to a misspelled name, or one that belongs to another trigger.","Une clé inconnue reste écrite telle quelle : une faute comme `{usre_name}` apparaît en clair dans le message envoyé. Des accolades visibles dans un résultat signalent presque toujours un nom mal écrit, ou propre à un autre déclencheur.",{"en":306,"fr":307},"A variable declared by the trigger but missing from the event becomes empty: `{user_name}` on an anonymous Twitch cheer produces nothing.","Une variable prévue par le déclencheur mais absente de l'événement devient vide : `{user_name}` d'un cheer anonyme sur Twitch ne produit rien.",{"en":309,"fr":310},"An object or a list is written as JSON, a boolean as `true` or `false`.","Un objet ou une liste est écrit en JSON, un booléen en `true` ou `false`.",{"en":312,"fr":313},"No arithmetic or transformation: `{bits / 100}` stays written as is, and `{user_name | upper}` gives the name without uppercasing it. Do the math in the service that receives the call, by sending it the raw value.","Aucun calcul ni transformation : `{bits / 100}` reste écrit tel quel, et `{user_name | upper}` donne le pseudo sans le passer en majuscules. Faites le calcul dans le service qui reçoit l'appel, en lui envoyant la valeur brute.",{"en":315,"fr":316},"To accumulate a value over time, “Set community data” in “Add (counter)” mode adds a number to a stored total.","Pour cumuler une valeur dans la durée, « Enregistrer une donnée de communauté » en mode « Ajouter (compteur) » ajoute un nombre à un total conservé.",false,{"id":319,"kind":320,"text":321,"type":48,"title":324},"wfd-blk-014","warning",{"en":322,"fr":323},"A template meant for another tool is not protected: in `{{user_name}}`, LibertyTalk replaces the inside and sends `{Alex}`. Keep those templates on the side of the tool that reads them, and send it the value in a JSON field.","Un gabarit prévu pour un autre outil n'est pas protégé : dans `{{user_name}}`, LibertyTalk remplace l'intérieur et envoie `{Alex}`. Gardez ces gabarits du côté de l'outil qui les lit, et envoyez-lui la valeur dans un champ JSON.",{"en":325,"fr":326},"Double braces from another tool","Les doubles accolades d'un autre outil",{"id":328,"text":329,"type":63,"level":10},"wfd-set-variable",{"en":330,"fr":331},"“Set a variable”","« Définir une variable »",{"id":333,"text":334,"type":41},"wfd-blk-015",{"en":335,"fr":336},"The “Set a variable” action creates a value reusable in the following nodes of the same run. The name is written without braces, using unaccented letters, digits and `_`: `réponse` would become `rponse`. The value can combine other variables. Example: name `announcement`, value `{user_name} just followed the channel`, then `{announcement}` in two messages, one on Discord, the other on Twitch.","L'action « Définir une variable » crée une valeur réutilisable dans les nœuds suivants de la même exécution. Le nom s'écrit sans accolades, en lettres sans accent, chiffres et `_` : `réponse` deviendrait `rponse`. La valeur peut combiner d'autres variables. Exemple : nom `annonce`, valeur `{user_name} vient de suivre la chaîne`, puis `{annonce}` dans deux messages, l'un sur Discord, l'autre sur Twitch.",{"id":338,"text":339,"type":41},"wfd-blk-016",{"en":340,"fr":341},"Nothing is saved to the database: the variable disappears when the run ends. A value that must survive from one event to the next goes through “Set community data”.","Rien n'est enregistré en base : la variable disparaît à la fin de l'exécution. Une valeur qui doit survivre d'un événement à l'autre passe par « Enregistrer une donnée de communauté ».",{"id":343,"text":344,"type":41},"wfd-blk-017",{"en":345,"fr":346},"A value made of a single variable holding an object keeps the whole object. With the name `reply` and the value `{webhook_response}`, `{reply.data.0.title}` stays readable further down.","Une valeur faite d'une seule variable qui contient un objet garde l'objet entier. Avec le nom `reponse` et la valeur `{webhook_response}`, `{reponse.data.0.title}` reste lisible plus loin.",{"id":348,"type":51,"title":349,"summary":352},"wfd-part-decide",{"en":350,"fr":351},"Deciding","Décider",{"en":353,"fr":354},"Conditions, switches and operators.","Conditions, aiguillages et opérateurs.",{"id":356,"text":357,"type":63,"level":10},"wfd-if-simple",{"en":358,"fr":359},"“If (classic)”","« Si (classique) »",{"id":361,"text":362,"type":41},"wfd-blk-018",{"en":363,"fr":364},"“If (classic)” evaluates one or more conditions and opens two outputs: the green handle for TRUE, the red one for FALSE. Several conditions combine with “All conditions (AND)” or “At least one condition (OR)”, in a single list. To mix both, chain two “If (classic)” nodes.","« Si (classique) » évalue une ou plusieurs conditions et ouvre deux sorties : la poignée verte pour VRAI, la rouge pour FAUX. Plusieurs conditions se combinent avec « Toutes les conditions (ET) » ou « Au moins une condition (OU) », sur une seule liste. Pour mélanger les deux, enchaînez deux nœuds « Si (classique) ».",{"id":366,"text":367,"type":41},"wfd-blk-019",{"en":368,"fr":369},"A condition reads a field, an operator and a value. The field can be written with or without braces (`bits` or `{bits}`). The value can contain variables: `bits` “> greater than” `{threshold}` compares two values of the run. With no condition at all, the TRUE branch is always taken.","Une condition lit un champ, un opérateur et une valeur. Le champ s'écrit avec ou sans accolades (`bits` ou `{bits}`). La valeur peut contenir des variables : `bits` « > supérieur à » `{seuil}` compare deux valeurs de l'exécution. Sans aucune condition, la branche VRAI est toujours prise.",{"id":371,"kind":44,"text":372,"type":48},"wfd-blk-020",{"en":373,"fr":374},"A branch left unconnected stops there, without an error. An empty FALSE output simply means “do nothing in that case”.","Une branche laissée sans suite s'arrête là, sans erreur. Une sortie FAUX vide veut simplement dire « ne rien faire dans ce cas ».",{"id":376,"text":377,"type":63,"level":10},"wfd-switch",{"en":378,"fr":379},"“Switch”","« Aiguillage (switch) »",{"id":381,"text":382,"type":41},"wfd-blk-021",{"en":383,"fr":384},"The “Switch” replaces a cascade of “If” nodes when there are more than two cases. Each case has its own conditions and handle, and the “Else” branch runs when no case matches. In “Exclusive (first match)” mode, only the first matching case is followed. In “All matching (fan-out)” mode, every matching case is.","L'« Aiguillage (switch) » remplace une cascade de « Si » quand il y a plus de deux cas. Chaque cas a ses conditions et sa poignée, et la branche « Sinon » part quand aucun cas n'est vrai. En mode « Exclusif (1er cas vrai) », seul le premier cas vrai est suivi. En mode « Tous les cas vrais (fan-out) », chaque cas vrai l'est.",{"id":386,"text":387,"type":41},"wfd-blk-022",{"en":388,"fr":389},"Example with Twitch's “Channel points reward”: one case per reward, tested on `{reward_title}`. Each case leads to a “Set a variable” named `effect` (`vip`, `sound` or `challenge`), then the three branches join a single “Webhook / API call” to `https://example.com/hooks/{effect}`. One call node instead of three: adding a reward only means adding a case.","Exemple avec « Récompense (points de chaîne) » sur Twitch : un cas par récompense, testé sur `{reward_title}`. Chaque cas mène à un « Définir une variable » nommé `effet` (`vip`, `son` ou `defi`), puis les trois branches rejoignent un seul « Appel webhook / API » vers `https://example.com/hooks/{effet}`. Un seul nœud d'appel au lieu de trois : ajouter une récompense ne fait qu'ajouter un cas.",{"id":391,"type":76,"steps":392,"caption":425},"wfd-blk-023",[393,400,408,415,420],{"kind":79,"label":394,"detail":397},{"en":395,"fr":396},"Channel points reward","Récompense (points de chaîne)",{"en":398,"fr":399},"provides `{reward_title}`","fournit `{reward_title}`",{"kind":401,"label":402,"detail":405},"condition",{"en":403,"fr":404},"Switch","Aiguillage (switch)",{"en":406,"fr":407},"one case per reward, plus “Else”","un cas par récompense, plus « Sinon »",{"kind":87,"label":409,"detail":412},{"en":410,"fr":411},"Set a variable","Définir une variable",{"en":413,"fr":414},"`effect` = `vip`, `sound` or `challenge`","`effet` = `vip`, `son` ou `defi`",{"kind":87,"label":416,"detail":417},{"en":96,"fr":97},{"en":418,"fr":419},"`https://example.com/hooks/{effect}`","`https://example.com/hooks/{effet}`",{"kind":102,"label":421,"detail":422},{"en":104,"fr":105},{"en":423,"fr":424},"runs the requested effect","déclenche l'effet demandé",{"en":426,"fr":427},"A channel points reward forwarded to an external service.","Une récompense de points de chaîne transmise à un service externe.",{"id":429,"text":430,"type":63,"level":10},"wfd-if-network",{"en":431,"fr":432},"“If network” and “If config”","« Si réseau » et « Si config »",{"id":434,"text":435,"type":41},"wfd-blk-024",{"en":436,"fr":437},"“If network” compares the network that triggered the run with the one picked in the node (Discord, Twitch, YouTube…), when one chain serves several networks. “If config” reads an answer given when a widget is installed: it is covered in part 6.","« Si réseau » compare le réseau qui a déclenché l'exécution à celui choisi dans le nœud (Discord, Twitch, YouTube…), quand une même chaîne sert plusieurs réseaux. « Si config » lit une réponse donnée à l'installation d'un widget : il est décrit dans la partie 6.",{"id":439,"text":440,"type":63,"level":297},"wfd-operators",{"en":441,"fr":442},"Operators and their traps","Les opérateurs et leurs pièges",{"id":444,"text":445,"type":41},"wfd-blk-025",{"en":446,"fr":447},"The editor offers operators based on the variable's type: text, number, yes/no or date. “Incoming webhook” variables, the “Simulated variables” of a “Manual trigger” and the output of “Set a variable” are text for the editor, which therefore doesn't offer numeric comparisons on them.","L'éditeur propose les opérateurs selon le type de la variable : texte, nombre, oui/non ou date. Les variables d'un « Webhook entrant », les « Variables simulées » d'un « Déclenchement manuel » et la sortie de « Définir une variable » sont du texte pour l'éditeur, qui n'y propose donc pas les comparaisons numériques.",{"id":449,"head":450,"rows":460,"type":185},"wfd-blk-026",[451,454,457],{"en":452,"fr":453},"Operator","Opérateur",{"en":455,"fr":456},"What it does","Ce qu'il fait",{"en":458,"fr":459},"Trap","Piège",[461,471,481,491,501,511,521],[462,465,468],{"en":463,"fr":464},"“= equal to”, “≠ different from”","« = égal à », « ≠ différent de »",{"en":466,"fr":467},"Compares the exact text.","Compare le texte exact.",{"en":469,"fr":470},"`Alex` and `alex` are different. On a yes/no variable, `true`, `1`, `yes` and `oui` all count as TRUE.","`Alex` et `alex` sont différents. Sur une variable oui/non, `true`, `1`, `yes` et `oui` valent VRAI.",[472,475,478],{"en":473,"fr":474},"“⊃ contains”, “⊄ does not contain”, “⊳ starts with”, “⊲ ends with”","« ⊃ contient », « ⊄ ne contient pas », « ⊳ commence par », « ⊲ se termine par »",{"en":476,"fr":477},"Looks for a piece of text.","Cherche un morceau de texte.",{"en":479,"fr":480},"Case-sensitive: “contains” `vip` won't find `VIP`. To ignore case, use a regex with `i`.","Sensible à la casse : « contient » `vip` ne trouve pas `VIP`. Pour ignorer la casse, passez par une regex avec `i`.",[482,485,488],{"en":483,"fr":484},"“~ matches regex”, “!~ does not match regex”","« ~ correspond au regex », « !~ ne correspond pas au regex »",{"en":486,"fr":487},"Tests a regular expression.","Teste une expression régulière.",{"en":489,"fr":490},"Write the delimiters: `/^vip/iu`. Without delimiters, a pattern starting with a symbol is misread, and `^vip` is always false. `i` ignores case, `u` handles accents: `/h[ée]ros/iu`.","Écrivez les délimiteurs : `/^vip/iu`. Sans délimiteur, un motif qui commence par un symbole est mal lu, et `^vip` est toujours faux. `i` ignore la casse, `u` gère les accents : `/h[ée]ros/iu`.",[492,495,498],{"en":493,"fr":494},"“∅ is empty”, “∃ is not empty”","« ∅ est vide », « ∃ n'est pas vide »",{"en":496,"fr":497},"Tests for a missing value.","Teste l'absence de valeur.",{"en":499,"fr":500},"`0` counts as empty.","`0` compte comme vide.",[502,505,508],{"en":503,"fr":504},"“> greater than”, “≥ greater or equal”, “\u003C less than”, “≤ less or equal”","« > supérieur à », « ≥ supérieur ou égal à », « \u003C inférieur à », « ≤ inférieur ou égal à »",{"en":506,"fr":507},"Compares two numbers.","Compare deux nombres.",{"en":509,"fr":510},"If either side is not a number, the condition is false. Only offered for number variables, such as `{bits}` or `{viewers}`.","Si l'un des deux côtés n'est pas un nombre, la condition est fausse. Proposés seulement pour les variables de type nombre, comme `{bits}` ou `{viewers}`.",[512,515,518],{"en":513,"fr":514},"“✓ is true”, “✗ is false”","« ✓ est vrai », « ✗ est faux »",{"en":516,"fr":517},"Reads a yes/no variable, such as `{webhook_response_ok}`.","Lit une variable oui/non, comme `{webhook_response_ok}`.",{"en":519,"fr":520},"“is true” accepts `true`, `1`, `yes` and `on`, but not `oui`.","« est vrai » accepte `true`, `1`, `yes` et `on`, mais pas `oui`.",[522,525,528],{"en":523,"fr":524},"Dates: “\u003C before”, “⏪ within the last N days”, “⊙ is today”…","Dates : « \u003C avant le », « ⏪ dans les N derniers jours », « ⊙ est aujourd'hui »…",{"en":526,"fr":527},"Compares dates and periods.","Compare des dates et des périodes.",{"en":529,"fr":530},"“before” and “after” compare by day, ignoring the time.","« avant le » et « après le » comparent au jour près, sans tenir compte de l'heure.",{"id":532,"kind":320,"text":533,"type":48,"title":536},"wfd-blk-027",{"en":534,"fr":535},"A condition's field reads the run's data, not system variables: `{@time}` used as a field is always empty. Copy it first with “Set a variable” (`hour` = `{@time}`), then compare `hour`. As a value, however, `{@date}` is replaced as expected.","Le champ d'une condition lit les données de l'exécution, pas les variables système : `{@time}` placé en champ vaut toujours vide. Copiez-la d'abord avec « Définir une variable » (`heure` = `{@time}`), puis comparez `heure`. En valeur, en revanche, `{@date}` est bien remplacée.",{"en":537,"fr":538},"A system variable can't be compared directly","Une variable système ne se compare pas directement",{"id":540,"type":51,"title":541,"summary":544},"wfd-part-act",{"en":542,"fr":543},"Acting outside LibertyTalk","Agir hors de LibertyTalk",{"en":545,"fr":546},"Outgoing calls, waits and incoming webhooks.","Appels sortants, attentes et webhooks entrants.",{"id":548,"text":549,"type":63,"level":10},"wfd-webhook-call",{"en":550,"fr":551},"“Webhook / API call”","« Appel webhook / API »",{"id":553,"text":554,"type":41},"wfd-blk-028",{"en":555,"fr":556},"This action sends an HTTP request: “Destination URL”, “HTTP method” (POST, GET, PUT, PATCH or DELETE), “Body (JSON)” and “Additional headers (JSON)”. Variables work in the URL, the body and the headers. Only public addresses are accepted: `localhost` or a private network address makes the step fail.","Cette action envoie une requête HTTP : « URL de destination », « Méthode HTTP » (POST, GET, PUT, PATCH ou DELETE), « Corps (JSON) » et « En-têtes supplémentaires (JSON) ». Les variables fonctionnent dans l'URL, le corps et les en-têtes. Seules les adresses publiques sont acceptées : `localhost` ou une adresse de réseau privé fait échouer l'étape.",{"id":558,"code":559,"type":560,"caption":561,"language":564},"wfd-blk-029","{\n  \"event\": \"cheer\",\n  \"user_name\": \"{user_name}\",\n  \"bits\": \"{bits}\",\n  \"message\": \"{message}\"\n}","code",{"en":562,"fr":563},"“Body (JSON)”: every variable in quotes.","« Corps (JSON) » : chaque variable entre guillemets.","json",{"id":566,"text":567,"type":41},"wfd-blk-030",{"en":568,"fr":569},"Put every variable in quotes, as above. When the body is valid JSON, LibertyTalk escapes the replaced values: a quote typed by a viewer in `{message}` doesn't break the request. Values are sent as text (`\"bits\":\"500\"`): the receiving service must convert them if it expects numbers.","Mettez chaque variable entre guillemets, comme ci-dessus. Quand le corps est un JSON valide, LibertyTalk échappe les valeurs remplacées : un guillemet tapé par un viewer dans `{message}` ne casse pas la requête. Les valeurs partent en texte (`\"bits\":\"500\"`) : le service qui reçoit doit les convertir s'il attend des nombres.",{"id":571,"code":572,"type":560,"caption":573,"language":564},"wfd-blk-031","{\"Authorization\": \"Bearer {api_token}\"}",{"en":574,"fr":575},"“Additional headers (JSON)”: a token provided by a widget variable.","« En-têtes supplémentaires (JSON) » : un jeton fourni par une variable de widget.",{"id":577,"text":578,"type":41},"wfd-blk-032",{"en":579,"fr":580},"The response feeds the next nodes: `{webhook_response_status}` (HTTP code), `{webhook_response_ok}` (true for a 2xx code), `{webhook_response_body}` (raw body) and `{webhook_response}`, the JSON response readable by path, for example `{webhook_response.data.0.title}`. The “JSON path (optional)” field extracts a single value into `{webhook_response_value}`. The service has 10 seconds to answer.","La réponse alimente les nœuds suivants : `{webhook_response_status}` (code HTTP), `{webhook_response_ok}` (vrai pour un code 2xx), `{webhook_response_body}` (corps brut) et `{webhook_response}`, la réponse JSON lisible par chemin, par exemple `{webhook_response.data.0.title}`. Le champ « Chemin JSON (optionnel) » extrait une seule valeur dans `{webhook_response_value}`. Le service a 10 secondes pour répondre.",{"id":582,"kind":320,"text":583,"type":48,"title":586},"wfd-blk-033",{"en":584,"fr":585},"Service down, timeout, 4xx or 5xx response: the step shows “Completed”, with `{webhook_response_ok}` false and a code of 0 (no response) or 4xx/5xx. Only a refused address (local or private) and a URL left empty once variables are replaced make the step fail. To react to an outage, add an “If (classic)” on `webhook_response_ok` “✓ is true”, and connect the FALSE output to “Notify the dashboard”.","Service éteint, délai dépassé, réponse 4xx ou 5xx : l'étape s'affiche « Terminé », avec `{webhook_response_ok}` à faux et un code 0 (aucune réponse) ou 4xx/5xx. Seules une adresse refusée (locale ou privée) et une URL restée vide après le remplacement des variables font échouer l'étape. Pour réagir à une panne, ajoutez un « Si (classique) » sur `webhook_response_ok` « ✓ est vrai », et branchez la sortie FAUX sur « Notifier le dashboard ».",{"en":587,"fr":588},"A green step doesn't prove the service answered","Une étape verte ne prouve pas que le service a répondu",{"id":590,"type":76,"steps":591,"caption":618},"wfd-blk-034",[592,599,604,611],{"kind":79,"label":593,"detail":596},{"en":594,"fr":595},"Bits received (cheer)","Bits reçus (cheer)",{"en":597,"fr":598},"provides `{bits}` and `{message}`","fournit `{bits}` et `{message}`",{"kind":87,"label":600,"detail":601},{"en":96,"fr":97},{"en":602,"fr":603},"POST to your service","POST vers votre service",{"kind":401,"label":605,"detail":608},{"en":606,"fr":607},"If (classic)","Si (classique)",{"en":609,"fr":610},"`webhook_response_ok` ✓ is true","`webhook_response_ok` ✓ est vrai",{"kind":87,"label":612,"detail":615},{"en":613,"fr":614},"Notify the dashboard","Notifier le dashboard",{"en":616,"fr":617},"on the FALSE branch: “Service unreachable”","sur la branche FAUX : « Service injoignable »",{"en":619,"fr":620},"Detecting a service that is offline.","Détecter un service hors ligne.",{"id":622,"text":623,"type":41},"wfd-blk-035",{"en":624,"fr":625},"“Webhook / API call (background)” sends the same request from a queue: the request doesn't block the engine, and the next nodes resume once the response arrives. Meanwhile, the step shows “Waiting”. It only provides `{webhook_response_status}`, `{webhook_response_body}` and `{webhook_response_ok}`.","« Appel webhook / API (arrière-plan) » envoie la même requête depuis une file d'attente : la requête ne bloque pas le moteur, et les nœuds suivants reprennent une fois la réponse reçue. Entre-temps, l'étape affiche « En attente ». Il ne fournit que `{webhook_response_status}`, `{webhook_response_body}` et `{webhook_response_ok}`.",{"id":627,"text":628,"type":41},"wfd-blk-036",{"en":629,"fr":630},"The “Sign the request” option adds the `X-LibertyTalk-Signature` header, computed with a key that belongs to LibertyTalk: it is meant for LibertyTalk tools such as LibertyBroad, and a third-party service cannot verify it. To authenticate your calls to your own service, put a token in the headers instead.","L'option « Signer la requête » ajoute l'en-tête `X-LibertyTalk-Signature`, calculé avec une clé propre à LibertyTalk : il sert aux outils LibertyTalk comme LibertyBroad, et un service tiers ne peut pas le vérifier. Pour authentifier vos appels auprès de votre propre service, placez plutôt un jeton dans les en-têtes.",{"id":632,"text":633,"type":63,"level":10},"wfd-wait",{"en":634,"fr":635},"“Wait”","« Attendre »",{"id":637,"text":638,"type":41},"wfd-blk-037",{"en":639,"fr":640},"“Wait” pauses the branch for a “Duration” and a “Unit” (seconds, minutes, hours or days). The maximum is 7 days: a longer duration is brought back to 7 days. The wait blocks nothing else: other branches keep going, and the step shows “Waiting” until it resumes. Example: a welcome message, “Wait” 10 minutes, then a second message with the server rules.","« Attendre » met la branche en pause pendant une « Durée » et une « Unité » (secondes, minutes, heures ou jours). Le maximum est de 7 jours : une durée plus longue est ramenée à 7 jours. L'attente ne bloque rien d'autre : les autres branches continuent, et l'étape affiche « En attente » jusqu'à la reprise. Exemple : un message de bienvenue, « Attendre » 10 minutes, puis un second message avec les règles du serveur.",{"id":642,"text":643,"type":41},"wfd-blk-038",{"en":644,"fr":645},"If the workflow is edited during a wait, the resume fails instead of running a graph that changed in the meantime.","Si le workflow est modifié pendant une attente, la reprise échoue au lieu d'exécuter un graphe qui a changé entre-temps.",{"id":647,"text":648,"type":63,"level":10},"wfd-incoming",{"en":157,"fr":158},{"id":650,"text":651,"type":41},"wfd-blk-039",{"en":652,"fr":653},"The “Incoming webhook” trigger gives your workflow an address. The URL and the secret appear in the “Webhook URL & secret” field after the first save. A third-party service uses them to send a POST with a JSON body, and each accepted call starts a run.","Le déclencheur « Webhook entrant » donne une adresse à votre workflow. L'URL et le secret apparaissent dans le champ « URL & secret du webhook » après le premier enregistrement. Un service tiers s'en sert pour envoyer un POST avec un corps JSON, et chaque appel accepté lance une exécution.",{"id":655,"text":656,"type":41},"wfd-blk-040",{"en":657,"fr":658},"The secret goes in the `X-Webhook-Secret` header. The “Secret header” field changes that name when the sender imposes its own, for example `X-Gitlab-Token` for GitLab. Don't put the secret in the URL (`?secret=`): it would end up in plain text in server logs.","Le secret s'envoie dans l'en-tête `X-Webhook-Secret`. Le champ « Header du secret » change ce nom quand l'émetteur impose le sien, par exemple `X-Gitlab-Token` pour GitLab. Ne placez pas le secret dans l'URL (`?secret=`) : il finirait en clair dans les journaux des serveurs.",{"id":660,"code":661,"type":560,"caption":662,"language":665},"wfd-blk-041","curl -X POST \"\u003Cwebhook-url>\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-Webhook-Secret: \u003Cwebhook-secret>\" \\\n  -d '{\"player\":\"Alex\",\"score\":42}'",{"en":663,"fr":664},"Testing the URL from a terminal: replace the two values in angle brackets with the trigger's.","Tester l'URL depuis un terminal : remplacez les deux valeurs entre chevrons par celles du déclencheur.","bash",{"id":667,"text":668,"type":41},"wfd-blk-042",{"en":669,"fr":670},"LibertyTalk answers `202` when the call is accepted, `401` if the secret or signature is wrong, `404` if the URL is unknown or the workflow is inactive, `400` if a body announced as JSON can't be read, and `429` beyond 120 accepted calls per minute.","LibertyTalk répond `202` quand l'appel est accepté, `401` si le secret ou la signature est faux, `404` si l'URL est inconnue ou si le workflow est inactif, `400` si un corps annoncé en JSON est illisible, et `429` au-delà de 120 appels acceptés par minute.",{"id":672,"text":673,"type":41},"wfd-blk-043",{"en":674,"fr":675},"For stronger protection, sign the request. Send the Unix timestamp in seconds in `X-LT-Timestamp`, and in `X-LT-Signature` the value `sha256=` followed by the HMAC-SHA256 of `{timestamp}.{body}`, computed with the secret. LibertyTalk rejects a timestamp more than 5 minutes off and a signature it has already received: an intercepted request can't be replayed.","Pour une protection plus forte, signez la requête. Envoyez l'horodatage Unix en secondes dans `X-LT-Timestamp`, et dans `X-LT-Signature` la valeur `sha256=` suivie du HMAC-SHA256 de `{horodatage}.{corps}`, calculé avec le secret. LibertyTalk refuse un horodatage écarté de plus de 5 minutes et une signature déjà reçue : une requête interceptée ne peut pas être rejouée.",{"id":677,"code":678,"type":560,"caption":679,"filename":682,"language":683},"wfd-blk-044","import { createHmac } from 'node:crypto'\n\nconst url = process.env.LT_WEBHOOK_URL\nconst secret = process.env.LT_WEBHOOK_SECRET\n\nconst body = JSON.stringify({ player: 'Alex', score: 42 })\nconst timestamp = Math.floor(Date.now() / 1000).toString()\nconst signature = createHmac('sha256', secret)\n  .update(`${timestamp}.${body}`)\n  .digest('hex')\n\nconst res = await fetch(url, {\n  method: 'POST',\n  headers: {\n    'Content-Type': 'application/json',\n    'X-LT-Timestamp': timestamp,\n    'X-LT-Signature': `sha256=${signature}`,\n  },\n  body,\n})\nconsole.log(res.status)",{"en":680,"fr":681},"Sending a signed event from Node.js 18 or later.","Envoyer un événement signé depuis Node.js 18 ou plus récent.","send-event.mjs","javascript",{"id":685,"text":686,"type":41},"wfd-blk-045",{"en":687,"fr":688},"In the workflow, `{payload}` holds the whole received body and `{payload.score}` a single field. The “Variables from the payload” field creates short names: “Target variable” `score`, “Key in the received payload” `score`, and `{score}` becomes usable in nodes and conditions alike. These variables are text for the editor: rather than a score to compare with a threshold, have the service send a value ready for “= equal to”, for example `\"tier\":\"gold\"`.","Dans le workflow, `{payload}` contient tout le corps reçu et `{payload.score}` un champ précis. Le champ « Variables depuis le payload » crée des noms courts : « Variable cible » `score`, « Clé dans le payload reçu » `score`, et `{score}` devient utilisable dans les nœuds comme dans les conditions. Ces variables sont du texte pour l'éditeur : plutôt qu'un score à comparer à un seuil, demandez au service d'envoyer une valeur prête pour « = égal à », par exemple `\"palier\":\"or\"`.",{"id":690,"text":691,"type":41},"wfd-blk-046",{"en":692,"fr":693},"In a widget, each installation gets its own URL and secret, shown on the installation page.","Dans un widget, chaque installation reçoit sa propre URL et son propre secret, affichés sur la page de l'installation.",{"id":695,"kind":320,"text":696,"type":48,"title":699},"wfd-blk-047",{"en":697,"fr":698},"A workflow that calls its own “Incoming webhook” URL is refused at save time. Across several workflows, each bounce is counted by the `X-LibertyTalk-Hop` header, and the chain is cut at the fifth bounce.","Un workflow qui appelle sa propre URL de « Webhook entrant » est refusé à l'enregistrement. Entre plusieurs workflows, chaque rebond est compté par l'en-tête `X-LibertyTalk-Hop`, et la chaîne est coupée au cinquième rebond.",{"en":700,"fr":701},"No loops through webhooks","Pas de boucle par webhook",{"id":703,"type":51,"title":704,"summary":707},"wfd-part-test",{"en":705,"fr":706},"Testing and debugging","Tester et déboguer",{"en":708,"fr":709},"Activate, test without a live event, read the execution console.","Activer, tester sans live, lire la console d'exécution.",{"id":711,"text":712,"type":63,"level":10},"wfd-activate",{"en":713,"fr":714},"Save, activate, test","Enregistrer, activer, tester",{"id":716,"text":717,"type":41},"wfd-blk-048",{"en":718,"fr":719},"Saving stores the graph. For network events, schedules and incoming webhooks to reach the workflow, it must also be active. On activation, LibertyTalk checks the platform rules: a sequence a platform forbids blocks the activation. The [Platform rules](dashboard:/platform-rules) page details each rule.","Enregistrer conserve le graphe. Pour que les événements réseau, la planification et le webhook entrant atteignent le workflow, il doit aussi être actif. À l'activation, LibertyTalk vérifie les règles des plateformes : un enchaînement interdit par une plateforme bloque l'activation. La page [Règles des plateformes](dashboard:/platform-rules) détaille chaque règle.",{"id":721,"text":722,"type":41},"wfd-blk-049",{"en":723,"fr":724},"The “Manual trigger” runs even when the workflow is inactive: it's the way to test without waiting for a real event. Add it next to the real trigger, fill in its “Simulated variables” (`user_name` = `Test`, `bits` = `500`), connect it to the first node of the chain and click “Run now”. The run uses the saved version: “Save and run” avoids testing an outdated one.","Le « Déclenchement manuel » s'exécute même quand le workflow est inactif : c'est la façon de tester sans attendre un vrai événement. Ajoutez-le à côté du vrai déclencheur, remplissez ses « Variables simulées » (`user_name` = `Test`, `bits` = `500`), reliez-le au premier nœud de la chaîne et cliquez sur « Exécuter maintenant ». L'exécution utilise la version enregistrée : « Enregistrer et exécuter » évite de tester une version périmée.",{"id":726,"kind":320,"text":727,"type":48},"wfd-blk-050",{"en":728,"fr":729},"A test has real effects: the bot actually posts, assigns roles, calls your URLs. Test on a Discord server or a test channel before wiring your community.","Un test a de vrais effets : le bot publie réellement, attribue des rôles, appelle vos URL. Testez sur un serveur Discord ou une chaîne de test avant de brancher votre communauté.",{"id":731,"text":732,"type":63,"level":10},"wfd-console",{"en":733,"fr":734},"Reading the execution console","Lire la console d'exécution",{"id":736,"text":737,"type":41},"wfd-blk-051",{"en":738,"fr":739},"The “Execution console”, below the editor, shows every run step by step, trigger included. Click its header to open it: runs show up live, and “Load last run” reloads the most recent one. Each step shows its “Input” (values received, variables replaced) and its “Output” (variables produced). For a condition, it shows the compared values and the branch taken.","La « Console d'exécution », sous l'éditeur, affiche chaque exécution étape par étape, déclencheur compris. Cliquez sur son en-tête pour l'ouvrir : les exécutions y arrivent en direct, et « Charger le dernier run » recharge la plus récente. Chaque étape montre son « Entrée » (les valeurs reçues, variables remplacées) et sa « Sortie » (les variables produites). Pour une condition, elle montre les valeurs comparées et la branche prise.",{"id":741,"head":742,"rows":749,"type":185},"wfd-blk-052",[743,746],{"en":744,"fr":745},"Status","Statut",{"en":747,"fr":748},"What it means","Ce qu'il veut dire",[750,757,764,771,778],[751,754],{"en":752,"fr":753},"Completed","Terminé",{"en":755,"fr":756},"The step succeeded. For a “Webhook / API call”, also check `webhook_response_ok`.","L'étape a réussi. Pour un « Appel webhook / API », vérifiez aussi `webhook_response_ok`.",[758,761],{"en":759,"fr":760},"Failed, continued","Échec toléré",{"en":762,"fr":763},"The action failed but the chain went on. Open the step to read the error.","L'action a échoué mais la chaîne a continué. Ouvrez l'étape pour lire l'erreur.",[765,768],{"en":766,"fr":767},"Failed","Échec",{"en":769,"fr":770},"The branch stopped there: configuration error, platform rule, cycle or limit reached.","La branche s'est arrêtée là : erreur de configuration, règle de plateforme, cycle ou plafond atteint.",[772,775],{"en":773,"fr":774},"Waiting","En attente",{"en":776,"fr":777},"A “Wait” or a background call hasn't finished yet.","Un « Attendre » ou un appel en arrière-plan n'est pas encore terminé.",[779,782],{"en":780,"fr":781},"Aborted","Interrompu",{"en":783,"fr":784},"The run was force-stopped, for example because the workflow was deactivated while it was running.","L'exécution a été arrêtée de force, par exemple parce que le workflow a été désactivé pendant qu'elle tournait.",{"id":786,"text":787,"type":41},"wfd-blk-053",{"en":788,"fr":789},"On each step, the curly-brace “Variables” icon shows every variable available at that point, with secrets masked. That's where you find out why a token came out empty or unchanged: you read the exact name of each key and its value.","Sur chaque étape, l'icône d'accolades « Variables » affiche toutes les variables disponibles à ce moment, secrets masqués. C'est là que l'on comprend pourquoi un jeton est sorti vide ou tel quel : vous lisez le nom exact de chaque clé et sa valeur.",{"id":791,"text":792,"type":63,"level":10},"wfd-mistakes",{"en":793,"fr":794},"Common mistakes","Erreurs fréquentes",{"id":796,"type":797,"items":798},"wfd-blk-054","faq",[799,806,813,820,827,834,841,848],{"a":800,"q":803},{"en":801,"fr":802},"The key doesn't exist in this run: a typo, or a name that belongs to another trigger (`{username}` on “Member joined”, `{user_name}` on “New follower”). Open “Variables” on the step, in the console, to read the real names.","La clé n'existe pas dans cette exécution : faute de frappe, ou nom propre à un autre déclencheur (`{username}` sur « Membre rejoint », `{user_name}` sur « Nouveau follower »). Ouvrez « Variables » sur l'étape, dans la console, pour lire les noms réels.",{"en":804,"fr":805},"My message shows `{user_name}` instead of the name.","Mon message affiche `{user_name}` au lieu du pseudo.",{"a":807,"q":810},{"en":808,"fr":809},"It is case-sensitive. Replace it with “~ matches regex” and `/word/iu`.","Elle est sensible à la casse. Remplacez-la par « ~ correspond au regex » avec `/mot/iu`.",{"en":811,"fr":812},"My “contains” condition never matches.","Ma condition « contient » ne réagit jamais.",{"a":814,"q":817},{"en":815,"fr":816},"The delimiters are probably missing: `^vip` is misread, `/^vip/` works.","Il manque sans doute les délimiteurs : `^vip` est mal lu, `/^vip/` fonctionne.",{"en":818,"fr":819},"My regex is always false.","Ma regex est toujours fausse.",{"a":821,"q":824},{"en":822,"fr":823},"A network error, a timeout or a 4xx/5xx response leave the step “Completed”. Read `webhook_response_status` in the step's output: 0 means the request never went through.","Une erreur réseau, un délai dépassé ou une réponse 4xx/5xx laissent l'étape « Terminé ». Lisez `webhook_response_status` dans la sortie de l'étape : 0 signifie que la requête n'a pas abouti.",{"en":825,"fr":826},"The webhook call is green but my service received nothing.","L'appel webhook est vert mais mon service n'a rien reçu.",{"a":828,"q":831},{"en":829,"fr":830},"The URL is empty once variables are replaced, often because a widget variable such as `{service_url}` wasn't filled in at install time. Open “Variables” on the step to read its value.","L'URL est vide une fois les variables remplacées, souvent parce qu'une variable de widget comme `{service_url}` n'a pas été remplie à l'installation. Ouvrez « Variables » sur l'étape pour lire sa valeur.",{"en":832,"fr":833},"My webhook call fails with “Webhook URL is empty”.","Mon appel webhook échoue avec « Webhook URL is empty ».",{"a":835,"q":838},{"en":836,"fr":837},"The workflow isn't active, or the URL was copied wrong. Activate it, then copy the URL again from “Webhook URL & secret”. A URL shut off after repeatedly exceeding 120 calls per minute comes back when you save the workflow again.","Le workflow n'est pas actif, ou l'URL a été mal copiée. Activez-le, puis recopiez l'URL depuis « URL & secret du webhook ». Une URL coupée après des dépassements répétés de 120 appels par minute se réactive en enregistrant à nouveau le workflow.",{"en":839,"fr":840},"My incoming webhook answers 404.","Mon webhook entrant répond 404.",{"a":842,"q":845},{"en":843,"fr":844},"The run starts from the saved version. Use “Save and run”.","L'exécution part de la version enregistrée. Utilisez « Enregistrer et exécuter ».",{"en":846,"fr":847},"The manual test doesn't use my latest change.","Le test manuel n'utilise pas ma dernière modification.",{"a":849,"q":852},{"en":850,"fr":851},"For the editor, the variable is text (incoming webhook, simulated variables, “Set a variable”). Compare a value prepared by the service with “= equal to”, or use a regex.","Pour l'éditeur, la variable est du texte (webhook entrant, variables simulées, « Définir une variable »). Comparez une valeur préparée par le service avec « = égal à », ou utilisez une regex.",{"en":853,"fr":854},"“> greater than” doesn't appear in the operator list.","« > supérieur à » n'apparaît pas dans la liste des opérateurs.",{"id":856,"text":857,"type":63,"level":10},"wfd-limits",{"en":858,"fr":859},"Limits to know","Limites à connaître",{"id":861,"type":300,"items":862,"ordered":317},"wfd-blk-055",[863,866,869,872,875,878,881],{"en":864,"fr":865},"No loops: a cycle in the graph makes the branch fail, and a chain stops after 100 nodes in a row.","Pas de boucle : un cycle dans le graphe fait échouer la branche, et une chaîne s'arrête au-delà de 100 nœuds à la suite.",{"en":867,"fr":868},"At most 50 calls per trigger, counting “Webhook / API call”, its background version and “Call a workflow”, sub-workflows included. Beyond that, the step fails.","50 appels au plus par déclenchement, en comptant « Appel webhook / API », sa version en arrière-plan et « Appeler un workflow », sous-workflows compris. Au-delà, l'étape échoue.",{"en":870,"fr":871},"More than 5 HTTP calls or sub-workflow launches reachable from one trigger: the editor shows a warning at save time, without blocking.","Plus de 5 appels HTTP ou lancements de sous-workflow atteignables depuis un même déclencheur : l'éditeur affiche un avertissement à l'enregistrement, sans bloquer.",{"en":873,"fr":874},"“Wait”: 7 days at most.","« Attendre » : 7 jours au maximum.",{"en":876,"fr":877},"“Call a workflow”: at most 5 nested call levels. A workflow can call another “Sub-workflow entry” it contains, but a routine can't call itself again: calling an entry already running in the chain fails.","« Appeler un workflow » : 5 niveaux d'appels imbriqués au plus. Un workflow peut appeler une autre « Entrée de sous-workflow » qu'il contient, mais une routine ne peut pas se rappeler elle-même : l'appel d'une entrée déjà en cours dans la chaîne échoue.",{"en":879,"fr":880},"“Incoming webhook”: 120 accepted calls per minute. After 3 minutes over the limit within 10 minutes, the URL is disabled until the workflow is saved again.","« Webhook entrant » : 120 appels acceptés par minute. Après 3 minutes en dépassement sur 10 minutes, l'URL est désactivée jusqu'au prochain enregistrement du workflow.",{"en":882,"fr":883},"No native arithmetic, random draw or cooldown: leave them to the called service.","Pas de calcul, de tirage au hasard ni de délai de récupération (cooldown) natif : confiez-les au service appelé.",{"id":885,"type":51,"title":886,"summary":889},"wfd-part-share",{"en":887,"fr":888},"Reusing and sharing","Factoriser et partager",{"en":890,"fr":891},"Sub-workflows, widgets and the Clu assistant.","Sous-workflows, widgets et l'assistant Clu.",{"id":893,"text":894,"type":63,"level":10},"wfd-subworkflows",{"en":895,"fr":896},"Sub-workflows","Sous-workflows",{"id":898,"text":899,"type":41},"wfd-blk-056",{"en":900,"fr":901},"A “Sub-workflow entry” makes a chain callable, like a function. Give it an “Entry name” and declare its “Expected parameters”, each with an optional default value: they become variables further down. One workflow can hold several entries.","Une « Entrée de sous-workflow » rend une chaîne appelable, comme une fonction. Donnez-lui un « Nom de l'entrée » et déclarez ses « Paramètres attendus », chacun avec une valeur par défaut facultative : ils deviennent des variables dans la suite. Un même workflow peut contenir plusieurs entrées.",{"id":903,"text":904,"type":41},"wfd-blk-057",{"en":905,"fr":906},"The “Call a workflow” action picks the “Routine to call” and fills in the “Parameters passed”. With “Wait for the result” set to Yes, the rest of the chain gets the variables the routine produced, but the routine can contain neither a “Wait” nor a background call. Set to No, the routine runs in the background and nothing comes back.","L'action « Appeler un workflow » choisit la « Routine à appeler » et remplit les « Paramètres passés ». Avec « Attendre le résultat » sur Oui, la suite récupère les variables produites par la routine, mais celle-ci ne peut contenir ni « Attendre » ni appel en arrière-plan. Sur Non, la routine part en tâche de fond et rien ne revient.",{"id":908,"text":909,"type":41},"wfd-blk-058",{"en":910,"fr":911},"Example: a “Warn the moderators” routine with a `reason` parameter, called by the anti-spam workflow and by the reports workflow. The alert message is edited in one place.","Exemple : une routine « Prévenir les modérateurs » avec un paramètre `raison`, appelée par le workflow anti-spam et par celui des signalements. Le message d'alerte se modifie à un seul endroit.",{"id":913,"text":914,"type":63,"level":10},"wfd-widgets",{"en":915,"fr":916},"From workflow to widget","Du workflow au widget",{"id":918,"text":919,"type":41},"wfd-blk-059",{"en":920,"fr":921},"A widget is a group of nodes that can be installed in a community, with settings specific to each installation. Click “New widget” in the editor controls (or type “widget” in the “+” palette), put the trigger and actions inside the frame, then open its gear icon to give it a name, a category and its variables. A regular zone becomes a widget when you tick “Make this group an installable widget”. The trigger must sit inside the frame: triggers are what set the widget's compatible networks.","Un widget est un groupe de nœuds installable dans une communauté, avec des réglages propres à chaque installation. Cliquez sur « Nouveau widget » dans les contrôles de l'éditeur (ou tapez « widget » dans la palette « + »), placez le déclencheur et les actions dans le cadre, puis ouvrez sa roue crantée pour lui donner un nom, une catégorie et ses variables. Une zone ordinaire devient un widget en cochant « Faire de ce groupe un widget installable ». Le déclencheur doit être dans le cadre : ce sont les déclencheurs qui fixent les réseaux compatibles du widget.",{"id":923,"text":924,"type":41},"wfd-blk-060",{"en":925,"fr":926},"In “Widget variables”, declare what the installer must provide, for example `service_url` and `api_token`. These names are then used like any variable: `{service_url}/events` in a “Webhook / API call” URL, `{api_token}` in its headers. On a node field, the “Ask at install time” box lets the installer choose the value, yours being the default.","Dans « Variables du widget », déclarez ce que l'installateur doit fournir, par exemple `service_url` et `api_token`. Ces noms s'utilisent ensuite comme toute variable : `{service_url}/events` dans l'URL d'un « Appel webhook / API », `{api_token}` dans ses en-têtes. Sur un champ de nœud, la case « Demander à l'installation » laisse l'installateur choisir la valeur, la vôtre servant de défaut.",{"id":928,"text":929,"type":41},"wfd-blk-061",{"en":930,"fr":931},"“If config” sets a “Question asked at install time”, for example “Enable daily stats?”, with a Yes / No, Text, Number or Choice answer. The TRUE branch runs when the node's comparison holds: each community turns a part of the widget on or off that way.","« Si config » pose une « Question posée à l'installation », par exemple « Activer les stats quotidiennes ? », avec une réponse Oui / Non, Texte, Nombre ou Choix. La branche VRAI part quand la comparaison du nœud est vraie : chaque communauté active ou coupe ainsi une partie du widget.",{"id":933,"text":934,"type":41},"wfd-blk-062",{"en":935,"fr":936},"Installing a widget freezes a copy of it. After a change, the installation page offers an update: webhook URLs and secrets are kept, only settings tied to deleted nodes can be lost.","Installer un widget en fige une copie. Après une modification, la page de l'installation propose une mise à jour : les URL et secrets de webhook sont conservés, seuls les réglages liés à des nœuds supprimés peuvent se perdre.",{"id":938,"type":76,"steps":939,"caption":966},"wfd-blk-063",[940,947,952,959],{"kind":79,"label":941,"detail":944},{"en":942,"fr":943},"Member joined (Discord)","Membre rejoint (Discord)",{"en":945,"fr":946},"provides `{user_mention}`","fournit `{user_mention}`",{"kind":87,"label":948,"detail":949},{"en":89,"fr":90},{"en":950,"fr":951},"`Welcome {user_mention}!`","`Bienvenue {user_mention} !`",{"kind":401,"label":953,"detail":956},{"en":954,"fr":955},"If config","Si config",{"en":957,"fr":958},"“Enable daily stats?”","« Activer les stats quotidiennes ? »",{"kind":87,"label":960,"detail":963},{"en":961,"fr":962},"Record a stat","Enregistrer une stat",{"en":964,"fr":965},"one counter per day, for example `daily_join_{@date}`","un compteur par jour, par exemple `daily_join_{@date}`",{"en":967,"fr":968},"A welcome widget with a statistics option.","Un widget de bienvenue avec une option de statistiques.",{"id":970,"text":971,"type":63,"level":10},"wfd-clu-assistant",{"en":972,"fr":973},"Clu, the editor assistant","Clu, l'assistant de l'éditeur",{"id":975,"text":976,"type":41},"wfd-blk-064",{"en":977,"fr":978},"The “Clu” button in the editor opens an assistant. Describe the scenario in one sentence, for example “When someone joins the Discord, send them a welcome message”: Clu asks questions if needed, then proposes nodes that you add with “Apply”. Review them before saving, especially networks and variable names. Clu needs an AI key, saved in [Settings](dashboard:/settings), “IA User” or “IA Account” tab.","Le bouton « Clu » de l'éditeur ouvre un assistant. Décrivez le scénario en une phrase, par exemple « Quand quelqu'un rejoint le Discord, lui envoyer un message de bienvenue » : Clu pose des questions si besoin, puis propose des nœuds que vous ajoutez avec « Appliquer ». Relisez-les avant d'enregistrer, surtout les réseaux et les noms de variables. Clu demande une clé IA, à enregistrer dans les [Paramètres](dashboard:/settings), onglet « IA Utilisateur » ou « IA Compte ».",{"id":980,"text":981,"type":63,"level":10},"wfd-next",{"en":982,"fr":983},"Going further","Pour aller plus loin",{"id":985,"type":986,"items":987},"wfd-blk-065","links",[988,997,1005],{"url":989,"kind":990,"label":991,"description":994},"dashboard:/workflows","dashboard",{"en":992,"fr":993},"Open workflows","Ouvrir les workflows",{"en":995,"fr":996},"Create a workflow or edit an existing one.","Créer un workflow ou reprendre un existant.",{"url":998,"kind":990,"label":999,"description":1002},"dashboard:/widgets",{"en":1000,"fr":1001},"Widget catalogue","Catalogue des widgets",{"en":1003,"fr":1004},"Install a widget or edit your own.","Installer un widget ou modifier les vôtres.",{"url":1006,"kind":990,"label":1007,"description":1010},"dashboard:/platform-rules",{"en":1008,"fr":1009},"Platform rules","Règles des plateformes",{"en":1011,"fr":1012},"Blocked sequences, network by network.","Les enchaînements bloqués, réseau par réseau.",{},1793373334836]