/*  MorgenGrauen MUDlib
    /p/daemon/errord.c
    speichert Fehler und Warnungen
    Autor: Zesstra
    $Id: errord.c 9439 2016-01-20 09:48:28Z Zesstra $
    ggf. Changelog:
*/

#pragma strict_types,save_types,rtt_checks
#pragma no_clone
#pragma no_shadow
#pragma no_inherit
#pragma pedantic
#pragma range_check
#pragma warn_deprecated

#include <config.h>
#include <wizlevels.h>
#include <defines.h>
#include <debug_info.h>
#include <commands.h>
#include <wizlevels.h>
#include <mail.h>
#include <tls.h>
#include <events.h>

inherit "/secure/errord-structs";

#define __NEED_IMPLEMENTATION__
#include "errord.h"
#undef __NEED_IMPLEMENTATION__

#define SAVEFILE  (__DIR__+"ARCH/errord")

#define TI this_interactive()

private int       access_check(string uid,int mode);
private varargs int set_lock(int issueid, int lock, string note);
private varargs int set_resolution(int issueid, int resolution, string note);

private int versende_mail(struct fullissue_s fehler);

nosave mapping lasterror;   // die letzen 5 jeder Art.


/* ******************* Helfer **************************** */

public int getErrorID(string hashkey)
{
  int** row=sl_exec("SELECT id from issues WHERE hashkey=?1;",
                    hashkey);
  //DEBUG(sprintf("getEID: %s: %O\n",hashkey,row));
  if (pointerp(row))
  {
    return row[0][0];
  }
  return -1;
}

// note->id muss auf einen Eintrag in issues verweisen, es erfolgt keine
// Pruefung.
int db_add_note(struct note_s note)
{
  sl_exec("INSERT INTO notes(issueid,time,user,txt) "
          "VALUES(?1,?2,?3,?4);",
          to_array(note)...);
  return sl_insert_id();
}

private struct frame_s* db_get_stack(int issueid)
{
  mixed rows = sl_exec("SELECT * FROM stacktraces WHERE issueid=?1 "
                       "ORDER BY rowid;", issueid);
  if (pointerp(rows))
  {
    struct frame_s* stack = allocate(sizeof(rows));
    int i;
    foreach(mixed row : rows)
    {
      stack[i] = to_struct(row, (<frame_s>));
      ++i;
    }
    return stack;
  }
  return 0;
}

private struct note_s* db_get_notes(int issueid)
{
  mixed rows = sl_exec("SELECT * FROM notes WHERE issueid=?1 "
                       "ORDER BY rowid;", issueid);
  if (pointerp(rows))
  {
    struct note_s* notes = allocate(sizeof(rows));
    int i;
    foreach(mixed row : rows)
    {
      notes[i] = to_struct(row, (<note_s>));
      ++i;
    }
    return notes;
  }
  return 0;
}

// einen durch id oder hashkey bezeichneten Eintrag als fullissue_s liefern.
private struct fullissue_s db_get_issue(int issueid, string hashkey)
{
  mixed rows = sl_exec("SELECT * FROM issues WHERE id=?1 OR hashkey=?2;",
                       issueid, hashkey);
  if (pointerp(rows))
  {
    // Einfachster Weg - funktioniert aber nur, solange die Felder in der DB
    // die gleiche Reihenfolge wie in der struct haben! Entweder immer
    // sicherstellen oder Ergebnisreihenfolge oben im select festlegen!
    struct fullissue_s issue = to_struct( rows[0], (<fullissue_s>) );
    if (issue->type == T_RTERROR)
        issue->stack = db_get_stack(issue->id);
    issue->notes = db_get_notes(issue->id);
    return issue;
  }
  return 0;
}

private struct fullissue_s filter_private(struct fullissue_s issue)
{
    //momentan wird F_CLI, also die Spielereingabe vor dem Fehler
    //ausgefiltert, wenn TI kein EM oder man in process_string() ist.

    //Wenn EM und nicht in process_string() oder die Spielereingabe gar nicht
    //im Fehlereintrag drinsteht: ungefiltert zurueck
    if (!issue->command ||
        (!process_call() && ARCH_SECURITY) )
        return issue;

    //sonst F_CLI rausfiltern, also Kopie und in der Kopie aendern.
    issue->command="Bitte EM fragen";
    return issue;
}

// setzt oder loescht die Loeschsperre.
// Prueft, ob <issueid> existiert und aendert den Zustand nur, wenn noetig.
// Rueckgabe: -1, wenn Issue nicht existiert, -2 wenn bereits resolved, -3
//            wenn keine Aenderung noetig, sonst den neuen Sperrzustand
int db_set_lock(int issueid, int lockstate, string note)
{
  int** rows = sl_exec("SELECT locked,resolved FROM issues WHERE id=?1;",
                       issueid);
  if (!rows)
    return -1;  // nicht vorhanden.

  if (rows[0][1])
      return -2; // bereits resolved -> Sperre nicht moeglich.


  if (lockstate && !rows[0][0])
  {
    // Sperren
//    sl_exec("BEGIN TRANSACTION;");
    sl_exec("UPDATE issues SET locked=1,locked_by=?2,locked_time=?3,mtime=?3 "
            "WHERE id=?1;",
            issueid, getuid(TI), time());
    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
                           txt: sprintf("Lock gesetzt: %s", 
                                        note ? note : "<kein Kommentar>")) );
//    sl_exec("COMMIT;");
    return 1;
  }
  else if (!lockstate && rows[0][0])
  {
    // entsperren
//    sl_exec("BEGIN TRANSACTION;");
    sl_exec("UPDATE issues SET locked=0,locked_by=0,locked_time=0,mtime=?2 "
            "WHERE id=?1;", issueid, time());
    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
                           txt: sprintf("Lock geloescht: %s", 
                                        note ? note : "<kein Kommentar>")) );
//    sl_exec("COMMIT;");
    return 0;
  }
  // nix aendern.
  return -3;
}

// markiert ein Issue als gefixt oder nicht gefixt.
// Prueft, ob <issueid> existiert und aendert den Zustand nur, wenn noetig.
// Rueckgabe: -1, wenn Issue nicht existiert, -3 wenn keine Aenderung noetig,
//            sonst den neuen Sperrzustand
int db_set_resolution(int issueid, int resolved, string note)
{
  int** rows = sl_exec("SELECT resolved FROM issues WHERE id=?1;",
                       issueid);
  if (!rows)
    return -1;  // nicht vorhanden.

  if (resolved && !rows[0][0])
  {
    // Als gefixt markieren.
//    sl_exec("BEGIN TRANSACTION;");
    sl_exec("UPDATE issues SET resolved=1,resolver=?2,mtime=?3 "
            "WHERE id=?1;",
            issueid, getuid(TI),time());
    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
                           txt: sprintf("Fehler gefixt: %s", 
                                        note ? note : "<kein Kommentar>")) );
