blob: 8b611f86255490c1fe9e1339e1f08a7181252eb9 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001/* /obj/toostels/fehlerteufel.c
2 Fehlerteufel - Magiertool zur Abfrage des Fehler-Daemons der Mudlib
3 Autor: Zesstra
4 Changelog:
5*/
6
7#pragma strict_types
Zesstra6b5ac892019-11-26 21:28:16 +01008//#pragma pedantic
MG Mud User88f12472016-06-24 23:31:02 +02009#pragma range_check
10#pragma no_shadow
11#pragma no_inherit
12
13inherit "/std/secure_thing";
14inherit "/secure/errord-structs";
15
16#include <defines.h>
17#include <wizlevels.h>
18#include <properties.h>
19#include <moving.h>
20#include <errord.h>
21#include <config.h>
22#include <debug_info.h>
23#include <input_to.h>
24#include <strings.h>
25
26#define TI this_interactive()
27
28#define DEBUG(x) if (funcall(symbol_function('find_player),"zesstra"))\
29 tell_object(funcall(symbol_function('find_player),"zesstra"),\
30 "EDBG: "+x+"\n")
31
32// variables
33private string owner; // UID vom Eigentuemer
34private string *uids=({}); // UIDs, auf die man schreibrechte hat
35private string *filteruids=({}); // wenn nicht-leer, nur diese UIDs zeigen
36private string *monitoruids=({}); // diese UIDs in die Liste einschliessen
37private int filterstatus=0; // Filter an oder aus?
38private mapping issuelist = ([]);
39/* ([ type1: ([uid1: <issuelist>, uid2: <issuelist> ]),
40 type2: ... ])
41 <issuelist> ist ein < <int|string>* >* vom ErrorD */
42
43//Welche Art von Fehler anzeigen?
44private int modus=T_RTERROR | T_RTWARN | T_REPORTED_ERR;
45private string *xmonitoruids = ({}); // expanded Monitor-UIDs
46private int lfehler; // letzter 'benutzter' Fehler.
47private int fehlerzahl; // fehlerzahl im letzten Reset.
48private mapping feingabe; // gerade eingegebener Fehler
49
50// ************** private functions **************
Bugfix86a40cb2022-09-22 13:34:51 +020051private varargs int update_issuelist(int lmodus);
MG Mud User88f12472016-06-24 23:31:02 +020052private void get_uids();
Bugfix74112842019-05-28 19:06:33 +020053private struct fullissue_s get_issue(string arg);
Bugfix43e311b2022-09-22 13:20:34 +020054private struct fullissue_s|struct fullissue_s* get_issues(string arg, int parsed = 0);
MG Mud User88f12472016-06-24 23:31:02 +020055
56// irgendeinen Fehler oder Warnung anzeigen.
57private int show_entry(struct fullissue_s issue)
58{
59 if (!issue) return 0;
60
bugfixd94d0932020-04-08 11:27:13 +020061 string txt=({string})ERRORD->format_error(issue, 0);
MG Mud User88f12472016-06-24 23:31:02 +020062
63 if (!stringp(txt) || !sizeof(txt))
64 return 0;
65
66 tell_object(PL,txt+"\n");
67 return 1;
68}
69
70protected int _feingabe_fertig(string arg) {
71
72 if (arg == "j")
73 {
74 if (!feingabe[F_MSG])
75 {
76 tell_object(PL,
77 "Also, eine Fehlerbeschreibung solltest Du schon eingeben! Abgebrochen.\n");
78 }
79 else
80 {
Vaniondb7851b2020-03-10 21:52:34 +010081 string hashkey = ({string})ERRORD->LogReportedError(feingabe);
MG Mud User88f12472016-06-24 23:31:02 +020082 tell_object(PL, sprintf(
83 "Vielen Dank! Die ID des eingegebenen Fehlers lautet: %s\n",
84 hashkey || "N/A"));
85 }
86 }
87 else
88 {
89 tell_object(PL, "Fehlereingabe abgebrochen.\n");
90 }
91
92 feingabe = 0;
93
94 return 1;
95}
96
97public int CmdFehlerEingabe(string arg) {
Arathorn2e77c0a2016-08-27 14:37:47 +020098 object|string target;
MG Mud User88f12472016-06-24 23:31:02 +020099
100 if (feingabe)
101 {
Arathorn2e77c0a2016-08-27 14:37:47 +0200102 tell_object(PL, "Du gibst doch bereits einen Fehler ein!\n");
MG Mud User88f12472016-06-24 23:31:02 +0200103 return 1;
104 }
105 feingabe = ([]);
106
107 if (arg)
108 {
109 target = present(arg);
110 if (!target)
111 target = find_object(arg); // vielleicht direkt angegeben?
Arathorn2e77c0a2016-08-27 14:37:47 +0200112 // Vielleicht gibt es ja eine Datei, die so heisst?
113 if (!target && file_size(arg) >= 0)
114 target = arg;
MG Mud User88f12472016-06-24 23:31:02 +0200115 }
116 // wenn nix gefunden, Environment des Magiers nehmen.
117 if (!target)
Arathorn2e77c0a2016-08-27 14:37:47 +0200118 {
119 tell_object(PL, break_string("Kein Objekt und keine Datei "
120 "angegeben, Fehler wird fuer den Raum eingetragen.",78));
MG Mud User88f12472016-06-24 23:31:02 +0200121 target = environment(environment());
Arathorn2e77c0a2016-08-27 14:37:47 +0200122 }
MG Mud User88f12472016-06-24 23:31:02 +0200123
124 feingabe[F_OBJ] = target;
125
126 tell_object(PL, break_string(sprintf(
127 "Du beginnst einen Fehlereintrag fuer das Objekt: %O\n", target),78));
128
129 input_to(function void (string str)
130 {
131 if (sizeof(str)) feingabe[F_MSG] = str;
132 }, INPUT_PROMPT, "Fehlerbeschreibung eingeben:\n");
133
134 input_to(function void (string str)
135 {
136 if (sizeof(str)) feingabe[F_PROG] = str;
137 else feingabe[F_PROG] = "unbekannt";
138 }, INPUT_PROMPT|INPUT_APPEND,
139 "Programm eingeben, in dem der Fehler auftritt (falls bekannt):\n");
140
141 input_to(function void (string str)
142 {
143 if (sizeof(str)) feingabe[F_LINE] = to_int(str);
144 tell_object(PL,break_string(sprintf(
145 "Du hast die folgenden Daten eingegeben:\n"
146 "Objekt: %O\n"
147 "Fehlerbeschreibung: %s\n"
148 "Programm: %s\n"
149 "Zeilennr.: %d\n",
150 feingabe[F_OBJ], feingabe[F_MSG] || "", feingabe[F_PROG],
151 feingabe[F_LINE]), 78, "", BS_LEAVE_MY_LFS));
152 }, INPUT_PROMPT|INPUT_APPEND,
153 "Zeilennr. eingeben, in der der Fehler auftritt (falls bekannt):\n");
154
155 input_to(#'_feingabe_fertig,
156 INPUT_PROMPT|INPUT_APPEND, "Eingaben korrekt? (j/n)\n");
157
158 return 1;
159}
160
161public int CmdFehlerZeigen(string arg)
162{
Bugfix74112842019-05-28 19:06:33 +0200163 struct fullissue_s|struct fullissue_s* issues=get_issues(arg);
MG Mud User88f12472016-06-24 23:31:02 +0200164 notify_fail("Einen Eintrag mit dieser ID gibt es nicht!\n");
165
Bugfix74112842019-05-28 19:06:33 +0200166 if (structp(issues))
MG Mud User88f12472016-06-24 23:31:02 +0200167 {
Bugfix74112842019-05-28 19:06:33 +0200168 show_entry(issues);
MG Mud User88f12472016-06-24 23:31:02 +0200169 // letzten Fehler merken.
Bugfix74112842019-05-28 19:06:33 +0200170 lfehler = issues->id;
MG Mud User88f12472016-06-24 23:31:02 +0200171 return 1;
172 }
MG Mud User88f12472016-06-24 23:31:02 +0200173 else if (pointerp(issues))
174 {
Bugfix74112842019-05-28 19:06:33 +0200175 foreach(struct fullissue_s issue : issues)
MG Mud User88f12472016-06-24 23:31:02 +0200176 {
177 show_entry(issue);
178 }
179 return 1;
180 }
181
182 notify_fail("Keine Eintraege fuer diesen Dateinamen/diese ID gefunden.\n");
183 return 0;
184}
185
MG Mud User88f12472016-06-24 23:31:02 +0200186public int CmdFehlerLoeschen(string arg)
187{
188 int issueid;
Bugfix1fab1332021-09-06 12:22:20 +0200189 string note;
Bugfix43e311b2022-09-22 13:20:34 +0200190 struct fullissue_s|struct fullissue_s* issues;
Vaniondb7851b2020-03-10 21:52:34 +0100191 arg = ({string})this_player()->_unparsed_args(0);
MG Mud User88f12472016-06-24 23:31:02 +0200192
193 if (stringp(arg) && sizeof(arg))
Bugfix1fab1332021-09-06 12:22:20 +0200194 {
Bugfix43e311b2022-09-22 13:20:34 +0200195 // Fuehrende Leerzeichen entfernen, um ID und Notiz zuverlaessig trennen zu
196 // koennen.
197 arg = trim(arg, TRIM_LEFT);
198 // Alles ab dem zweiten Wort sollte eine Notiz sein.
199 int spacepos = strstr(arg, " ");
200 if(spacepos != -1)
201 {
202 note = arg[spacepos + 1 ..];
203 arg = arg[.. spacepos - 1];
204 }
205 issues = get_issues(arg, 1);
206 if(structp(issues))
207 {
208 issueid = issues->id;
209 }
Bugfix1fab1332021-09-06 12:22:20 +0200210 }
MG Mud User88f12472016-06-24 23:31:02 +0200211 else
Bugfix43e311b2022-09-22 13:20:34 +0200212 issueid = lfehler;
MG Mud User88f12472016-06-24 23:31:02 +0200213
214 notify_fail("Einen Eintrag mit dieser ID/diesem Loadname gibt es nicht!\n");
215
Bugfix43e311b2022-09-22 13:20:34 +0200216 if(issueid > 0)
MG Mud User88f12472016-06-24 23:31:02 +0200217 {
Bugfix43e311b2022-09-22 13:20:34 +0200218 int res = ({int})ERRORD->ToggleDeleteError(issueid, note);
219 if (res == 1)
220 {
221 tell_object(PL,
222 "Fehler/Warnung wurde zum Loeschen markiert und wird in Kuerze "
223 "geloescht.\n");
224 lfehler = issueid;
225 return 1;
226 }
227 else if (res==0)
228 {
229 tell_object(PL,"Loeschmarkierung wurde entfernt.\n");
230 lfehler = issueid;
231 return 1;
232 }
233 else if (res < -1)
234 {
235 tell_object(PL, "Irgendwas ist beim Loeschen schiefgegangen. "
236 "Keine Schreibrechte?\n");
237 lfehler = issueid;
238 return 1;
239 }
MG Mud User88f12472016-06-24 23:31:02 +0200240 }
Bugfix43e311b2022-09-22 13:20:34 +0200241 else if(pointerp(issues))
MG Mud User88f12472016-06-24 23:31:02 +0200242 {
Bugfix43e311b2022-09-22 13:20:34 +0200243 int sum_deleted = 0;
244 string res = "";
245 foreach(struct fullissue_s issue : issues)
246 {
247 issueid = issue->id;
248 if(({int})ERRORD->ToggleDeleteError(issueid, note) == 1)
249 {
250 res += issueid + " als geloescht markiert.\n";
251 ++sum_deleted;
252 }
253 }
254 PL->ReceiveMsg(res, MT_NOTIFICATION | MSG_DONT_WRAP);
255 return sum_deleted;
MG Mud User88f12472016-06-24 23:31:02 +0200256 }
Bugfix43e311b2022-09-22 13:20:34 +0200257 // Offenbar kein Fehler gefunden
258 return 0;
MG Mud User88f12472016-06-24 23:31:02 +0200259}
260
261public int CmdRefresh(string arg) {
262 reset();
263 tell_object(PL,"Fehlerdaten wurden neu eingelesen.\n");
264 return 1;
265}
266
Bugfix67091cb2022-09-22 15:57:31 +0200267#define NO_FALLBACK 1
268#define NO_COMBINED_TYPES 2
269private int select_modus(string arg, int flags = 0) {
MG Mud User88f12472016-06-24 23:31:02 +0200270 int lmodus;
271 switch(arg) {
272 case "alles":
273 case "alle":
Bugfix67091cb2022-09-22 15:57:31 +0200274 if(flags & NO_COMBINED_TYPES)
275 {
276 lmodus = 0;
277 }
278 else
279 {
280 lmodus = T_RTERROR | T_RTWARN | T_CTERROR | T_CTWARN | T_REPORTED_ERR
281 | T_REPORTED_IDEA | T_REPORTED_TYPO | T_REPORTED_MD |
282 T_REPORTED_SYNTAX;
283 }
MG Mud User88f12472016-06-24 23:31:02 +0200284 break;
285 case "fehler":
286 case "error":
287 case "errors":
Bugfix67091cb2022-09-22 15:57:31 +0200288 if(flags & NO_COMBINED_TYPES)
289 {
290 lmodus = 0;
291 }
292 else
293 {
294 lmodus=T_RTERROR | T_CTERROR | T_REPORTED_ERR;
295 }
MG Mud User88f12472016-06-24 23:31:02 +0200296 break;
297 case "warnungen":
298 case "warnung":
299 case "warning":
300 case "warnings":
Bugfix67091cb2022-09-22 15:57:31 +0200301 if(flags & NO_COMBINED_TYPES)
302 {
303 lmodus = 0;
304 }
305 else
306 {
307 lmodus=T_RTWARN | T_CTWARN;
308 }
MG Mud User88f12472016-06-24 23:31:02 +0200309 break;
310 case "laufzeitfehler":
311 lmodus=T_RTERROR;
312 break;
313 case "ladezeitfehler":
314 lmodus=T_CTERROR;
315 break;
316 case "fehlerhinweis":
317 case "fehlerhinweise":
318 case "hinweise":
319 lmodus=T_REPORTED_ERR;
320 break;
321 case "ideen":
322 case "idee":
323 lmodus=T_REPORTED_IDEA;
324 break;
325 case "md":
326 lmodus=T_REPORTED_MD;
327 break;
328 case "typo":
329 case "typos":
330 lmodus=T_REPORTED_TYPO;
331 break;
Bugfixa75344d2017-06-16 14:04:48 +0200332 case "syntax":
333 case "syntaxhinweis":
334 case "syntaxhinweise":
335 lmodus=T_REPORTED_SYNTAX;
336 break;
MG Mud User88f12472016-06-24 23:31:02 +0200337 case "laufzeitwarnungen":
338 case "runtimewarnings":
339 lmodus=T_RTWARN;
340 break;
341 case "ladezeitwarnungen":
342 case "compiletimewarnings":
343 lmodus=T_CTWARN;
344 break;
345 default:
Bugfix67091cb2022-09-22 15:57:31 +0200346 if(flags & NO_FALLBACK)
347 {
348 lmodus = 0;
349 }
350 else
351 {
352 lmodus=modus;
353 }
MG Mud User88f12472016-06-24 23:31:02 +0200354 }
355 return lmodus;
356}
357
358private string * errorlabel(int t)
359{
360 switch(t) {
361 case T_RTERROR:
362 return ({"Laufzeitfehler","Laufzeitfehler","Dieser Laufzeitfehler"});
363 case T_REPORTED_ERR:
364 return ({"Fehlerhinweis","Fehlerhinweise","Dieser Fehlerhinweis"});
365 case T_REPORTED_IDEA:
366 return ({"Idee","Ideen","Diese Idee"});
367 case T_REPORTED_MD:
368 return ({"fehlende Detail","fehlende Details","Dieses fehlende Detail"});
369 case T_REPORTED_TYPO:
370 return ({"Typo","Typos","Dieser Typo"});
Bugfixa75344d2017-06-16 14:04:48 +0200371 case T_REPORTED_SYNTAX:
372 return ({"Syntaxhinweis","Syntaxhinweise","Dieser Syntaxhinweis"});
MG Mud User88f12472016-06-24 23:31:02 +0200373 case T_RTWARN:
374 return ({"Laufzeitwarnung","Laufzeitwarnungen","Diese Laufzeitwarnung"});
375 case T_CTWARN:
376 return ({"Ladezeitwarnung", "Ladezeitwarnungen","Diese Ladezeitwarnung"});
377 case T_CTERROR:
378 return ({"Ladezeitfehler","Ladezeitfehler","Dieser Ladezeitfehler"});
379 }
380 raise_error("Unkannter Fehlertyp: "+t+"\n");
MG Mud User88f12472016-06-24 23:31:02 +0200381}
382
383public int CmdFehlerListe(string arg) {
384 string txt;
385 //string *luids;
386 int lmodus; // modus fuer diese Liste
387 mapping fehlerbackup;
388
389 if (stringp(arg) && sizeof(arg))
390 {
391 lmodus=select_modus(arg);
392 if (lmodus != modus)
393 {
394 fehlerbackup=issuelist; // Fehlerliste von 'modus' aufheben
Bugfix86a40cb2022-09-22 13:34:51 +0200395 update_issuelist(lmodus); // neue Fehlerliste holen
MG Mud User88f12472016-06-24 23:31:02 +0200396 }
397 }
398 else
399 lmodus=modus;
400/*
401 if (!fehlerzahl)
402 {
403 txt="Fuer Deine UIDs sind keine Fehler/Warnungen bekannt. :-)\n";
404 tell_object(PL,txt);
405 return 1;
406 }
407*/
408 foreach(int typ, mapping typemap : issuelist)
409 {
410 if (!(typ & lmodus))
411 continue; // Type nicht gewaehlt.
412 txt="";
413 if (!sizeof(typemap)) {
414 tell_object(PL,
Bugfix33f2c5f2022-10-12 18:02:24 +0200415 "Es sind keine " + errorlabel(typ)[1] +
416 " Deiner UIDs bekannt. :-)\n");
MG Mud User88f12472016-06-24 23:31:02 +0200417 continue;
418 }
419 foreach(string uid, < <int|string>* >* list : typemap)
420 {
421 if (!sizeof(list)) continue;
422 if (filterstatus && member(filteruids, uid) > -1) continue;
423 //txt+=sprintf("%s:\n", uid);
424 foreach(<int|string>* row : list)
425 {
426 txt+=sprintf("%:6d | %:40-s | %:26-s\n",
427 row[0], row[1], row[2]);
428 }
429 }
430 if (txt && sizeof(txt))
431 {
432 txt = sprintf("\nFuer Deine UIDs sind folgende %s bekannt (Filter: %s):\n"
433 "%:6|s | %:40|s | %s\n",
434 errorlabel(typ)[1], (filterstatus ? "an" : "aus"),
435 "ID", "Loadname", "UID")
436 + txt;
437 tell_object(PL, txt);
438 }
439 else
440 {
441 tell_object(PL, sprintf(
442 "\nFuer Deine UIDs sind keine %s bekannt (Filter: %s):\n",
443 errorlabel(typ)[1], (filterstatus ? "an" : "aus")));
444 }
445 }
446
447 if (mappingp(fehlerbackup) && modus!=lmodus)
448 issuelist=fehlerbackup; // fehlerliste fuer 'modus' restaurieren
449 return 1;
450}
451
452public int CmdFilter(string arg) {
453
Vaniondb7851b2020-03-10 21:52:34 +0100454 arg=({string})PL->_unparsed_args(0);
MG Mud User88f12472016-06-24 23:31:02 +0200455
456 if (!stringp(arg) || !sizeof(arg)) {
457 tell_object(PL,break_string(
458 "Momentan interessieren Dich folgende UIDs nicht"
459 +(filterstatus ? " (Filter an):\n" : " (Filter aus):\n")
460 +CountUp(filteruids)+"\n", 78,"",BS_LEAVE_MY_LFS));
461 return 1;
462 }
463
464 if (arg=="keine") {
465 filteruids=({});
466 filterstatus=1;
467 tell_object(PL,break_string(
468 "Dein Fehlerteufel wird Dir nun nur noch ausgewaehlte "
469 "Fehler berichten. Momentan hast Du keine UIDs ausgeblendet. "
470 "(Filter an)",78));
471 }
472 else if (arg=="alle") {
473 filterstatus=1;
474 filteruids=uids;
475 tell_object(PL,break_string(
476 "Dein Fehlerteufel wird Dir nun nur noch ausgewaehlte "
477 "Fehler berichten. Du blendest momentan alle UIDs aus. "
478 "(Filter an)",78));
479 }
480 else if (arg=="aus") {
481 filterstatus=0;
482 tell_object(PL,break_string(
483 "Dein Fehlerteufel wird Dir nun wieder alle Fehler berichten. ",
484 78));
485 }
486 else if (arg=="an" || arg=="ein") {
487 filterstatus=1;
488 tell_object(PL,break_string(
489 "Dein Fehlerteufel wird Dir nun nur noch ausgewaehlte "
490 "Fehler berichten.",78));
491 }
492 else {
493 foreach(string uid: explode(arg," ")-({""})) {
494 if (sizeof(uid)>1 && uid[0]=='+') {
495 if (member(filteruids,uid[1..])==-1)
496 filteruids+=({uid[1..]});
497 }
498 else if (sizeof(uid)>1 && uid[0]=='-') {
499 filteruids-=({uid[1..]});
500 }
501 else {
502 if (member(filteruids,uid)==-1)
503 filteruids+=({uid});
504 else
505 filteruids-=({uid});
506 }
507 }
508 }
509
510 tell_object(PL,break_string(
511 "Momentan interessieren Dich folgende UIDs nicht"
512 +(filterstatus ? " (Filter an):\n" : " (Filter aus):\n")
513 +CountUp(filteruids)+"\n", 78,"",BS_LEAVE_MY_LFS));
514
515 return 1;
516}
517
518public int CmdMonitor(string arg) {
519
Vaniondb7851b2020-03-10 21:52:34 +0100520 arg=({string})PL->_unparsed_args(0);
MG Mud User88f12472016-06-24 23:31:02 +0200521
522 if (!stringp(arg) || !sizeof(arg)) {
523 tell_object(PL,break_string(
524 "Momentan interessieren Dich folgende UIDs zusaetzlich zu Deinen: \n"
525 +(sizeof(monitoruids) ? CountUp(monitoruids) : "")
526 +"\n", 78,"",BS_LEAVE_MY_LFS));
527 return 1;
528 }
529
530 if (arg=="keine") {
531 monitoruids=({});
532 xmonitoruids=({});
533 tell_object(PL,break_string(
534 "Dein Fehlerteufel wird Dir nun nur noch "
535 "Fehler Deiner eigenen UIDs berichten.",78));
536 return 1;
537 }
538 else {
539 foreach(string uid: explode(arg," ")-({""})) {
540 if (sizeof(uid)>1 && uid[0]=='+') {
541 if (member(monitoruids,uid[1..])==-1)
542 monitoruids+=({uid[1..]});
543 }
544 else if (sizeof(uid)>1 && uid[0]=='-') {
545 monitoruids-=({uid[1..]});
546 }
547 else {
548 if (member(monitoruids,uid)==-1)
549 monitoruids+=({uid});
550 else
551 monitoruids-=({uid});
552 }
553 }
554 }
555 get_uids();
556 tell_object(PL,break_string(
557 "Momentan interessieren Dich folgende UIDs zusaetzlich zu Deinen: \n"
558 +(sizeof(monitoruids) ? CountUp(monitoruids) : "")
559 +"\n", 78,"",BS_LEAVE_MY_LFS));
560
561 return 1;
562}
563
564public int CmdModus(string arg) {
MG Mud User88f12472016-06-24 23:31:02 +0200565 // Argument verwursten
566 if (stringp(arg) && sizeof(arg)) {
567 modus = select_modus(arg);
568 reset(); // neue Fehlerliste holen
569 }
570 // aktuelle Einstellung ausgeben.
571 string *modstr=({});
572 if (modus & T_RTERROR)
573 modstr+=({"Fehler (Laufzeit)"});
574 if (modus & T_RTWARN)
575 modstr+=({"Warnungen (Laufzeit)"});
576 if (modus & T_CTERROR)
577 modstr+=({"Fehler (Ladezeit)"});
578 if (modus & T_CTWARN)
579 modstr+=({"Warnungen (Ladezeit)"});
580 if (modus & T_REPORTED_ERR)
581 modstr+=({"Fehlerhinweise"});
582 if (modus & T_REPORTED_IDEA)
583 modstr+=({"Idee"});
584 if (modus & T_REPORTED_MD)
585 modstr+=({"fehlende Details"});
586 if (modus & T_REPORTED_TYPO)
587 modstr+=({"Typo"});
Bugfixa75344d2017-06-16 14:04:48 +0200588 if(modus&T_REPORTED_SYNTAX)
589 modstr+=({"Syntaxhinweise"});
MG Mud User88f12472016-06-24 23:31:02 +0200590
591 tell_object(PL, break_string(
592 "Dein Fehlerteufel wird Dir nun ueber aufgetretene "
593 +CountUp(modstr)+" Bericht erstatten.",78));
594 return(1);
595}
596
597int CmdAddNote(string str) {
598 string *arr;
599
600 notify_fail("Bitte eine ID und einen Text angeben!\n");
601 if(!objectp(TI))
602 return 0;
603
Vaniondb7851b2020-03-10 21:52:34 +0100604 str=({string})PL->_unparsed_args(0);
MG Mud User88f12472016-06-24 23:31:02 +0200605 if (!stringp(str) || !sizeof(str))
606 return 0;
607
608 arr=explode(str," ")-({""});
609 if (sizeof(arr)<2)
610 return 0;
611 int issueid = to_int(arr[0]);
612
613 str=implode(arr[1..]," "); //text wiederherstellen, aber ohne ID
614
Vaniondb7851b2020-03-10 21:52:34 +0100615 switch(({int})ERRORD->AddNote(issueid,str))
MG Mud User88f12472016-06-24 23:31:02 +0200616 {
617 case -1:
618 tell_object(PL,
619 sprintf("Es gibt keinen Fehler mit der ID: %d\n",issueid));
620 return 1;
621 case -3:
622 return 0; //offenbar keine Notiz angegeben.
623 }
624 // letzten Fehler merken.
625 lfehler = issueid;
626
627 tell_object(PL,
628 sprintf("Deine Notiz wurde zu %d hinzugefuegt.\n",
629 issueid));
630 return 1;
631}
632
633int CmdFix(string str)
634{
635 string *arr;
636 int fixing, res;
637
638 notify_fail("Bitte eine ID und optional eine Notiz angeben!\n");
639 if(!objectp(TI))
640 return 0;
641
Vaniondb7851b2020-03-10 21:52:34 +0100642 str=({string})PL->_unparsed_args(0);
MG Mud User88f12472016-06-24 23:31:02 +0200643 if (!stringp(str) || !sizeof(str))
644 return 0;
645
646 arr=explode(str," ")-({""});
647 if (!sizeof(arr))
648 return 0;
649
650 int issueid=to_int(arr[0]);
651 if (sizeof(arr)>1)
652 str=implode(arr[1..]," "); //text wiederherstellen, aber ohne Key
653 else str=0;
654
655 if (query_verb()=="ffix" || query_verb()=="fehlerfix")
656 {
657 fixing=1;
Vaniondb7851b2020-03-10 21:52:34 +0100658 res = ({int})ERRORD->ResolveIssue(issueid, str);
MG Mud User88f12472016-06-24 23:31:02 +0200659 }
660 else
661 {
Vaniondb7851b2020-03-10 21:52:34 +0100662 res = ({int})ERRORD->ReOpenIssue(issueid, str);
MG Mud User88f12472016-06-24 23:31:02 +0200663 }
664
665 if (res==-1)
666 {
667 tell_object(PL,
668 sprintf("Es gibt keinen Fehler mit der ID: %d\n",issueid));
669 }
670 else if (res==-10)
671 {
672 tell_object(PL,
673 "Du hast leider keinen Schreibzugriff diesen Fehler.\n"
674 "Aber vielleicht moechtest Du mit fnotiz eine Notiz anhaengen?\n");
675 }
676 else if (res==-3)
677 {
678 if (fixing)
679 tell_object(PL,"Dieser Fehler ist bereits gefixt.\n");
680 else
681 tell_object(PL,"Dieser Fehler ist noch nicht gefixt.\n");
682 }
683 else if (res==1)
684 {
685 tell_object(PL,
686 sprintf("Fehler %d als gefixt markiert.\n",issueid));
687 }
688 else if (res==0)
689 {
690 tell_object(PL,
691 sprintf("Fehler %d als nicht gefixt markiert.\n",issueid));
692 }
693 // letzten Fehler merken.
694 lfehler = issueid;
695
696 return 1;
697}
698
699int CmdLock(string str) {
700 string *arr;
701 int locking;
702 int res;
703
704 notify_fail("Bitte eine ID und optional eine Notiz angeben!\n");
705 if(!objectp(TI))
706 return 0;
707
Vaniondb7851b2020-03-10 21:52:34 +0100708 str=({string})PL->_unparsed_args(0);
MG Mud User88f12472016-06-24 23:31:02 +0200709 if (!stringp(str) || !sizeof(str))
710 return 0;
711
712 arr=explode(str," ")-({""});
713 if (!sizeof(arr))
714 return 0;
715
716 int issueid=to_int(arr[0]);
717 if (sizeof(arr)>1)
718 str=implode(arr[1..]," "); //text wiederherstellen, aber ohne Key
719 else str=0;
720
721 if (query_verb()=="flock" || query_verb()=="fehlerlock")
722 {
723 locking=1;
Vaniondb7851b2020-03-10 21:52:34 +0100724 res=({int})ERRORD->LockIssue(issueid,str);
MG Mud User88f12472016-06-24 23:31:02 +0200725 }
726 else
727 {
Vaniondb7851b2020-03-10 21:52:34 +0100728 res=({int})ERRORD->UnlockIssue(issueid,str);
MG Mud User88f12472016-06-24 23:31:02 +0200729 }
730
731 if (res==-1)
732 {
733 tell_object(PL,
734 sprintf("Es gibt keinen Fehler mit der ID: %d\n",issueid));
735 }
736 else if (res==-10)
737 {
738 tell_object(PL,
739 "Du hast leider keinen Schreibzugriff diesen Fehler.\n");
740 }
741 else if (res==-3)
742 {
743 if (locking)
744 tell_object(PL,
745 "Dieser Fehler ist bereits vor autom. Loeschen geschuetzt.\n");
746 else
747 tell_object(PL,
748 "Dieser Fehler ist bereits zum autom. Loeschen freigegeben.\n");
749 }
750 else if (res==-2)
751 {
752 tell_object(PL,
753 "Dieser Fehler ist bereits gefixt und wird bald geloescht.\n");
754 }
755 else if (res==1)
756 {
757 tell_object(PL,
758 sprintf("Fehler %d vor autom. Loeschen geschuetzt.\n",issueid));
759 }
760 else if (res==0)
761 {
762 tell_object(PL,
763 sprintf("Fehler %d zum autom. Loeschen freigegeben.\n",issueid));
764 }
765 // letzten Fehler merken.
766 lfehler = issueid;
767
768 return 1;
769}
770
771int CmdReassign(string str) {
772
773 notify_fail("Bitte eine ID, die neue UID und ggf. eine Notiz angeben!\n");
774 if(!objectp(TI))
775 return 0;
776
Vaniondb7851b2020-03-10 21:52:34 +0100777 str=({string})PL->_unparsed_args(0);
MG Mud User88f12472016-06-24 23:31:02 +0200778 if (!stringp(str) || !sizeof(str))
779 return 0;
780
781 string *arr=explode(str," ")-({""});
782 if (sizeof(arr)<2)
783 return 0;
784 int issueid=to_int(arr[0]);
785 string newuid=arr[1];
786
787 //text wiederherstellen, aber ohne Key und UID
788 if (sizeof(arr) > 2)
789 str = implode(arr[2..]," ");
790 else
791 str = 0;
792
Vaniondb7851b2020-03-10 21:52:34 +0100793 switch(({int})ERRORD->ReassignIssue(issueid, newuid, str))
MG Mud User88f12472016-06-24 23:31:02 +0200794 {
795 case -1:
796 tell_object(PL,
797 sprintf("Es gibt keinen Fehler mit der ID: %d\n",issueid));
798 return(1);
799 case -10:
800 tell_object(PL,
801 sprintf("Du hast keine Schreibrechte auf Fehler %d\n",issueid));
802 return 1;
803 case -2:
804 return(0); //offenbar keine neue uid angegeben. (kann nicht)
805 case -3:
806 tell_object(PL,break_string(
807 "Alte == Neue UID ist irgendwie unsinnig...",78));
808 return 1;
809 }
810 // letzten Fehler merken.
811 lfehler = issueid;
812
813 tell_object(PL,break_string(
814 sprintf("Der Fehler der ID %d wurde an die UID %s "
815 "uebertragen.\n", issueid, newuid),78));
816 return 1;
817}
818
Bugfix994aef02019-05-28 19:58:21 +0200819int CmdFehlerDirectory(string arg)
820{
821 struct fullissue_s issue=get_issue(arg);
822 if(!structp(issue))
823 {
824 PL->ReceiveMsg(
825 "Kein Eintrag mit dieser ID gefunden.",
826 MT_NOTIFICATION);
827 }
828 else
829 {
830 string path=issue->loadname||issue->obj;
831 if(!stringp(path) || !sizeof(path))
832 {
833 PL->ReceiveMsg(
834 "Kein Pfad zu dieser ID verfuegbar.",
835 MT_NOTIFICATION);
836 }
837 else
838 {
839 path=implode(explode(path,"/")[..<2],"/");
Bugfixa9e16052022-09-29 11:38:56 +0200840 PL->SetProp(P_LASTDIR, PL->QueryProp(P_CURRENTDIR));
Bugfix994aef02019-05-28 19:58:21 +0200841 PL->SetProp(P_CURRENTDIR,path);
842 PL->ReceiveMsg(
843 "Aktuelles Verzeichnis ist jetzt: "+path,
844 MT_NOTIFICATION);
845 }
846 }
847 return 1;
848 }
849
Bugfix67091cb2022-09-22 15:57:31 +0200850public int CmdFehlerAendere(string arg)
851{
852 string note;
853 arg = ({string})PL->_unparsed_args(0);
854
855 notify_fail("Bitte ID, Typ und optional einen Kommentar angeben.\n");
856
857 if(!sizeof(arg)) return 0;
858 // Fuehrende Leerzeichen entfernen, um ID, Typ und Notiz zuverlaessig
859 // trennen zu koennen.
860 arg = trim(arg, TRIM_LEFT);
861 string* words = explode(arg, " ");
862 if(sizeof(words) < 2) return 0;
863 arg = words[0];
864 // Alles ab dem dritten Wort sollte eine Notiz sein.
865 if(sizeof(words) > 2)
866 {
867 note = implode(words[2..], " ");
868 }
869
870 struct fullissue_s issue = get_issue(arg);
871
872 if(!structp(issue))
873 {
874 notify_fail("Kein Fehler mit dieser ID gefunden.\n");
875 return 0;
876 }
877
878 int type = select_modus(words[1], NO_FALLBACK | NO_COMBINED_TYPES);
879 if(!type)
880 {
881 notify_fail("Fehlertyp nicht bekannt.\n");
882 return 0;
883 }
884
885 if(!(type in CHANGEABLE_TYPES) || !(issue->type in CHANGEABLE_TYPES))
886 {
887 ({int})PL->ReceiveMsg(
888 "Fehlertyp nicht aenderbar.\n",
889 MT_NOTIFICATION);
890 return 1;
891 }
892
893 if(({int})ERRORD->ChangeType(issue->id, type, issue->type, note) == 1)
894 {
895 string* type_name = ({string*})ERRORD->print_type(type);
896 ({int})PL->ReceiveMsg(
897 "Fehlertyp von " + issue->id + " auf " + type_name[0] + " geaendert.",
898 MT_NOTIFICATION);
899 }
900 else
901 {
902 ({int})PL->ReceiveMsg(
903 "Aendern nicht moeglich. Keine Schreibrechte?",
904 MT_NOTIFICATION);
905 }
906 return 1;
907}
908
MG Mud User88f12472016-06-24 23:31:02 +0200909// ************** public 'internal' functions **************
910public string QueryOwner() {return owner;}
911public mixed QueryIssueList() {return issuelist;}
912
Zesstraff356512018-08-27 20:20:36 +0200913protected void create() {
MG Mud User88f12472016-06-24 23:31:02 +0200914 if (!clonep(ME))
915 return;
916 ::create();
917
918 SetProp(P_SHORT,"Der Fehlerteufel");
919 SetProp(P_LONG,break_string(
920 "Dein Fehlerteufel soll Dir helfen, Informationen "
921 "ueber aufgetretene Fehler zu erhalten. Hierzu fragt er die "
922 "in \"Deinen\" UIDs aufgetretenen Fehler und deren Details vom "
923 "Fehlerspeicher der Mudlib ab. Folgende Kommandos kennt er:",78)
924 +"fehlerabfrage <id> - Fragt Details ueber Fehler mit der ID ab.\n"
925 "fehlerloeschen <id> - Fehler zum Loeschen markieren.\n"
926 "fehlerliste - Fehlerliste der eigenen UIDs anzeigen\n"
927 "fehlerrefresh - Fehlerdaten und UIDs neu einlesen\n"
928 "fehlerfilter - UIDs fuer den Filter angeben (s. manpage!)\n"
929 "fehlermodus - Fehler oder Warnungen ausgeben? (s. manpage)\n"
930 "fehlermonitor - zus. UIDs beobachten (s. manpage)\n"
931 "fnotiz <id> <note> - eine Notiz anhaengen\n"
932 "flock <id> <note> - Fehler vor autom. Loeschen schuetzen\n"
933 "funlock <id> <note> - Fehler zum autom. Loeschen freigeben\n"
934 "ffix <id> <note> - Fehler als gefixt kennzeichnen\n"
935 "funfix <id> <note> - gefixten Fehler als nicht-gefixt markieren\n"
Bugfix994aef02019-05-28 19:58:21 +0200936 "fdir <id> - in das Verzeichnis des fehlerhaften Objekts "
937 "wechseln\n"
MG Mud User88f12472016-06-24 23:31:02 +0200938 "fuebertrage <id> <newuid> <note>\n"
939 " - Fehler an die UID uebertragen\n"
Bugfix67091cb2022-09-22 15:57:31 +0200940 "faendere <id> <newtype> <note>\n"
941 " - Fehlertyp aendern\n"
MG Mud User88f12472016-06-24 23:31:02 +0200942 );
943 SetProp(P_NAME,"Fehlerteufel");
944 SetProp(P_GENDER,MALE);
945 SetProp(P_WEIGHT,0);
946 SetProp(P_VALUE,0);
947 SetProp(P_SIZE,10);
948 SetProp(P_NODROP,"Den Fehlerteufel behaelst Du lieber bei Dir.\n");
949 SetProp(P_NEVERDROP,1);
950
951 AddId( ({"fehlerteufel","teufel"}) );
952
953 AddCmd(({"fehlerabfrage","fabfrage"}), "CmdFehlerZeigen" );
954 AddCmd(({"fehlerloeschen","floeschen"}), "CmdFehlerLoeschen");
955 AddCmd(({"fehlerliste","fliste", "fehleruebersicht","fuebersicht"}),
956 "CmdFehlerListe");
957 AddCmd(({"fehlerrefresh","frefresh"}),"CmdRefresh");
958 AddCmd(({"fehlerfilter","ffilter"}),"CmdFilter");
959 AddCmd(({"fehlermodus","fmodus"}),"CmdModus");
960 AddCmd(({"fehlermonitor","fmonitor"}),"CmdMonitor");
961 AddCmd(({"fehlernotiz","fnotiz"}),"CmdAddNote");
962 AddCmd(({"fehlerlock","flock","fehlerunlock","funlock"}),
963 "CmdLock");
964 AddCmd(({"fehlerfix","ffix","fehlerunfix","funfix"}),
965 "CmdFix");
966 AddCmd(({"fehleruebertrage","fuebertrage"}),"CmdReassign");
967 AddCmd(({"fehlereingabe", "feingabe"}), "CmdFehlerEingabe");
Bugfix994aef02019-05-28 19:58:21 +0200968 AddCmd(({"fehlerdir","fdir"}),"CmdFehlerDirectory");
Bugfix67091cb2022-09-22 15:57:31 +0200969 AddCmd(({"fehleraendere", "faendere"}), "CmdFehlerAendere");
MG Mud User88f12472016-06-24 23:31:02 +0200970}
971
Zesstraff356512018-08-27 20:20:36 +0200972public varargs void init(object origin)
MG Mud User88f12472016-06-24 23:31:02 +0200973{
974 if (find_call_out("remove") != -1) return;
975
976 // pruefung auf env nicht noetig, move geht nur in ein env und ohne env
977 // auch kein init().
978 if ( !query_once_interactive(environment()) ||
979 !IS_LEARNER(environment())) {
980 // in interactive, aber kein magier -> direkt weg.
981 call_out("remove",0,1);
982 return;
983 }
984 else if (!sizeof(owner))
985 // Env ist Interactiv und Magier (sonst waer man oben rausgeflogen)
986 owner=getuid(environment());
987 else if (owner!=getuid(environment())) {
988 //ok, nicht der Eigentuemer, direkt weg.
989 call_out("remove",0);
990 return;
991 }
992 SetProp(P_EXTRA_LOOK,break_string(
bugfixd94d0932020-04-08 11:27:13 +0200993 "Auf "+({string})environment()->Name(WESSEN)
994 +" Schulter sitzt ein kleiner "
MG Mud User88f12472016-06-24 23:31:02 +0200995 "Fehlerteufel, der "
bugfixd94d0932020-04-08 11:27:13 +0200996 +({string})environment()->QueryPronoun(WEM)
MG Mud User88f12472016-06-24 23:31:02 +0200997 +" immer wieder etwas ins Ohr fluestert.",78));
998
999 call_out("reset",1);
1000
1001 ::init();
1002}
1003
1004public mixed Configure(mixed data)
1005{
1006 if (!data)
1007 {
1008 return (["filteruids":filteruids,
1009 "filterstatus":filterstatus,
1010 "modus":modus,
1011 "monitoruids":monitoruids,
1012 "fehlerzahl": fehlerzahl]);
1013 }
1014 else if (mappingp(data))
1015 {
1016 if (member(data,"filteruids") && pointerp(data["filteruids"]))
1017 filteruids=data["filteruids"];
1018 if (member(data,"filterstatus") && intp(data["filterstatus"]))
1019 filterstatus=data["filterstatus"];
1020 if (member(data,"modus") && intp(data["modus"]))
1021 modus=data["modus"];
1022 if (member(data,"monitoruids") && pointerp(data["monitoruids"]))
1023 monitoruids=data["monitoruids"];
1024 if (member(data,"fehlerzahl") && intp(data["fehlerzahl"]))
1025 fehlerzahl=data["fehlerzahl"];
1026 return 1;
1027 }
1028 return 0;
1029}
1030
1031mapping _query_autoloadobj()
1032{
1033 return Configure(0);
1034}
1035
1036mapping _set_autoloadobj(mixed data)
1037{
1038 Configure(data);
1039 return _query_autoloadobj();
1040}
1041
1042
1043void reset()
1044{
1045 get_uids();
Bugfix86a40cb2022-09-22 13:34:51 +02001046 int neuefehlerzahl=update_issuelist();
MG Mud User88f12472016-06-24 23:31:02 +02001047
1048 if (fehlerzahl < neuefehlerzahl)
1049 tell_object(environment(ME), break_string(
1050 "Deine Fehlerliste ist soeben laenger geworden.",78,
1051 "Dein Fehlerteufel teilt Dir mit: "));
1052 else if (fehlerzahl > neuefehlerzahl)
1053 tell_object(environment(ME), break_string(
1054 "Deine Fehlerliste ist soeben kuerzer geworden.",78,
1055 "Dein Fehlerteufel teilt Dir mit: "));
1056 fehlerzahl = neuefehlerzahl;
1057}
1058
1059// ******** private functions *********************
1060private void get_uids()
1061{
Vaniondb7851b2020-03-10 21:52:34 +01001062 uids=({string *})master()->QueryUIDsForWizard(owner);
MG Mud User88f12472016-06-24 23:31:02 +02001063 xmonitoruids=({});
1064 if (sizeof(monitoruids))
1065 {
1066 closure cl=symbol_function("QueryUIDAlias", master());
1067 foreach(string uid: monitoruids) {
Vaniondb7851b2020-03-10 21:52:34 +01001068 xmonitoruids += ({string*})funcall(cl, uid);
MG Mud User88f12472016-06-24 23:31:02 +02001069 }
1070 }
1071}
1072
1073/* Holt sich aus dem ErrorD die Liste ungeloeschter und ungefixter Fehler fuer
1074 * fuer die UIDs des Magier fuer alle Typen
1075 */
Bugfix86a40cb2022-09-22 13:34:51 +02001076private varargs int update_issuelist(int lmodus)
MG Mud User88f12472016-06-24 23:31:02 +02001077{
1078 int count;
1079
1080 if (!lmodus)
1081 lmodus=modus;
1082
1083 issuelist=m_allocate(sizeof(ALL_ERR_TYPES),1);
1084
1085 foreach(int type: ALL_ERR_TYPES)
1086 {
1087 if (type & lmodus)
1088 {
1089 //DEBUG(sprintf("Type: %d\n",type));
Bugfix33f2c5f2022-10-12 18:02:24 +02001090 m_add(issuelist, type, ([]));
MG Mud User88f12472016-06-24 23:31:02 +02001091 foreach(string uid : uids + xmonitoruids)
1092 {
1093 //DEBUG(sprintf("Type: %d, UID: %s\n",type,uid));
Bugfix33f2c5f2022-10-12 18:02:24 +02001094 // Ggf. stehen UIDs mehrfach in der Liste, wenn eine UID fuer
1095 // die der Magier zustaendig ist haendisch im Fehlermonitor oder
1096 // im Master eingetragen ist
1097 if(uid in issuelist[type]) continue;
MG Mud User88f12472016-06-24 23:31:02 +02001098 < <int|string>* >* list =
Vaniondb7851b2020-03-10 21:52:34 +01001099 ({< <int|string>* >*})ERRORD->QueryIssueList(type,uid);
Bugfix33f2c5f2022-10-12 18:02:24 +02001100 if(!sizeof(list)) continue;
1101
MG Mud User88f12472016-06-24 23:31:02 +02001102 count += sizeof(list);
1103
Bugfix33f2c5f2022-10-12 18:02:24 +02001104 issuelist[type] += ([uid: list ]);
MG Mud User88f12472016-06-24 23:31:02 +02001105 }
1106 }
1107 }
Bugfix74112842019-05-28 19:06:33 +02001108
MG Mud User88f12472016-06-24 23:31:02 +02001109 return count;
1110}
1111
Bugfix74112842019-05-28 19:06:33 +02001112private struct fullissue_s get_issue(string arg)
1113{
1114 int issueid;
1115 struct fullissue_s issue;
1116
1117 if (stringp(arg) && sizeof(arg))
1118 {
1119 arg = trim(arg, TRIM_BOTH);
1120 issueid = to_int(arg);
1121 }
1122 else
1123 {
1124 issueid = lfehler;
1125 arg = to_string(issueid);
1126 }
1127
1128 // Wurde ein Hash uebergeben, ist issueid 0 und arg der Hash.
1129 // Wurde eine ID oder nichts uebergeben, ist issueid die ID als int und
1130 // arg die ID als string.
1131 if (to_string(issueid) == arg)
Vaniondb7851b2020-03-10 21:52:34 +01001132 issue = ({struct fullissue_s})ERRORD->QueryIssueByID(issueid);
Bugfix74112842019-05-28 19:06:33 +02001133 else
Vaniondb7851b2020-03-10 21:52:34 +01001134 issue = ({struct fullissue_s})ERRORD->QueryIssueByHash(arg);
Bugfix74112842019-05-28 19:06:33 +02001135 return issue;
1136}
1137
Bugfix43e311b2022-09-22 13:20:34 +02001138private struct fullissue_s|struct fullissue_s* get_issues(string arg, int parsed)
Bugfix74112842019-05-28 19:06:33 +02001139{
Bugfix43e311b2022-09-22 13:20:34 +02001140 // Manche Funktionen kuemmern sich selbst um _unparsed_args((), da z.B.
1141 // noch eine Notiz abgeschnitten werden muss.
1142 if(!parsed)
1143 arg=({string})PL->_unparsed_args();
Bugfix74112842019-05-28 19:06:33 +02001144 struct fullissue_s|struct fullissue_s* issues;
Bugfixe1949592019-09-16 20:41:54 +02001145
1146 // Erstmal schauen, ob arg eine ID ist.
1147 issues=get_issue(arg);
1148 // Wenn nicht, dann ist es wohl ein Pfad.
1149 if(!structp(issues))
Bugfix74112842019-05-28 19:06:33 +02001150 {
Bugfixe1949592019-09-16 20:41:54 +02001151 // Mit einem / am Anfang ist der Pfad vermutlich komplett, ansonsten
1152 // wird im aktuellen Verzeichnis gesucht.
1153 if(sizeof(arg) && arg[0] != '/')
1154 {
bugfixd94d0932020-04-08 11:27:13 +02001155 arg=({string})PL->QueryProp(P_CURRENTDIR)+"/"+arg;
Bugfixe1949592019-09-16 20:41:54 +02001156 }
Bugfix74112842019-05-28 19:06:33 +02001157 issues=({});
1158 foreach(int m: ALL_ERR_TYPES)
1159 {
1160 if (!(m & modus))
1161 continue;
1162 struct fullissue_s *tmp =
Vaniondb7851b2020-03-10 21:52:34 +01001163 ({struct fullissue_s *})ERRORD->QueryIssuesByFile(arg, m);
Bugfix74112842019-05-28 19:06:33 +02001164 if (tmp)
1165 issues+=tmp;
1166 }
1167 if (!sizeof(issues))
1168 issues=0;
1169 }
Bugfix74112842019-05-28 19:06:33 +02001170
1171 return issues;
1172}