Skip to content

Commit

Permalink
Add bingeboard
Browse files Browse the repository at this point in the history
Adds the bingeboard table to the database.
This table stores stats about the player that are updated on each turn.

A working example of this being utilized is at https://binge.csh.rit.edu
This example provided by:
https://github.com/liam-middlebrook/bingehack4-binge-api
https://github.com/liam-middlebrook/bingehack4-bingeboard-web
  • Loading branch information
liam-middlebrook committed Mar 19, 2017
1 parent e25262e commit 6caf7a5
Show file tree
Hide file tree
Showing 4 changed files with 204 additions and 0 deletions.
9 changes: 9 additions & 0 deletions nethack_server/include/nhserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,20 @@ extern long db_add_new_game(int uid, const char *filename, const char *role,
const char *race, const char *gend,
const char *align, int mode, const char *plname,
const char *levdesc);
extern void db_add_binge_entry(int gid, int level, int hp, int max_hp, int gold, int moves,
int energy, int max_energy, int attrib_str, int attrib_int,
int attrib_wis, int attrib_dex, int attrib_con, int attrib_cha,
int score);
extern void db_update_game(int gameid, int moves, int depth,
const char *levdesc);
extern void db_update_binge_entry(int gid, int level, int hp, int max_hp, int gold, int moves,
int energy, int max_energy, int attrib_str, int attrib_int,
int attrib_wis, int attrib_dex, int attrib_con, int attrib_cha,
int score);
extern enum getgame_result db_get_game_filename(
int gid, char *filenamebuf, int buflen);
extern void db_delete_game(int uid, int gid);
extern void db_delete_binge_entry(int gid);
extern struct gamefile_info *db_list_games(int completed, int uid, int limit,
int *count);
extern void db_add_topten_entry(int gid, int points, int hp, int maxhp,
Expand Down
21 changes: 21 additions & 0 deletions nethack_server/src/clientcmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,12 @@ ccmd_create_game(json_t * params)
ri->racenames[race], ri->gendnames[gend],
ri->alignnames[align], mode, name,
player_info.level_desc);
db_add_binge_entry(gameid, player_info.z, player_info.hp,
player_info.hpmax, player_info.gold,
player_info.moves, player_info.en,
player_info.enmax, player_info.st,
player_info.in, player_info.wi, player_info.dx,
player_info.co, player_info.ch, player_info.score);
log_msg("%s has created a new game (%d) as %s", user_info.username,
gameid, name);
j_msg = json_pack("{si}", "return", gameid);
Expand Down Expand Up @@ -349,6 +355,7 @@ ccmd_play_game(json_t * params)
"list?",
"yn", 'n') == 'y') {
db_delete_game(user_info.uid, gid);
db_delete_binge_entry(gid);
log_msg("%s has chosen to remove game %d from the database",
user_info.username, gid);
}
Expand All @@ -359,6 +366,13 @@ ccmd_play_game(json_t * params)
db_update_game(gid, player_info.moves, player_info.z,
player_info.level_desc);

db_update_binge_entry(gid, player_info.z, player_info.hp,
player_info.hpmax, player_info.gold,
player_info.moves, player_info.en,
player_info.enmax, player_info.st,
player_info.in, player_info.wi, player_info.dx,
player_info.co, player_info.ch, player_info.score);