//    sl_exec("COMMIT;");
    return 1;
  }
  else if (!resolved && rows[0][0])
  {
    // als nicht gefixt markieren.
//    sl_exec("BEGIN TRANSACTION;");
    sl_exec("UPDATE issues SET resolved=0,resolver=0,mtime=?2 "
            "WHERE id=?1;", issueid, time());
    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
                           txt: sprintf("Fix zurueckgezogen: %s", 
                                        note ? note : "<kein Kommentar>")) );
//    sl_exec("COMMIT;");
    return 0;
  }
  // nix aendern.
  return -3;

}

// Transferiert ein Issue zu einer neuen zustaendigen UID
// Prueft, ob <issueid> existiert und aendert den Zustand nur, wenn noetig.
// Rueckgabe: -1, wenn Issue nicht existiert, -3 wenn keine Aenderung noetig,
//            1, wenn erfolgreich neu zugewiesen
int db_reassign_issue(int issueid, string newuid, string note)
{
  string** rows = sl_exec("SELECT uid FROM issues WHERE id=?1;",
                       issueid);
  if (!rows)
    return -1;  // nicht vorhanden.

  if (!stringp(newuid))
    return(-2);

  if (newuid != rows[0][0])
  {
//    sl_exec("BEGIN TRANSACTION;");
    sl_exec("UPDATE issues SET uid=?2,mtime=?3 WHERE id=?1;",
            issueid, newuid,time());
    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
                           txt: sprintf("Fehler von %s an %s uebertragen. (%s)",
                                        rows[0][0], newuid,
                                        note ? note : "<kein Kommentar>")) );
//    sl_exec("COMMIT;");
    return 1;
  }

  return -3;
}

// inkrementiert count und aktualisiert mtime, atime.
// Ausserdem wird ggf. das Loeschflag genullt - ein erneut aufgetretener
// Fehler sollte anschliessend nicht mehr geloescht sein. Geloeste
// (resolved) Eintraege werden NICHT auf ungeloest gesetzt. Vermutlich trat
// der Fehler in einem alten Objekte auf...
// Issue muss in der DB existieren.
int db_countup_issue(int issueid)
{
  sl_exec("UPDATE issues SET count=count+1,mtime=?2,atime=?2,deleted=0 WHERE id=?1;",
          issueid,time());
  return 1;
}

// Das Issue wird ggf. ent-loescht und als nicht resvolved markiert.
// Sind pl und msg != 0, wird eine Notiz angehaengt.
// aktualisiert mtime, atime.
// Issue muss in der DB existieren.
int db_reopen_issue(int issueid, string pl, string msg)
{
  int** row=sl_exec("SELECT deleted,resolved from issues WHERE id=?1;",
                    issueid);
  if (pointerp(row)
      && (row[0][0] || row[0][1]) )
  {
//    sl_exec("BEGIN TRANSACTION;");
    if (pl && msg)
    {
      db_add_note( (<note_s> id: issueid,
                             time: time(),
                             user: pl,
                             txt: msg) );
    }
    sl_exec("UPDATE issues SET "
        "deleted=0,resolved=0,resolver=0,mtime=?2,atime=?2 WHERE id=?1;",
        issueid,time());
//    sl_exec("COMMIT;");
  }
  return 1;
}

int db_insert_issue(struct fullissue_s issue)
{
  //DEBUG(sprintf("db_insert: %O\n", issue));

  mixed row=sl_exec("SELECT id from issues WHERE hashkey=?1;",
                    issue->hashkey);
  //DEBUG(sprintf("insert: %s: %O\n",issue->hashkey,row));
  if (pointerp(row))
  {
    issue->id=row[0][0];
    return db_countup_issue(issue->id);
  }
//  sl_exec("BEGIN TRANSACTION;");
  sl_exec("INSERT INTO issues(hashkey,uid,type,mtime,ctime,atime,count,"
          "deleted,resolved,locked,locked_by,locked_time,resolver,message,"
          "loadname,obj,prog,loc,titp,tienv,hbobj,caught,command,verb) "
          "VALUES(?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,"
          "?16,?17,?18,?19,?20,?21,?22,?23,?24);",
          (to_array(issue)[1..24])...); 
  issue->id=sl_insert_id();

  if (pointerp(issue->stack))
  {
    foreach(struct frame_s entry : issue->stack)
    {
      entry->id = issue->id;
      sl_exec("INSERT INTO stacktraces(issueid,type,name,prog,obj,loc,ticks) "
              "VALUES(?1,?2,?3,?4,?5,?6,?7);",
              to_array(entry)...);
    }
  }
  if (pointerp(issue->notes))
  {
    foreach(struct note_s entry : issue->notes)
    {
      entry->id = issue->id;
      sl_exec("INSERT INTO notes(issueid,time,user,txt) "
              "VALUES(?1,?2,?3,?4);",
              to_array(entry)...);
    }
  }
//  sl_exec("COMMIT;");

  return issue->id;
}


