Variables, filtres et limites
Les variables disponibles dans un flow, les filtres communs à tous les déclencheurs, les limites de protection et le dépannage.
🧩 Variables, filtres et limites
🧩 Les variables
Dans n'importe quel champ texte d'un flow, écris le nom d'une variable entre accolades : Bienvenue {user} sur {server} !. Elle est remplacée à l'exécution. Dans l'éditeur, tape { pour voir la liste.
Il y a deux familles, qui ne se mélangent jamais :
- 🔵 les variables Discord : des faits lus sur Discord (le membre, le serveur, le salon), recalculés à chaque exécution ;
- 🟠 les variables OpenBots : celles que OpenBots fournit ou calcule (nom affiché, date et heure, ce que produit un déclencheur ou un bloc, tes propres variables).
Dans l'éditeur, une variable Discord s'affiche en pastille bleue, une variable OpenBots en pastille ambrée ; une variable inconnue (faute de frappe, réglage oublié) s'affiche en gris, avec un bouton + pour la déclarer.
[!WARNING] Les textes écrits par des membres sont neutralisés. Le bot a plus de droits qu'un membre : sans précaution, quelqu'un qui écrirait
@everyonedans un message que ton flow répète ferait notifier tout le serveur au nom du bot. Dans le texte d'un message ({arg}de « Message envoyé », « Message avec un mot-clé », modifié, supprimé), un nom de fil, un pseudo, une raison de bannissement, une réponse de formulaire ou de webhook,@everyone,@hereet les mentions de rôle sont donc désactivés (un espace invisible est glissé dedans : le texte reste lisible et rien n'est notifié). Les mentions de membres restent actives, elles ne notifient qu'une personne. Conséquence : une Condition «{arg}contient@everyone» ne peut plus correspondre. Pour repérer ces messages, utilise plutôt le filtre du déclencheur (« Message avec un mot-clé »), qui lit le message d'origine.
[!NOTE] Quand le déclencheur n'a pas de membre (« Salon créé », « Rôle supprimé », « Répétition programmée », « Webhook entrant »…), les variables du membre sont vides. Une variable inconnue reste écrite telle quelle (
{coquille}) dans le message : c'est le signe d'une faute de frappe ou d'un réglage à cocher.
🔵 Variables Discord
Ce sont des informations que Discord connaît, converties en une forme directement utilisable : des jours (pour comparer), des réponses oui / non (faciles à tester dans une Condition) et des dates Discord que chaque lecteur voit dans son propre fuseau et sa propre langue. Elles ne sont jamais stockées : elles sont relues à chaque exécution.
Elles sont toutes disponibles dans tous les flows ; quand l'information manque, elles sont vides.
Le membre
| Variable | Contenu |
|---|---|
{user_id} | Identifiant Discord du membre |
{user_nick} | Pseudo sur le serveur (vide s'il n'en a pas) |
{user_global_name} | Nom d'affichage Discord du membre |
{user_avatar} | Lien de l'avatar du membre |
{account_created} | Date de création du compte (date Discord) |
{account_age_days} | Âge du compte, en jours |
{server_joined} | Date d'arrivée sur le serveur (date Discord) |
{server_age_days} | Ancienneté sur le serveur, en jours |
{role_count} | Nombre de rôles du membre (sans @everyone) |
{top_role} | Le rôle le plus haut du membre |
{role_names} | Les noms de ses rôles, du plus haut au plus bas, séparés par des virgules |
{has_default_avatar} | oui / non |
{is_bot} | oui / non |
{is_suspicious} | oui / non (compte marqué suspect par Discord) |
{is_boosting} | oui / non (booste le serveur) |
{is_owner} | oui / non (propriétaire du serveur) |
{is_admin} | oui / non (a la permission Administrateur) |
{is_timed_out} | oui / non (exclu temporairement en ce moment) |
{in_voice} | oui / non (connecté à un salon vocal) |
Exemple : Compte créé le {account_created} (il y a {account_age_days} jours), arrivé le {server_joined}.
Le serveur
| Variable | Contenu |
|---|---|
{server_id} | Identifiant du serveur |
{server_icon} | Lien de l'icône du serveur |
{server_owner} | Mention du propriétaire |
{server_created} | Date de création du serveur (date Discord) |
{server_boost_level} | Niveau de boost, de 0 à 3 |
{server_boost_count} | Nombre de boosts |
{server_channels} | Nombre de salons |
{server_roles} | Nombre de rôles (sans @everyone) |
{server_emojis} | Nombre d'emojis personnalisés |
Le salon
Le salon où l'événement a lieu (celui du message, du bouton cliqué…).
| Variable | Contenu |
|---|---|
{channel_id} | Identifiant du salon |
{channel_name} | Nom du salon |
{channel_type} | Type : texte, vocal, annonces, scène, catégorie, forum… |
{channel_topic} | Sujet du salon (vide s'il n'en a pas) |
{category_name} | Nom de la catégorie du salon |
Pour les déclencheurs « Salon créé » et « Salon supprimé », ces variables décrivent le salon concerné (celui qui vient d'être créé ou supprimé), pas le salon de contexte.
À l'arrivée d'un membre
Deux variables n'existent que pour le déclencheur « Arrivée d'un membre » :
| Variable | Contenu |
|---|---|
{is_returning} | oui / non : le membre a déjà rejoint ce serveur avant |
{invite_code} | Code de l'invitation utilisée |
[!NOTE] Les textes que les membres écrivent eux-mêmes (pseudo, nom d'un rôle, sujet d'un salon…) ont leurs
@everyone,@hereet mentions de rôle neutralisés avant d'être mis dans une variable : le bot peut les reposter sans notifier personne. Les textes longs sont coupés à 500 caractères.
🟠 Variables OpenBots
De base
Disponibles dans tous les flows.
| Variable | Contenu |
|---|---|
{user} | Nom affiché du membre |
{mention} | Mention du membre (@membre) |
{username} | Nom d'utilisateur Discord |
{server} | Nom du serveur |
{count} | Nombre de membres du serveur |
{channel} | Le salon courant (mention cliquable) |
🕒 Date et heure
Disponibles dans tous les flows, même sans membre (comme « Répétition programmée »).
| Variable | Contenu |
|---|---|
{date} | Date du jour, JJ/MM/AAAA (ex. 19/09/2026) |
{time} | Heure, HH:MM (ex. 21:33) |
{datetime} | Date et heure, JJ/MM/AAAA HH:MM |
{date_iso} | Date au format AAAA-MM-JJ |
{weekday} | Jour de la semaine : lundi, mardi… |
{weekday_number} | Numéro du jour : 1 (lundi) à 7 (dimanche) |
{day} | Jour du mois, de 1 à 31 |
{month} | Mois : janvier, février… |
{month_number} | Numéro du mois, de 1 à 12 |
{year} | Année (ex. 2026) |
{hour} | Heure, de 0 à 23 |
{minute} | Minute, de 00 à 59 |
{timestamp} | Horodatage Discord (voir ci-dessous) |
- Elles suivent le fuseau du déclencheur : le champ « Fuseau des heures et jours actifs » (ex.
Europe/Paris), ou le fuseau propre à « Répétition programmée ». Sans fuseau, c'est l'heure UTC (deux heures de moins qu'à Paris l'été) : renseigne un fuseau pour afficher la bonne heure. - La date et le jour de la semaine suivent le fuseau : à Paris, à 0 h 30, on est déjà « demain ».
{timestamp}sert aux horodatages Discord, que chaque lecteur voit dans son propre fuseau :<t:{timestamp}:F>(date complète),<t:{timestamp}:t>(heure),<t:{timestamp}:R>(« il y a 3 minutes »).- Les numéros (
{weekday_number},{month_number},{hour}) servent à comparer dans une Condition : «{hour}≥ 22 », «{weekday_number}> 5 » pour le week-end. - Exemple :
Bonjour {user} ! Nous sommes {weekday} {day} {month}, il est {time}. - Ces noms sont réservés : tu ne peux pas déclarer une variable du serveur qui s'appelle
date,hour… (une variable déjà déclarée avant sous ce nom garde sa valeur).
Fournies par un déclencheur
Chaque déclencheur ajoute les siennes, seulement pour lui. Elles sont détaillées, déclencheur par déclencheur, dans la page des déclencheurs.
| Famille | Variables |
|---|---|
| Message | {arg} (le texte), {message_id}, {message_link}, {attachment_count}, {link_count}, {mention_count} |
| Commande slash | un {paramètre} par paramètre de la commande (et {paramètre_id} pour un membre, un salon, un rôle ou un fichier joint) |
| Réaction, sondage | {emoji}, {answer_id} |
| Pseudo modifié | {old_nick}, {new_nick}, {nick_cleared} |
| Bannissement | {ban_reason} |
| Exclusion temporaire | {timeout_until}, {timeout_minutes}, {timeout_ended} |
| Rôle créé, supprimé | {role_name}, {role_id}, {role_color}, {role_mention} |
| Fil de discussion | {thread_name}, {thread_id}, {thread_type}, {parent_name}, {is_forum_post}, {thread_locked} |
| Auteur d'une action (option « Chercher QUI a fait l'action ») | {actor}, {actor_id}, {actor_mention}, {actor_is_bot} |
| AutoMod | {automod_rule}, {automod_rule_id}, {automod_action}, {automod_trigger}, {automod_keyword}, {automod_content} |
| Webhook entrant | {webhook_clé} pour chaque clé du JSON reçu, et {webhook_body} |
Produites par un bloc
Un bloc peut poser des variables pour la suite du flow.
| Bloc | Variables |
|---|---|
| Après un échec (sortie « Échec ») | {error} : la raison |
| Les trois boucles (Pour chaque membre / ligne d'un texte / élément d'une liste) | {loop_index}, {loop_total}, {loop_done}, {loop_aborted}, {loop_skipped} ; plus {line} (la ligne, boucle sur un texte) ou {préfixe}/{préfixe_champ} (l'élément, boucle sur une liste) |
| Appeler une URL externe | {http_status}, {http_body}, {http_value} (ou les noms que tu as choisis) |
| Lire le niveau du membre | {level}, {xp} (ou les noms que tu as choisis) |
| Afficher un formulaire | une variable par question posée |
| Lire / Tirer / Modifier une liste | {préfixe} et {préfixe_name} (le nom de l'élément), un {préfixe_champ} par champ de la liste, et {préfixe_count} pour « Tirer au hasard » |
| Afficher une liste en texte | {liste} (le texte) et {liste_count} (le nombre d'éléments qui correspondent, avant la limite ; ou les noms que tu as choisis) |
| Attendre une réponse | {reply} (ou le nom choisi), {reply_message_id}, {reply_attachment}, {reply_emoji} |
| Blocs avec « Enregistrer … dans la variable » | le message envoyé, le salon, le rôle ou le fil créé, l'invitation… |
| Définir une variable, Transformer un texte, Lire la mémoire | la variable que tu nommes |
Les variables de ton serveur
Tu peux aussi déclarer tes propres variables (depuis l'éditeur : tape {coquille}, puis clique sur le + gris). Elles sont propres au serveur et gardent leur valeur d'une exécution à l'autre. Voir Créer tes propres variables.
La variable {error}
Après l'échec d'une action (sortie Échec), {error} contient la raison. Elle n'existe qu'à partir du moment où une action échoue.
Créer tes propres variables
- Le bloc Définir une variable et le bloc Transformer un texte créent une variable.
- Beaucoup d'actions ont un champ « Enregistrer … dans la variable » : le message envoyé, le salon, le rôle ou le fil créé, l'invitation…
- Lire la mémoire, Lire le niveau et Appeler une URL externe rangent aussi leur résultat dans des variables.
- Afficher un formulaire crée une variable par question posée : la réponse du membre.
- Webhook entrant crée une variable par clé du JSON reçu (
{webhook_clé}), plus{webhook_body}. - Attendre une réponse range la réponse dans la variable de ton choix (
{reply}par défaut), plus{reply_message_id},{reply_attachment}ou{reply_emoji}.
Une variable vit le temps d'une exécution du flow : chaque déclenchement repart de zéro. Pour garder une information d'un déclenchement à l'autre, utilise la mémoire, ou une variable du serveur déclarée depuis l'éditeur, dont la valeur est conservée.
Dans une boucle (membre, ligne de texte ou élément de liste), chaque passage repart des variables d'avant la boucle : ce que tu modifies pour l'un ne « fuit » pas vers le suivant.
🧰 Filtres communs aux déclencheurs
Tous les déclencheurs proposent ces garde-fous optionnels (certains sont retirés là où ils n'ont pas de sens, par exemple les filtres de rôle pour un déclencheur sans membre).
| Filtre | Effet |
|---|---|
| Ne pas exécuter si le membre a ce rôle | Exclut un rôle |
| Ne pas exécuter dans ce salon / Seulement dans ce salon | Exclut, ou limite à, un salon |
| Ignorer si le membre est un bot | Ignore les bots |
| Heures actives, jours actifs, fuseau | Limite le flow à certaines heures et jours. Sans fuseau, l'heure est UTC : indique par exemple Europe/Paris |
| Anti-spam par membre | Une fois par membre toutes les N secondes |
| Anti-spam global | Une fois pour tout le serveur toutes les N secondes |
| Maximum par jour | Plafonne le nombre de déclenchements quotidiens du flow |
| Âge minimum du compte / Ancienneté minimum | Écarte les comptes ou membres trop récents |
| Effectif minimum / maximum du serveur | Le flow ne tourne que dans cette fourchette de taille |
| Délai avant exécution | Attend quelques secondes avant de démarrer |
| Variable de contexte | N'exécute que si une variable du déclencheur vaut exactement une valeur |
| Journal | Écrit un message dans un salon, et/ou dans les journaux du site, à chaque déclenchement |
Les actions ont aussi leurs filtres : ne s'exécuter que pour un rôle, ignorer un rôle, ne s'exécuter que dans un salon ou l'ignorer, ignorer les bots. Et beaucoup d'entre elles peuvent poster une notification (dans un salon choisi, en message simple ou en embed, avec mention d'un rôle, message privé au membre, auto-suppression, anti-spam…).
🚧 Limites et protections
Un même bot peut servir plusieurs serveurs : ces plafonds évitent qu'un flow mal réglé (ou malveillant) n'ait de conséquences sur les autres. Ils sont fixes.
| Sujet | Limite |
|---|---|
| Les trois boucles (membre, ligne de texte, élément de liste) | 100 éléments au plus ; pause de 0,3 à 5 s entre deux ; 3 minutes au total ; une seule boucle à la fois par serveur ; 30 s minimum entre deux boucles ; 12 boucles par heure ; arrêt après 5 échecs de suite ; pas de boucle dans une boucle |
| Exécuter un autre flow | 3 appels imbriqués au plus ; 20 appels par exécution du flow de départ ; pas d'appel circulaire ; flows du même serveur uniquement |
| Attendre | 5 minutes au plus |
| Attendre une réponse | 5 secondes à 15 minutes ; 2 attentes en cours par membre, 30 par serveur |
| Continuer plus tard | 90 jours au plus ; 2 000 attentes en cours par serveur |
| Mémoire | Nom de donnée : 100 caractères ; valeur : 2 000 caractères ; 5 000 données par serveur |
| Commande slash | 25 paramètres au plus par commande, 100 commandes par serveur (limites de Discord) ; nom de commande de 32 caractères, description de 100 |
| Listes | 20 listes par serveur ; 10 champs par liste ; 500 éléments par liste ; 100 caractères par nom, 200 par valeur ; « Afficher une liste » : 50 lignes et 2 000 caractères au plus |
| Formulaire | 5 questions au plus ; 10 minutes d'attente de la réponse ; 3 formulaires ouverts par membre, 25 par serveur ; réponses de 4 000 caractères au plus |
| Webhook entrant | Corps de 16 Ko au plus ; 20 variables, valeurs de 2 000 caractères ; 30 appels par minute et par flow, 300 par serveur ; 20 flows lancés en même temps par serveur ; 10 webhooks par serveur |
| Message privé | 20 par minute et par serveur ; 2 000 caractères |
| Appel d'URL | 30 par minute et par serveur ; 15 s de délai ; réponse lue jusqu'à 64 Ko ; adresses internes refusées ; aucune redirection suivie |
| Expressions régulières | 200 caractères pour le motif, 2 000 pour le texte analysé ; les motifs à risque (qui pourraient geler le bot) sont refusés |
| « Chercher QUI a fait l'action » | Quelques lectures du journal d'audit par minute et par serveur |
| Exclusion temporaire | 28 jours au plus |
| Invitation | 7 jours au plus |
| Mode lent | 6 heures au plus |
| Sondage | 2 à 10 réponses ; 32 jours au plus |
| Supprimer plusieurs messages | 100 messages au plus |
Les actions sensibles (expulser, bannir, débannir, exclure, supprimer un rôle, un salon ou un emoji, supprimer plusieurs messages, appeler une URL, envoyer un message privé) sont ignorées dans une boucle tant que l'autorisation explicite n'est pas cochée.
🩺 Dépannage : « ça ne se passe pas »
- Le flow est-il enregistré et activé ? Rien n'est sauvegardé automatiquement.
- Le bot a-t-il la permission ? Discord refuse une action sans permission — et un rôle visé plus haut que celui du bot ne peut pas être donné, retiré ni modifié. Relie la sortie Échec de l'action à un message contenant
{error}pour voir la raison exacte. - Un filtre bloque-t-il ? Regarde les heures actives (l'heure est UTC sans fuseau), les anti-spam, le rôle requis, le salon.
- Essaie le bouton Tester : il ignore les filtres du déclencheur. S'il fonctionne alors que le vrai événement ne fait rien, c'est un filtre.
- Active le journal du déclencheur : un message dans un salon à chaque déclenchement te dit si le flow démarre bien.
- Une variable reste écrite
{comme ça}: elle n'existe pas pour ce déclencheur, ou son nom comporte une faute. - Un message privé n'arrive pas : le membre les a probablement fermés. Utilise la sortie « échec » du bloc pour prévenir autrement.