Appearance
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/loseraccumulent ;finish()déclenche l'envoi (sendRewards()).kapp.display()une fois, puis on met à jour le DOM ; décompte viaawait wait(1000).