Aller au contenu

Référence de l'éditeur de widgets

Cette page liste ce que ton code peut utiliser dans un widget de l’éditeur de widgets KickBot : les événements widgetEvent, l’objet globalValues, l’objet userVariables et les helpers window.kickbotWidget. Chaque widget est du HTML, du CSS et du JavaScript classiques qui tournent comme source navigateur dans OBS. KickBot se connecte à Kick pour toi et envoie les événements à ton code.

Quand OBS ouvre l’URL du widget, KickBot :

  1. Charge la page du widget avec un fond transparent.
  2. Ajoute ton CSS dans un élément <style> et met ton HTML dans la page.
  3. Charge les données de ta chaîne depuis Kick (nombre de followers, nombre de viewers, statut du stream et chat récent) dans globalValues.
  4. Lance ton JavaScript. Il tourne une seule fois, après l’étape 3, donc globalValues est prêt quand ton code démarre.
  5. Envoie les événements en direct à ton code sous forme d’événements widgetEvent sur document.

Ton JavaScript peut lire deux objets sans rien importer : globalValues et userVariables. Les helpers sont sur window.kickbotWidget.

Limites :

ÉlémentLimite
Largeur et hauteurRéglées dans Paramètres de base. Un nouveau widget vide fait 800 × 600. La fenêtre Nouveau widget accepte jusqu’à 7680 × 4320.
HTML, CSS et JavaScriptJusqu’à 2 000 000 caractères par fichier
Nom du widgetJusqu’à 500 caractères
Fichiers des variables utilisateurJusqu’à 25 Mo par fichier
Widgets de l’éditeur avec le forfait Gratuit10 (sans limite avec Premium)

Ajoute un seul listener pour widgetEvent sur document. Chaque événement contient event.detail avec trois champs :

ChampTypeValeur
event_namestringL’événement, par exemple followEvent
sourcestringToujours kick
dataobjectLes données de l’événement (voir plus bas)
document.addEventListener('widgetEvent', (event) => {
const { event_name, data } = event.detail;
if (event_name === 'followEvent') {
showAlert(data.user.username + ' followed!');
}
if (event_name === 'subEvent') {
showAlert(data.username + ' subscribed for ' + data.months + ' months');
}
});
Nom de l’événementQuand il se déclencheBouton de test
subEventUn viewer s’abonneSub
subGiftEventUn viewer offre des subsSub offert
kicksEventUn viewer envoie des KICKsKICKs
followEventUn viewer followFollow
unfollowEventUn viewer unfollowUnfollow
chatMessageEventUn message est envoyé dans le chatMessage
chatMessageDeletedEventUn modérateur supprime un messageMessage supprimé
chatMessagePinnedEventUn message est épingléMessage épinglé
chatMessageUnpinnedEventLe message épinglé est retiréMessage désépinglé
chatClearedEventUn modérateur efface le chatChat effacé
followerCountUpdatedEventKick envoie un nouveau nombre de followersCompteur de followers mis à jour
subCountUpdatedEventLe nombre de subs sur Kick a changéCompteur de subs mis à jour
viewerCountUpdatedEventKick envoie un nouveau nombre de viewersCompteur de viewers mis à jour
raidEventUne autre chaîne te raid (host)Raid
streamOnlineTon stream commenceStream en ligne
streamOfflineTon stream se termineStream hors ligne

Il n’y a pas d’événement de tip. Pour les alertes de tip, utilise le widget d’alerte de tip.

Voici les données dans event.detail.data. Elles correspondent aux événements de test de l’éditeur. Les vrais événements peuvent avoir plus de champs. Les noms, nombres et ID ci-dessous sont des exemples.

subEvent

{
months: 1,
username: 'viewer_one',
chatroom_id: 3847194
}

subGiftEvent

{
chatroom_id: 3847194,
gifted_usernames: ['viewer_one', 'viewer_two', 'viewer_three'],
gifter_username: 'big_gifter'
}

kicksEvent