// loggt einen T_REPORTED_ERR, T_REPORTED_IDEA, T_REPORTED_TYPO,
// T_REPORTED_MD, T_REPORTED_SYNTAX
public string LogReportedError(mapping err)
{
    //darf nur von Spielershells oder Objekt in /obj/ (z.B. Fehlerteufel oder
    //vitem_proxy) gerufen werden.
    if (extern_call() && !previous_object()
        || (strstr(load_name(previous_object()),"/std/shells/") == -1
            && strstr(load_name(previous_object()), "/"LIBOBJDIR"/") == -1))
        return 0;

    //DEBUG("LogReportedError\n");
    // DEBUG(sprintf("%O\n",err));
    string uid = ({string})master()->creator_file(err[F_OBJ]);

    // default-Typ
    if (!member(err, F_TYPE)) err[F_TYPE] = T_REPORTED_ERR;

    // div. Keys duerfen nicht gesetzt sein.
    err -= ([F_STATE, F_READSTAMP, F_CAUGHT, F_STACK, F_CLI, F_VERB,
             F_LOCK, F_RESOLVER, F_NOTES]);

    // Errormapping in issue-struct umwandeln und befuellen.
    struct fullissue_s issue = (<fullissue_s>);
    issue->type = err[F_TYPE];
    issue->uid = uid;
    issue->mtime = issue->ctime = issue->atime = time();
    issue->count=1;
    issue->loadname = load_name(err[F_OBJ]);
    issue->message = err[F_MSG];
    issue->obj = objectp(err[F_OBJ]) ? object_name(err[F_OBJ]) : err[F_OBJ];
    // Normalisieren auf fuehrenden / und kein .c
    if (err[F_PROG]!="unbekannt")
        issue->prog = load_name(err[F_PROG]);
    else
        issue->prog = "unbekannt";
    issue->titp = getuid(this_interactive() || this_player());
    if (objectp(err[F_OBJ]))
      issue->tienv = object_name(environment(err[F_OBJ]));

    //DEBUG(sprintf("%O\n",issue));
    issue->hashkey = hash(TLS_HASH_MD5,
        sprintf("%d%s%s", issue->type, issue->loadname, issue->message));

    // ggf. vorhandenen Fehler suchen - zugegeben: sollte bei von Spielern
    // gemeldeten Dingen vermutlich nie vorkommen...
    int oldid = getErrorID(issue->hashkey);
    if (oldid >= 0)
    {
      // ggf. sicherstellen, dass er wieder eroeffnet wird.
      db_reopen_issue(oldid, "<ErrorD>",
                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
      db_countup_issue(oldid);
      return issue->hashkey;
    }

    // sonst fuegen wir einen neuen Eintrag hinzu
    // Spielergemeldete Bugs werden erstmal vor automatischem Loeschen
    // geschuetzt, bis ein zustaendiger Magier ihn zur Kenntnis nimmt und
    // entsperrt.
    issue->locked = 1;
    issue->locked_by = getuid(TI || PL);
    issue->locked_time = time();

    // In DB eintragen.
    issue->id = db_insert_issue(issue);

    lasterror[issue->type]=issue->id;

    // Event triggern, aber nur eine Teilmenge der Daten direkt mitliefern.
    EVENTD->TriggerEvent(EVT_LIB_NEW_ERROR,
              ([F_TYPE: issue->type, F_HASHKEY:issue->hashkey,
               F_UID:issue->uid, F_ID: issue->id]));

    DEBUG(sprintf("LogReportedError: %s\n",issue->hashkey));

    return issue->hashkey;
}

//Fehler registrieren
//Diese Funktion darf nicht mehr als 200k Ticks verbrauchen und wird nur vom
//Master gerufen!
public int LogError(string msg,string prg,string curobj,int line,mixed culprit,
    int caught)
{
    //DEBUG(sprintf("LogError: Prog: %O, Obj: %O,\n",prg,curobj));

    //darf nur vom Master gerufen werden
    if (!extern_call() || 
        (previous_object() && previous_object() != master()))
        return 0;

    struct fullissue_s issue = (<fullissue_s>);

    //UID bestimmen
    issue->uid=({string})master()->creator_file(curobj);
    //DEBUG(sprintf("LogError: UID: %s\n",uid));

    //Loadname (besser als BP, falls rename_object() benutzt wurde) bestimmen
    if (!stringp(curobj) || !sizeof(curobj))
        issue->loadname = curobj = "<Unbekannt>";
    else
    {
        //load_name nimmt Strings und Objects und konstruiert den loadname,
        //wie er sein sollte, wenn das Objekt nicht mehr existiert.
        issue->loadname=load_name(curobj);
    }
    if (!stringp(issue->loadname))
    {
        //hier kommt man rein, falls curobj ein 'kaputter' Name ist,
        //d.h. load_name() 0 liefert.
        issue->loadname="<Illegal object name>";
    }

    // Wenn curobj in /players/ liegt, es einen TI gibt, welcher ein Magier
    // ist und dieser die Prop P_DONT_LOG_ERRORS gesetzt hat, wird der FEhler
    // nicht gespeichert.
    if (this_interactive() && IS_LEARNER(this_interactive())
        && strstr(issue->loadname,WIZARDDIR)==0
        && ({int})this_interactive()->QueryProp(P_DONT_LOG_ERRORS))
    {
        return 0;
    }

    // prg und curobj auf fuehrenden / und ohne .c am Ende normieren.
    if (stringp(prg))
        issue->prog = load_name(prg);
    if (stringp(curobj) && curobj[0]!='/')
    {
      curobj="/"+curobj;
    }

    issue->obj = curobj;
    issue->loc = line;
    issue->message = msg;
    issue->ctime = issue->mtime = issue->atime = time();
    issue->type = T_RTERROR;
    issue->count = 1;
    issue->caught = caught;

    //Hashkey bestimmen: Typ, Name der Blueprint des buggenden Objekts,
    //Programmname, Zeilennr., Fehlermeldung
    //TODO: evtl. sha1() statt md5()?
    issue->hashkey=hash(TLS_HASH_MD5,
        sprintf("%d%s%s%d%s", T_RTERROR, issue->loadname||"",
                            issue->prog || "", issue->loc,
                            issue->message||"<No error message given.>"));
    DEBUG(sprintf("LogError: Hashkey: %s", issue->hashkey));

    // ggf. vorhandenen Fehler suchen
    int oldid = getErrorID(issue->hashkey);
    if (oldid >= 0)
    {
      db_reopen_issue(oldid, "<ErrorD>",
                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
      db_countup_issue(oldid);
      return oldid;
    }

    //sonst fuegen wir einen neuen Eintrag hinzu
    //DEBUG(sprintf("LogError: OBJ: %s, BP: %s",curobj,loadname));
    // Wenn Fehler im HB, Objektnamen ermitteln
    if (objectp(culprit))
        issue->hbobj = object_name(culprit);

    //gibt es einen TI/TP? Name mit erfassen
    mixed tienv;
    if(objectp(this_interactive()))
    {
        issue->titp=getuid(this_interactive());
        tienv=environment(this_interactive());
    }
    else if (objectp(PL) && query_once_interactive(PL))
    {
        issue->titp=getuid(PL);
        tienv=environment(PL);
    }
    else if (objectp(PL))
    {
        issue->titp=object_name(PL);
        tienv=environment(PL);
    }
    if (objectp(tienv))
        issue->tienv=object_name(tienv);

    // Mal schauen, ob der Commandstack auch was fuer uns hat. ;-)
    mixed cli;
    if (pointerp(cli=command_stack()) && sizeof(cli))
    {
        issue->verb=cli[0][CMD_VERB];
        issue->command=cli[0][CMD_TEXT];
    }

    //stacktrace holen
    mixed stacktrace;
    if (caught)
        stacktrace=debug_info(DINFO_TRACE,DIT_ERROR);
    else
        stacktrace=debug_info(DINFO_TRACE,DIT_UNCAUGHT_ERROR);
    // gueltige Stacktraces haben min. 2 Elemente.
    // (leerer Trace: ({"No trace."}))
    if (sizeof(stacktrace) > 1)
    {
      int i;
      issue->stack = allocate(sizeof(stacktrace)-1);
      // erstes Element ist 0 oder HB-Objekt: kein frame, daher ueberspringen
      foreach(mixed entry : stacktrace[1..])
      {
        // frame->id will be set later by db_insert_issue().
        struct frame_s frame = (<frame_s> type : entry[TRACE_TYPE],
                                          name:  entry[TRACE_NAME],
                                          prog:  entry[TRACE_PROGRAM],
                                          obj:   entry[TRACE_OBJECT],
                                          loc:   entry[TRACE_LOC],
                                          ticks: entry[TRACE_EVALCOST]);
        issue->stack[i] = frame;
        ++i;
      }
    }

    issue->id = db_insert_issue(issue);

    lasterror[T_RTERROR]=issue->id;

    // Event triggern, aber nur eine Teilmenge der Daten direkt mitliefern.
    EVENTD->TriggerEvent(EVT_LIB_NEW_ERROR,
              ([ F_TYPE: T_RTERROR, F_HASHKEY: issue->hashkey, F_UID:
               issue->uid, F_ID: issue->id ]));

//    DEBUG(sprintf("LogError: Fehlereintrag:\n%O\n",
//          errors[uid][hashkey]));
//    DEBUG(sprintf("LogError: Verbrauchte Ticks: %d\n",
//          200000-get_eval_cost()));
    return issue->id;
}

//Warnungen registrieren
//Diese Funktion darf nicht mehr als 200k Ticks verbrauchen und wird nur vom
//Master gerufen!
public int LogWarning(string msg,string prg,string curobj,int line, int in_catch)
{
    //DEBUG(sprintf("LogWarning: Prog: %O, Obj: %O,\n",prg,curobj));

    //darf nur vom Master gerufen werden
    if (!extern_call() || 
        (previous_object() && previous_object() != master()))
        return 0;

    struct fullissue_s issue = (<fullissue_s>);

    //UID bestimmen
    issue->uid=({string})master()->creator_file(curobj);
    //DEBUG(sprintf("LogWarning UID: %s\n",uid));

    //Loadname (besser als BP, falls rename_object() benutzt wurde) bestimmen
    if (!stringp(curobj) || !sizeof(curobj))
        issue->loadname = curobj = "<Unbekannt>";
    else
    {
        //load_name nimmt Strings und Objects und konstruiert den loadname,
        //wie er sein sollte, wenn das Objekt nicht mehr existiert.
        issue->loadname=load_name(curobj);
    }

    if (!stringp(issue->loadname))
        //hier sollte man reinkommen, falls curobj ein 'kaputter' Name ist,
        //d.h. load_name() 0 liefert.
        issue->loadname="<Illegal object name>";

    // prg und curobj auf abs. Pfade normalisieren.
    if (stringp(prg))
        issue->prog=load_name(prg);
    if (stringp(curobj) && curobj[0]!='/')
    {
      curobj="/"+curobj;
    }

    //DEBUG(sprintf("LogWarning: OBJ: %s, BP: %s\n",curobj,blue));

    // Wenn curobj in /players/ liegt, es einen TI gibt, welcher ein Magier
    // ist und dieser die Prop P_DONT_LOG_ERRORS gesetzt hat, wird der FEhler
    // nicht gespeichert.
    if (this_interactive() && IS_LEARNER(this_interactive())
        && strstr(issue->loadname,WIZARDDIR)==0
        && ({int})this_interactive()->QueryProp(P_DONT_LOG_ERRORS)) {
        return 0;
    }

    //Hashkey bestimmen, Typ, Name der Blueprint des buggenden Objekts, Programm
    //Zeilennr., Warnungsmeldung
    issue->hashkey=hash(TLS_HASH_MD5,
        sprintf("%d%s%s%d%s", T_RTWARN, issue->loadname, issue->prog, line,
                           msg));
    //DEBUG(sprintf("LogWarning: Hashkey: %s",hashkey));


    // ggf. vorhandenen Fehler suchen
    int oldid = getErrorID(issue->hashkey);
    if (oldid >= 0)
    {
      db_reopen_issue(oldid, "<ErrorD>",
                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
      db_countup_issue(oldid);
      return oldid;
    }

    //sonst fuegen wir einen neuen Eintrag hinzu
    // erstmal vervollstaendigen
    issue->obj = curobj;
    issue->message = msg;
    issue->ctime = issue->mtime = issue->atime = time();
    issue->loc = line;
    issue->count = 1;
    issue->type = T_RTWARN;
    issue->caught = in_catch;

    //gibt es einen TI/TP? Name mit erfassen
    mixed tienv;
    if(objectp(this_interactive()))
    {
        issue->titp=getuid(this_interactive());
        tienv=environment(this_interactive());
    }
    else if (objectp(PL) && query_once_interactive(PL))
    {
        issue->titp=getuid(PL);
        tienv=environment(PL);
    }
    else if (objectp(PL))
    {
        issue->titp=object_name(PL);
        tienv=environment(PL);
    }
    if (objectp(tienv))
        issue->tienv=object_name(tienv);

    // Mal schauen, ob der Commandstack auch was fuer uns hat. ;-)
    mixed cli;
    if (pointerp(cli=command_stack()) && sizeof(cli))
    {
        issue->verb=cli[0][CMD_VERB];
        issue->command=cli[0][CMD_TEXT];
    }

    issue->id = db_insert_issue(issue);

    lasterror[T_RTWARN]=issue->id;
    // Event triggern, aber nur eine Teilmenge der Daten direkt mitliefern.
    EVENTD->TriggerEvent(EVT_LIB_NEW_ERROR,
        ([F_TYPE: issue->type, F_ID: issue->id,
          F_UID: issue->uid, F_HASHKEY: issue->hashkey]) );

//    DEBUG(sprintf("LogWarning: Warnungseintrag:\n%O\n",
//          warnings[uid][hashkey]));
//    DEBUG(sprintf("LogWarning: Verbrauchte Ticks: %d\n",
//          200000-get_eval_cost()));
    return issue->id;
}

//Warnungen und Fehler beim Kompilieren  registrieren
//Diese Funktion darf nicht mehr als 200k Ticks verbrauchen und wird nur vom
//Master gerufen!
public int LogCompileProblem(string file,string msg,int warn) {

    //DEBUG(sprintf("LogCompileProblem: Prog: %O, Obj: %O,\n",file,msg));

    //darf nur vom Master gerufen werden
    if (!extern_call() || 
        (previous_object() && previous_object() != master()))
        return 0;

    struct fullissue_s issue = (<fullissue_s>);

    //UID bestimmen
    issue->uid=({string})master()->creator_file(file);
    //DEBUG(sprintf("LogCompileProblem UID: %s\n",uid));

    // An File a) fuehrenden / anhaengen und b) endendes .c abschneiden. Macht
    // beides netterweise load_name().
    issue->loadname = load_name(file);
    issue->type = warn ? T_CTWARN : T_CTERROR;

    //loggen wir fuer das File ueberhaupt?
    if (member(BLACKLIST,explode(issue->loadname,"/")[<1])>=0)
        return 0;

    //Hashkey bestimmen, in diesem Fall einfach, wir koennen die
    //Fehlermeldunge selber nehmen.
    issue->hashkey=hash(TLS_HASH_MD5,sprintf(
          "%d%s%s",issue->type,issue->loadname, msg));
    //DEBUG(sprintf("LogCompileProblem: Hashkey: %s",hashkey));

    // ggf. vorhandenen Fehler suchen
    int oldid = getErrorID(issue->hashkey);
    if (oldid >= 0)
    {
      db_reopen_issue(oldid, "<ErrorD>",
                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
      db_countup_issue(oldid);
      return oldid;
    }

    // neuen Eintrag
    issue->message = msg;
    issue->count = 1;
    issue->ctime = issue->mtime = issue->atime = time();

    issue->id = db_insert_issue(issue);

    if (warn) lasterror[T_CTWARN]=issue->id;
    else lasterror[T_CTERROR]=issue->id;

//    DEBUG(sprintf("LogCompileProblem: Eintrag:\n%O\n",
//          (warn ? ctwarnings[uid][hashkey] : cterrors[uid][hashkey])));
//   DEBUG(sprintf("LogCompileProblem: Verbrauchte Ticks: %d\n",
//          200000-get_eval_cost()));
   return issue->id;
}

/* ****************  Public Interface ****************** */

//Einen bestimmten Fehler nach Hashkey suchen und als fullissue_s inkl. Notes
//und Stacktrace liefern.
struct fullissue_s QueryIssueByHash(string hashkey)
{
  struct fullissue_s issue = db_get_issue(0, hashkey);
  if (structp(issue))
    return filter_private(issue);
  return 0;
}
//Einen bestimmten Fehler nach ID suchen und als fullissue_s inkl. Notes
//und Stacktrace liefern.
struct fullissue_s QueryIssueByID(int issueid)
{
  struct fullissue_s issue = db_get_issue(issueid, 0);
  if (structp(issue))
    return filter_private(issue);
  return 0;
}

// den letzten Eintrag den jeweiligen Typ liefern.
struct fullissue_s QueryLastIssue(int type)
{
    if (!member(lasterror,type))
        return 0;
    //einfach den kompletten letzten Eintrag zurueckliefern
    return(QueryIssueByID(lasterror[type]));
}

// Liefert alle Issues, deren obj,prog oder loadname gleich <file> ist.
public struct fullissue_s* QueryIssuesByFile(string file, int type)
{
  mixed rows = sl_exec("SELECT * FROM issues "
                       "WHERE (loadname=?1 OR prog=?1 OR obj=?1) "
                       "AND deleted=0 AND resolved=0 AND type=?2"
                       "ORDER BY type,mtime;", file, type);
  if (pointerp(rows))
  {
    struct fullissue_s* ilist = allocate(sizeof(rows));
    int i;
    foreach(mixed row : rows)
    {
      // Einfachster Weg - funktioniert aber nur, solange die Felder in der DB
      // die gleiche Reihenfolge wie in der struct haben! Entweder immer
      // sicherstellen oder Ergebnisreihenfolge oben im select festlegen!
      struct fullissue_s issue = to_struct( row, (<fullissue_s>) );
      if (issue->type == T_RTERROR)
          issue->stack = db_get_stack(issue->id);
      issue->notes = db_get_notes(issue->id);
      ilist[i] = filter_private(issue);
      ++i;
    }
    return ilist;
  }
  return 0;
}

// Liefert eine Liste von allen IDs, Loadnames, UIDs und Typen fuer die
// angebenen <type> und <uid>.
varargs < <int|string>* >* QueryIssueListByFile(string file)
{
  mixed rows = sl_exec("SELECT id,loadname,obj,prog,loc FROM issues "
                       "WHERE (loadname=?1 OR prog=?1 OR obj=?1) "
                       "AND deleted=0 AND resolved=0 "
                       "ORDER BY type,mtime;", file);
  return rows;
}

// Liefert eine Liste von allen IDs, Loadnames, UIDs und Typen fuer die
// angebenen <type> und <uid>.
varargs < <int|string>* >* QueryIssueListByLoadname(string file, int type)
{
  mixed rows;
  if (type && file)
  {
     rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
                       "WHERE loadname=?1 AND type=?2 AND deleted=0 "
                       "AND resolved=0 "
                       "ORDER BY type,mtime;", file, type);
  }
  else if (type)
  {
     rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
                       "WHERE type=?1 AND deleted=0 AND resolved=0 "
                       "ORDER BY type,mtime;", type);
  }
  else if (file)
  {
    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
                       "WHERE loadname=?1 AND deleted=0 AND resolved=0 "
                       "ORDER BY type,mtime;", file);
  }
  return rows;
}


// Liefert eine Liste von allen IDs, Loadnames, UIDs und Typen fuer die
// angebenen <type> und <uid>.
varargs < <int|string>* >* QueryIssueList(int type, string uid)
{
  mixed rows;
  if (type && uid)
  {
    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
                   "WHERE type=?1 AND uid=?2 AND deleted=0 "
                   "AND resolved=0 "
                   "ORDER BY type,rowid;", type,uid);
  }
  else if (type)
  {
    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
                   "WHERE type=?1 AND deleted=0 AND resolved=0 "
                   "ORDER BY type,rowid;", type);
  }
  else if (uid)
  {
    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
                   "WHERE uid=?1 AND deleted=0 AND resolved=0 "
                   "ORDER BY type,rowid;", uid);
  }
  return rows;
}