/* move the finished game to its final resting place */
if (status == GAME_OVER) {
char filename[1024], final_name[1024];
Expand Down Expand Up @@ -394,6 +408,13 @@ ccmd_exit_game(json_t * params)
if (status) {
db_update_game(gameid, player_info.moves, player_info.z,
player_info.level_desc);
db_update_binge_entry(gameid, player_info.z, player_info.hp,
player_info.hpmax, player_info.gold,
player_info.moves, player_info.en,
player_info.enmax, player_info.st,
player_info.in, player_info.wi, player_info.dx,
player_info.co, player_info.ch, player_info.score);

log_msg("%s has closed game %d", user_info.username, gameid);
gameid = -1;
close(gamefd);
Expand Down
167 changes: 167 additions & 0 deletions nethack_server/src/db_pgsql.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,25 @@ static const char SQL_init_games_table[] =
"owner integer NOT NULL REFERENCES users (uid), " "ts timestamp NOT NULL, "
"start_ts timestamp NOT NULL" ");";

static const char SQL_init_binge_table[] =
"CREATE TABLE bingeboard ("
"gid SERIAL PRIMARY KEY REFERENCES games (gid), "
"level integer NOT NULL, "
"hp integer NOT NULL, "
"max_hp integer NOT NULL, "
"gold integer NOT NULL, "
"moves integer NOT NULL, "
"energy integer NOT NULL, "
"max_energy integer NOT NULL, "
"attrib_str integer NOT NULL, "
"attrib_int integer NOT NULL, "
"attrib_wis integer NOT NULL, "
"attrib_dex integer NOT NULL, "
"attrib_con integer NOT NULL, "
"attrib_cha integer NOT NULL, "
"score integer NOT NULL "
");";

static const char SQL_init_topten_table[] =
"CREATE TABLE topten(" "gid integer PRIMARY KEY REFERENCES games (gid), "
"points integer NOT NULL, " "hp integer NOT NULL, "
Expand Down Expand Up @@ -81,16 +100,36 @@ static const char SQL_add_game[] =
"VALUES ($1::text, $2::text, $3::text, $4::text, $5::text, "
"$6::integer, 1, 1, $7::integer, $8::text, $9::text, 'now', 'now')";

static const char SQL_add_binge_entry[] =
"INSERT INTO bingeboard ("
"gid, level, hp, max_hp, gold, moves, energy, max_energy, attrib_str, "
"attrib_int, attrib_wis, attrib_dex, attrib_con, attrib_cha, score) "
"VALUES ($1::integer, $2::integer, $3::integer, $4::integer, $5::integer, "
"$6::integer, $7::integer, $8::integer, $9::integer, $10::integer, $11::integer, "
"$12::integer, $13::integer, $14::integer, $15::integer)";

static const char SQL_delete_game[] =
"DELETE FROM games WHERE owner = $1::integer AND gid = $2::integer;";

static const char SQL_delete_binge_entry[] =
"DELETE FROM bingeboard WHERE gid = $1::integer;";

static const char SQL_last_game_id[] = "SELECT currval('games_gid_seq');";

static const char SQL_update_game[] =
"UPDATE games "
"SET ts = 'now', moves = $2::integer, depth = $3::integer, level_desc = "
"$4::text WHERE gid = $1::integer;";

static const char SQL_update_binge_entry[] =
"UPDATE bingeboard "
"SET level = $2::integer, hp = $3::integer, max_hp = $4::integer, "
"gold = $5::integer, moves = $6::integer, energy = $7::integer, "
"max_energy = $8::integer, attrib_str = $9::integer, attrib_int = $10::integer, "
"attrib_wis = $11::integer, attrib_dex = $12::integer, attrib_con = $13::integer, "
"attrib_cha = $14::integer, score = $15::integer WHERE gid = $1::integer;";


static const char SQL_set_game_done[] =
"UPDATE games " "SET done = TRUE " "WHERE gid = $1::integer;";

Expand Down Expand Up @@ -208,6 +247,7 @@ check_database(void)
*/
if (!check_create_table("users", SQL_init_user_table) ||
!check_create_table("games", SQL_init_games_table) ||
!check_create_table("bingeboard", SQL_init_binge_table) ||
!check_create_table("topten", SQL_init_topten_table))
goto err;

Expand Down Expand Up @@ -446,6 +486,60 @@ db_add_new_game(int uid, const char *filename, const char *role,
return gid;
}

void
db_add_binge_entry(int gid, int level, int hp, int max_hp, int gold, int moves,
int energy, int max_energy, int attrib_str, int attrib_int,
int attrib_wis, int attrib_dex, int attrib_con, int attrib_cha,
int score)
{
PGresult *res;
char gid_str[16],
level_str[16],
hp_str[16],
max_hp_str[16],
gold_str[16],
moves_str[16],
energy_str[16],
max_energy_str[16],
attrib_str_str[16],
attrib_int_str[16],
attrib_wis_str[16],
attrib_dex_str[16],
attrib_con_str[16],
attrib_cha_str[16],
score_str[16];

const char *const params[] = {gid_str, level_str, hp_str, max_hp_str,
gold_str, moves_str, energy_str, max_energy_str, attrib_str_str,
attrib_int_str, attrib_wis_str, attrib_dex_str, attrib_con_str,
attrib_cha_str, score_str
};
const int paramFormats[15] = { 0 };

snprintf(gid_str, sizeof(gid_str), "%d", gid);
snprintf(level_str, sizeof(level_str), "%d", level);
snprintf(hp_str, sizeof(hp_str), "%d", hp);
snprintf(max_hp_str, sizeof(max_hp_str), "%d", max_hp);
snprintf(gold_str, sizeof(gold_str), "%d", gold);
snprintf(moves_str, sizeof(moves_str), "%d", moves);
snprintf(energy_str, sizeof(energy_str), "%d", energy);
snprintf(max_energy_str, sizeof(max_energy_str), "%d", max_energy);
snprintf(attrib_str_str, sizeof(attrib_str_str), "%d", attrib_str);
snprintf(attrib_int_str, sizeof(attrib_int_str), "%d", attrib_int);
snprintf(attrib_wis_str, sizeof(attrib_wis_str), "%d", attrib_wis);
snprintf(attrib_dex_str, sizeof(attrib_dex_str), "%d", attrib_dex);
snprintf(attrib_con_str, sizeof(attrib_con_str), "%d", attrib_con);
snprintf(attrib_cha_str, sizeof(attrib_cha_str), "%d", attrib_cha);
snprintf(score_str, sizeof(score_str), "%d", score);

res =
PQexecParams(conn, SQL_add_binge_entry, 15, NULL, params, NULL, paramFormats,
0);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
log_msg("db_add_binge_entry error while adding (%d): %s", gid, PQerrorMessage(conn));
PQclear(res);
}
}

void
db_update_game(int game, int moves, int depth, const char *levdesc)
Expand All @@ -467,6 +561,60 @@ db_update_game(int game, int moves, int depth, const char *levdesc)
PQclear(res);
}

