Logique
Conditions, variables, attentes, boucles et mémoire : organiser ce qui se passe dans un flow.
🔀 Logique
Les blocs de logique ne font rien de visible sur Discord : ils décident quelle branche suivre, calculent une valeur ou gardent une information en mémoire.
[!NOTE] Dans la palette, ces blocs se répartissent en deux sections : Logique (brancher, attendre, boucler — ce que fait cette page) et Valeurs et stockage (variables, mémoire, listes, appel d'une URL — les 3 dernières parties de cette page), pour ne pas tout entasser au même endroit.
🔀 Brancher
Condition
Compare deux valeurs et suit la sortie vrai ou faux. Les valeurs acceptent des variables ({user}, {arg}…).
Opérateurs : égal, différent, contient, ne contient pas, commence par, se termine par, supérieur, inférieur (et ou égal), est vide, n'est pas vide, dans la liste (séparée par des virgules), correspond à une expression régulière. Options : sensible à la casse, ignorer les espaces en début et fin.
Aiguillage (plusieurs cas)
Compare une valeur à une liste de cas, un par ligne (8 au plus). Chaque ligne devient une sortie ; la première qui correspond gagne, sinon la sortie par défaut. Comparaisons : égal, contient, commence par, se termine par, expression régulière.
Tirage au sort
Sépare le flow en deux sorties A et B selon une chance en pourcentage (par exemple 20 % de chances de suivre A).
Décider avec l'IA
Comme Aiguillage, mais le choix n'est pas une comparaison de texte : c'est l'IA de la plateforme qui juge, à partir d'un contexte (qui peut contenir des variables) et d'une liste d'options — une par ligne, 8 au plus, chacune devient une sortie. Si l'IA ne peut pas choisir (quota atteint, fournisseur en panne, délai dépassé, réponse hors options), la sortie par défaut est suivie — jamais d'erreur qui bloque le flow. Coûte un vrai appel IA : plafonné par serveur (quelques appels par minute) pour qu'un flow qui boucle ne consomme pas le budget de tous les autres clients.
🧮 Variables et texte
Définir une variable
Crée ou modifie une variable pour la réutiliser ensuite avec {nom} ou dans une condition. Actions : remplacer, incrémenter, décrémenter, multiplier, diviser, garder le plus petit ou le plus grand, arrondir, nombre aléatoire dans une plage (les bornes acceptent 0 et les nombres négatifs), ajouter au texte (début ou fin), MAJUSCULES, minuscules, Casse De Titre (une majuscule au début de chaque mot, séparé par une espace ou un tiret : « aujourd'hui » devient « Aujourd'hui »), longueur du texte.
Transformer un texte
Range le résultat dans la variable de ton choix.
- Remplacer un texte par un autre (avec ou sans respect de la casse).
- Nettoyer les espaces (début, fin, doublons).
- N-ième mot, ou tout à partir du N-ième mot — pratique pour découper
!ticket problème de connexion. - Extraire avec une expression régulière (le premier groupe, ou toute la correspondance).
- Raccourcir à N caractères.
- Nom propre pour un salon : minuscules, sans accents, tirets (
Été 2026 — Événement !devientete-2026-evenement). - Nombre de lignes, N-ième ligne ou Contient cette ligne (exactement, pas une sous-chaîne) : pour compter, indexer ou tester un texte à une ligne par élément (le « tableau » de cet éditeur) sans le parcourir — pour le parcourir, utilise « Pour chaque ligne d'un texte » plus bas.
Les expressions régulières dangereuses (qui pourraient geler le bot) sont refusées : le résultat reste alors vide.
Choisir un texte au hasard
Tire un texte dans une liste et le range dans une variable (par défaut {choix}). Un texte par ligne, 50 au plus.
- Les variables de la ligne tirée (
{user},{server}…) sont remplacées après le tirage :Bienvenue {user} !fonctionne. - Option « Ne pas tirer deux fois de suite le même texte » : le bloc retient le dernier tirage et l'exclut du suivant (avec un seul texte, il se répète forcément). Cette mémoire est celle du bot en fonctionnement : elle repart de zéro au redémarrage.
- Exemple : des phrases de bienvenue différentes à chaque arrivée, un lot tiré au sort, un GIF parmi une liste d'adresses.
[!NOTE] À ne pas confondre avec Tirage au sort, qui envoie le flow vers une sortie A ou B selon une chance en pourcentage : ici, on tire une valeur, pas un chemin.
Lire le niveau du membre
Récupère le niveau et l'XP d'un membre (messages ou vocal) dans des variables.
⏳ Temps
Attendre
Met le flow en pause pendant quelques secondes (5 minutes au plus). Le flow reste « en cours » pendant l'attente : pour plus long, utilise « Continuer plus tard ».
Attendre une réponse
Le flow s'arrête et attend qu'un membre réponde, dans le salon, par un message ou par une réaction, puis continue avec cette réponse. À placer après un message envoyé par le flow (la question) : « Quel est ton pseudo ? » → attendre → enregistrer le pseudo ; « Réagis avec ✅ pour accepter le règlement » → attendre → donner le rôle.
- Ce que le flow attend : un message dans un salon (par défaut celui du flow), ou une réaction sur un message précis (la variable qui contient son identifiant, ou à défaut le message du déclencheur). Pour une réaction, tu peux exiger un emoji précis : les autres sont ignorés.
- Seulement le membre du flow (activé par défaut) : la réponse d'un autre membre est ignorée. Désactive-le pour accepter la première réponse de n'importe qui. Sans membre associé (déclencheur par webhook, par exemple), n'importe qui convient.
- Attendre au plus : de 5 secondes à 15 minutes (2 minutes par défaut).
- Les messages des bots sont toujours ignorés (la question du flow ne compte pas comme réponse).
Trois sorties : Réponse reçue, Sans réponse (délai dépassé) et Échec (salon ou message introuvable, trop d'attentes en cours…, la raison est dans {error}).
La réponse arrive dans la variable choisie ({reply} par défaut). Pour un message, tu as aussi {reply_message_id} (son identifiant) et {reply_attachment} (le lien du premier fichier joint, vide s'il n'y en a pas — pratique pour demander une capture d'écran) ; pour une réaction, {reply_emoji}. Le texte reçu est nettoyé : un @everyone, un @here ou une mention de rôle est neutralisé. L'option « Supprimer le message reçu après l'avoir lu » demande la permission Gérer les messages ; sans elle, le message reste et le flow continue.
À savoir : la réponse déclenche aussi, comme n'importe quel message, les autres flows qui l'écoutent. Un membre ne peut pas avoir plus de 2 attentes en cours, un serveur plus de 30. Si le bot redémarre pendant l'attente, elle est perdue et le flow ne reprend pas. Pour un délai plus long ou qui doit survivre à un redémarrage, utilise « Continuer plus tard ».
Continuer plus tard
Arrête la branche maintenant et la reprend plus tard, jusqu'à 90 jours après — même si le bot redémarre entre-temps. Tu peux donner un nom à l'attente : une nouvelle attente avec le même nom remplace la précédente. Par défaut, si le membre a quitté le serveur entre-temps, la suite est abandonnée ; une case permet de continuer quand même.
Exemple : « 3 jours après l'arrivée, envoyer un message de suivi ».
Si l'attente est refusée (trop d'attentes déjà en cours sur le serveur, échéance trop lointaine…), le bloc sort par Échec et la raison est dans {error} : tu peux prévenir un modérateur. Sans sortie Échec reliée, la branche s'arrête — la suite ne part jamais tout de suite à la place.
Annuler une attente
Annule une attente en cours par son nom (typiquement quand la condition n'a plus lieu d'être : le membre a passé la vérification).
🧠 Mémoire
La mémoire garde des informations que Discord ne conserve pas, d'un déclenchement à l'autre : le nombre d'avertissements d'un membre, une date, un état… Elle est propre à ton serveur et ne se mélange jamais avec celle des autres.
Écrire dans la mémoire
Deux portées : du membre (une valeur par membre) ou du serveur (commune à tous). Actions : définir une valeur, ajouter à un compteur (un nombre négatif retranche), effacer. La nouvelle valeur peut être rangée dans une variable. Deux sorties : Suite et Échec (nom vide, nom réservé, valeur trop longue, quota atteint, ou aucun membre à qui rattacher la donnée ; la raison est dans {error}). Sans sortie Échec reliée, le flow continue comme avant.
Lire la mémoire
Met une donnée dans une variable, avec une valeur par défaut si elle n'existe pas encore (le premier passage d'un compteur). Ensuite, une Condition peut tester « avertissements ≥ 3 ».
[!NOTE] Les noms de données commençant par
__sont réservés au fonctionnement interne et ne peuvent être ni lus ni écrits.
📚 Listes
Une liste garde des éléments nommés, chacun avec ses propres champs. Exemple : la liste objets d'un jeu de rôle, où chaque objet a une attaque (nombre), une rarete (texte) et un prix (nombre). Ensuite, tes flows lisent, tirent au hasard, modifient et affichent ces éléments, et tes commandes peuvent les proposer comme suggestions.
Créer une liste : l'onglet Listes
Dans l'éditeur, le panneau de droite a un onglet Listes (l'icône en forme de liste, à côté de « Variables »).
- Tape le nom de la liste (« Objets du jeu ») et clique sur Créer.
- Ajoute ses champs : un nom (
attaque), un type — texte, nombre ou oui / non — et, si tu veux, une valeur par défaut. Clique sur Enregistrer les champs. Ajouter ou retirer un champ garde tes éléments. - Ajoute les éléments : un nom (« Épée longue ») et la valeur de chaque champ. Chaque modification est enregistrée tout de suite. Renommer un élément change son nom partout.
Limites : 20 listes par serveur, 10 champs par liste, 500 éléments par liste, 100 caractères pour un nom, 200 pour une valeur. Un nombre vaut 0 par défaut et un oui / non vaut non. Le nom d'un élément ne tient compte ni des majuscules ni des accents (« Épée » et « epee » sont le même élément). Une valeur invalide (du texte dans un nombre) est refusée, jamais corrigée en silence. Les listes d'un serveur ne sont jamais visibles depuis un autre serveur.
Lire un élément d'une liste
Cherche un élément par son nom (accepte une {variable}, par exemple {objet} reçu d'une commande) et pose ses valeurs en variables. Si tu écris item comme préfixe (c'est la valeur par défaut) :
{item}et{item_name}: le nom de l'élément ;{item_attaque},{item_rarete}… : un champ, une variable par champ de la liste.
Trois sorties : Trouvé, Introuvable (les variables sont alors vides) et Échec (liste inconnue, nom vide…).
Tirer un élément d'une liste au hasard
Tire un élément : le butin d'un coffre, une récompense, une question. Deux réglages optionnels :
- un champ de poids (un nombre) : plus il est grand, plus l'élément sort souvent ; un poids de
0ne sort jamais. Sans champ de poids, tous ont la même chance ; - un filtre : « ne garder que les éléments dont
rareteestrare»,attaque≥ 10, le nom contientépée… Les nombres se comparent comme des nombres (9est plus petit que10).
Mêmes variables que « Lire un élément », plus {item_count} : combien d'éléments étaient candidats. Sorties : Tiré, Liste vide (aucun candidat) et Échec.
Modifier une liste
Ajoute, change ou retire un élément :
| Action | Ce que ça fait |
|---|---|
| Ajouter ou modifier | crée l'élément, ou change les champs cités |
| Ajouter | comme au-dessus, mais échoue si l'élément existe déjà |
| Modifier | échoue s'il n'existe pas |
| Retirer | supprime l'élément (rien ne se passe s'il n'existe déjà plus) |
Les champs à écrire se donnent une ligne par champ :
attaque=12
rarete=épique
stock+=5
stock-=1= remplace, += ajoute et -= retranche (champs nombre seulement). Un champ que tu ne cites pas garde sa valeur (ou sa valeur par défaut à la création). Après l'écriture, {item}, {item_attaque}… portent l'élément tel qu'il est enregistré. Sortie Échec : liste inconnue, valeur invalide, champ inconnu, liste pleine.
[!NOTE] Chaque ligne est traitée séparément : une variable qui contient un retour à la ligne (un texte tapé par un membre, par exemple) ne peut pas ajouter une ligne
poids=999. Elle reste une seule valeur.
Afficher une liste en texte
Transforme une liste en texte prêt à envoyer dans un message : une ligne par élément, écrite avec ton modèle ({name} — attaque {attaque} ({rarete})). Tu peux trier par un champ (du plus grand au plus petit si tu veux), filtrer, et limiter à N éléments (50 au plus). Variables : {liste} (le texte, 2 000 caractères au plus : une ligne qui ne tient pas est abandonnée en entier) et {liste_count} (combien d'éléments correspondent au filtre, avant la limite : avec une limite de 5 sur 12 éléments, {liste_count} vaut 12, ce qui permet d'écrire « 5 affichés sur 12 »).
Pour chaque élément d'une liste
Parcourt tous les éléments retenus (même filtre et même tri que « Afficher une liste en texte »), et exécute une suite de blocs une fois par élément, avec ses champs en variables — même convention que « Lire un élément d'une liste » ({item}, {item_name}, {item_champ}…). Aucun membre n'est associé au corps de la boucle : {user} etc. restent vides, comme pour un déclencheur sans membre.
Deux sorties : pour chaque élément (le corps) puis terminé. C'est ce qu'il faut pour agir sur chaque objet d'une boutique (rappeler un événement, republier un catalogue…) — pour n'en tirer qu'un, reste sur « Tirer un élément d'une liste au hasard ».
Exemple : une boutique de RPG
- Onglet Listes :
objetsavec les champsattaque(nombre),prix(nombre),stock(nombre). - Commande
/acheter objet:dont le paramètreobjetpropose les éléments de la listeobjets(source « Liste du serveur »). - Dans le flow,
{objet_prix}et{objet_stock}sont déjà là : une Condition vérifie{objet_stock}> 0, un bloc Modifier une liste écritstock-=1, puis un message annonce l'achat.
🔁 Boucle
Trois blocs bouclent, selon ce que tu parcours : des membres, un texte (le « tableau » de cet éditeur : une valeur par ligne, comme partout ailleurs dans l'éditeur), ou une liste du serveur (juste au-dessus). Les trois se règlent pareil (nombre maximum d'éléments, pause entre deux, actions sensibles à autoriser explicitement) et partagent les mêmes variables.
Pour chaque membre ayant ce rôle
Exécute une suite de blocs une fois par membre qui a un rôle. Deux sorties : pour chaque membre (le corps de la boucle, où le membre courant devient « le membre du flow » : {user}, {mention}, « Ajouter un rôle »… le visent) puis terminé (une seule fois, à la fin).
Réglages : rôle, nombre maximum de membres, ordre (du plus ancien au plus récent, l'inverse, ou au hasard), pause entre deux membres, inclure ou non les bots.
Pour chaque ligne d'un texte
Parcourt un texte, une valeur par ligne (ou séparée par une virgule — pratique pour une variable déjà jointe, comme {role_names}), et pose la ligne courante dans la variable de ton choix ({line} par défaut) à chaque passage. Aucun membre associé au corps : {user} etc. restent vides.
C'est le tableau de cet éditeur : pas besoin d'une liste du serveur (persistée, à champs) pour une suite de valeurs jetable — un texte à une ligne par élément suffit, et « Transformer un texte » sait le compter/l'indexer/le tester sans même boucler (voir plus haut).
Variables communes aux trois boucles
{loop_index} et {loop_total} dans le corps ; après la boucle : {loop_done} (éléments traités), {loop_total}, {loop_aborted} (raison d'un arrêt anticipé) et {loop_skipped} (raison d'un refus de démarrer, par exemple une liste ou un texte vide).
[!WARNING] Une boucle transforme une action en beaucoup d'actions Discord : des plafonds stricts, non réglables au-delà de leur maximum, la protègent (voir les limites) — les mêmes plafonds pour les trois blocs, qu'il s'agisse de membres, de lignes ou d'éléments de liste. Les actions sensibles (bannir, expulser, exclure, supprimer, appeler une URL…) sont ignorées dans le corps de la boucle, sauf si tu coches explicitement l'autorisation. Une boucle ne peut pas en contenir une autre.
🧩 Sous-flows
Exécuter un autre flow
Lance un modèle (un flow dont le déclencheur est Appelé par un autre flow) du même serveur, puis reprend par la sortie Suite. Le modèle travaille sur le même membre, le même salon et le même message que le flow qui l'appelle.
- Les variables circulent dans les deux sens : le modèle voit celles de l'appelant, et l'appelant récupère celles que le modèle a créées ou modifiées.
- Deux sorties : Suite et Échec. En cas d'échec,
{error}donne la raison :flow introuvable,flow désactivé,ce flow n'est pas un modèle,appel circulaire,profondeur maximale atteinte,trop d'appels de flows. Sans fil sur Échec, le flow continue par Suite. - Dans l'éditeur, le sélecteur ne propose que les modèles de ton serveur, et jamais le flow que tu es en train d'éditer.
Protections : un modèle ne peut pas rappeler un flow déjà en cours (A appelle B qui rappelle A : refusé), on ne peut pas imbriquer plus de 3 appels, et un même flow de départ ne peut faire que 20 appels au total. Seuls les flows de ton serveur sont appelables.
[!WARNING] Un « Continuer plus tard » placé dans le modèle arrête la suite du modèle et la reprendra plus tard : le flow appelant, lui, continue tout de suite. N'importe laquelle des trois boucles peut appeler un modèle (un appel par élément), mais ce modèle ne peut pas contenir lui-même une boucle, et ses actions sensibles restent ignorées tant que l'autorisation de la boucle n'est pas cochée.