varargs string* QueryUIDsForType(int type) {
    //liefert alle UIDs fuer einen Fehlertyp oder fuer alle Fehlertypen
    string** rows;

    if (type)
    {
      rows = sl_exec("SELECT uid FROM issues "
                     "WHERE type=?1 AND deleted=0 AND resvoled=0;", type);
    }
    else
      rows = sl_exec("SELECT uid FROM issues WHERE deleted=0 "
                     "AND resolved=0;");

    return map(rows, function string (string* item)
                     {return item[0];} );
}

//Wieviele unterschiedliche Fehler in diesem Typ?
varargs int QueryUniqueIssueCount(int type, string uid)
{
  int** rows;

  if (type && uid)
  {
    rows = sl_exec("SELECT count(*) FROM issues "
                   "WHERE type=?1 AND uid=?2 AND deleted=0 AND resolved=0;",
                   type, uid);
  }
  else if (type)
  {
    rows = sl_exec("SELECT count(*) FROM issues "
                   "WHERE type=?1 AND deleted=0 AND resolved=0;",
                   type);
  }
  else if (uid)
  {
    rows = sl_exec("SELECT count(*) FROM issues "
                   "WHERE uid=?1 AND deleted=0 AND resolved=0;",
                   uid);
  }
  else
    rows = sl_exec("SELECT count(*) FROM issues "
                   "WHERE deleted=0 AND resolved=0;");

  return rows[0][0];
}

