TM-History: langlebigen Modus dokumentiert

Langlebigen Modus dokumentiert und vollstaendig aktiviert,
manuelles Loeschen der TM-Hist eingebaut.

Change-Id: I3c63bd22d1443eec8ab17c4f09f7e7904fac8fdf
diff --git a/doc/pcmd/tmhist b/doc/pcmd/tmhist
index d5f6cf6..9faa890 100644
--- a/doc/pcmd/tmhist
+++ b/doc/pcmd/tmhist
@@ -7,6 +7,8 @@
     tmhist aus
     tmhist namen
     tmhist ein
+    tmhist langlebig
+    tmhist loeschen
     tmhist <spielername>
     tmhist <nr>
 
@@ -14,17 +16,23 @@
     Ohne Argument wird die aktuelle Teile-mit-History ausgegeben.
     'tmhist aus' schaltet die Speicherung komplett aus,
     'tmhist namen' speichert nur die Namen der Gespraechspartner und einige
-    statistische Daten.
+       statistische Daten.
     'tmhist ein' speichert Namen der Gespraechspartner sowie die Inhalte der
-    Gespraeche.
+       Gespraeche.
+    'tmhist langlebig' speichert auch ueber 'schlafe ein' hinaus.
+    'tmhist loeschen' loescht den aktuellen Inhalt der History, speichert
+       aber weiterhin ankommende TMs.
     'tmhist <name>' gibt das Gespraech mit dem angegebenen Spieler wieder,
-    sofern so ein Gespraech existiert und der Inhalt gespeichert wurde.
+       sofern so ein Gespraech existiert und der Inhalt gespeichert wurde.
     'tmhist <nr>' gibt das Gespraech mit der Nummer <nr> in der History
-    wieder.
+       wieder.
 
-    Die Gespraechsinhalte werden beim Ausloggen mittels 'schlafe ein'
-    innerhalb von ca. 4s geloescht, bei 'ende' sofort. Bricht die Verbindung
-    zum MorgenGrauen ab, werden die Gespraechsinhalte nach 15min geloescht.
+    Wenn die Teile-mit-History auf "langlebig" geschaltet wird, bleibt sie
+    auch nach einem 'schlafe ein' oder einem Verbindungsabbruch (aber nicht
+    nach 'ende') erhalten. Ansonsten werden die Gespraechsinhalte beim
+    Ausloggen mittels 'schlafe ein' innerhalb von ca. 4s geloescht, bei 
+    'ende' sofort und bei Abbruch der Verbindung zum MorgenGrauen nach ca.
+    15min geloescht.
     Es werden max. 20 Gespraeche mit jeweils max. 50 Nachrichten gespeichert.
 
     Alle mit dem Befehl 'rfluester' mitgeteilten Mitteilungen werden nicht
@@ -35,4 +43,4 @@
     ignoriere, kobold, muds, senderwiederholung, klingelton, teile, rfluestere
 
  LETZTE AeNDERUNG:
-    Sa, 09.08.2008, Zesstra
+    14.02.2022, Zesstra
diff --git a/std/player/base.c b/std/player/base.c
index e39f33a..7b3b42a 100644
--- a/std/player/base.c
+++ b/std/player/base.c
@@ -3466,7 +3466,7 @@
 
   say(capitalize(name(WER))+" hat gerade die Verbindung zu "MUDNAME" gekappt.\n");
   remove_interactive(ME);
-  call_out(#'clear_tell_history,4);
+  call_out(#'clear_tell_history, 4, 0);
   return 1;
 }
 
diff --git a/std/player/comm.c b/std/player/comm.c
index 7025a86..312f7e5 100644
--- a/std/player/comm.c
+++ b/std/player/comm.c
@@ -650,10 +650,10 @@
     ReceiveMsg(sprintf(
       "\nadd_to_tell_history(): got bad uid argument %O."
       "sent: %d, recv: %d, flags: %d, msg: %s", 
-      uid, sent, recv, flags, message),MT_DEBUG|MSG_BS_LEAVE_LFS,0,0,ME);              
+      uid, sent, recv, flags, message),MT_DEBUG|MSG_BS_LEAVE_LFS,0,0,ME);
   }
 