{
message: 'Great stream!',
sender: { id: 12345678, username: 'viewer_one', username_color: '#93EBE0' },
gift: {
gift_id: 'full_send',
name: 'Full Send',
amount: 100,
type: 'BASIC',
tier: 'BASIC',
character_limit: 0,
pinned_time: 0
},
channel: 'channel_3984507'
}

followEvent et unfollowEvent (même forme ; followers_count est le nouveau nombre)

{
id: 'd4e5f6a7-89b0-12c3-d456-78901e2f3a4b',
channel: { id: 3984507, slug: 'kickbotdev' },
user: { id: 14873539, slug: 'viewer_one', username: 'viewer_one' },
followers_count: 36,
created_at: '2024-05-13T22:19:07+00:00'
}

chatMessageEvent

{
id: '85c884b3-7377-478c-b6aa-22b7db752b93',
chatroom_id: 3974112,
content: 'hello [emote:37226:KEKW]',
type: 'message',
created_at: '2024-05-13T22:29:52+00:00',
sender: {
id: 4063326,
username: 'viewer_one',
slug: 'viewer_one',
identity: {
color: '#72ACED',
badges: [{ type: 'subscriber', text: 'Subscriber', count: 3 }]
}
}
}

Les emotes Kick sont dans content sous la forme [emote:ID:NAME]. Utilise createChatMessageFragment (consulte Afficher le texte du chat en toute sécurité) pour les transformer en images.

chatMessageDeletedEvent

{
id: '9cd3788a-ecd2-4051-a162-a7ea9be8ce7a',
message: { id: '89d6be86-63db-4581-922e-14a6c4a9c2e6' }
}

Utilise data.message.id pour retrouver et retirer le message que tu as affiché.

chatMessagePinnedEvent (data.message a la même forme que les données d’un chatMessageEvent)

{
message: {
id: '5d798a38-ad17-45e4-8169-bda2faa85b79',
chatroom_id: 3974112,
content: 'This is a pinned message!',
type: 'message',
created_at: '2024-05-13T22:30:41+00:00',
sender: { id: 4063326, username: 'kickbotdev', slug: 'kickbotdev', identity: { color: '#72ACED', badges: [] } }
}
}

chatMessageUnpinnedEvent : data est un tableau vide ([]).

chatClearedEvent

{ id: '47e3596f-0274-46e0-85b1-029fa3bfc5ea' }

followerCountUpdatedEvent (attention au camelCase followersCount)

{ followersCount: 1532, channel_id: 4599, created_at: 1715639984 }

subCountUpdatedEvent

{ subscriber_count: 184, channel_id: 4599 }

viewerCountUpdatedEvent

{ viewer_count: 320, channel_id: 5937485 }

raidEvent

{
chatroom_id: 839485,
optional_message: 'gg stream',
number_viewers: 150,
host_username: 'raiding_channel'
}

streamOnline

{
livestream: {
id: 3984507,
channel_id: 3984507,
session_title: 'Test stream!',
created_at: '2024-05-13T22:30:41+00:00'
}
}

streamOffline

{
livestream: {
id: 3984507,
channel: { id: 3984507, is_banned: false }
}
}

globalValues contient l’état actuel de ta chaîne. KickBot le remplit avant que ton code tourne et le tient à jour quand les événements arrivent. Utilise-le pour dessiner ton widget au démarrage, avant l’arrivée du moindre événement.

