From: Pasi Kallinen Date: Wed, 12 Oct 2011 14:34:40 +0000 (+0000) Subject: Allow getting the server time and date via banner variables: X-Git-Tag: v1.6.1-roc-dev~86 X-Git-Url: https://skyeroc.xyz/gitweb/?a=commitdiff_plain;h=b5d3e6257b8902f1982de6e5e69658e7f8decc94;p=dgamelaunch Allow getting the server time and date via banner variables: bannervars = [ "$DATETIME" = timeformat("%F %T") ] git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@624 db0b04b0-f4d1-0310-9a6d-de3e77497b0e --- diff --git a/TODO b/TODO index 38898c3..c5725e0 100644 --- 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 diff --git a/config.l b/config.l index 467cbd0..3216bd1 100644 --- 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; } diff --git a/config.y b/config.y index e6d847d..58466f0 100644 --- 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 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 diff --git a/dgamelaunch.c b/dgamelaunch.c index f7b6f18..bc9002e 100644 --- a/dgamelaunch.c +++ b/dgamelaunch.c @@ -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); diff --git a/dgamelaunch.h b/dgamelaunch.h index 9b83c84..80e5517 100644 --- a/dgamelaunch.h +++ b/dgamelaunch.h @@ -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); diff --git a/examples/dgamelaunch.conf b/examples/dgamelaunch.conf index 0964978..9e1eef5 100644 --- a/examples/dgamelaunch.conf +++ b/examples/dgamelaunch.conf @@ -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