//Einen bestimmten Fehler loeschen
varargs int ToggleDeleteError(int issueid, string note)
{
  mixed rows = sl_exec("SELECT uid,deleted from issues WHERE id=?1;",
                       issueid);
  if (!pointerp(rows))
    return -1;
  
  if (!access_check(rows[0][0], M_DELETE))
    //zugriff zum Schreiben nicht gestattet
    return -10;

//  sl_exec("BEGIN TRANSACTION;");
  if (rows[0][1])
  {
    // was deleted -> undelete it
    sl_exec("UPDATE issues SET deleted=0,mtime=?2 WHERE id=?1;",
            issueid,time());
    db_add_note((<note_s> id: issueid, time: time(), user: getuid(TI),
                          txt: sprintf("Loeschmarkierung entfernt. (%s)",
                                       note ? note: "<kein Kommentar>")
                ));
  }
  else
  {
    // was not deleted -> delete it.
    sl_exec("UPDATE issues SET deleted=1,mtime=?2 WHERE id=?1;",
            issueid, time());
    db_add_note((<note_s> id: issueid, time: time(), user: getuid(TI),
                          txt: sprintf("Loeschmarkierung gesetzt. (%s)",
                                       note ? note: "<kein Kommentar>")
                ));
  }
//  sl_exec("COMMIT;");
  return !rows[0][1];
}


