Meldungen am vitem_proxy am Erzeuger loggen.
Wenn eine Fehlermeldung an einem vitem_proxy abgesetzt wird,
wird diese am Erzeuger protokolliert, da dieser das vItem
unter seiner Kontrolle und konfiguriert hat (vItem ohne
Templat!).
Change-Id: I3471a985ad28e070f2a4b06979b95b5f6716a763
diff --git a/obj/vitem_proxy.c b/obj/vitem_proxy.c
index 5a957e3..333d6ce 100644
--- a/obj/vitem_proxy.c
+++ b/obj/vitem_proxy.c
@@ -2,6 +2,10 @@
inherit "/std/container";
#include <moving.h>
+#include <errord.h>
+#include <config.h>
+#include <language.h>
+#include <living/comm.h>
object cloner;
@@ -49,3 +53,60 @@
}
return 0;
}
+
+// Fehler werden nicht an diesem Objekt eingetragen, sondern am erzeugenden
+// Objekt. Wenn das unbekannt ist, wird das Standardverfahren zum Logging
+// verwendet.
+public int SmartLog(string unused, string error_type, string meldung,
+ string date)
+{
+ // Wenn kein Cloner, loggt der Aufrufer (vermutlich an diesem Objekt).
+ // Und ausserdem nur Meldungen von Spielershells akzeptieren.
+ if (!cloner
+ || strstr(load_name(previous_object()),"/std/shells/") == -1)
+ return 0;
+
+ mapping err = ([ F_PROG: "unbekannt",
+ F_LINE: 0,
+ F_MSG: meldung,
+ F_OBJ: cloner
+ ]);
+ string desc="etwas unbekanntes";
+ switch(error_type) {
+ case "BUGS":
+ desc="einen Fehler";
+ err[F_TYPE]=T_REPORTED_ERR;
+ break;
+ case "DETAILS":
+ desc="ein fehlendes Detail";
+ err[F_TYPE]=T_REPORTED_MD;
+ break;
+ case "IDEA":
+ desc="eine Idee";
+ err[F_TYPE]=T_REPORTED_IDEA;
+ break;
+ case "TYPO":
+ desc="einen Typo";
+ err[F_TYPE]=T_REPORTED_TYPO;
+ break;
+ case "SYNTAX":
+ desc="einen Syntaxhinweis";
+ err[F_TYPE]=T_REPORTED_SYNTAX;
+ break;
+ }
+ // Eintragung in die Fehler-DB
+ string hashkey = (string)ERRORD->LogReportedError(err);
+ if (stringp(hashkey))
+ {
+ previous_object()->ReceiveMsg(sprintf(
+ "Ein kleiner Fehlerteufel hat D%s an %s unter der ID %s "
+ "notiert.",
+ (cloner->IsRoom() ? "diesem Raum" : cloner->name(WEM,1)), desc,
+ hashkey || "N/A"),
+ MT_NOTIFICATION | MSG_DONT_BUFFER | MSG_DONT_STORE | MSG_DONT_IGNORE,
+ MA_UNKNOWN, 0, this_object());
+ return 1; // wurde erfolgreich protokolliert.
+ }
+
+ return 0; // nicht erfolgreich, Aufrufer muss protokollieren.
+}
diff --git a/secure/errord.c b/secure/errord.c
index 6ce0759..b7d647b 100644
--- a/secure/errord.c
+++ b/secure/errord.c
@@ -344,10 +344,11 @@
// T_REPORTED_MD, T_REPORTED_SYNTAX
public string LogReportedError(mapping err)
{
- //darf nur von Spielershells oder Fehlerteufel gerufen werden.
+ //darf nur von Spielershells oder Objekt in /obj/ (z.B. Fehlerteufel oder
+ //vitem_proxy) gerufen werden.
if (extern_call() && !previous_object()
|| (strstr(load_name(previous_object()),"/std/shells/") == -1
- && load_name(previous_object()) != "/obj/tools/fehlerteufel"))
+ && strstr(load_name(previous_object()), "/"LIBOBJDIR"/") == -1))
return 0;
//DEBUG("LogReportedError\n");