globalValues = {
subCount: 184,
followerCount: 1532,
viewerCount: 320,
lastFollower: { /* the last follow */ },
lastSub: { /* the last sub, for example { username, months } */ },
lastGiftedSub: { /* the last gift, for example { gifter_username, gifted_usernames } */ },
chatMessages: [ /* chatMessageEvent payloads */ ],
streamerInfo: {
kick: {
username: 'KickBotDev',
slug: 'kickbotdev',
profile_picture: 'https://files.kick.com/images/user/.../fullsize.webp',
user_id: '4063326',
channel_id: '3984507',
chatroom_id: '3974112',
bio: 'Channel bio',
subscriber_badges: [ /* your channel's sub badges from Kick */ ]
}
},
currentStream: {
is_live: true,
title: 'Stream title',
started_at: '2026-10-24 18:00:00'
}
}
ValeurComment elle se met à jour
subCountChargée depuis Kick. Augmente de 1 à chaque subEvent et de 1 pour chaque sub offert, et est remise à jour par subCountUpdatedEvent.
followerCountChargée depuis Kick. Mise à jour par followEvent, unfollowEvent et followerCountUpdatedEvent.
viewerCountChargée depuis Kick (0 hors ligne). Mise à jour par viewerCountUpdatedEvent.
lastFollower, lastSub, lastGiftedSubLe dernier que KickBot a vu sur ta chaîne, ou null. Mis à jour par l’événement correspondant.
chatMessagesLe chat récent de Kick au chargement du widget, puis chaque nouveau message. Garde les 100 plus récents. chatClearedEvent le vide. Pour masquer les messages supprimés, gère chatMessageDeletedEvent dans ton propre code.
streamerInfo.kickTon profil Kick. Ne change pas pendant que le widget tourne.
currentStreamChargée depuis Kick au chargement du widget. Elle n’est pas mise à jour par streamOnline ni streamOffline. Écoute ces événements si tu as besoin de l’état du live.

Les variables utilisateur sont les paramètres que les streamers voient quand ils ouvrent ton widget dans Widgets enregistrés. Tu les ajoutes sous Variables utilisateur dans l’éditeur. Dans ton code, lis la valeur avec userVariables.<variable name>.value.

const goal = Number(userVariables.follower_goal.value);
document.body.style.color = userVariables.text_color.value;

Champs d’une variable :

ChampCe que c’est
TitreLe libellé que les streamers voient.
Nom de la variableLe nom dans ton code. Lettres, chiffres et _ uniquement. Tu ne peux plus le changer après avoir créé la variable.
TooltipUn texte d’aide en plus sous le titre.
Type de variableConsulte le tableau ci-dessous.
Valeur par défautLa valeur avant que le streamer la change. Elle peut être vide.
ObligatoireLes streamers doivent saisir une valeur avant de pouvoir enregistrer.
TypeCe que le streamer voitvalue dans ton code
TexteUn champ de texteUne string
NombreUn champ de nombreUn nombre ou une string numérique. Utilise Number() pour être sûr.
CouleurUn sélecteur de couleurUne couleur hexadécimale en string, par exemple #ffffff
Menu déroulantUn menu avec tes optionsL’option choisie, en string. Par défaut, c’est la première option.
InterrupteurUn interrupteur on/offtrue ou false
Image/GIFUn champ d’URL et un bouton d’importUne URL vers le fichier
VidéoUn champ d’URL et un bouton d’importUne URL vers le fichier
AudioUn champ d’URL et un bouton d’importUne URL vers le fichier

Les fichiers importés sont stockés par KickBot, et value est l’URL du fichier. Utilise le menu à côté d’une variable pour la monter, la descendre, la modifier ou la supprimer. L’ordre dans l’éditeur est l’ordre que voient les streamers.

Traite chaque champ d’événement et chaque variable utilisateur comme du texte venant d’un inconnu. KickBot nettoie le texte du chat et des événements avant que ton code le reçoive, donc il est sûr comme texte HTML, mais pas comme URL, CSS ou script. Ne mets pas les champs bruts d’un événement dans innerHTML. Utilise ces helpers :

