Skip to content

kapp.dynamicTriggers (triggers à l'exécution)

Créer, mettre à jour et supprimer des déclencheurs à l'exécution (commandes chat, mots-clés, récompenses Twitch, intervalles…) — utile pour une appli qui ouvre des interactions viewers pendant qu'elle tourne.

Service

  • await create(data: DynamicTriggerCreateData): Promise<DynamicTrigger> — crée le trigger (serveur + local) et renvoie l'objet DynamicTrigger.
  • await update(id: number, data): Promise<DynamicTrigger | null> — met à jour un trigger connu localement (null si introuvable).
  • await remove(id: number): Promise<void> — supprime le trigger (serveur + registre local).
  • await resolveRequest(id: number): Promise<void> — valide une requête de trigger (confirme l'activation, consomme la monnaie le cas échéant).
  • await rejectRequest(id: number, reason = null): Promise<void> — rejette une requête (rembourse la monnaie).

Objet DynamicTrigger

  • trigger.onTrigger(cb): void — enregistre un callback exécuté à chaque activation.
    • cb: (trigger, trigger_request, resolve, reject) => Promise<string>
    • resolve(): Promise<void> valide la requête ; reject(reason?): Promise<string> la rejette.
  • await trigger.update(data): Promise<void> / await trigger.remove(): Promise<void>.

Pattern

js
(async function () {
    const trigger = await kapp.dynamicTriggers.create({
        type: 'CHATCMD',
        // ... champs selon DynamicTriggerCreateData (voir app-sdk.d.ts) ...
    });

    trigger.onTrigger(async (t, request, resolve, reject) => {
        const user = request.setter;
        // ... logique ...
        await resolve();          // ou await reject('raison') pour rembourser
        return 'ok';
    });

    // l'appli reste vivante tant qu'elle veut écouter, puis :
    // await kapp.finish();
})();

Limite : 20 triggers dynamiques par exécution

Une exécution d'appli peut détenir au maximum 20 triggers dynamiques simultanés, tous types confondus. Au-delà, create() échoue (HTTP 403) : chaque trigger coûte des ressources runtime (routage core, et un appel API Twitch pour un TWREW).

Ce plafond est par exécution, pas à vie : quand l'appli se termine, tous ses triggers dynamiques sont supprimés automatiquement. Il n'a aucun rapport avec l'abonnement du streamer — les triggers dynamiques ne consomment pas son quota et ne sont jamais désactivés par un changement de plan.

En pratique 20 est très large : si tu t'en approches, c'est généralement le signe qu'il faut un trigger générique paramétré plutôt qu'un trigger par cas. Supprime (remove()) ceux dont tu n'as plus besoin au lieu de les accumuler.

Limite : 25 caractères de titre

Le title d'un trigger dynamique est plafonné à 25 caractères — c'est une contrainte d'affichage (cartes d'applis, boutons du dashboard viewers, panneau de l'extension Twitch, tous en libellé court non tronquable), pas une limite technique.

Un titre plus long n'est jamais rejeté : le serveur le tronque et continue. Une appli déjà livrée ne peut pas se corriger en plein live, un 400 la casserait pour un simple libellé. L'objet renvoyé par create() / update() porte donc déjà le titre tronqué — ne suppose pas que trigger.title est ce que tu as envoyé, relis-le si tu l'affiches.

Exception TWREW : le titre est celui de la récompense Twitch, plafonné à 45 caractères (limite de l'API Twitch). Même règle — troncature, pas d'erreur.

⚠️ L'endpoint bas niveau des récompenses sans trigger (k.api.request('/twitch/reward/v1', 'POST', …)) ne se comporte pas pareil : lui rejette en 400 au-delà de 45, parce que Twitch refuserait la création de toute façon.

Pièges

  • Référence-toi à app-sdk.d.ts pour la forme exacte de DynamicTriggerCreateData (champs selon le type de trigger).
  • update ne marche que sur un trigger déjà connu localement (créé dans cette exécution) — sinon null.
  • resolveRequest / rejectRequest gèrent la monnaie (consommation / remboursement) : appelle-les pour les triggers à coût.
  • Ne crée pas tes triggers dans une boucle non bornée (un par viewer, un par item…) : tu toucherais le plafond de 20 et create() rejetterait.