Skip to content

Exemple — mini-jeu oneshot avec rewards

Intention : un tirage au sort express. Le streamer lance l'appli, les viewers tapent !join pendant 20 s, un gagnant est tiré, récompensé, l'appli se termine.

infos.json (extrait)

jsonc
{
  "launch-mode": "oneshot",
  "app-index": "index.html",
  "scopes": ["chat:read", "chat:write"],
  "window": { "width": 1920, "height": 1080, "x": 0, "y": 0 }
}

script.js

js
(async function () {
    const participants = new Map();   // login -> User

    kapp.chat.onCommand('join', (user) => {
        participants.set(user.login, user);
    });

    kapp.display();
    document.body.innerHTML = '<h1 id="t">Tapez !join — 20s</h1>';

    for (let s = 20; s > 0; s--) {
        document.getElementById('t').textContent = `Tapez !join — ${s}s`;
        await wait(1000);
    }

    const list = [...participants.values()];
    if (list.length === 0) {
        await kapp.chat.say('Personne n\'a joué 😢');
        return kapp.abort('aucun participant');
    }

    const winner = list[Math.floor(Math.random() * list.length)];
    document.getElementById('t').textContent = `🎉 ${winner.display_name} gagne !`;
    await kapp.chat.say(`🎉 Bravo ${winner.display_name} !`);

    kapp.rewards.winner(winner);                 // accumulé...
    list.filter(u => u !== winner).forEach(u => kapp.rewards.loser(u));

    await wait(4000);
    await kapp.finish();                          // ...envoyé ici
})();

Pourquoi

  • launch-mode: oneshot + kapp.finish() explicite : l'appli se ferme d'elle-même à la fin.
  • kapp.rewards.winner/loser accumulent ; finish() déclenche l'envoi (sendRewards()).
  • kapp.display() une fois, puis on met à jour le DOM ; décompte via await wait(1000).