// sperrt den Eintrag oder entsperrt ihn.
// Sperre heisst hier, dass der Fehler vom Expire nicht automatisch geloescht
// wird.
varargs int LockIssue(int issueid, string note) {
    return set_lock(issueid, 1, note);
}

varargs int UnlockIssue(int issueid, string note) {
    return set_lock(issueid, 0, note);
}

// einen Fehler als gefixt markieren
varargs int ResolveIssue(int issueid, string note) {
    return set_resolution(issueid, 1, note);
}
// einen Fehler als nicht gefixt markieren
varargs int ReOpenIssue(int issueid, string note) {
    return set_resolution(issueid, 0, note);
}

varargs int AddNote(int issueid, string note)
{

    if (!stringp(note) || !sizeof(note))
      return(-3);

    // existiert die ID in der DB?
    struct fullissue_s issue = db_get_issue(issueid,0);
    if (!issue)
      return -1;

    if (!access_check(issue->uid, M_WRITE))
        //zugriff zum Schreiben nicht gestattet
        return(-10);

    return db_add_note((<note_s> id: issueid, time: time(), user: getuid(TI),
                                 txt: note));
}

//Einen bestimmten Fehler einer anderen UID zuweisen.
//Hashkey ist zwar eindeutig, aber Angabe der
//der UID ist deutlich schneller. Weglassen des Typs nochmal langsamer. ;-)
//Potentiell also sehr teuer, wenn man UID oder UID+Typ weglaesst.
varargs int ReassignIssue(int issueid, string newuid, string note)
{
    struct fullissue_s issue = db_get_issue(issueid,0);
    if (!issue)
      return -1;

    if (!access_check(issue->uid, M_REASSIGN))
        //zugriff zum Schreiben nicht gestattet
        return(-10);

    return db_reassign_issue(issueid, newuid, note);
}

/* *********** Eher fuer Debug-Zwecke *********************** */
/*
mixed QueryAll(int type) {
    //das koennte ein sehr sehr grosses Mapping sein, ausserdem wird keine
    //Kopie zurueckgegeben, daher erstmal nur ich...
    if (!this_interactive() || 
        member(MAINTAINER,getuid(this_interactive()))<0)
        return(-1);
    if (process_call()) return(-2);
    if (!type) return(-3);
    return(errors[type]);
}

mixed QueryResolved()
{
    //das koennte ein sehr sehr grosses Mapping sein, ausserdem wird keine
    //Kopie zurueckgegeben, daher erstmal nur ich...
    if (!this_interactive() || 
        member(MAINTAINER,getuid(this_interactive()))<0)
        return(-1);
    if (process_call()) return(-2);
    return(resolved);
}
*/

/* *****************  Internal Stuff   ******************** */
void create() {
    seteuid(getuid(ME));

    if (sl_open("/"LIBDATADIR"/secure/ARCH/errord.sqlite") != 1)
    //if (sl_open("/errord.sqlite") != 1)
    {
      raise_error("Datenbank konnte nicht geoeffnet werden.\n");
    }
    sl_exec("PRAGMA foreign_keys = ON; PRAGMA temp_store = 2; ");
    //string* res=sl_exec("PRAGMA quick_check(N);");
    //if (pointerp(res))
    //{
    //  raise_error("");
    //}
    //sl_exec("CREATE TABLE issue(id INTEGER,haskey TEXT);");
    foreach (string cmd :
        explode(read_file("/secure/ARCH/errord.sql.init"),";\n"))
    {
      if (sizeof(cmd) && cmd != "\n")
      {
        sl_exec(cmd);
      }
    }
    sl_exec("ANALYZE main;");

    lasterror=([]);
}

string name() {return("<Error-Daemon>");}

