SDK web

Pour les jeux HTML5 (itch.io, CrazyGames, Poki, votre propre site) et les apps web. Un seul fichier, sans dépendance, environ 77 Ko (26 Ko compressé). Il ajoute un bouton de chat, ou s'ouvre depuis votre propre bouton Aide.

Installation

Téléchargez inngame.js et hébergez-le avec votre jeu (ou chargez-le depuis cette adresse). Le plus court : une balise avec la clé publique de l'app (inbox → Réglages → Apps → Général) :

<script src="inngame.js" data-app-key="app_…"></script>

La balise lit aussi data-language et data-base-url. Le SDK parle à https://app.inngame.app par défaut. Ou démarrez-le vous-même pour passer des options :

<script src="inngame.js"></script>
<script>
  Inngame.init({
    appKey: "app_…",
    appVersion: "1.2.0",
    launcher: false,               // no floating button: open it from your menu
    context: () => ({ level: player.level, coins: player.coins }),
    onItemGranted: (item) => inventory.add(item.id, item.quantity),
  });
  helpButton.onclick = () => Inngame.open();
</script>

Il se charge aussi en module CommonJS (require("./inngame.js")) pour les bundlers. Types TypeScript : téléchargez inngame.d.ts à côté du script (import Inngame = require("./inngame"), ou la variable globale window.Inngame). Chaque option et chaque rappel y est documenté.

Ce que les joueurs obtiennent

Le chat web d'Inngame en japonais : le joueur signale un bug, la réponse de l'équipe, écrite en anglais, arrive traduite en japonais avec un lien Voir l'original, suivie d'une carte pour récupérer 50 gemmes.
Un joueur au Japon écrit en japonais ; l'équipe a répondu en anglais. Capture réelle du SDK web.

Contexte joint à chaque message

Adresse de la page, écran et fenêtre, navigateur, langue, fuseau horaire, temps depuis le chargement, les 50 dernières erreurs et alertes de la console (plus les erreurs non interceptées), et ce que renvoie votre fonction context(), sous game. Coupez la capture de la console avec captureLogs: false. L'équipe voit tout à côté de la conversation.

Objets et offres

Quand l'équipe envoie un objet, le joueur touche Récupérer. Le SDK envoie un nonce aléatoire et n'appelle onItemGranted que si le serveur confirme que cette demande l'emporte : un objet n'est jamais donné deux fois, même avec deux onglets ouverts ou un réseau capricieux. Sans onItemGranted, le bouton reste désactivé. Pour donner l'objet côté serveur, utilisez plutôt le webhook item.claimed.

onOffer(offerId) et onScreen(screen, value) ferment le chat et passent la main au jeu ; onRestorePurchases() est appelé en laissant le chat ouvert. Sans le rappel correspondant, le tap est signalé à l'équipe comme échoué.

Les cartes d'avis ouvrent l'url de la carte, ou les identifiants de boutique des réglages Avis de l'app (page d'évaluation Steam, App Store sur les appareils tactiles Apple, sinon Google Play). Les cartes link ouvrent leur url dans un nouvel onglet (http(s) uniquement). Les cartes refund (remboursements Apple) ouvrent la page « Signaler un problème » d'Apple, où le joueur demande le remboursement à Apple : la feuille de remboursement intégrée n'existe que dans les apps iOS natives.

Identité

Les joueurs commencent anonymes ; le navigateur garde le jeton de l'appareil dans le localStorage, la conversation est donc toujours là à la visite suivante. Pour la rattacher à vos comptes :

await Inngame.identify({ userId: "u_42", name: "Nova", token: jwtFromYourServer });

Sans token, l'identifiant n'est qu'une étiquette, jamais une fusion. Vous pouvez aussi passer l'identité au démarrage avec l'option user. Pour les achats, Inngame.user.purchaseToken est l'UUID Inngame de ce joueur : passez-le à votre boutique ou à votre service d'abonnement. Voir Identité des joueurs.

Référence

AppelRôle
Inngame.init(options)appKey (obligatoire), baseUrl, language (par défaut : celle du navigateur), appVersion, user (identité au démarrage), launcher, position ("right" ou "left"), theme ("light", "dark", ou celui du système), zIndex, captureLogs, context, et les rappels des cartes onItemGranted, onOffer, onScreen, onRestorePurchases. Renvoie une promesse ; les appels suivants renvoient la même.
Inngame.open() · close() · toggle()Afficher ou masquer le chat.
Inngame.unread · isOpen · user · config · versionÉtat courant : réponses non lues, chat affiché, le joueur (id, name, verified, identified, language, blocked, purchaseToken), réglages de l'inbox (apparence, annonce, disponibilité, avis), version du SDK ("0.2.3").
Inngame.on(event, fn)"unread" (nombre), "message" (une réponse est arrivée), "open", "close". Renvoie une fonction qui retire l'écouteur.
Inngame.identify(identity){userId, name, email, token, metadata}. Renvoie le joueur.
Inngame.track(name, props, opensChat)Un événement du jeu pour les automatisations ; avec opensChat: true, une automatisation peut ouvrir le chat, et la promesse renvoie true si c'est le cas.
Inngame.logout()Ce navigateur continue avec un nouveau joueur anonyme.
Inngame.deleteData()Efface le joueur, ses conversations et ses photos, puis démarre un nouveau joueur anonyme. Renvoie true.
Inngame.isUnavailable()true tant que votre support est indisponible (votre espace Inngame est suspendu). Le chat affiche alors « Le support est indisponible pour le moment. Réessayez plus tard. » dans la langue du joueur et masque la zone de saisie ; les messages non envoyés attendent et partent au retour du support. Le SDK revérifie toutes les 10 minutes chat ouvert et à chaque ouverture, et revient à la normale tout seul. En attendant, track renvoie false, identify null (l'identité est gardée pour plus tard) et deleteData false ; rien ne lève d'exception dans votre code.