-  // letzten Gespraechspartner fuer erwidere.
+  // Gespraechspartner fuer erwidere auch ohne tmhist speichern.
   if (flags & (MSGFLAG_TELL|MSGFLAG_RTELL))
     last_comm_partner = uid;
 
@@ -677,6 +677,7 @@
     }
   }
 
+  // mit eingeschalteter History weitere Details speichern.
   if (!tell_history_enabled)
     return;
 
@@ -718,6 +719,7 @@
     chat->recvcount += recv;
   }
 
+  // ggf. auch INhalte von Gespraechen speichern
   if (tell_history_enabled < TELLHIST_ENABLED)
     return;
 
@@ -743,21 +745,18 @@
   msg->timestamp = time();
 }
 
-protected void clear_tell_history()
+protected void clear_tell_history(int force)
 {
   /* Nach einem "schlafe ein" werden die gespeicherten Mitteilungen geloescht,
      sofern der Spieler nichts abweichendes eingestellt hat. */
 
-#ifdef TELLHIST_LONGLIFE
-  if (tell_history_enabled == TELLHIST_LONGLIFE)
-    return;
-#endif
-
-  foreach (string uid, struct chat_s chat: tell_history)
-    if (pointerp(chat->msgbuf)) {
-      chat->msgbuf = 0;
-      chat->ptr = 0;
-    }
+  // bei manuellem Loeschen (force==1) immer loeschen, ansonsten nur, wenn die
+  // History nicht "long-life" ist.
+  if (tell_history_enabled < TELLHIST_LONGLIFE || force)
+  {
+    tell_history = ([]);
+    commreceivers = ({});
+  }
 }
 
 protected void reset(void)
@@ -767,7 +766,7 @@
      wie bei einem "schlafe ein" die Mitteilungen geloescht. */
 
   if (!interactive())
-    clear_tell_history();
+    clear_tell_history(0);
 
 }
 
@@ -1657,12 +1656,21 @@
     tell_history_enabled = TELLHIST_DISABLED;
     write("Ok, es wird nichts mehr gespeichert.\n");
     if (sizeof(tell_history)) {
-      tell_history = ([]);
-      commreceivers = ({});
+      clear_tell_history(1);
       write("Deine Mitteilungsgeschichte wurde geloescht.\n");
     }
     return 1;
   }
+  if (str == "loeschen")
+  {
+    if (sizeof(tell_history)) {
+      clear_tell_history(1);
+      write("Deine Mitteilungsgeschichte wurde geloescht.\n");
+    }
+    else
+      write("Deine Mitteilungsgeschichte war schon leer.\n");
+    return 1;
+  }
 
   if (str == "namen") {
     int flag;
@@ -1685,14 +1693,12 @@
     return 1;
   }
 
-#ifdef TELLHIST_LONGLIFE
   if (str == "langlebig") {
     tell_history_enabled = TELLHIST_LONGLIFE;
     write("Ok, zukuenftige Mitteilungen werden jeweils bis zum naechsten "
           "Ende/Crash/\nReboot gespeichert.\n");
     return 1;
   }
-#endif
 
   if (str == "status") {
     switch (tell_history_enabled) {
@@ -1705,12 +1711,10 @@
       case TELLHIST_ENABLED:
         write("Deine Mitteilungen werden gespeichert.\n");
         break;
-#ifdef TELLHIST_LONGLIFE
       case TELLHIST_LONGLIFE:
         write("Deine Mitteilungen werden jeweils bis zum naechsten Ende/"
               "Crash/Reboot\ngespeichert.\n");
         break;
-#endif
     }
     return 1;
   }