fehlerteufel.c-Dateireferenz

#include <defines.h>
#include <wizlevels.h>
#include <properties.h>
#include <moving.h>
#include <errord.h>
#include <config.h>
#include <debug_info.h>
Include-Abhängigkeitsdiagramm für fehlerteufel.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define TI   this_interactive()

Funktionen

public string format_stacktrace (mixed bt)
public string format_error (string hashvalue, mapping fehler)
public string format_notes (mixed notes)
private varargs void get_errors (int lmodus)
private void get_uids ()
public int CmdFehlerZeigen (string arg)
private mapping QueryLocal (string hashkey)
public int CmdFehlerLoeschen (string arg)
public int CmdRefresh (string arg)
public int CmdFehlerListe (string arg)
public int CmdFilter (string arg)
public int CmdMonitor (string arg)
public int CmdModus (string arg)
int CmdAddNote (string str)
int CmdFix (string str)
int CmdLock (string str)
int CmdReassign (string str)
public string QueryOwner ()
public mapping QueryErrors ()
void create ()
void init ()
mapping _query_autoloadobj ()
mapping _set_autoloadobj (mixed data)
void reset ()

Variablen

inherit std secure_thing
private string owner
private string * uids = ({})
private string * filteruids = ({})
private string * monitoruids = ({})
private int filterstatus = 0
private mapping fehler = ([])
private int modus = T_RTERROR
private string * xmonitoruids = ({})
private string lfehler = ""
private int altefehlerzahl

Makro-Dokumentation

#define TI   this_interactive()

Definiert in Zeile 23 der Datei fehlerteufel.c.


Dokumentation der Funktionen

mapping _query_autoloadobj (  ) 

Definiert in Zeile 803 der Datei fehlerteufel.c.

Benutzt altefehlerzahl, filterstatus, filteruids, modus und monitoruids.

00803                              {
00804     // auch ein leeres Array ist zum Glueck != 0
00805     return (["filteruids":filteruids,
00806                      "filterstatus":filterstatus,
00807                      "modus":modus,
00808                      "monitoruids":monitoruids,
00809                      "fehlerzahl": altefehlerzahl]);
00810 }

mapping _set_autoloadobj ( mixed  data  ) 

Definiert in Zeile 812 der Datei fehlerteufel.c.

Benutzt _query_autoloadobj(), altefehlerzahl, filterstatus, filteruids, modus und monitoruids.

