]> skyeroc.xyz Git - dgamelaunch/commitdiff
Allow getting the server time and date via banner variables:
authorPasi Kallinen <paxed@alt.org>
Wed, 12 Oct 2011 14:34:40 +0000 (14:34 +0000)
committerPasi Kallinen <paxed@alt.org>
Wed, 12 Oct 2011 14:34:40 +0000 (14:34 +0000)
 bannervars = [ "$DATETIME" = timeformat("%F %T") ]

git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@624 db0b04b0-f4d1-0310-9a6d-de3e77497b0e

TODO
config.l
config.y
dgamelaunch.c
dgamelaunch.h
examples/dgamelaunch.conf

diff --git a/TODO b/TODO
index 38898c301dc2abe20d8601adc1fec2bcc0d17aa6..c5725e0e1ab0991c628c807902c5f0c8b672c6d9 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,8 @@
 
+-allow setting banners for the internal menus, with the same method
+ as normal user-defined menus, but only the banner is used from them.
+ if no such menu is defined, then uses the default banner file.
+
 -update dgamelaunch.8
 
 -occasionally dgl crashes, leaving the shmem semaphore in a state
index 467cbd0cd0a52046e243cdee856f63d901b6170b..3216bd1c14df5fec2fdad7fc2a090515bef51bf7 100644 (file)
--- a/config.l
+++ b/config.l
@@ -88,6 +88,7 @@ extra_info_file { return TYPE_EXTRA_INFO_FILE; }
 "rc_fmt"       { return TYPE_RC_FMT; }
 "ttyrecdir"    { return TYPE_PATH_TTYREC; }
 bannervars     { return TYPE_BANNERVARS; }
+timeformat     { return TYPE_TIMEFORMAT; }
 sortmode       { return TYPE_WATCH_SORTMODE; }
 watch_columns  { return TYPE_WATCH_COLUMNS; }
 commands       { return TYPE_CMDQUEUE; }
index e6d847d81e713d89a63ade9a888f54bc51761cd8..58466f015e4b152f048a68c64c726d6ba2611dc4 100644 (file)
--- a/config.y
+++ b/config.y
@@ -57,7 +57,7 @@ static int sortmode_number(const char *sortmode_name) {
 %token TYPE_PATH_PASSWD TYPE_PATH_LOCKFILE TYPE_PATH_TTYREC
 %token TYPE_MALSTRING TYPE_PATH_INPROGRESS TYPE_GAME_ARGS TYPE_RC_FMT
 %token TYPE_CMDQUEUE TYPE_DEFINE_MENU TYPE_BANNER_FILE TYPE_CURSOR
-%token TYPE_POSTCMDQUEUE
+%token TYPE_POSTCMDQUEUE TYPE_TIMEFORMAT
 %token TYPE_MAX_IDLE_TIME TYPE_MENU_MAX_IDLE_TIME TYPE_EXTRA_INFO_FILE
 %token TYPE_ENCODING TYPE_LOCALE TYPE_UTF8ESC TYPE_FILEMODE
 %token <s> TYPE_VALUE
@@ -301,7 +301,11 @@ banner_vars : banner_vars ',' banner_var
 
 banner_var : TYPE_VALUE '=' TYPE_VALUE
        {
-           banner_var_add($1, $3);
+           banner_var_add($1, $3, 0);
+       }
+       | TYPE_VALUE '=' TYPE_TIMEFORMAT '(' TYPE_VALUE ')'
+       {
+           banner_var_add($1, $5, 1);
        };
 
 watch_columns: watch_columns ',' watch_column
index f7b6f181655b1429c4519d7c7e2066632bcec496..bc9002e0f84ebd1aa400441630d0efae2d64af18 100644 (file)
@@ -403,7 +403,7 @@ bannerstrmangle(char *buf, char *bufnew, int buflen, char *fromstr, char *tostr)
 }
 
 void
-banner_var_add(char *name, char *value)
+banner_var_add(char *name, char *value, int special)
 {
     struct dg_banner_var *tmp = (struct dg_banner_var *)malloc(sizeof(struct dg_banner_var));
 
@@ -411,6 +411,7 @@ banner_var_add(char *name, char *value)
 
     tmp->name = strdup(name);
     tmp->value = strdup(value);
+    tmp->special = special;
     tmp->next = globalconfig.banner_var_list;
     globalconfig.banner_var_list = tmp;
 }
@@ -430,12 +431,26 @@ banner_var_free()
     globalconfig.banner_var_list = NULL;
 }
 
+char *
+banner_var_resolve(struct dg_banner_var *bv)
+{
+  static char tmpbuf[81];
+  time_t tstamp;
+  struct tm *ptm;
+  if (!bv) return NULL;
+  if (!bv->special) return bv->value;
+  time(&tstamp);
+  ptm = gmtime(&tstamp);
+  strftime(tmpbuf, 80, bv->value, ptm);
+  return tmpbuf;
+}
+
 char *
 banner_var_value(char *name)
 {
     struct dg_banner_var *bv = globalconfig.banner_var_list;
     while (bv) {
-       if (!strcmp(bv->name, name)) return bv->name;
+       if (!strcmp(bv->name, name)) return banner_var_resolve(bv);
        bv = bv->next;
     }
     return NULL;
@@ -517,7 +532,7 @@ loadbanner (char *fname, struct dg_banner *ban)
          char tmpbufnew[80];
          struct dg_banner_var *bv = globalconfig.banner_var_list;
          while (bv) {
-             strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, 80, bv->name, bv->value), 80);
+             strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, 80, bv->name, banner_var_resolve(bv)), 80);
              bv = bv->next;
          }
          strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, 80, "$VERSION", PACKAGE_STRING), 80);
index 9b83c8435dcabe62b00d78d9771fad360e213db6..80e55170bc8339c8519586a2d2ae104ba10e72a5 100644 (file)
@@ -106,6 +106,7 @@ static const char *SORTMODE_NAME[NUM_SORTMODES] = {
 struct dg_banner_var {
     char *name;
     char *value;
+    int special;
     struct dg_banner_var *next;
 };
 
@@ -281,7 +282,7 @@ extern char *gen_inprogress_lock(int game, pid_t pid, char *ttyrec_filename);
 extern void catch_sighup(int signum);
 extern void loadbanner(char *fname, struct dg_banner *ban);
 extern void drawbanner(struct dg_banner *ban);
-extern void banner_var_add(char *name, char *value);
+extern void banner_var_add(char *name, char *value, int special);
 extern char *banner_var_value(char *name);
 extern void banner_var_free(void);
 extern int check_retard(int reset);
index 0964978cb83ab85aeb198f924db07f627bd062d6..9e1eef59601e49c8f7a36f14f8a19a18ced4bb15 100644 (file)
@@ -47,8 +47,13 @@ chroot_path = "/opt/nethack/nethack.alt.org/"
 dglroot = "/dgldir/"
 
 # Strings to be replaced in every banner
+# you can have either direct string replacements, like
+# "$FOO" = "BAR", or you can get the server time with
+# "$FOO" = timeformat("%F %T")
+# for the timeformat parameter string format, see man strftime
 bannervars = [ "$MOTDTIME" = "2011.10.08",
-              "$SERVERID" = "nethack.alt.org - http://nethack.alt.org/"
+              "$SERVERID" = "nethack.alt.org - http://nethack.alt.org/",
+              "$DATETIME" = timeformat("%F %T")
             ]
 
 # From inside the jail, location of a banner file, which is