Neues Kommando zum Aendern des Fehlertyps

Spieler waehlen haeufig die falsche Kategorie fuer Fehlermeldungen.
Entdeckt man einen solchen Fehler, kann man ihn jetzt in die passende
Kategorie verschieben, um ihn spaeter leichter wiederzufinden.

Change-Id: I74761542321e1b558370fa049902a0593cea746f
diff --git a/secure/errord.c b/secure/errord.c
index 84577ec..3faf424 100644
--- a/secure/errord.c
+++ b/secure/errord.c
@@ -37,6 +37,7 @@
 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);
+public string* print_type(int type);
 
 private int versende_mail(struct fullissue_s fehler);
 
@@ -1024,6 +1025,28 @@
     return db_reassign_issue(issueid, newuid, note);
 }
 
+varargs int ChangeType(int issueid, int newtype, int oldtype, string note)
+{
+  struct fullissue_s issue = db_get_issue(issueid, 0);
+  if(!issue)
+    return -1;
+
+  if (!access_check(issue->uid, M_CHANGE_TYPE))
+  {
+    // Zugriff zum Schreiben nicht gestattet
+    return(-10);
+  }
+
+  sl_exec(
+    "UPDATE issues SET type=?1,mtime=?2 WHERE id=?3;",
+    newtype, time(), issueid);
+  db_add_note(
+    (<note_s> id: issueid, time: time(), user: getuid(TI),
+    txt: sprintf("Fehlertyp von %s auf %s geaendert. (%s)",
+    print_type(oldtype)[0], print_type(newtype)[0], (note || "<kein Kommentar>"))));
+  return 1;
+}
+
 /* *********** Eher fuer Debug-Zwecke *********************** */
 /*
 mixed QueryAll(int type) {
@@ -1167,6 +1190,7 @@
       case M_DELETE:
       case M_REASSIGN:
       case M_FIX:
+      case M_CHANGE_TYPE:
         // Master nach UIDs fragen, fuer die der jew. Magier
         // zustaendig ist.
         if (member(({string*})master()->QueryUIDsForWizard(secure_euid()),uid) >= 0)
@@ -1266,6 +1290,44 @@
   return txt;
 }
 
+public string* print_type(int type)
+{
+  string* res;
+  switch(type)
+  {
+    case T_RTERROR:
+      res = ({"Laufzeitfehler","Dieser Laufzeitfehler"});
+      break;
+    case T_REPORTED_ERR:
+      res = ({"Fehlerhinweis","Dieser Fehlerhinweis"});
+      break;
+    case T_REPORTED_TYPO:
+      res = ({"Typo","Dieser Typo"});
+      break;
+    case T_REPORTED_IDEA:
+      res = ({"Idee","Diese Idee"});
+      break;
+    case T_REPORTED_MD:
+      res = ({"Fehlendes Detail","Dieses fehlende Detail"});
+      break;
+    case T_REPORTED_SYNTAX:
+      res = ({"Syntaxproblem","Dieses Syntaxproblem"});
+      break;
+    case T_RTWARN:
+      res = ({"Laufzeitwarnung","Diese Laufzeitwarnung"});
+      break;
+    case T_CTWARN:
+      res = ({"Ladezeitwarnung","Diese Ladezeitwarnung"});
+      break;
+    case T_CTERROR:
+      res = ({"Ladezeitfehler","Dieser Ladezeitfehler"});
+      break;
+    default:
+      res = 0;
+  }
+  return res;
+}
+
 public string format_error(struct fullissue_s issue, int only_essential)
 {
   string txt;
@@ -1274,37 +1336,8 @@
   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;
-  }
+  label = print_type(issue->type);
+  if(!label) return 0;
 
   txt=sprintf( "\nDaten fuer %s mit ID %d:\n"
                "Hashkey: %s\n"
diff --git a/secure/errord.h b/secure/errord.h
index da41f89..8da611b 100644
--- a/secure/errord.h
+++ b/secure/errord.h
@@ -22,6 +22,8 @@
 #define ALL_ERR_TYPES ({T_RTERROR, T_RTWARN, T_CTERROR, T_CTWARN, \
                         T_REPORTED_ERR, T_REPORTED_TYPO, T_REPORTED_IDEA, \
                         T_REPORTED_MD, T_REPORTED_SYNTAX })
+#define CHANGEABLE_TYPES ({T_REPORTED_ERR, T_REPORTED_TYPO, T_REPORTED_IDEA, \
+                           T_REPORTED_MD, T_REPORTED_SYNTAX})
 
 // Status
 #define STAT_DELETED  0x1
@@ -83,6 +85,7 @@
 #define M_FIX    4
 #define M_REASSIGN 8
 #define M_DELETE 16
+#define M_CHANGE_TYPE 32
 
 // Changelog
 #define CHANGELOG "/log/CHANGELOG"