void
db_update_binge_entry(int gid, int level, int hp, int max_hp, int gold, int moves,
int energy, int max_energy, int attrib_str, int attrib_int,
int attrib_wis, int attrib_dex, int attrib_con, int attrib_cha,
int score)
{
PGresult *res;
char gid_str[16],
level_str[16],
hp_str[16],
max_hp_str[16],
gold_str[16],
moves_str[16],
energy_str[16],
max_energy_str[16],
attrib_str_str[16],
attrib_int_str[16],
attrib_wis_str[16],
attrib_dex_str[16],
attrib_con_str[16],
attrib_cha_str[16],
score_str[16];

const char *const params[] = {gid_str, level_str, hp_str, max_hp_str,
gold_str, moves_str, energy_str, max_energy_str, attrib_str_str,
attrib_int_str, attrib_wis_str, attrib_dex_str, attrib_con_str,
attrib_cha_str, score_str
};
const int paramFormats[15] = { 0 };

snprintf(gid_str, sizeof(gid_str), "%d", gid);
snprintf(level_str, sizeof(level_str), "%d", level);
snprintf(hp_str, sizeof(hp_str), "%d", hp);
snprintf(max_hp_str, sizeof(max_hp_str), "%d", max_hp);
snprintf(gold_str, sizeof(gold_str), "%d", gold);
snprintf(moves_str, sizeof(moves_str), "%d", moves);
snprintf(energy_str, sizeof(energy_str), "%d", energy);
snprintf(max_energy_str, sizeof(max_energy_str), "%d", max_energy);
snprintf(attrib_str_str, sizeof(attrib_str_str), "%d", attrib_str);
snprintf(attrib_int_str, sizeof(attrib_int_str), "%d", attrib_int);
snprintf(attrib_wis_str, sizeof(attrib_wis_str), "%d", attrib_wis);
snprintf(attrib_dex_str, sizeof(attrib_dex_str), "%d", attrib_dex);
snprintf(attrib_con_str, sizeof(attrib_con_str), "%d", attrib_con);
snprintf(attrib_cha_str, sizeof(attrib_cha_str), "%d", attrib_cha);
snprintf(score_str, sizeof(score_str), "%d", score);

res =
PQexecParams(conn, SQL_update_binge_entry, 15, NULL, params, NULL, paramFormats,
0);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
log_msg("update_binge_entry error: %s", PQerrorMessage(conn));
PQclear(res);
}

void
db_delete_game(int uid, int gid)
{
Expand All @@ -487,6 +635,25 @@ db_delete_game(int uid, int gid)
PQclear(res);
}

void
db_delete_binge_entry(int gid)
{
PGresult *res;
char gid_str[16];
const char *const params[] = { gid_str };
const int paramFormats[] = { 0 };

snprintf(gid_str, sizeof(gid_str), "%d", gid);

res =
PQexecParams(conn, SQL_delete_binge_entry, 1, NULL, params, NULL, paramFormats,
0);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
log_msg("db_delete_binge_entry error: %s", PQerrorMessage(conn));

PQclear(res);
}


static struct gamefile_info *
db_game_name_core(int completed, int uid, int gid, int limit, int *count)
Expand Down
7 changes: 7 additions & 0 deletions nethack_server/src/winprocs.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,13 @@ srv_update_status(struct nh_player_info *pi)
}
player_info = *pi;

db_update_binge_entry(gameid, player_info.z, player_info.hp,
player_info.hpmax, player_info.gold,
player_info.moves, player_info.en,
player_info.enmax, player_info.st,
player_info.in, player_info.wi, player_info.dx,
player_info.co, player_info.ch, player_info.score);

add_display_data("update_status", jobj);
}

Expand Down

0 comments on commit 6caf7a5

Please sign in to comment.