Gründer Scripting
Pour pouvoir réaliser plus de trucs avec !chatbot, j'ai ajouté quelques commandes dont la syntaxe est hyper chiante, alors accrochez vous.
Contents
Principes de bases
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.
Accumulation de commandes
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une autre commande. Cette autre commande doit être passée en argument à la première commande. Prenons l'exemple de la commande !in
qui exécute la dite autre commande après un temps donné :
-
§in 5s, !am db_ah
Cette commande jouera le fameux "AH !" de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de !in
est la commande à lancer après le temps donné. Mais cela n'est pas nécessaire; en effet : la commande !in
ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,
-
!in 5s !am db_ah
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que !script
, qui exécute tour à tour les commande qui lui sont passées en argument :
-
§script !am db_ah, !am r_issou
Ceci exécutera !am db_ah
puis !am r_issou
. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.
-
!script !am db_ah !am r_issou
(invalide)
Aura pour effet :
- De lancer
!am
sans argument (causera une erreur) - D'écrire dans le chat 'db_ah'
- De re-lancer
!am
sans argument (causera à nouveau une erreur) - D'écrire dans le chat 'r_issou'
Les tokens numérotés ($x)
Vous vous souvenez de la commande !chatbot qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de "remplaçage" ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons !random
:
-
!random 1 6 Le résultat est $0
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande !random
.
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont "une valeur de retour" ?
-
!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0
(invalide)
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?
- La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.
- Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera
!random 1 6 Le premier nombre est x et le deuxième x
- La deuxième commande est exécutée. Elle choisi le nombre y.
- Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.
Pour y remédier, il faut échapper le second $0 :
-
!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0
Là, ça marche. Détaillons tout de même ce qui se passe :
- La première commande est exécutée. Elle choisi un nombre au hasard x.
- Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x sauf ceux qui sont échappés. Ainsi, la commande sera
!random 1 6 Le premier nombre est x et le deuxième $0
- La deuxième commande est exécutée. Elle choisi le nombre y.
- Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.
Les tokens nommés
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté "les tokens nommés". Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.
Cela ce fait en deux étapes :
- Déclaration : On liste les noms de chaque tokens utilisés:
!{token1, token2, ...}nom_de_la_commande
- Invocation : Chaque occurrence
${nom_du_token}
sera remplacée par sa valeur
Exemple : !{token1, token2, token3}commande ${token1} ${token2} ${token3}
aura le même effet que !commande $0 $1 $2
.
Remarque : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans !{un_token}commande ${un_autre_token}
, ${un_autre_token}
ne bougera pas et restera toujours ${un_autre_token}
.
Reprenons l'exemple de la partie ci-dessus :
-
!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande !say
(qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car les tokens nommés ne fonctionnent qu'avec les commandes. Sans tokens nommés, cette commande est inutile.
Bref, voyons le fonctionnement du code ci-dessus en détails :
- La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.
- Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera
!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}
. Comme elle ne connaît pas de token nommé "nombre_2", elle ne touche pas à ${token_2} et le laisse intacte. - La deuxième commande est exécutée. Elle choisi le nombre y.
- Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat "Le premier nombre est x et le deuxième y" comme prévu.
Les commandes
!chatbot
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail ici.
!if
Syntaxe :
-
!if cond !commande à exécuter
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.
!ifelse
Syntaxe :
-
§ifelse cond, !commande si vrai, !commande si faux
Si 'cond' est 0, false, ou est vide, alors !commande si faux
sera exécuté. Sinon, !commande si vrai
sera lancé.
!ifnot
Syntaxe :
-
!ifnot cond !commande à exécuter
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.
!in
Syntaxe :
-
!in temps(ms|s|m|h) !commande à exécuter
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre entier suivi d'une unité accolée. Exemples :
Texte | Interprétation |
---|---|
758ms | 758 millisecondes |
3s | 3 secondes |
12m | 12 minutes |
2h | 2 heures |
13 s | INVALIDE: l'espace ne doit pas être présent |
7.0s | INVALIDE: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier. |
!macro
Syntaxe :
-
!macro add nom !commande à executer
-
!macro exec nom param0 param1 param2 etc...
-
!macro delete nom
La syntaxe 1 permet d'ajouter une macro nommée "nom". Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...
La syntaxe 2 permet d'appeler une macro nommée "nom".
La syntaxe 3 permet de supprimer la macron "nom".
Remarque : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).
!math
Syntaxe :
-
!math a opérateur b !commande à exécuter
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :
Opérateur | Opération | |
---|---|---|
+ | Additionne a et b | |
- | Soustrait b à a | |
* | Multiplie a et b | |
/ | Divise a par b | |
% | Calcule le reste de la division de a par b | |
^ | Calcule a puissance b | |
>= | Si a >= b, 1 ; sinon 0 | |
> | Si a > b, 1 ; sinon 0 | |
<= | Si a <= b, 1 ; sinon 0 | |
< | Si a < b, 1 ; sinon 0 | |
== | Si a == b, 1 ; sinon 0 | |
!= | Si a != b, 1 ; sinon 0 | |
&& | Si a == 0, 0 ; sinon b (et logique) | |
|
Si a == 0, b ; sinon a (ou logique) |
Remarque : un i
peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :
-
!math 1 / 2
retournera 0.5 -
!math 1 /i 2
retournera 0
!random
Syntaxe :
-
!random min max !commande à exécuter
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.
!repeat
Syntaxe :
-
!repeat n !commande à exécuter
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.
Remarque : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...
!say
Syntaxe :
-
!say message à écrire
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.
!script
Syntaxe :
-
§script commande1, commande2, commande3, ...
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.
Exemple
On souhaite spammer avec des mêmes audios. Disons, 20 fois le "AH !" de Denis.
-
!repeat 20 !am db_ah
C'est bien, mais tout se lance en même temps car !am n'attends pas la fin du meme audio.
-
!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah
Cette commande va lancer :
- !in 0ms !am db_ah
- !in 100ms !am db_ah
- !in 200ms !am db_ah
- ...
- !in 2000ms !am db_ah
Autrement dit, elle va jouer "db_ah" toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :
-
!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0
- ou
!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}
avec des arguments nommés
Et voilà ! Plus qu'a lancer la macro avec !macro exec spam db_ah 20