00812                                      {
00813 
00814     if (mappingp(data)) {
00815       if (member(data,"filteruids") && pointerp(data["filteruids"]))
00816                 filteruids=data["filteruids"];
00817       if (member(data,"filterstatus") && intp(data["filterstatus"]))
00818                 filterstatus=data["filterstatus"];
00819       if (member(data,"modus") && intp(data["modus"]))
00820                 modus=data["modus"];
00821       if (member(data,"monitoruids") && pointerp(data["monitoruids"]))
00822                 monitoruids=data["monitoruids"];
00823       if (member(data,"fehlerzahl") && intp(data["fehlerzahl"]))
00824                 altefehlerzahl=data["fehlerzahl"];
00825     }
00826     return(_query_autoloadobj());
00827 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int CmdAddNote ( string  str  ) 

Definiert in Zeile 382 der Datei fehlerteufel.c.

Benutzt ERRORD, lfehler, notify_fail(), PL und TI.

00382                            {
00383   string *arr, hashkey;
00384   
00385   notify_fail("Bitte eine ID und einen Text angeben!\n");
00386   if(!objectp(TI)) return(0);
00387  
00388   str=(string)PL->_unparsed_args(0);
00389   if (!stringp(str) || !strlen(str))
00390     return(0);
00391   
00392   arr=explode(str," ")-({""});
00393   if (sizeof(arr)<2)
00394     return(0);
00395   hashkey=arr[0];
00396 
00397   str=implode(arr[1..]," ");  //text wiederherstellen, aber ohne Key
00398 
00399   switch((int)ERRORD->AddNote(hashkey,str)) {
00400     case -1:
00401       tell_object(PL,
00402                   sprintf("Es gibt keinen Fehler mit der ID: %s\n",hashkey));
00403       return(1);
00404     case -3:
00405       return(0); //offenbar keine Notiz angegeben.
00406   }
00407   // letzten Fehler merken.
00408   lfehler = hashkey;
00409 
00410   tell_object(PL,
00411       sprintf("Deine Notiz wurde zu %s hinzugefuegt.\n",
00412                 hashkey));
00413   return(1);
00414 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int CmdFehlerListe ( string  arg  ) 

Definiert in Zeile 150 der Datei fehlerteufel.c.

Benutzt err, F_COUNT, F_LOADNAME, F_STATE, F_TYPE, fehler, filterstatus, filteruids, get_errors(), modus, PL, STAT_DELETED, STAT_RESOLVED, T_RTERROR, T_RTWARN, uids und xmonitoruids.

00150                                       {
00151   string txt;
00152   string *luids;
00153   int lmodus; // modus fuer diese Liste
00154   mapping fehlerbackup;
00155 
00156   if (stringp(arg) && strlen(arg)) {
00157     switch(arg) {
00158       case "fehler":
00159       case "error":
00160       case "errors":
00161                 lmodus=T_RTERROR;
00162                 break;
00163       case "warnungen":
00164       case "warnung":
00165       case "warning":
00166       case "warnings":
00167                 lmodus=T_RTWARN;
00168         break;
00169       default:
00170                 lmodus=modus;
00171     }
00172     if (lmodus != modus) {
00173       fehlerbackup=fehler; // Fehlerliste von 'modus' aufheben
00174       get_errors(lmodus);  // neue Fehlerliste holen
00175     }
00176   }
00177   else lmodus=modus;
00178 
00179   if (!sizeof(fehler)) {
00180     txt="Fuer Deine UIDs sind keine Fehler/Warnungen bekannt.\n";
00181     tell_object(PL,txt);
00182     return 1;
00183   }
00184   else
00185     txt="";
00186   
00187   // UIDs ermitteln, die a) im Cache sind und b) entweder die eigenen sind
00188   // oder auf der Monitorliste stehen, also Schnittmenge bilden
00189   // Schnittmenge: (m_indices(fehler) & uids) 
00190   //             + (m_indices(fehler) & xmonitoruids)
00191   luids = m_indices(fehler);
00192   luids = (luids & uids ) + ( luids & xmonitoruids);
00193   // ggf. noch die ausgefiltern raussortieren
00194   if (filterstatus) {
00195     luids=m_indices(fehler)-filteruids;
00196   }
00197 
00198   foreach(string uid: luids) {
00199     string txt2="";
00200     foreach(string hashvalue, mapping err: fehler[uid]) {
00201       // geloeschte oder gefixte Fehler nicht anzeigen.
00202       if (err[F_STATE] & (STAT_DELETED | STAT_RESOLVED) ) 
00203                   continue;
00204       if (err[F_TYPE]==T_RTERROR || err[F_TYPE]==T_RTWARN)
00205                 txt2+=sprintf("%:32s: %.38-s, (%.4-d)\n",
00206                     hashvalue,err[F_LOADNAME],err[F_COUNT]);
00207       else
00208                 txt2+=sprintf("%:32s: %.45-s\n",hashvalue,err[F_LOADNAME]);
00209     }
00210     if (txt2!="")
00211       txt+=sprintf("\n%s:\n%s",uid,txt2);
00212   }
00213   if (txt=="") {
00214       tell_object(PL,"Fuer Deine UIDs sind keine Fehler/Warnungen "
00215                   "bekannt. :-)\n");
00216       return 1;
00217   }
00218 
00219   txt="Folgende Fehler/Warnungen sind fuer Deine UIDs bekannt "
00220     +(filterstatus ? "(Filter an):\n" : "(Filter aus):\n") + txt;
00221 
00222   tell_object(PL,txt);
00223   /*
00224   tell_room(environment(PL),break_string(PL->Name(WESSEN)
00225       +" kleiner Fehlerteufel erzaehlt "
00226       +PL->QueryPronoun(WEM)
00227       +" ganz leise etwas.",78),
00228       ({PL}));
00229 */
00230   if (mappingp(fehlerbackup) && modus!=lmodus)
00231     fehler=fehlerbackup; // fehlerliste fuer 'modus' restaurieren
00232   return 1;
00233 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int CmdFehlerLoeschen ( string  arg  ) 

Definiert in Zeile 91 der Datei fehlerteufel.c.

Benutzt altefehlerzahl, err, ERRORD, F_TYPE, F_UID, fehler, lfehler, m_delete(), notify_fail(), PL, QueryLocal(), uids und xmonitoruids.

00091                                          {
00092   int res;
00093 
00094   if (!stringp(arg) || !strlen(arg))
00095       arg = lfehler;
00096 
00097   notify_fail("Einen Eintrag mit dieser ID gibt es nicht!\n");
00098   
00099   mapping err = QueryLocal(arg);
00100   int eigener = mappingp(err);
00101   if (!eigener)
00102     err = (mapping)ERRORD->QueryError(arg, 0, 0);
00103   if (!sizeof(err))
00104     return 0;
00105 
00106   res=(int)ERRORD->ToggleDeleteError(arg, 0, err[F_TYPE], err[F_UID]);
00107   if (res==1) {
00108       if (eigener) {
00109                 // Fehler aus lokaler Liste loeschen
00110                 altefehlerzahl--;
00111                 efun::m_delete(fehler[err[F_UID]], arg);
00112       }
00113       tell_object(PL,
00114                 "Fehler/Warnung wurde zum Loeschen markiert und wird in Kuerze "
00115                 "geloescht.\n");
00116   }
00117   else if (res==2) {
00118       if (member(uids + xmonitoruids, err[F_UID]) != -1) {
00119                 // Fehler wird in die lokale Liste einfuegen
00120                 altefehlerzahl++;
00121                 fehler[err[F_UID]][arg] = (mapping)ERRORD->QueryError(arg,
00122                                                     err[F_TYPE], err[F_UID]);
00123       }
00124       tell_object(PL,"Loeschmarkierung wurde entfernt.\n");
00125   }
00126   else if (res==-1)
00127     return 0;
00128   else if (res==-2)
00129     tell_object(PL,"Du hast leider keinen Schreibzugriff auf diesen "
00130                 "Eintrag.\n");
00131 
00132   // letzten Fehler merken.
00133   lfehler = arg;
00134  
00135   /*
00136   tell_room(environment(PL),break_string(PL->Name(WER)
00137       +" fluestert "+PL->QueryPossPronoun(MALE,WEM,SINGULAR)
00138       +" Fehlerteufel leise etwas ins Ohr.",78),
00139       ({PL}));*/
00140   //get_errors(); // Fehler neu einlesen. TODO: nur den geaenderten Fehler.
00141   return 1;
00142 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int CmdFehlerZeigen ( string  arg  ) 

Definiert in Zeile 46 der Datei fehlerteufel.c.

Benutzt ERRORD, F_TYPE, fehler, format_error(), lfehler, notify_fail(), PL, T_RTERROR und T_RTWARN.

00046                                        {
00047   mapping fehler;
00048   string txt;
00049 
00050   if (!stringp(arg) || !strlen(arg))
00051       arg = lfehler;
00052   
00053   notify_fail("Einen Eintrag mit dieser ID gibt es nicht!\n");
00054 
00055   if (!mappingp(fehler=(mapping)ERRORD->QueryError(arg)) ||
00056        !sizeof(fehler)) {
00057       return 0;
00058   }
00059   // letzten Fehler merken.
00060   lfehler = arg;
00061   
00062   switch (fehler[F_TYPE]) {
00063     case T_RTERROR:
00064     case T_RTWARN:
00065       txt=format_error(arg,fehler);
00066       break;
00067   }
00068   
00069   if (!stringp(txt) || !strlen(txt))
00070       return 0;
00071 
00072   tell_object(PL,txt+"\n");
00073   /*tell_room(environment(PL),break_string(PL->Name(WESSEN)
00074       +" kleiner Fehlerteufel fluestert "
00075       +PL->QueryPronoun(WEM)
00076       +" eindringlich etwas ins Ohr. ",78),({PL}));
00077   */
00078   return 1;
00079 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int CmdFilter ( string  arg  ) 

Definiert in Zeile 235 der Datei fehlerteufel.c.

Benutzt break_string(), BS_LEAVE_MY_LFS, CountUp(), filterstatus, filteruids, PL und uids.

00235                                  {
00236 
00237   arg=(string)PL->_unparsed_args(0);  
00238  
00239   if (!stringp(arg) || !strlen(arg)) {
00240     tell_object(PL,break_string(
00241                   "Momentan interessieren Dich folgende UIDs nicht"
00242                   +(filterstatus ? " (Filter an):\n" : " (Filter aus):\n")
00243                   +CountUp(filteruids)+"\n", 78,"",BS_LEAVE_MY_LFS));
00244     return 1;
00245   }
00246 
00247   if (arg=="keine") {
00248     filteruids=({});
00249     filterstatus=1;
00250     tell_object(PL,break_string(
00251                 "Dein Fehlerteufel wird Dir nun nur noch ausgewaehlte "
00252                 "Fehler berichten. Momentan hast Du keine UIDs ausgeblendet. "
00253                 "(Filter an)",78));
00254   }
00255   else if (arg=="alle") {
00256     filterstatus=1;
00257     filteruids=uids;
00258     tell_object(PL,break_string(
00259                 "Dein Fehlerteufel wird Dir nun nur noch ausgewaehlte "
00260                 "Fehler berichten. Du blendest momentan alle UIDs aus. "
00261                 "(Filter an)",78));
00262   }
00263   else if (arg=="aus") {
00264     filterstatus=0;
00265     tell_object(PL,break_string(
00266                 "Dein Fehlerteufel wird Dir nun wieder alle Fehler berichten. ",
00267                 78));
00268   }
00269   else if (arg=="an" || arg=="ein") {
00270     filterstatus=1;
00271     tell_object(PL,break_string(
00272                 "Dein Fehlerteufel wird Dir nun nur noch ausgewaehlte "
00273                 "Fehler berichten.",78));
00274   }
00275   else {
00276     foreach(string uid: explode(arg," ")-({""})) {
00277       if (strlen(uid)>1 && uid[0]=='+') {
00278                 if (member(filteruids,uid[1..])==-1)
00279                   filteruids+=({uid[1..]});
00280       }
00281       else if (strlen(uid)>1 && uid[0]=='-') {
00282                   filteruids-=({uid[1..]});
00283       }
00284       else {
00285                 if (member(filteruids,uid)==-1)
00286                   filteruids+=({uid});
00287                 else
00288                   filteruids-=({uid});
00289       }
00290     }
00291   }
00292 
00293   tell_object(PL,break_string(
00294                   "Momentan interessieren Dich folgende UIDs nicht"
00295                   +(filterstatus ? " (Filter an):\n" : " (Filter aus):\n")
00296                   +CountUp(filteruids)+"\n", 78,"",BS_LEAVE_MY_LFS));
00297 
00298   return 1;
00299 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int CmdFix ( string  str  ) 

Definiert in Zeile 416 der Datei fehlerteufel.c.

Benutzt altefehlerzahl, err, ERRORD, F_TYPE, F_UID, fehler, lfehler, m_delete(), notify_fail(), PL, QueryLocal(), TI, uids und xmonitoruids.

00416                        {
00417   string *arr, hashkey;
00418   int fixing, res;
00419 
00420   notify_fail("Bitte eine ID und optional eine Notiz angeben!\n");
00421   if(!objectp(TI)) return(0);
00422  
00423   str=(string)PL->_unparsed_args(0);
00424   if (!stringp(str) || !strlen(str))
00425     return(0);
00426   
00427   arr=explode(str," ")-({""});
00428   if (!sizeof(arr)) return 0;
00429  
00430   hashkey=arr[0];
00431   if (sizeof(arr)>1)
00432     str=implode(arr[1..]," ");  //text wiederherstellen, aber ohne Key
00433   else str=0;
00434 
00435   notify_fail("Einen Fehler mit dieser ID gibt es leider nicht.\n");
00436   mapping err = QueryLocal(hashkey);
00437   int eigener = mappingp(err);
00438   if (!eigener)
00439     err = (mapping)ERRORD->QueryError(hashkey, 0, 0);
00440   if (!sizeof(err))
00441     return 0;
00442 
00443   if (query_verb()=="ffix" || query_verb()=="fehlerfix") {
00444       fixing=1;
00445       res=(int)ERRORD->ResolveError(hashkey,str, err[F_TYPE], err[F_UID]);
00446   }
00447   else {
00448       res=(int)ERRORD->ReOpenError(hashkey, str);
00449   }
00450 
00451   if (res==-1) {
00452       tell_object(PL,
00453                   sprintf("Es gibt keinen Fehler mit der ID: %s\n",hashkey));
00454   }
00455   else if (res==-2) {
00456       tell_object(PL,
00457                 "Du hast leider keinen Schreibzugriff diesen Fehler.\n"
00458                 "Aber vielleicht moechtest Du mit fnotiz eine Notiz anhaengen?\n");
00459   }
00460   else if (res==-3) {
00461     if (fixing)
00462       tell_object(PL,"Dieser Fehler ist bereits gefixt.\n");
00463     else
00464       tell_object(PL,"Dieser Fehler noch nicht gefixt.\n");
00465   }
00466   else if (res>0) {
00467     if (fixing) {
00468       // fehler in lokaler Liste ggf. loeschen.
00469       if (eigener) {
00470                 efun::m_delete(fehler[err[F_UID]], hashkey);
00471                 altefehlerzahl--;
00472       }
00473       tell_object(PL,
00474                   sprintf("Fehler %s als gefixt markiert.\n",hashkey));
00475     }
00476     else {
00477       // eigene UID oder beobachtete? -> fehler in lokaler Liste
00478       if (member(uids + xmonitoruids, err[F_UID]) != -1) {
00479                 altefehlerzahl++;
00480                 fehler[err[F_UID]][hashkey] = (mapping)ERRORD->QueryError(hashkey,
00481                                                        err[F_TYPE], err [F_UID]);
00482       }
00483       tell_object(PL,
00484                   sprintf("Fehler %s als nicht gefixt markiert.\n",hashkey));
00485     }
00486   }
00487   // letzten Fehler merken.
00488   lfehler = hashkey;
00489   //get_errors(); // TODO: nur den geaenderten Fehler. ;-)
00490   return(1);
00491 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int CmdLock ( string  str  ) 

Definiert in Zeile 493 der Datei fehlerteufel.c.

Benutzt ERRORD, lfehler, notify_fail(), PL und TI.

00493                         {
00494   string *arr, hashkey;
00495   int locking;
00496   mixed res;
00497 
00498   notify_fail("Bitte eine ID und optional eine Notiz angeben!\n");
00499   if(!objectp(TI)) return(0);
00500  
00501   str=(string)PL->_unparsed_args(0);
00502   if (!stringp(str) || !strlen(str))
00503     return(0);
00504   
00505   arr=explode(str," ")-({""});
00506   if (!sizeof(arr)) return 0;
00507  
00508   hashkey=arr[0];
00509   if (sizeof(arr)>1)
00510     str=implode(arr[1..]," ");  //text wiederherstellen, aber ohne Key
00511   else str=0;
00512  
00513   if (query_verb()=="flock" || query_verb()=="fehlerlock") {
00514       locking=1;
00515       res=(mixed)ERRORD->LockError(hashkey,str);
00516   }
00517   else {
00518       res=(int)ERRORD->UnlockError(hashkey,str);
00519   }
00520 
00521   if (res==-1) {
00522       tell_object(PL,
00523                   sprintf("Es gibt keinen Fehler mit der ID: %s\n",hashkey));
00524   }
00525   else if (res==-2) {
00526        tell_object(PL,
00527                    "Du hast leider keinen Schreibzugriff diesen Fehler.\n");
00528   }
00529   else if (res==-3) {
00530       if (locking)
00531                   tell_object(PL,
00532                       "Dieser Fehler ist bereits vor autom. Loeschen geschuetzt.\n");
00533       else
00534                   tell_object(PL,
00535                       "Dieser Fehler ist bereits zum autom. Loeschen freigegeben.\n");
00536   }
00537   else if (res==-4) {
00538        tell_object(PL,
00539                    "Dieser Fehler ist bereits gefixt und wird bald geloescht.\n");
00540   }
00541   else if (pointerp(res) && sizeof(res)==2) {
00542     if (locking)
00543       tell_object(PL,
00544                   sprintf("Fehler %s vor autom. Loeschen geschuetzt.\n",hashkey));
00545   }
00546   else if (res>0) {
00547     if (!locking)
00548       tell_object(PL,
00549                   sprintf("Fehler %s zum autom. Loeschen freigegeben.\n",hashkey));
00550   }
00551   // letzten Fehler merken.
00552   lfehler = hashkey;
00553 
00554   return(1);
00555 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int CmdModus ( string  arg  ) 

Definiert in Zeile 347 der Datei fehlerteufel.c.

Benutzt break_string(), modus, PL, reset(), T_RTERROR und T_RTWARN.

00347                                 {
00348   string txt;
00349   
00350   // Argument verwursten
00351   if (stringp(arg) && strlen(arg)) {
00352     switch(arg) {
00353       case "fehler":
00354       case "error":
00355       case "errors":
00356                 modus=T_RTERROR;
00357                 break;
00358       case "warnungen":
00359       case "warnung":
00360       case "warning":
00361       case "warnings":
00362                 modus=T_RTWARN;
00363         break;
00364     }
00365     reset();  // neue Fehlerliste holen
00366   }
00367   // aktuelle Einstellung ausgeben.
00368   switch(modus) {
00369     case T_RTERROR:
00370       txt="Fehler (Laufzeit)";
00371       break;
00372     case T_RTWARN:
00373       txt="Warnungen (Laufzeit)";
00374       break;
00375   }
00376   tell_object(PL, break_string(
00377       "Deiner Fehlerteufel wird Dir nun ueber aufgetretene "
00378       +txt+" Bericht erstatten.",78));
00379   return(1);
00380 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int CmdMonitor ( string  arg  ) 

Definiert in Zeile 301 der Datei fehlerteufel.c.

Benutzt break_string(), BS_LEAVE_MY_LFS, CountUp(), get_uids(), monitoruids, PL und xmonitoruids.

00301                                   {
00302 
00303   arg=(string)PL->_unparsed_args(0);  
00304  
00305   if (!stringp(arg) || !strlen(arg)) {
00306     tell_object(PL,break_string(
00307                   "Momentan interessieren Dich folgende UIDs zusaetzlich zu Deinen: \n"
00308                   +(sizeof(monitoruids) ? CountUp(monitoruids) : "")
00309                   +"\n", 78,"",BS_LEAVE_MY_LFS));
00310     return 1;
00311   }
00312 
00313   if (arg=="keine") {
00314     monitoruids=({});
00315     xmonitoruids=({});
00316     tell_object(PL,break_string(
00317                 "Dein Fehlerteufel wird Dir nun nur noch "
00318                 "Fehler Deiner eigenen UIDs berichten.",78));
00319     return 1;
00320   }
00321   else {
00322     foreach(string uid: explode(arg," ")-({""})) {
00323       if (strlen(uid)>1 && uid[0]=='+') {
00324                 if (member(monitoruids,uid[1..])==-1)
00325                   monitoruids+=({uid[1..]});
00326       }
00327       else if (strlen(uid)>1 && uid[0]=='-') {
00328                   monitoruids-=({uid[1..]});
00329       }
00330       else {
00331                 if (member(monitoruids,uid)==-1)
00332                   monitoruids+=({uid});
00333                 else
00334                   monitoruids-=({uid});
00335       }
00336     }
00337   }
00338   get_uids();
00339   tell_object(PL,break_string(
00340                 "Momentan interessieren Dich folgende UIDs zusaetzlich zu Deinen: \n"
00341                 +(sizeof(monitoruids) ? CountUp(monitoruids) : "")
00342                 +"\n", 78,"",BS_LEAVE_MY_LFS));
00343 
00344   return 1;
00345 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int CmdReassign ( string  str  ) 

Definiert in Zeile 557 der Datei fehlerteufel.c.

Benutzt break_string(), ERRORD, get_errors(), lfehler, notify_fail(), PL und TI.

00557                             {
00558 
00559   notify_fail("Bitte eine ID, die neue UID und ggf. eine Notiz angeben!\n");
00560   if(!objectp(TI)) return(0);
00561  
00562   str=(string)PL->_unparsed_args(0);
00563   if (!stringp(str) || !strlen(str))
00564     return(0);
00565   
00566   string *arr=explode(str," ")-({""});
00567   if (sizeof(arr)<2)
00568     return(0);
00569   string hashkey=arr[0];
00570   string newuid=arr[1];
00571 
00572   //text wiederherstellen, aber ohne Key und UID
00573   if (sizeof(arr) > 2)
00574     str = implode(arr[2..]," ");
00575   else
00576     str = 0;
00577 
00578   switch((int)ERRORD->ReassignError(hashkey, newuid, str)) {
00579     case -1:
00580       tell_object(PL,
00581                   sprintf("Es gibt keinen Fehler mit der ID: %s\n",hashkey));
00582       return(1);
00583     case -2:
00584       tell_object(PL,
00585                   sprintf("Du hast keine Schreibrechte auf Fehler %s\n",hashkey));
00586       return 1;
00587     case -3:
00588       return(0); //offenbar keine Notiz angegeben.
00589     case -4:
00590       tell_object(PL,break_string(
00591                   sprintf("In %s gibt es bereits einen Fehler der ID %s\n",
00592                     newuid,hashkey),78));
00593       return 1;
00594   }
00595   // letzten Fehler merken.
00596   lfehler = hashkey;
00597   // neue Fehlerliste holen (ja, schneller waere, den geaenderten Fehler
00598   // lokal zu aendern.
00599   get_errors();
00600 
00601   tell_object(PL,break_string(
00602       sprintf("Der Fehler der ID %s wurde an die UID %s "
00603                 "uebertragen.\n", hashkey, newuid),78));
00604   return(1);
00605 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int CmdRefresh ( string  arg  ) 

Definiert in Zeile 144 der Datei fehlerteufel.c.

Benutzt PL und reset().

00144                                   {
00145     reset();
00146     tell_object(PL,"Fehlerdaten wurden neu eingelesen.\n");
00147     return 1;
00148 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void create (  ) 

Definiert in Zeile 724 der Datei fehlerteufel.c.

Benutzt AddCmd(), AddId(), break_string(), create(), MALE, ME, P_GENDER, P_LONG, P_NAME, P_NEVERDROP, P_NODROP, P_SHORT, P_SIZE, P_VALUE, P_WEIGHT und SetProp().

00724               {
00725     if (!clonep(ME))
00726         return;
00727     ::create(); 
00728 
00729     SetProp(P_SHORT,"Der Fehlerteufel");
00730     SetProp(P_LONG,break_string(
00731                   "Dein Fehlerteufel soll Dir helfen, Informationen "
00732                   "ueber aufgetretene Fehler zu erhalten. Hierzu fragt er die "
00733                   "in \"Deinen\" UIDs aufgetretenen Fehler und deren Details vom "
00734                   "Fehlerspeicher der Mudlib ab. Folgende Kommandos kennt er:",78)
00735     +"fehlerabfrage <id>  - Fragt Details ueber Fehler mit der ID ab.\n"
00736     "fehlerloeschen <id> - Fehler zum Loeschen markieren.\n"
00737     "fehlerliste         - Fehlerliste der eigenen UIDs anzeigen\n"
00738     "fehlerrefresh       - Fehlerdaten und UIDs neu einlesen\n"
00739     "fehlerfilter        - UIDs fuer den Filter angeben (s. manpage!)\n"
00740     "fehlermodus         - Fehler oder Warnungen ausgeben? (s. manpage)\n"
00741     "fehlermonitor       - zus. UIDs beobachten (s. manpage)\n"
00742     "fnotiz <id> <note>  - eine Notiz anhaengen\n"
00743     "flock <id>  <note>  - Fehler vor autom. Loeschen schuetzen\n"
00744     "funlock <id> <note> - Fehler zum autom. Loeschen freigeben\n"
00745     "ffix <id> <note>    - Fehler als gefixt kennzeichnen\n"
00746     "funfix <id> <note>  - gefixten Fehler als nicht-gefixt markieren\n"
00747     "fuebertrage <id> <newuid> <note>\n"
00748     "                    - Fehler an die UID uebertragen\n"
00749     );
00750     SetProp(P_NAME,"Fehlerteufel");
00751     SetProp(P_GENDER,MALE);
00752     SetProp(P_WEIGHT,0);
00753     SetProp(P_VALUE,0);
00754     SetProp(P_SIZE,10);
00755     SetProp(P_NODROP,"Den Fehlerteufel behaelst Du lieber bei Dir.\n");
00756     SetProp(P_NEVERDROP,1);
00757 
00758     AddId( ({"fehlerteufel","teufel"}) );
00759 
00760     AddCmd(({"fehlerabfrage","fabfrage"}), "CmdFehlerZeigen" );
00761     AddCmd(({"fehlerloeschen","floeschen"}), "CmdFehlerLoeschen");
00762     AddCmd(({"fehlerliste","fliste", "fehleruebersicht","fuebersicht"}), 
00763                 "CmdFehlerListe");
00764     AddCmd(({"fehlerrefresh","frefresh"}),"CmdRefresh");
00765     AddCmd(({"fehlerfilter","ffilter"}),"CmdFilter");
00766     AddCmd(({"fehlermodus","fmodus"}),"CmdModus");
00767     AddCmd(({"fehlermonitor","fmonitor"}),"CmdMonitor");
00768     AddCmd(({"fehlernotiz","fnotiz"}),"CmdAddNote");
00769     AddCmd(({"fehlerlock","flock","fehlerunlock","funlock"}),
00770                 "CmdLock");
00771     AddCmd(({"fehlerfix","ffix","fehlerunfix","funfix"}),
00772                 "CmdFix");
00773     AddCmd(({"fehleruebertrage","fuebertrage"}),"CmdReassign");
00774 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public string format_error ( string  hashvalue,
mapping  fehler 
)

Definiert in Zeile 646 der Datei fehlerteufel.c.

Benutzt abs, break_string(), BS_INDENT_ONCE, dtime(), F_CAUGHT, F_CLI, F_COUNT, F_CREATESTAMP, F_HB_OBJ, F_LINE, F_LOADNAME, F_LOCK, F_MODSTAMP, F_MSG, F_NOTES, F_OBJ, F_PROG, F_STACK, F_STATE, F_TIENV, F_TITP, F_TYPE, F_UID, F_VERB, format_notes(), format_stacktrace(), STAT_DELETED, STAT_LOCKED, STAT_RESOLVED, T_RTERROR und T_RTWARN.

Wird benutzt von CmdFehlerZeigen() und versende_mail().

00646                                                              {
00647   string txt;
00648   string *label;
00649   
00650   if (!mappingp(fehler) || !sizeof(fehler) || !strlen(hashvalue)) { 
00651     return 0;
00652   }
00653   switch(fehler[F_TYPE]) {
00654     case T_RTERROR:
00655       label=({"Fehler","Dieser Fehler"});
00656       break;
00657     case T_RTWARN:
00658       label=({"Warnung","Diese Warnung"});
00659       break;
00660     default: return 0;
00661   }
00662 
00663   txt=sprintf( "\nDaten fuer %s mit ID '%s':\n"
00664                "Zeit: %25s (Erstmalig: %25s)\n"
00665                        "Programm:   %.60s\n"
00666                        "Zeile:      %.60d\n"
00667                        "Objekt:     %.60s\n"
00668                        "Loadname:   %.60s\n"
00669                        "UID:        %.60s\n",
00670                        label[0], hashvalue,
00671                        dtime(abs(fehler[F_MODSTAMP])),dtime(fehler[F_CREATESTAMP]),
00672                        fehler[F_PROG] || "<Unbekannt>", 
00673                        fehler[F_LINE], fehler[F_OBJ],
00674                        fehler[F_LOADNAME], fehler[F_UID]);
00675                       
00676   txt+=sprintf("%s",break_string(fehler[F_MSG],78,
00677                           "Meldung:    ",BS_INDENT_ONCE));
00678   if (stringp(fehler[F_HB_OBJ]))
00679       txt+=sprintf(
00680                        "HB-Obj:     %.60s\n",fehler[F_HB_OBJ]);
00681 
00682   if (stringp(fehler[F_TITP])) {
00683       txt+=sprintf(
00684                        "TI/TP:      %.60s\n",fehler[F_TITP]);
00685       if (stringp(fehler[F_TIENV]))
00686                   txt+=sprintf(
00687                        "Environm.:  %.60s\n",fehler[F_TIENV]);
00688   }
00689    
00690   if (!stringp(fehler[F_CLI]) || fehler[F_CLI]=="Bitte EM fragen") {
00691       // in diesem Fall zumindest das Verb ausgeben, so vorhanden
00692       if (fehler[F_VERB])
00693                   txt+=sprintf(
00694                       "Verb:        %.60s\n",fehler[F_VERB]);
00695   }
00696   else if (stringp(fehler[F_CLI]))
00697       txt+=sprintf(     
00698                   "Befehl:     %.60s\n",fehler[F_CLI]);
00699   if (fehler[F_CAUGHT])
00700       txt+=label[1]+" trat in einem 'catch()' auf.\n";
00701  
00702   if (fehler[F_STATE] & STAT_DELETED)
00703       txt+=label[1]+" wurde als geloescht markiert.\n";
00704   if (fehler[F_STATE] & STAT_LOCKED)
00705       txt+=break_string(
00706                   sprintf("%s wurde von %s am %s vor automatischem Loeschen "
00707                   "geschuetzt (locked).\n",
00708                   label[1],fehler[F_LOCK][1],dtime(fehler[F_LOCK][0])),78);
00709   if (fehler[F_STATE] & STAT_RESOLVED)
00710       txt+=label[1]+" wurde als erledigt markiert.\n";
00711  
00712   txt+=sprintf("%s trat bisher %d Mal auf.\n",
00713                label[1],fehler[F_COUNT]);
00714   
00715   if (pointerp(fehler[F_STACK]))
00716       txt+="Backtrace:\n"+format_stacktrace(fehler[F_STACK])+"\n";
00717 
00718   if (pointerp(fehler[F_NOTES]) && sizeof(fehler[F_NOTES]))
00719       txt+="Bemerkungen:\n"+format_notes(fehler[F_NOTES])+"\n";
00720 
00721   return txt;
00722 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

public string format_notes ( mixed  notes  ) 

Definiert in Zeile 635 der Datei fehlerteufel.c.

Benutzt break_string(), dtime() und i.

Wird benutzt von format_error().

00635                                         {
00636   int i;
00637   string txt="";
00638   foreach(mixed note: notes) {
00639     txt+=sprintf("Notiz %d von %.10s am %.30s\n%s",
00640                 ++i,capitalize(note[1]),dtime(note[0]),
00641                 break_string(note[2],78,"  "));
00642   }
00643   return txt;
00644 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

public string format_stacktrace ( mixed  bt  ) 

Definiert in Zeile 611 der Datei fehlerteufel.c.

Benutzt lines, TRACE_EVALCOST, TRACE_LOC, TRACE_NAME, TRACE_OBJECT und TRACE_PROGRAM.

Wird benutzt von format_error().

00611                                           {
00612     string *lines;
00613 
00614     if (!pointerp(bt) || !sizeof(bt))
00615                 return("");
00616     lines=({});
00617     foreach(mixed frame: bt) {
00618       if (stringp(frame))
00619                 lines+=({sprintf("Thread-Start: %s",frame)});
00620       else if (pointerp(frame)) {
00621                 lines+=({sprintf("Fun: %.20O in Prog: %.40s\n"
00622                                  "   Zeile: %.8d [%.50s]\n"
00623                                                  "   Evalcosts: %d",
00624                                  frame[TRACE_NAME],frame[TRACE_PROGRAM],
00625                                                  frame[TRACE_LOC],frame[TRACE_OBJECT],
00626                                                  (sizeof(frame) > TRACE_EVALCOST) ? 
00627                                                               frame[TRACE_EVALCOST] : 0)
00628                         });
00629       }
00630     }
00631 
00632     return(implode(lines,"\n"));
00633 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private varargs void get_errors ( int  lmodus  ) 

Definiert in Zeile 869 der Datei fehlerteufel.c.

Benutzt ERRORD, fehler, modus, uids und xmonitoruids.

Wird benutzt von CmdFehlerListe(), CmdReassign() und reset().

00869                                             {
00870     if (!lmodus)
00871       lmodus=modus;
00872     fehler=m_allocate(10,1);
00873     foreach(string uid : uids + xmonitoruids) {
00874       fehler+=([uid:(mapping)ERRORD->QueryErrors(lmodus,uid)]);
00875     }
00876 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private void get_uids (  ) 

Definiert in Zeile 858 der Datei fehlerteufel.c.

Benutzt cl, master, monitoruids, owner, uids und xmonitoruids.

Wird benutzt von CmdMonitor() und reset().

00858                         {
00859     uids=(string *)master()->QueryUIDsForWizard(owner);
00860     xmonitoruids=({});
00861     if (sizeof(monitoruids)) {
00862       closure cl=symbol_function("QueryUIDAlias", master());
00863       foreach(string uid: monitoruids) {
00864                 xmonitoruids += (string*)funcall(cl, uid);
00865       }
00866     }
00867 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void init (  ) 

Definiert in Zeile 776 der Datei fehlerteufel.c.

Benutzt break_string(), call_out(), init(), IS_LEARNER, Name(), owner, P_EXTRA_LOOK, QueryPronoun(), SetProp(), WEM und WESSEN.

00776             {
00777     if (find_call_out("remove") != -1) return;
00778     // pruefung auf env nicht noetig, move geht nur in ein env und ohne env
00779     // auch kein init().
00780     if ( !query_once_interactive(environment()) || 
00781                 !IS_LEARNER(environment())) {
00782                 // in interactive, aber kein magier -> direkt weg.
00783                 call_out("remove",0,1);
00784                 return;
00785     }
00786     else if (!strlen(owner))
00787                 // Env ist Interactiv und Magier (sonst waer man oben rausgeflogen)
00788                 owner=getuid(environment());
00789     else if (owner!=getuid(environment())) {
00790        //ok, nicht der Eigentuemer, direkt weg.
00791        call_out("remove",0);
00792        return;
00793    }
00794    SetProp(P_EXTRA_LOOK,break_string(
00795                  "Auf "+environment()->Name(WESSEN)+" Schulter sitzt ein kleiner "
00796                  "Fehlerteufel, der "
00797                  +environment()->QueryPronoun(WEM)
00798                  +" immer wieder etwas ins Ohr fluestert.",78));
00799    call_out("reset",1);
00800    ::init();
00801 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public mapping QueryErrors (  ) 

Definiert in Zeile 609 der Datei fehlerteufel.c.

Benutzt fehler.

00609 {return fehler;}

private mapping QueryLocal ( string  hashkey  ) 

Definiert in Zeile 82 der Datei fehlerteufel.c.

Benutzt fehler.

Wird benutzt von CmdFehlerLoeschen() und CmdFix().

00082                                            {
00083   foreach(string uid, mapping errs: fehler) {
00084     if (member(errs, hashkey)) {
00085       return errs[hashkey];
00086     }
00087   }
00088   return 0;
00089 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

public string QueryOwner (  ) 

Definiert in Zeile 608 der Datei fehlerteufel.c.

Benutzt owner.

00608 {return owner;}

void reset ( void   ) 

Definiert in Zeile 830 der Datei fehlerteufel.c.

Benutzt altefehlerzahl, break_string(), F_STATE, fehler, get_errors(), get_uids(), ME, STAT_DELETED und STAT_RESOLVED.

00830              {
00831     int neuefehlerzahl;
00832 
00833     get_uids();
00834     get_errors();
00835     
00836     // neue Fehler zaehlen, dabei aber nur die nicht-geloeschten und
00837     // nicht-geloesten beruecksichtigen.
00838     foreach(string uid, mapping errs: fehler) {
00839       neuefehlerzahl+=sizeof(filter(errs, function int (string key, mapping e)
00840                     { if (e[F_STATE] & (STAT_DELETED | STAT_RESOLVED))
00841                         return 0;
00842                       return 1;
00843                     }
00844                       ));
00845     }
00846     if (altefehlerzahl < neuefehlerzahl)
00847       tell_object(environment(ME), break_string(
00848                 "Deine Fehlerliste ist soeben laenger geworden.",78,
00849                 "Dein Fehlerteufel teilt Dir mit: "));
00850     else if (altefehlerzahl > neuefehlerzahl)
00851       tell_object(environment(ME), break_string(
00852                 "Deine Fehlerliste ist soeben kuerzer geworden.",78,
00853                 "Dein Fehlerteufel teilt Dir mit: "));
00854     altefehlerzahl = neuefehlerzahl;
00855 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:


Variablen-Dokumentation

private int altefehlerzahl

Definiert in Zeile 35 der Datei fehlerteufel.c.

Wird benutzt von _query_autoloadobj(), _set_autoloadobj(), CmdFehlerLoeschen(), CmdFix() und reset().

private mapping fehler = ([])
private int filterstatus = 0

Definiert in Zeile 30 der Datei fehlerteufel.c.

Wird benutzt von _query_autoloadobj(), _set_autoloadobj(), CmdFehlerListe() und CmdFilter().

private string* filteruids = ({})

Definiert in Zeile 28 der Datei fehlerteufel.c.

Wird benutzt von _query_autoloadobj(), _set_autoloadobj(), CmdFehlerListe() und CmdFilter().

private string lfehler = ""

Definiert in Zeile 34 der Datei fehlerteufel.c.

Wird benutzt von CmdAddNote(), CmdFehlerLoeschen(), CmdFehlerZeigen(), CmdFix(), CmdLock() und CmdReassign().

private int modus = T_RTERROR

Definiert in Zeile 32 der Datei fehlerteufel.c.

Wird benutzt von _query_autoloadobj(), _set_autoloadobj(), CmdFehlerListe(), CmdModus() und get_errors().

private string* monitoruids = ({})

Definiert in Zeile 29 der Datei fehlerteufel.c.

Wird benutzt von _query_autoloadobj(), _set_autoloadobj(), CmdMonitor() und get_uids().

private string owner

Definiert in Zeile 26 der Datei fehlerteufel.c.

inherit std secure_thing

Definiert in Zeile 13 der Datei fehlerteufel.c.

private string* uids = ({})
private string* xmonitoruids = ({})

Definiert in Zeile 33 der Datei fehlerteufel.c.

Wird benutzt von CmdFehlerListe(), CmdFehlerLoeschen(), CmdFix(), CmdMonitor(), get_errors() und get_uids().

Erzeugt am Thu Jun 3 14:39:49 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3