Appearance
kapp.emotes
Accéder aux emotes et badges Twitch disponibles sur le channel (globaux + spécifiques au channel, BetterTTV), et résoudre les badges portés par un viewer en images affichables à l'écran.
Service partagé appli + widget : l'API est identique. Seul le wrapper d'exécution diffère (côté widget :
window.executeWidgetFunction; côté appli :script.jsaprès l'eventAppliLoaded).
Quand l'utiliser (vs alternative)
kapp.emotes.getBadges(ev): afficher les badges d'un viewer (abonné tier 1/2/3 avec palier 1 mois, 2 mois…, modo, VIP, founder…) à partir d'un message chat.kapp.emotes.get(): accéder au set complet (emotes Twitch / BTTV, jeux de badges) pour un rendu custom.- Les emotes d'un message se rendent déjà via
ev.getMessageAsHtml()(voirchat.md) — pas besoin de ce service pour ça.
Méthodes
get(): Promise<EmotesSet>— set complet{ emotes_global, emotes_channel, badges_global, badges_channel, emotes_bttv_global, emotes_bttv_channel }. async. Chaque appel fetch une donnée fraîche (endpoint rate-limité) : ne l'appelle PAS à chaque message — pour les badges, utilisegetBadge/getBadgesqui cachent en interne.getBadge(set_id, version): Promise<ResolvedBadge|null>— résout un badge (ex.'subscriber','3012') en{ set_id, id, title, description, image_url_1x, image_url_2x, image_url_4x, … }. Les badges du channel (paliers d'abo custom, bits) sont prioritaires sur les globaux, comme sur Twitch.nullsi inconnu. async. Sets cachés en interne pour toute l'exécution → utilisable à chaque message sans coût réseau.getBadges(source): Promise<ResolvedBadge[]>— résout d'un coup les badges d'un message :source= leChatEventdirectement, ou une liste{set_id, version}(=ev.getBadges()). Ordre d'affichage Twitch préservé, badges inconnus ignorés. async. Même cache interne quegetBadge.
Côté ChatEvent (sync, voir chat.md) : ev.getBadges() (badges portés, bruts), ev.isSubscriber(), ev.getSubscriberMonths() (mois d'abo exacts, via badge-info), ev.getSubscriberTier() (1|2|3, ou null si indéterminable).
Exemple (V2, exécutable)
js
// Affiche badges + infos d'abo de chaque abonné qui parle
kapp.chat.onMessage(async (user, ev) => {
if (!ev.isSubscriber()) return;
const months = ev.getSubscriberMonths(); // mois exacts (badge-info)
const tier = ev.getSubscriberTier(); // 1|2|3, ou null (ex. founder)
const badges = await kapp.emotes.getBadges(ev); // badges → images
const row = document.createElement('div');
row.innerHTML = badges.map(b => `<img src="${b.image_url_2x}" alt="${b.title}" width="24" height="24">`).join('')
+ ` <b>${user.display_name}</b> — sub T${tier ?? '?'} depuis ${months} mois`;
document.body.prepend(row);
});Pièges
- Les badges sont une donnée par message (tags IRC Twitch) : ils ne sont PAS sur l'objet
User. Pas de message reçu = pas de badges connus pour ce viewer. Pour vérifier uniquement l'abonnement actuel d'unUser, même sans message, utiliseawait user.getSubscriptionStatus()(appel Twitch live, voirusers.md). getSubscriberTier()peut êtrenullalors queisSubscriber()esttrue: un founder qui affiche son badge founder ne porte pas de badge subscriber.- Le badge d'abo affiché est un palier (1, 2, 3, 6, 9 mois…), pas la durée réelle : la durée exacte est
ev.getSubscriberMonths(). get()fetch à chaque appel et l'endpoint est rate-limité : dans unonMessage, passe pargetBadge/getBadges(cache interne), jamais parget()en boucle.badges_channelne contient que les badges custom du streamer ;getBadge/getBadgesgèrent déjà le fallback vers les badges globaux — ne réimplémente pas la résolution à la main.