void save_me(int now) {
  if (now)
    save_object(SAVEFILE);
  else if (find_call_out(#'save_object)==-1) {
    call_out(#'save_object, 30, SAVEFILE);
  }
}

varargs int remove(int silent) {
    save_me(1);
    destruct(ME);
    return(1);
}


// sperrt den Eintrag (lock!=0) oder entsperrt ihn (lock==0). 
// Sperre heisst hier, dass der Fehler vom Expire nicht automatisch geloescht
// wird.
// liefert <0 im Fehlerfall, sonst Array mit Lockdaten
private varargs int set_lock(int issueid, int lock, string note)
{
    struct fullissue_s issue = db_get_issue(issueid,0);
    if (!issue)
      return -1;

    if (!access_check(issue->uid, M_WRITE))
        //zugriff zum Schreiben nicht gestattet
        return(-10);

    return db_set_lock(issueid, lock, note);
}

//markiert einen Fehler als gefixt, mit 'note' als Bemerkung (res!=0) oder
//markiert einen Fehler wieder als nicht-gefixt (resolution==0)
//liefert < 0 im Fehlerfall, sonst den neuen Zustand.
private varargs int set_resolution(int issueid, int resolution, string note)
{
    struct fullissue_s issue = db_get_issue(issueid,0);
    if (!issue)
      return -1;

    // Fixen duerfen nur zustaendige
    if (resolution
        && !access_check(issue->uid, M_FIX))
      return -10;
    // ggf. Fix zurueckziehen darf jeder mit M_WRITE
    if (!resolution &&
        !access_check(issue->uid, M_WRITE))
      return -10;

    int res = db_set_resolution(issueid, resolution, note);

    if (res == 1)
    {
      // Fehler jetzt gefixt.
      versende_mail(db_get_issue(issueid,0));  // per Mail verschicken
    }

    return res;
}

//ist der Zugriff auf uid erlaubt? Geprueft wird TI (wenn kein TI, auch kein
//Schreibzugriff)
//mode gibt an, ob lesend oder schreibend
private int access_check(string uid, int mode) {

    if (mode==M_READ)
        return LEARNER_SECURITY;  //lesen darf jeder Magier

    // In process_string() schonmal gar nicht.
    if (process_call()) return(0);
    // EM+ duerfen alles loeschen.
    if (ARCH_SECURITY) return(1);
    // eigene UIDs darf man auch vollumfaenglich bearbeiten.
    if (secure_euid()==uid) return(1);

    // alles andere wird speziell geprueft
    switch(mode)
    {
      // M_WRITE ist zur zeit eigentlich immer nen Append - das duerfen zur
      // Zeit alle ab Vollmagier
      case M_WRITE:
        return LEARNER_SECURITY;
        break;
      // Loeschen und Fixen duerfen zur Zeit nur Zustaendige.
      case M_DELETE:
      case M_REASSIGN:
      case M_FIX:
        // Master nach UIDs fragen, fuer die der jew. Magier
        // zustaendig ist.
        if (member(({string*})master()->QueryUIDsForWizard(secure_euid()),uid) >= 0)
          return 1;

        break;
    }

    return(0);        //Fall-through, neinRNER_SECURITY
}

public string format_stacktrace(struct frame_s* stacktrace) {
    string *lines;

    if (!pointerp(stacktrace) || !sizeof(stacktrace))
        return("");

    lines=allocate(sizeof(stacktrace));
    int i;
    foreach(struct frame_s frame: stacktrace)
    {
      lines[i]=sprintf("Fun: %.20O in Prog: %.40s\n"
                       "   Zeile: %.8d [%.50s]\n"
                       "   Evalcosts: %d",
                       frame->name,frame->prog,
                       frame->loc,frame->obj,frame->ticks);
      ++i;
    }
    return(implode(lines,"\n"));
}

public string format_notes(struct note_s* notes)
{
  int i;
  string text="";
  foreach(struct note_s note: notes)
  {
    text+=sprintf("Notiz %d von %.10s am %.30s\n%s",
        ++i,capitalize(note->user),dtime(note->time),
        break_string(note->txt, 78,"  "));
  }
  return text;
}

public string format_error_spieler(struct fullissue_s issue)
{
  string txt;
  string *label;

  if (!issue)
    return 0;

  switch(issue->type)
  {
    case T_RTERROR:
      label=({"Laufzeitfehler","Dieser Laufzeitfehler"});
      break;
    case T_REPORTED_ERR:
      label=({"Fehlerhinweis","Dieser Fehlerhinweis"});
      break;
    case T_REPORTED_TYPO:
      label=({"Typo","Dieser Typo"});
      break;
    case T_REPORTED_IDEA:
      label=({"Idee","Diese Idee"});
      break;
    case T_REPORTED_MD:
      label=({"Fehlendes Detail","Dieses fehlende Detail"});
      break;
    case T_REPORTED_SYNTAX:
      label=({"Syntaxproblem","Dieses Syntaxproblem"});
      break;
    case T_RTWARN:
      label=({"Laufzeitwarnung","Diese Laufzeitwarnung"});
      break;
    case T_CTWARN:
      label=({"Ladezeitwarnung","Diese Ladezeitwarnung"});
      break;
    case T_CTERROR:
      label=({"Ladezeitfehler","Dieser Ladezeitfehler"});
      break;
    default: return 0;
  }

  txt=sprintf( "\nDaten fuer %s mit ID '%s':\n"
               "Zeit: %25s\n",
               label[0], issue->hashkey,
               dtime(issue->ctime)
              );

  txt+=sprintf("%s",break_string(issue->message,78,
                  "Meldung:    ",BS_INDENT_ONCE));

  if (pointerp(issue->notes))
      txt+="Bemerkungen:\n"+format_notes(issue->notes)+"\n";

  return txt;
}

public string format_error(struct fullissue_s issue, int only_essential)
{
  string txt;
  string *label;

  if (!issue)
    return 0;

  switch(issue->type)
  {
    case T_RTERROR:
      label=({"Laufzeitfehler","Dieser Laufzeitfehler"});
      break;
    case T_REPORTED_ERR:
      label=({"Fehlerhinweis","Dieser Fehlerhinweis"});
      break;
    case T_REPORTED_TYPO:
      label=({"Typo","Dieser Typo"});
      break;
    case T_REPORTED_IDEA:
      label=({"Idee","Diese Idee"});
      break;
    case T_REPORTED_MD:
      label=({"Fehlendes Detail","Dieses fehlende Detail"});
      break;
    case T_REPORTED_SYNTAX:
      label=({"Syntaxproblem","Dieses Syntaxproblem"});
      break;
    case T_RTWARN:
      label=({"Laufzeitwarnung","Diese Laufzeitwarnung"});
      break;
    case T_CTWARN:
      label=({"Ladezeitwarnung","Diese Ladezeitwarnung"});
      break;
    case T_CTERROR:
      label=({"Ladezeitfehler","Dieser Ladezeitfehler"});
      break;
    default: return 0;
  }

  txt=sprintf( "\nDaten fuer %s mit ID %d:\n"
               "Hashkey: %s\n"
               "Zeit: %25s (Erstmalig: %25s)\n",
               label[0], issue->id, issue->hashkey,
               dtime(abs(issue->mtime)),dtime(issue->ctime)
              );

  if (stringp(issue->prog))
      txt += sprintf(
               "Programm:   %.60s\n"
               "Zeile:      %.60d\n",
               issue->prog, issue->loc
               );

  if (stringp(issue->obj))
      txt+=sprintf("Objekt:     %.60s\n",
               issue->obj);

  txt += sprintf("Loadname:   %.60s\n"
                 "UID:        %.60s\n",
                 issue->loadname, issue->uid);

  txt+=sprintf("%s",break_string(issue->message,78,
                  "Meldung:    ",BS_INDENT_ONCE));
  if (stringp(issue->hbobj))
      txt+=sprintf(
               "HB-Obj:     %.60s\n",issue->hbobj);

  if (stringp(issue->titp)) {
      txt+=sprintf(
               "TI/TP:      %.60s\n",issue->titp);
      if (stringp(issue->tienv))
          txt+=sprintf(
               "Environm.:  %.60s\n",issue->tienv);
  }

  if (!stringp(issue->command) ||
      !ARCH_SECURITY || process_call())
  {
      // Kommandoeingabe ist Privatsphaere und darf nicht von jedem einsehbar
      // sein.
      // in diesem Fall aber zumindest das Verb ausgeben, so vorhanden
      if (issue->verb)
          txt+=sprintf(
              "Verb:        %.60s\n",issue->verb);
  }
  // !process_call() && ARCH_SECURITY erfuellt...
  else if (stringp(issue->command))
      txt+=sprintf(
          "Befehl:     %.60s\n",issue->command);

  if (issue->caught)
      txt+=label[1]+" trat in einem 'catch()' auf.\n";

  if (!only_essential)
  {
    if (issue->deleted)
        txt+=label[1]+" wurde als geloescht markiert.\n";

    if (issue->locked)
        txt+=break_string(
            sprintf("%s wurde von %s am %s vor automatischem Loeschen "
            "geschuetzt (locked).\n",
            label[1],issue->locked_by, dtime(issue->locked_time)),78);
    if (issue->resolved)
        txt+=label[1]+" wurde als erledigt markiert.\n";
  }

  txt+=sprintf("%s trat bisher %d Mal auf.\n",
               label[1],issue->count);

  if (pointerp(issue->stack))
      txt+="Stacktrace:\n"+format_stacktrace(issue->stack)+"\n";

  if (pointerp(issue->notes))
      txt+="Bemerkungen:\n"+format_notes(issue->notes)+"\n";

  return txt;
}

// letzter Aenderung eines Spieler-/Magiersavefiles. Naeherung fuer letzten
// Logout ohne das Savefile einzulesen und P_LAST_LOGOUT zu pruefen.
private int recent_lastlogout(string nam, int validtime)
{
  if (!nam || sizeof(nam)<2) return 0;
  return file_time("/"LIBSAVEDIR"/" + nam[0..0] + "/" + nam + ".o") >= validtime;
}

// Versendet Mail an zustaendigen Magier und ggf. Spieler, der den Eintrag
// erstellt hat.
// ACHTUNG: loescht issue->command.
private int versende_mail(struct fullissue_s issue)
{
  // Versendet eine mail mit dem gefixten Fehler.
  mixed *mail;
  string text, *empf;
  int res = -1;

  mail = allocate(9);
  mail[MSG_FROM] = "<Fehler-Daemon>";
  mail[MSG_SENDER] = getuid(TI);
  mail[MSG_BCC] = 0;
  mail[MSG_SUBJECT] = sprintf("Fehler/Warnung in %s behoben", issue->loadname);
  mail[MSG_DATE] = dtime(time());

  // auch wenn ein EM fixt, sollen die Empfaenger nicht automatisch die
  // Spielereingabe erhalten, also command loeschen.
  issue->command = 0;

  // erstmal eine Mail an zustaendige Magier.
  empf = ({string*})master()->QueryWizardsForUID(issue->uid);
  // lang (180 Tage) nicht eingeloggte Magier ausfiltern
  empf = filter(empf, #'recent_lastlogout, time() - 15552000);
  if (sizeof(empf))
  {

    text = break_string(
      sprintf(STANDARDMAILTEXT,capitalize(getuid(TI)))
      +format_error(issue, 1),78,"",BS_LEAVE_MY_LFS);

    mail[MSG_RECIPIENT] = empf[0];
    if (sizeof(empf)>1)
      mail[MSG_CC] = empf[1..];
    else
      mail[MSG_CC] = 0;
    mail[MSG_BODY]=text;
    mail[MSG_ID]=sprintf(MUDNAME": %d.%d",time(),random(__INT_MAX__));

    if (!sizeof(({string*})"/secure/mailer"->DeliverMail(mail,0)))
      res = -1; // an niemanden erfolgreich zugestellt. :-(
    else
      res = 1;
  }

  // Bei von Spielern gemeldeten Fehler werden Spieler bei
  // Erledigung informiert, wenn deren letzter Logout weniger als 180 Tage her
  // ist.
  if ( (issue->type &
        (T_REPORTED_ERR|T_REPORTED_TYPO|T_REPORTED_IDEA|T_REPORTED_MD|
        T_REPORTED_SYNTAX))
      && issue->titp
      && recent_lastlogout(issue->titp, time() - 15552000) )
  {
    text = break_string(
      sprintf(STANDARDMAILTEXT_ERRORHINT,
        capitalize(issue->titp), capitalize(getuid(TI)))
      +format_error_spieler(issue), 78,"",BS_LEAVE_MY_LFS);

    mail[MSG_ID]=sprintf(MUDNAME": %d.%d",time(),random(__INT_MAX__));
    mail[MSG_RECIPIENT] = issue->titp;
    mail[MSG_CC] = 0;
    mail[MSG_SUBJECT] = sprintf("Fehler/Idee/Typo wurde von %s behoben",
                                getuid(TI));
    mail[MSG_BODY] = text;

    if (!sizeof(({string*})"/secure/mailer"->DeliverMail(mail,0)))
      res |= -1;
    else
      res |= 1;
  }

  return res;
}

void reset()
{
  // geloeschte Issues sofort, gefixte 30 Tage nach letzter Aenderung
  // loeschen.
  sl_exec("DELETE FROM issues WHERE deleted=1;");
  sl_exec("DELETE FROM issues WHERE resolved=1 AND mtime<?1;",
          time()-30*24*3600);
  set_next_reset(3600*24);
}

// Nicht jeder Magier muss den ErrorD direkt zerstoeren koennen.
public string NotifyDestruct(object caller) {
  if( (caller!=this_object() && !ARCH_SECURITY) || process_call() ) {
    return "Du darfst den Error-Daemon nicht zerstoeren!\n";
  }
  return 0;
}