HelperCe qu’il fait
window.kickbotWidget.createChatMessageFragment(content, font_size)Renvoie un DocumentFragment avec des nœuds texte et les images des emotes Kick. Les emotes font font_size + 3 pixels. font_size vaut 20 par défaut.
window.kickbotWidget.createTextNode(value)Renvoie un nœud texte pour n’importe quelle valeur.
window.kickbotWidget.escapeHtmlText(value)Échappe le texte à placer entre des balises HTML quand tu dois construire une string HTML. Ne l’utilise pas pour des URL, du CSS ou du script.
document.addEventListener('widgetEvent', (event) => {
if (event.detail.event_name !== 'chatMessageEvent') return;
const data = event.detail.data;
const line = document.createElement('div');
line.id = 'msg-' + data.id;
const name = document.createElement('strong');
name.style.color = data.sender.identity.color;
name.append(window.kickbotWidget.createTextNode(data.sender.username + ': '));
line.append(name);
line.append(window.kickbotWidget.createChatMessageFragment(data.content, 20));
document.getElementById('chat').append(line);
});

Pour les autres textes, utilise textContent ou createTextNode.

L’aperçu de l’éditeur fonctionne comme OBS, avec quelques différences pour les tests :

  • Quand tu changes le code ou une variable utilisateur, l’aperçu relance ton JavaScript. KickBot retire d’abord les listeners widgetEvent du lancement précédent. Les minuteurs de setInterval et setTimeout ne sont pas retirés, donc clique sur le bouton de rechargement s’ils s’accumulent.
  • Quand tu changes la largeur ou la hauteur, l’aperçu se recharge.
  • Les événements de test vont seulement dans l’aperçu. Un Follow de test ajoute 1 à globalValues.followerCount, et Unfollow retire 1. Compteur de viewers mis à jour envoie un nombre d’exemple. Message supprimé retire un message au hasard du chat de l’aperçu.
  • Si ta chaîne n’a encore aucun dernier follower, sub ou sub offert, l’aperçu utilise des données d’exemple pour lastFollower, lastSub et lastGiftedSub.
  • Pour voir la sortie de console.log et les erreurs, clique sur le bouton qui ouvre l’aperçu dans une nouvelle fenêtre, puis ouvre les outils de développement dans cette fenêtre.

Voici un objectif de followers court. Il utilise un listener d’événements, globalValues et deux variables utilisateur : follower_goal (Nombre) et bar_color (Couleur).

HTML :

<div class="goal">
<span id="count"></span> / <span id="target"></span>
<div class="bar"><div class="fill"></div></div>
</div>

CSS :

body { margin: 0; font-family: Arial, sans-serif; color: #fff; }
.goal { padding: 12px; background: #100c28; border-radius: 16px; font-size: 32px; font-weight: bold; }
.bar { height: 24px; margin-top: 8px; background: #3d3957; border-radius: 12px; overflow: hidden; }
.fill { height: 100%; width: 0; transition: width 0.3s ease; }

JavaScript :

const target = Number(userVariables.follower_goal.value) || 100;
document.getElementById('target').textContent = target;
document.querySelector('.fill').style.background = userVariables.bar_color.value;
function update(count) {
document.getElementById('count').textContent = count;
document.querySelector('.fill').style.width = Math.min((count / target) * 100, 100) + '%';
}
document.addEventListener('widgetEvent', (event) => {
const { event_name, data } = event.detail;
if (event_name === 'followEvent' || event_name === 'unfollowEvent') update(data.followers_count);
if (event_name === 'followerCountUpdatedEvent') update(data.followersCount);
});
update(globalValues.followerCount);

Pour une version complète avec plus de paramètres, crée un nouveau widget à partir du modèle Simple Follower Goal.

  • Dessine l’état de départ à partir de globalValues, puis change-le avec les événements. Un widget qui attend un événement reste vide tant que rien ne se passe.
  • Widgets enregistrés affiche seulement les boutons de test des noms d’événements présents dans ton JavaScript. Écris le nom complet de l’événement (par exemple 'followEvent') dans ton code pour que les streamers puissent tester ton widget.
  • Garde le fond transparent, sauf si un fond fait partie du design, pour que le widget se pose par-dessus la scène.
  • Tu peux aussi gérer les widgets de l’éditeur avec l’API KickBot. Consulte la référence de l’API des widgets.