From badc02927e861a52e997a712671f026d9d9287c7 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 7 Dec 2015 18:11:58 +0200 Subject: [PATCH] Add play_if_exist command --- config.l | 2 ++ config.y | 11 ++++++++++- dgamelaunch.h | 2 ++ dgl-common.c | 17 +++++++++++++++-- examples/dgamelaunch.conf | 5 +++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/config.l b/config.l index 1d15d76..b3b78d4 100644 --- a/config.l +++ b/config.l @@ -74,6 +74,7 @@ cursor { return TYPE_CURSOR; } "chroot_path" { return TYPE_PATH_CHROOT; } "game_name" { return TYPE_NAME_GAME; } "short_name" { return TYPE_GAME_SHORT_NAME; } +"game_id" { return TYPE_GAME_ID; } "game_path" { return TYPE_PATH_GAME; } "dglroot" { return TYPE_PATH_DGLDIR; } "spooldir" { return TYPE_PATH_SPOOL; } @@ -120,6 +121,7 @@ ask_login { yylval.i = DGLCMD_LOGIN; return TYPE_DGLCMD0; } ask_register { yylval.i = DGLCMD_REGISTER; return TYPE_DGLCMD0; } quit { yylval.i = DGLCMD_QUIT; return TYPE_DGLCMD0; } play_game { yylval.i = DGLCMD_PLAYGAME; return TYPE_DGLCMD1; } +play_if_exist { yylval.i = DGLCMD_PLAY_IF_EXIST; return TYPE_DGLCMD2; } submenu { yylval.i = DGLCMD_SUBMENU; return TYPE_DGLCMD1; } return { yylval.i = DGLCMD_RETURN; return TYPE_DGLCMD0; } rawprint { yylval.i = DGLCMD_RAWPRINT; return TYPE_DGLCMD1; } diff --git a/config.y b/config.y index b4c1b01..fd90224 100644 --- a/config.y +++ b/config.y @@ -51,7 +51,7 @@ static int sortmode_number(const char *sortmode_name) { %token TYPE_SUSER TYPE_SGROUP TYPE_SGID TYPE_SUID TYPE_MAX TYPE_MAXNICKLEN %token TYPE_GAME_SHORT_NAME TYPE_WATCH_SORTMODE TYPE_BANNERVARS -%token TYPE_ALLOW_REGISTRATION TYPE_WATCH_COLUMNS +%token TYPE_ALLOW_REGISTRATION TYPE_WATCH_COLUMNS TYPE_GAME_ID %token TYPE_PATH_GAME TYPE_NAME_GAME TYPE_PATH_DGLDIR TYPE_PATH_SPOOL %token TYPE_PATH_BANNER TYPE_PATH_CANNED TYPE_PATH_CHROOT %token TYPE_PATH_PASSWD TYPE_PATH_LOCKFILE TYPE_PATH_TTYREC @@ -496,6 +496,11 @@ game_definition : TYPE_CMDQUEUE myconfig[ncnf]->shortname = strdup($3); break; + case TYPE_GAME_ID: + if (myconfig[ncnf]->game_id) free (myconfig[ncnf]->game_id); + myconfig[ncnf]->game_id = strdup($3); + break; + case TYPE_RC_FMT: if (myconfig[ncnf]->rc_fmt) free(myconfig[ncnf]->rc_fmt); myconfig[ncnf]->rc_fmt = strdup($3); @@ -575,6 +580,8 @@ definegame : TYPE_DEFINE_GAME '{' } game_definitions '}' { + if (myconfig[ncnf]->game_id == NULL && myconfig[ncnf]->shortname) + myconfig[ncnf]->game_id = strdup(myconfig[ncnf]->shortname); ncnf++; num_games = ncnf; } @@ -644,6 +651,7 @@ KeyType : TYPE_SUSER { $$ = TYPE_SUSER; } | TYPE_PATH_GAME { $$ = TYPE_PATH_GAME; } | TYPE_NAME_GAME { $$ = TYPE_NAME_GAME; } | TYPE_GAME_SHORT_NAME { $$ = TYPE_GAME_SHORT_NAME; } + | TYPE_GAME_ID { $$ = TYPE_GAME_ID; } | TYPE_PATH_DGLDIR { $$ = TYPE_PATH_DGLDIR; } | TYPE_PATH_SPOOL { $$ = TYPE_PATH_SPOOL; } | TYPE_PATH_BANNER { $$ = TYPE_PATH_BANNER; } @@ -680,6 +688,7 @@ const char* lookup_token (int t) case TYPE_NAME_GAME: return "game_name"; case TYPE_ALLOW_REGISTRATION: return "allow_new_nicks"; case TYPE_GAME_SHORT_NAME: return "short_name"; + case TYPE_GAME_ID: return "game_id"; case TYPE_PATH_DGLDIR: return "dglroot"; case TYPE_PATH_SPOOL: return "spooldir"; case TYPE_PATH_BANNER: return "banner"; diff --git a/dgamelaunch.h b/dgamelaunch.h index b9ce41c..e298adf 100644 --- a/dgamelaunch.h +++ b/dgamelaunch.h @@ -72,6 +72,7 @@ typedef enum DGLCMD_CHMAIL, /* chmail */ DGLCMD_CHPASSWD, /* chpasswd */ DGLCMD_PLAYGAME, /* play_game "foo" */ + DGLCMD_PLAY_IF_EXIST, /* play_if_exist "game" "file" */ DGLCMD_SUBMENU, /* submenu "foo" */ DGLCMD_RETURN /* return */ } dglcmd_actions; @@ -198,6 +199,7 @@ struct dg_config { char* game_path; char* game_name; + char* game_id; char* shortname; char* rcfile; char* ttyrecdir; diff --git a/dgl-common.c b/dgl-common.c index 0cf7959..80560b5 100644 --- a/dgl-common.c +++ b/dgl-common.c @@ -25,6 +25,7 @@ struct dg_config **myconfig = NULL; struct dg_config defconfig = { /* game_path = */ "/bin/nethack", /* game_name = */ "NetHack", + /* game_id = */ NULL, /* shortname = */ "NH", /* rcfile = */ NULL, /*"/dgl-default-rcfile",*/ /* ttyrecdir =*/ "%ruserdata/%n/ttyrec/", @@ -215,6 +216,7 @@ dgl_exec_cmdqueue(struct dg_cmdpart *queue, int game, struct dg_user *me) struct dg_cmdpart *tmp = queue; char *p1; char *p2; + int played = 0; if (!queue) return 1; @@ -338,12 +340,22 @@ dgl_exec_cmdqueue(struct dg_cmdpart *queue, int game, struct dg_user *me) case DGLCMD_RETURN: return_from_submenu = 1; break; + case DGLCMD_PLAY_IF_EXIST: + if (!(loggedin && me && p1 && p2)) break; + { + FILE *tmpfile; + tmpfile = fopen(p2, "r"); + if (tmpfile) { + fclose(tmpfile); + } else break; + } + /* else fall through to playgame */ case DGLCMD_PLAYGAME: - if (loggedin && me && p1) { + if (loggedin && me && p1 && !played) { int userchoice, i; char *tmpstr; for (userchoice = 0; userchoice < num_games; userchoice++) { - if (!strcmp(myconfig[userchoice]->game_name, p1) || !strcmp(myconfig[userchoice]->shortname, p1)) { + if (!strcmp(myconfig[userchoice]->game_id, p1) || !strcmp(myconfig[userchoice]->game_name, p1) || !strcmp(myconfig[userchoice]->shortname, p1)) { if (purge_stale_locks(userchoice)) { if (myconfig[userchoice]->rcfile) { if (access (dgl_format_str(userchoice, me, myconfig[userchoice]->rc_fmt, NULL), R_OK) == -1) @@ -378,6 +390,7 @@ dgl_exec_cmdqueue(struct dg_cmdpart *queue, int game, struct dg_user *me) dgl_format_str(userchoice, me, myconfig[userchoice]->ttyrecdir, NULL), gen_ttyrec_filename()); idle_alarm_set_enabled(1); + played = 1; /* lastly, run the generic "do these when a game is left" commands */ signal (SIGHUP, catch_sighup); signal (SIGINT, catch_sighup); diff --git a/examples/dgamelaunch.conf b/examples/dgamelaunch.conf index 7c9dea5..2a79175 100644 --- a/examples/dgamelaunch.conf +++ b/examples/dgamelaunch.conf @@ -143,6 +143,7 @@ default_term = "xterm" # registration of new nicks is allowed. # play_game "foo" = start game which has the short name "foo" # (user must be logged in) +# play_if_exist "foo" "file" = start game "foo", if file "file" exists. # submenu "foo" = go to submenu "foo" # return = return from submenu # @@ -260,6 +261,10 @@ menu["watchmenu_help"] { # # Short name, used in the watching menu # short_name = "NHstb" # +# # Game ID - should be unique. Defaults to game_name, if not defined. +# # Used to determine which game is which for "play_game" and "play_if_exists" commands +# game_id = "NHstb" +# # # arguments for when we exec the binary # game_args = "/bin/nethackstub", # "foo",