Mudlet-GUI auf Anforderung senden
Mudlet sieht nicht vor, die Nachricht Client.GUI
mit Version und Downloadlink via GMCP anzufordern.
Es ist aber 'bad practice', einfach irgendwelche
nicht angeforderten Nachrichten zu senden, die
naturgemaess auch an andere Clients gehen.
Daher wird die Nachricht jetzt nach Anforderung
durch den Spieler gesendet.
Change-Id: Ib617e97b4be96f87b3355b3d984e2dd10dac695d
diff --git a/doc/pcmd/telnet b/doc/pcmd/telnet
index 11fa001..aec98ae 100644
--- a/doc/pcmd/telnet
+++ b/doc/pcmd/telnet
@@ -29,15 +29,21 @@
* tls
Zeigt an, ob die Verbindung zwischen Client und MG mit TLS
verschluesselt ist, so dass auf dem Weg niemand mitlesen kann.
- * charset
+ * charset <set>
Stellt den zu nutzenden Zeichensatz ein bzw. gibt ihn aus, wenn kein
Argument angegeben wird.
Soll die Einstellung geloescht und der Default wiederhergestellt werden,
muss als Argument \'loeschen\' angegeben werden.
+ Fuer Details s. Hilfeseite telnet_charset
+ * client-gui <client>
+ Sendet fuer den angegebenen Client eine Nachricht via GMCP (sofern das
+ vom Client aktiviert wurde), welche diesem sagt, von wo das aktuelle
+ GUI-Paket fuer den Client ladbar ist.
+ Zur Zeit steht hier nur "mudlet" zur Verfuegung.
SIEHE AUCH:
telnegs, telnet_keepalive, telnet gmcp, telnet_charset
P_TELNET_KEEPALIVE_DELAY
LETZTE AeNDERUNG:
- 16.01.2020, Zesstra
+ 12.06.2021, Zesstra
diff --git a/std/player/base.c b/std/player/base.c
index 91757e3..4cd2c7a 100644
--- a/std/player/base.c
+++ b/std/player/base.c
@@ -4426,6 +4426,9 @@
tell_object(ME,
"Deine Verbindung zum Morgengrauen ist nicht verschluesselt.\n");
return 1;
+ case "client-gui":
+ GMCP_offer_clientgui(newargs);
+ return 1;
}
return 0;
}
diff --git a/std/player/protocols/gmcp.c b/std/player/protocols/gmcp.c
index ad9485f..19e5227 100644
--- a/std/player/protocols/gmcp.c
+++ b/std/player/protocols/gmcp.c
@@ -67,7 +67,6 @@
// grundsaetzlich aktiv ist.
protected int GMCP_Status(string module)
{
- module ||= "Core";
if (mappingp(gmcpdata) && member(gmcpdata, module))
{
struct gmcp_mod_s mod = gmcpdata[module];
@@ -297,25 +296,42 @@
// Gerufen, wenn Daten zu senden sind.
protected void GMCPmod_Core_v1_send(mapping data)
{
- // Wenn Core registriert wird, wird diese Funktion gerufen und <data> als 0
- // uebergeben. Wir nutzen das zur Erkennung, dass GMCP aktiviert wurde und
- // senden die URI fuer das Client-UI-Package.
- // Bemerkung: ja... Warum zur Hoelle macht Mudlet das so? Es sollte ein
- // Modul UI definiert werden, was vom Client angefordert wird, anstatt dass
- // wir auf Verdacht da etwas aus einem nicht-angeforderten Modul rauspusten,
- // sobald GMCP aktiviert wird.
- // Wenn das mal jemand von anderen Clients anmeckert, fliegt es raus.
- if (!data)
+ // Zur Zeit passiert hier weiter nix, spaeter mal Core.Goodbye senden.
+}
+
+// Uebermittelt eine Nachricht Client.GUI an den Client, wenn der Spieler das
+// via "telnet client-gui ..." anfordert.
+protected void GMCP_offer_clientgui(string client)
+{
+ if (!GMCP_Status())
+ {
+ tell_object(ME,
+ "Dein Client hat GMCP nicht aktiviert.\n");
+ return;
+ }
+ if (client == "mudlet")
{
<int|string>* version = (__DIR__"mudlet_gui")->current_version();
if (version)
{
+ // Don't know, why mudlet wants version value as string...
GMCP_send("Client.GUI",
- (["version": version[1], "url": version[0]]) );
+ (["version": to_string(version[1]), "url": version[0]]) );
+ tell_object(ME,
+ "Paketdaten wurden an Mudlet geschickt.\n");
+ }
+ else
+ {
+ tell_object(ME,
+ "Zur Zeit ist fuer Mudlet kein GUI-Paket verfuegbar.\n");
+
}
}
-
- // Zur Zeit passiert hier weiter nix, spaeter mal Core.Goodbye senden.
+ else
+ {
+ tell_object(ME,
+ "Fuer diesen Client existiert kein GUI-Paket.\n");
+ }
}
diff --git a/sys/player/gmcp.h b/sys/player/gmcp.h
index 1c6e4fa..082bc7a 100644
--- a/sys/player/gmcp.h
+++ b/sys/player/gmcp.h
@@ -17,7 +17,7 @@
#define __GMCP_H_PROTO__
// prototypes
-protected int GMCP_Status(string module);
+protected int GMCP_Status(string module="Core");
protected int GMCP_Char(mapping data);
protected int GMCP_Channel(string msg, string channel, string sender);
protected int GMCP_Room();