AkiBot documentation

Écrire un widget

Un widget fait main, c’est du HTML, du CSS et du JavaScript que tu écris toi-même, et qui réagit à ce qui se passe sur ta chaîne. Si les widgets tout faits ne suffisent pas, c’est par ici.

Où l’écrire

Sur le tableau de bord, ta chaîne, puis Widgets et Écrire un widget. Le code à gauche, le widget qui tourne à droite. De faux événements pour l’essayer sans attendre un vrai follow. Une erreur s’affiche avec sa ligne.

Une fois enregistré, il se pose dans un overlay depuis l’éditeur d’overlay, comme n’importe quel widget.

Réagir : akibot.on

akibot.on('alerte', (data) => {
  if (data.kind === 'follow') montrer(data.user + ' arrive !');
});

Le premier argument est le type d’événement, le second ta fonction, qui reçoit les données puis le type. '*' écoute tout.

TypeQuandCe que contient data
alerteFollow, abonnement, bits, raid, points…kind (follow, subscribe, resub, subgift, cheer, raid, points, powerup, serie pour une série de visionnage, don pour un don reçu sur Ko-fi, StreamElements, Streamlabs ou TipeeeStream), titre, sous, et les variables de l’alerte (liste). essai vaut true pour une alerte émulée, rejoue pour une alerte renvoyée depuis le fil d’activité.
chatUn message dans le chatuser, login, message, couleur, badges, commande (vrai pour une commande du bot), bot (vrai pour un bot reconnu), niveau (de viewer à broadcaster), premier (vrai pour le tout premier message de la personne sur la chaîne), notice (pour le petit mot d’un réabonnement, d’une série de visionnage ou d’une annonce de modo : la sorte d’annonce, resub, viewermilestone, announcement…), morceaux (le texte découpé en texte, emotes et GIF). Un GIF arrive en { t: 'gif', source, url, secours, texte } : source vaut twitch pour un GIF envoyé avec le bouton GIF de Twitch (abonnés palier 2 et 3), dont texte est la description entre crochets et url l’adresse donnée par Twitch, à garder telle quelle ; il vaut lien pour un lien Tenor, Giphy ou Klipy collé à la main, avec l’image légère, l’originale en secours et le lien tapé.
chat-retraitLa modération retire un messageid du message, ou login de la personne pour un ban ou une exclusion.
compteurUn compteur changenom, valeur.
jeuPendu, motus, devine le motL’état de la partie, jamais la solution tant qu’elle tourne.
clipUn clip vient d’être crééLe clip et qui l’a fait.
hypeUn train de la hype commence, avance ou finitniveau, progression et objectif du niveau en cours, total, finA (sa fin, en millisecondes), statut (en-cours ou fini).
sondageUn sondage commence, avance ou finittitre, choix (titre et votes), finA, statut (en-cours, fini ou annule).
predictionUne prédiction commence, avance, ferme ses paris ou finittitre, issues (titre, points, personnes, couleur), verrouA, statut (en-cours, verrouille, fini ou annule), gagnante.
pub-programmePendant un live, toutes les vingt secondes, si le message d’avant-pub est régléprochaine (l’heure de la prochaine pub, en millisecondes), duree en secondes, reports restants.
pub-bientotUne minute avant une puba (son heure), duree.
pubUne pub commencedebut, duree en secondes, fin : de quoi tenir un compte à rebours.
pub-finLa pub est finieRien.
tirageUn tirage au sort s’ouvre, quelqu’un s’inscrit (une fois par seconde au plus), il ferme, un gagnant sortstatut (ouvert, ferme, gagnant ou annule), mot, lot, qui (tous, abonnes ou followers), n (les inscrits), finA, gagnant (nom, et source : twitch ou discord).
musiqueLe morceau change, passe en pause, reprend ou saute, ou plus rien ne joue (envoyé par l’extension En Écoute, pas à chaque battement)service (spotify, deezer, youtube-music ou apple-music), serviceNom, titre, artiste, album, pochette (une adresse https, ou vide), duree et position en secondes, vitesse, enLecture. La position est celle du moment de l’envoi : pour la faire avancer, ajoute le temps passé depuis, fois la vitesse. Quand plus rien ne joue : vide à true.
controleLe dock met les alertes en pause, coupe leurs sons ou passe celle qui joueaction (pause, muet ou passer), pause et muet : l’état après l’ordre. Une alerte faite main peut s’y plier aussi.
alertes-retraitUne vague de follows est bloquéekind des alertes retirées de la file.
etatAu chargementLes compteurs, la citation, les objectifs (voir plus bas).
configL’overlay a été modifiéRien d’utile : la page se redessine d’elle-même.

Ce qu’il sait déjà : akibot.etat

akibot.etat.compteurs donne les compteurs de la chaîne ({ morts: 12 }), akibot.etat.citation la citation du moment, akibot.etat.objectifs la valeur des barres d’objectif. Mis à jour à chaque événement.

Ses réglages : akibot.champs et {{cle}}

Un widget peut déclarer des réglages, que la personne qui le pose change sans toucher au code : une couleur, un texte, un nombre. Types possibles : texte (texte), nombre (nombre), couleur (couleur), case (case à cocher), liste (liste de choix), image (image (adresse)). 30 réglages au plus.

La clé d’un réglage commence par une minuscule, puis lettres, chiffres et _. Sa valeur se lit de deux façons :

<div class="nom">{{titre}}</div>

.nom { color: {{couleur}}; }

akibot.config donne le widget entier, tel qu’il est enregistré dans l’overlay.

Ce qu’un widget ne peut pas faire

Un widget de la galerie peut avoir été écrit par n’importe qui. Il tourne donc enfermé :

Sa taille est celle que tu règles dans l’éditeur d’overlay. Il ne peut pas la changer tout seul.

Le chat, c’est du texte. Écris-le avec textContent. En septembre 2026, des chercheurs ont montré qu’un message de chat posé en HTML dans un overlay peut aller jusqu’à prendre la main sur le PC du streamer, à cause du vieux Chromium d’OBS 32. Si ton widget fait quand même innerHTML = data.message, je nettoie au passage : plus de script, plus d’attribut onerror ou onclick, plus de lien javascript:. La mise en forme (<b>, <i>, les styles) reste. Un gestionnaire d’événement s’ajoute avec addEventListener, pas dans une chaîne de HTML.

Les limites

Un exemple complet

Le dernier abonné, avec une couleur réglable (un réglage couleur de type couleur).

<!-- HTML -->
<div id="dernier">Personne encore</div>

/* CSS */
#dernier { font: 700 32px sans-serif; color: {{couleur}}; }

// JavaScript
const el = document.getElementById('dernier');
akibot.on('alerte', (data) => {
  if (['subscribe', 'resub', 'subgift'].includes(data.kind) && !data.essai) {
    el.textContent = data.user;
  }
});

Le partager

Un widget se publie dans la galerie depuis son éditeur. Tu acceptes qu’il soit repris et modifié ; celui qui le reprend en a une copie, et la galerie cite le tien comme original.

Comme il contient du code, je le relis avant qu’il apparaisse dans la galerie, et à chaque nouvelle version. Un overlay qui contient un widget fait main aussi. Le code de quelqu’un d’autre finit dans l’OBS d’un streamer : je préfère le lire avant.