Added crecall()
authorAri Johnson <ari@cobramush.org>
Fri, 13 Apr 2007 03:59:43 +0000 (03:59 +0000)
committerAri Johnson <ari@theari.com>
Thu, 24 Mar 2011 15:58:45 +0000 (15:58 +0000)
(cherry picked from commit f7a124bb66073b43c3923dbe24342c10cd45c115)

game/txt/changes/0.73
game/txt/hlp/cobra_chat.hlp
src/extchat.c
src/function.c
win32/funs.h

index 7c50af5ab4ba6bdc487b3bdde53b27e9be7da55d..1f42c297321da484c4af6c107dde1505b0581024 100644 (file)
@@ -195,4 +195,5 @@ CobraMUSH Version 0.73
    * FIXED flag restriction on 'home' is now entirely in restrict.cnf [AEJ]
    * @chan/list works better for people who increase CHAN_NAME_LEN [AEJ]
    * locate() can take multiple types and prefer all of them [AEJ]
+   * crecall() [AEJ]
 
index fbd6491165588cb10208996b52e0aceed8409180..22979652d845a062566935cf0415fcd8c9298517 100644 (file)
@@ -323,6 +323,15 @@ specific indirect lock instead of the default one:
   @clock.
 
   See also: @clock
+& CRECALL()
+  crecall(<channel>[, <lines> [, <start line> [, <osep> [, <timestamps?> ]]]])
+
+  This function is the functional form of @chan/recall, and returns a
+  string containing the recalled lines from the channel, separated by
+  <osep>. If <timestamps?> is a true value, the recalled lines will
+  include their timestamps; otherwise, they will not.
+
+  See also: @channel3
 & Channel functions
   Channel functions work with the channel system.
 
index 53d2ffdb382811bb4ea854973e9973293d15d9bb..fc5a1ad4b0e0939f0aed2c9a6d7a900ba8758960 100644 (file)
@@ -3220,6 +3220,117 @@ FUNCTION(fun_cemit)
   do_cemit(executor, args[0], args[1], flags);
 }
 
+/* ARGSUSED */
+FUNCTION(fun_crecall)
+{
+  CHAN *chan;
+  CHANUSER *u;
+  int start = -1, num_lines = 10;
+  char *p = NULL, *buf, *name;
+  time_t timestamp;
+  char *stamp;
+  dbref speaker;
+  int type;
+  int first = 1;
+  char sep;
+  int showstamp = 0;
+
+  name = args[0];
+  if (!name || !*name) {
+    safe_str(T("#-1 NO SUCH CHANNEL"), buff, bp);
+    return;
+  }
+
+  if (!args[1] || !*args[1]) {
+    /* nothing */
+  } else if (is_integer(args[1])) {
+    num_lines = parse_integer(args[1]);
+    if (num_lines == 0)
+      num_lines = INT_MAX;
+  } else {
+    safe_str(T(e_int), buff, bp);
+    return;
+  }
+  if (!args[2] || !*args[2]) {
+    /* nothing */
+  } else if (is_integer(args[2])) {
+    start = parse_integer(args[2]) - 1;
+  } else {
+    safe_str(T(e_int), buff, bp);
+    return;
+  }
+
+  if (!delim_check(buff, bp, nargs, args, 4, &sep))
+    return;
+
+  if (nargs > 4 && args[4] && *args[4])
+    showstamp = parse_boolean(args[4]);
+
+  if (num_lines < 0) {
+    safe_str(T(e_uint), buff, bp);
+    return;
+  }
+
+  test_channel(executor, name, chan);
+  if (!Chan_Can_See(chan, executor)) {
+    if (onchannel(executor, chan))
+      safe_str(T(e_perm), buff, bp);
+    else
+      safe_str(T("#-1 NO SUCH CHANNEL"), buff, bp);
+    return;
+  }
+
+  u = onchannel(executor, chan);
+  if (!u &&!Chan_Can_Access(chan, executor)) {
+    safe_str(T(e_perm), buff, bp);
+    return;
+  }
+
+  if (!ChanBufferQ(chan)) {
+    safe_str(T("#-1 NO RECALL BUFFER"), buff, bp);
+    return;
+  }
+
+  if (start < 0)
+    start = BufferQNum(ChanBufferQ(chan)) - num_lines;
+  if (isempty_bufferq(ChanBufferQ(chan))
+      || BufferQNum(ChanBufferQ(chan)) <= start) {
+    safe_str(T(e_range), buff, bp);
+    return;
+  }
+
+  while (start > 0) {
+    buf = iter_bufferq(ChanBufferQ(chan), &p, &speaker, &type, &timestamp);
+    start--;
+  }
+  while ((buf = iter_bufferq(ChanBufferQ(chan), &p, &speaker, &type,
+                            &timestamp)) && num_lines > 0) {
+    if (first)
+      first = 0;
+    else
+      safe_chr(sep, buff, bp);
+    if (Nospoof(executor) && GoodObject(speaker)) {
+      char *nsmsg = ns_esnotify(speaker, na_one, &executor,
+                               Paranoid(executor) ? 1 : 0);
+      if (!showstamp)
+       safe_format(buff, bp, T("%s %s"), nsmsg, buf);
+      else {
+       stamp = show_time(timestamp, 0);
+       safe_format(buff, bp, T("[%s] %s %s"), stamp, nsmsg, buf);
+      }
+      mush_free(nsmsg, "string");
+    } else {
+      if (!showstamp)
+       safe_str(buf, buff, bp);
+      else {
+       stamp = show_time(timestamp, 0);
+       safe_format(buff, bp, T("[%s] %s"), stamp, buf);
+      }
+    }
+    num_lines--;
+  }
+}
+
 COMMAND (cmd_cemit) {
   int spflags = !strcmp(cmd->name, "@NSCEMIT") ? PEMIT_SPOOF : 0;
   SPOOF(player, cause, sw);
index 32d7652a6675edba1b4ae99cda4ec94702d7b2d8..c7b41e428ea5a692549570f357487fcceae3b013 100644 (file)
@@ -315,6 +315,7 @@ FUNTAB flist[] = {
   {"CLOCK", fun_clock, 1, 2, FN_REG},
   {"CMSGS", fun_cinfo, 1, 1, FN_REG},
   {"COWNER", fun_cowner, 1, 1, FN_REG},
+  {"CRECALL", fun_crecall, 3, 5, FN_REG},
   {"CSTATUS", fun_cinfo, 1, 1, FN_REG},
   {"CTITLE", fun_ctitle, 2, 2, FN_REG},
   {"CUSERS", fun_cinfo, 1, 1, FN_REG},
index 8f2cfb36b9a6becdcc8af033b745287d10640707..5eefb07d4b1bfb04dafc71112751f194c4164149 100644 (file)
@@ -61,6 +61,7 @@ FUNCTION_PROTO(fun_cor);
 FUNCTION_PROTO(fun_cos);
 FUNCTION_PROTO(fun_cowner);
 FUNCTION_PROTO(fun_create);
+FUNCTION_PROTO(fun_crecall);
 FUNCTION_PROTO(fun_crplog);
 FUNCTION_PROTO(fun_cstatus);
 FUNCTION_PROTO(fun_ctime);