-
Notifications
You must be signed in to change notification settings - Fork 1
HTML UI
UserApps können HTML-basierte Benutzeroberflächen anzeigen. Dieses Kapitel erklärt die verschiedenen Darstellungsarten und wie du sie einsetzt.
Es gibt verschiedene Arten, wie eine HTML-UI dem Nutzer angezeigt werden kann:
| Modus | Beschreibung | Typischer Einsatz |
|---|---|---|
| Popup | Eigenes Fenster/Dialog | Spiele, Formulare, Einstellungen |
| Overlay | Überlagert den Channel | Vollbild-Anwendungen |
| Global | Globale App-Ansicht | Apps im "Apps & Spiele"-Menü |
| Headerbar | Leiste über dem Channel | Statusanzeigen, Ticker |
var pageData = { spielstand: 42 };
var htmlFile = new HTMLFile("index.html", pageData);
// Popup mit Größe 480x720 Pixel (Breite x Höhe)
var popup = AppContent.popupContent(htmlFile, 480, 720);
popup.setResponsive(true); // Passt sich an Bildschirmgröße an
// Prüfen ob der Nutzer Popups anzeigen kann
if (user.canShowAppViewMode(AppViewMode.Popup)) {
user.sendAppContent(popup);
}Größen-Limits: Breite und Höhe müssen zwischen 50 und 1000 Pixel liegen.
var htmlFile = new HTMLFile("overlay.html", {});
var overlay = AppContent.overlayContent(htmlFile, 600, 400);
overlay.setResponsive(true);
if (user.canShowAppViewMode(AppViewMode.Overlay)) {
user.sendAppContent(overlay);
}var htmlFile = new HTMLFile("header.html", {});
var header = AppContent.headerbarContent(htmlFile, 50); // Nur Höhe, volle Breite
user.sendAppContent(header);Headerbar-Hinweise:
- Die Höhe ist auf 20–500 px limitiert, die Breite wird ignoriert (immer volle Breite)
- Im HTMLChat scheint der Channel-Hintergrund durch die Headerbar hindurch. Setze daher immer eine Hintergrund-Farbe auf
<body>, um das zu verhindern.
Wenn du user.sendAppContent() aufrufst, erhältst du eine AppContentSession zurück. Darüber steuerst du die laufende UI-Instanz:
var session = user.sendAppContent(popup);
// Event an diese spezifische Session senden
session.sendEvent('update', { score: 100 });
// Alle aktiven Sessions eines Nutzers abrufen
var sessions = user.getAppContentSessions();
var popupSessions = user.getAppContentSessions(AppViewMode.Popup);Reagiere darauf, wenn ein Nutzer die App schließt:
var popup = AppContent.popupContent(htmlFile, 480, 720);
user.sendAppContent(popup);
popup.addCloseListener(function(user, appContent) {
user.sendPrivateMessage(
"App geschlossen, falls du sie wieder öffnen willst, klicke hier: °>/openApp|/openApp<°"
);
});Du kannst eine laufende UI durch eine neue ersetzen:
var alteUI = AppContent.popupContent(new HTMLFile("seite1.html", {}), 480, 720);
user.sendAppContent(alteUI);
// Später: UI ersetzen (ohne das Fenster zu schließen)
var neueUI = AppContent.popupContent(new HTMLFile("seite2.html", {}), 480, 720);
alteUI.replaceWithAppContent(neueUI);Um Cache-Probleme zu vermeiden, nutze die Client-Methoden zum Einbinden von Ressourcen:
// Clientcode (www/index.html)
if (typeof Client !== 'undefined') {
Client.includeCSS('css/style.css');
Client.includeJS('js/app.js');
}Dadurch wird bei jedem App-Update automatisch der Cache invalidiert.
Erlaube dem Nutzer, die Größe des App-Fensters selbst zu verändern:
// Clientcode
if (typeof Client !== 'undefined') {
var hostFrame = Client.getHostFrame();
hostFrame.setResizable(true);
}UserApps laufen sowohl auf Desktop als auch auf mobilen Geräten. Empfehlungen:
- Setze immer
popup.setResponsive(true) - Verwende
<meta name="viewport" content="width=device-width, initial-scale=1.0">im HTML - Teste auf verschiedenen Bildschirmgrößen
- Prüfe mit
user.canShowAppViewMode()ob der Modus unterstützt wird
// Servercode (innerhalb von var App = (new function() { ... }());)
this.chatCommands = {
menu: function(user, params, func) {
openPage(user, 'menu.html', { name: user.getNick() });
}
};
function openPage(user, page, data) {
var htmlFile = new HTMLFile(page, data || {});
var popup = AppContent.popupContent(htmlFile, 480, 720);
popup.setResponsive(true);
if (user.canShowAppViewMode(AppViewMode.Popup)) {
user.sendAppContent(popup);
} else {
user.sendPrivateMessage('Dein Gerät unterstützt diese Ansicht leider nicht.');
}
popup.addCloseListener(function(closingUser) {
KnuddelsServer.getDefaultLogger().info(closingUser.getNick() + ' hat die App geschlossen');
});
}
this.onEventReceived = function(user, type, data, appContentSession) {
if (type === "navigate") {
openPage(user, data.page + '.html', data.pageData || {});
}
};Die HTML-UI wird in einem sandboxed iframe ausgeführt. Das bringt einige Einschränkungen mit sich:
-
allow-forms– Formulare absenden -
allow-orientation-lock– Bildschirmausrichtung -
allow-pointer-lock– Mauszeiger sperren -
allow-same-origin– Gleicher Ursprung -
allow-scripts– JavaScript ausführen
-
alert()→ Wird durchconsole.log()ersetzt (erzeugt Warning) -
prompt()→ Deaktiviert -
confirm()→ Deaktiviert -
window.history→ Komplett deaktiviert - Kamera/Mikrofon-Zugriff ist nicht möglich
Knuddels stellt automatisch Polyfills bereit — du musst sie nicht selbst einbinden:
- Promise
- Object.assign
- Symbol / Symbol.iterator
- String.prototype.startsWith
-
document.addEventListener("eventReceived", ...)→ Nutze stattdessenClient.addEventListener(type, callback). Die alte Variante war nie offiziell dokumentiert und wird in einer zukünftigen Version entfernt. -
Client.onSendEventReceived()→ Nutze stattdessenClient.dispatchEvent(). War eine interne API, die sich durch Frameworks verbreitet hat.
Channel-Owner können per Chat-Befehl App-Manager hinzufügen und entfernen:
// App-Manager hinzufügen
/apps addManager knuddelsDE.ENTWICKLER_ID.AppName NutzernameDesManagers
// App-Manager entfernen
/apps removeManager knuddelsDE.ENTWICKLER_ID.AppName NutzernameDesManagers
- AppContent – UI-Container
- AppContentSession – Aktive UI-Instanz
- AppViewMode – Darstellungsmodi
- HTMLFile – HTML-Datei-Referenz
- Client – Client-seitiges Objekt
- Client.HostFrame – Fenster-Steuerung
- Erste Schritte – Voraussetzungen, Einrichtung, deine erste App
-
Projektstruktur – Dateien, Ordner und
app.config - Dev-Server – Entwicklungsumgebung und Testen
-
App-Lifecycle und Hooks –
onAppStart,onUserJoinedund Co. -
Server-API Grundlagen –
KnuddelsServer,Channel,Logger - Client-Server-Kommunikation – Events zwischen Frontend und Backend
-
Benutzer und Nachrichten –
User,BotUser, Nachrichten senden - HTML-UI und AppContent – Popups, Overlays, Globale Apps-UI
-
Datenspeicherung –
AppPersistence,UserPersistence -
Knuddel und Zahlungen – Transfers, Käufe,
KnuddelAccount - Toplisten – Ranglisten und Highscores
- Globale Apps – Apps im "Apps & Spiele"-Menü
- Quests – Aufgaben für Nutzer
- Externe Server-Kommunikation – HTTP-Requests an externe APIs
- Tutorials – Übersicht aller Tutorials
- Tic-Tac-Toe – Multiplayer-Spiel mit Bestenliste
- Best Practices – Tipps, Limits und häufige Fehler
- FAQ – Häufig gestellte Fragen
- KCode-Formatierung – Nachrichten-Formatierung mit KCode