Ein weiterer Fehler wäre beispielsweise die Methode setAppContent der Klasse User. Die richtige Methode lautet sendAppContent. Insgesamt würde ich dir dazu raten, die Best Practices der Software-Entwicklung und die Konventionen der Programmiersprache JavaScript einzuhalten. Beispielsweise lädst du ein Objekt zum Key "gb" aus der Persistenz, was aber nicht erkennen lässt, was sich genau dahinter verbirgt. Offenbar soll es ein Array sein, weil du der Variable data in der else-Klausel ein leeres Array zuweist. Die Funktion hidegb entfernt dann einen Content (und verbirgt ihn nicht), steht wohl aber irgendwie im Zusammenhang mit den gb-Daten. Auch würde ich dir raten, mit Blockvariablen zu arbeiten (deshalb markiert beispielsweise die IDE Webstorm das Schlüsselwort "var"). Ordnung in dem Code macht es später leichter, ihn zu warten und zu erweitern. Das spart dir viele frustrierende Stunden Code-Arbeit.

Nur rumprobieren bis es klappt ist nicht die beste Idee. Ich empfehle: Wenn dir ein Fehler angezeigt wird, dann recherchiere nach dem Fehler. So sammelst du auf Dauer nützliche Erfahrungen. Die Fehlermeldung zu lesen und zu verstehen ist von besonderer Bedeutung für die Programmierarbeit. Rumprobieren und stundenlang festzustellen, dass es nicht funktioniert, frustriert nur und raubt vielen auf Dauer die Motivation.

Zu deiner letzten Frage: Das kannst du regeln, indem du Client.executeSlashCommand(string) nutzt, ist aber eher weniger interessant. Alle Befehle, die nicht auf einer Whitelist stehen, erfordern eine weitere Abfrage durch James. Ich würde es per Event lösen, welches nach einem Klick im User Interface ein Signal an deine serverseitige Anwendung sendet. Das tatsächliche Ereignisse kann dann direkt im Channel ausgelöst werden. Mehr dazu findest du in der API-Doku zur Methode sendEvent(string, object).
_________________________
If you don't understand recursion, read this again.