#include <defines.h>#include <wizlevels.h>#include <properties.h>#include <moving.h>#include <errord.h>#include <config.h>#include <debug_info.h>
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 |
| #define TI this_interactive() |
Definiert in Zeile 23 der Datei fehlerteufel.c.
| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| public int CmdRefresh | ( | string | arg | ) |
| 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 }

| 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 }


| 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 }


| 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 }

| 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 }

| 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 }

| 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 }

| public mapping QueryErrors | ( | ) |
| 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 }

| public string QueryOwner | ( | ) |
| 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 }

| 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 = ([]) |
Definiert in Zeile 31 der Datei fehlerteufel.c.
Wird benutzt von CmdFehlerListe(), CmdFehlerLoeschen(), CmdFehlerZeigen(), CmdFix(), get_errors(), QueryErrors(), QueryLocal(), reset() und throw_it().
| 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 = ({}) |
Definiert in Zeile 27 der Datei fehlerteufel.c.
Wird benutzt von CmdFehlerListe(), CmdFehlerLoeschen(), CmdFilter(), CmdFix(), ExpandUIDAlias(), get_errors() und get_uids().
| private string* xmonitoruids = ({}) |
Definiert in Zeile 33 der Datei fehlerteufel.c.
Wird benutzt von CmdFehlerListe(), CmdFehlerLoeschen(), CmdFix(), CmdMonitor(), get_errors() und get_uids().
1.6.3