diff options
author | Ratakor <ratakor@disroot.org> | 2023-06-03 14:09:27 +0200 |
---|---|---|
committer | Ratakor <ratakor@disroot.org> | 2023-06-03 14:09:27 +0200 |
commit | 3374cfbcac033d1ae7910efd5d9835c65e9499c5 (patch) | |
tree | 98c753cb632cee136f2283c8ccb9af514ac33716 | |
parent | 5d7d20319073ac5acd775712d4e5f5d0eae0bd36 (diff) |
Fix a bug with update and save statsv0.0.7
Fix a bug with update_players() and save_player_to_file() in stats.c.
Other change:
Move create_player() to init.c as load_player().
Change some int to unsigned int, and unsigned long to unsigned int and
int to size_t.
-rw-r--r-- | src/cmd_help.c | 2 | ||||
-rw-r--r-- | src/cmd_info.c | 6 | ||||
-rw-r--r-- | src/cmd_lbraid.c | 29 | ||||
-rw-r--r-- | src/cmd_leaderboard.c | 10 | ||||
-rw-r--r-- | src/cmd_uraid.c | 8 | ||||
-rw-r--r-- | src/init.c | 55 | ||||
-rw-r--r-- | src/nolan.h | 1 | ||||
-rw-r--r-- | src/raids.c | 47 | ||||
-rw-r--r-- | src/stats.c | 77 |
9 files changed, 122 insertions, 113 deletions
diff --git a/src/cmd_help.c b/src/cmd_help.c index a573753..43a9fa3 100644 --- a/src/cmd_help.c +++ b/src/cmd_help.c @@ -18,7 +18,7 @@ help(char *buf, size_t siz) { char *p; size_t rsiz; - int i, len = LENGTH(stats_ids); + unsigned int i, len = LENGTH(stats_ids); strlcpy(buf, "Post a screenshot of your stats to ", siz); for (i = 0; i < len; i++) { diff --git a/src/cmd_info.c b/src/cmd_info.c index e0e3a6f..375f42f 100644 --- a/src/cmd_info.c +++ b/src/cmd_info.c @@ -94,7 +94,7 @@ write_invalid(char *buf, size_t siz) void write_info(char *buf, size_t siz, int index) { - unsigned long i; + unsigned int i; char *p; *buf = '\0'; @@ -120,7 +120,7 @@ write_info(char *buf, size_t siz, int index) void info_from_uid(char *buf, size_t siz, u64snowflake userid) { - unsigned long i = 0; + unsigned int i = 0; while (i < nplayers && players[i].userid != userid) i++; @@ -134,7 +134,7 @@ info_from_uid(char *buf, size_t siz, u64snowflake userid) void info_from_txt(char *buf, size_t siz, char *txt) { - unsigned long i = 0; + unsigned int i = 0; u64snowflake userid; userid = str_to_uid(txt); diff --git a/src/cmd_lbraid.c b/src/cmd_lbraid.c index 57811d6..812ec5d 100644 --- a/src/cmd_lbraid.c +++ b/src/cmd_lbraid.c @@ -3,10 +3,10 @@ #include <time.h> #include "nolan.h" -static void parse_file(char *fname, Slayer slayers[], int *nslayers); -static void load_files(Slayer slayers[], int *nslayers); +static void parse_file(char *fname, Slayer slayers[], size_t *nslayers); +static void load_files(Slayer slayers[], size_t *nslayers); static int compare(const void *s1, const void *s2); -static void write_lbraid(char *buf, int siz, Slayer slayers[], int nslayers); +static void write_lbraid(char *buf, int siz, Slayer slayers[], size_t nslayers); static void lbraid(char *buf, size_t siz); void @@ -21,11 +21,11 @@ create_slash_lbraid(struct discord *client) } void -parse_file(char *fname, Slayer slayers[], int *nslayers) +parse_file(char *fname, Slayer slayers[], size_t *nslayers) { FILE *fp; - int i; char line[LINE_SIZE], *endname; + unsigned int i; unsigned long dmg; if ((fp = fopen(fname, "r")) == NULL) @@ -53,9 +53,9 @@ parse_file(char *fname, Slayer slayers[], int *nslayers) } void -load_files(Slayer slayers[], int *nslayers) +load_files(Slayer slayers[], size_t *nslayers) { - int i; + unsigned int i; long day = time(NULL) / 86400; char fname[128]; @@ -71,17 +71,18 @@ load_files(Slayer slayers[], int *nslayers) int compare(const void *s1, const void *s2) { - const long dmg1 = ((unsigned long *)(Slayer *)s1)[1]; - const long dmg2 = ((unsigned long *)(Slayer *)s2)[1]; + const unsigned long dmg1 = ((Slayer *)s1)->damage; + const unsigned long dmg2 = ((Slayer *)s2)->damage; return dmg2 - dmg1; } void -write_lbraid(char *buf, int siz, Slayer slayers[], int nslayers) +write_lbraid(char *buf, int siz, Slayer slayers[], size_t nslayers) { - int i, lb_max = MIN(nslayers, LB_MAX); + unsigned int i, lb_max = MIN(nslayers, LB_MAX); char *p = buf; + for (i = 0; i < lb_max; i++) { siz -= snprintf(p, siz, "%d. %s: %'lu damage\n", i, slayers[i].name, slayers[i].damage); @@ -94,12 +95,13 @@ write_lbraid(char *buf, int siz, Slayer slayers[], int nslayers) void lbraid(char *buf, size_t siz) { - int i, nslayers = 0; + unsigned int i; + size_t nslayers = 0; Slayer slayers[MAX_SLAYERS]; load_files(slayers, &nslayers); qsort(slayers, nslayers, sizeof(slayers[0]), compare); - write_lbraid(buf, siz, slayers, nslayers); + write_lbraid(buf, (int)siz, slayers, nslayers); if (nslayers > 0) { for (i = 0; i < nslayers; i++) { @@ -125,7 +127,6 @@ on_lbraid(struct discord *client, const struct discord_message *event) return; #endif /* DEVEL */ - lbraid(buf, siz); struct discord_create_message msg = { .content = buf diff --git a/src/cmd_leaderboard.c b/src/cmd_leaderboard.c index 2f8568a..1ae1b4f 100644 --- a/src/cmd_leaderboard.c +++ b/src/cmd_leaderboard.c @@ -4,7 +4,7 @@ static void write_invalid(char *buf, size_t siz); static int compare(const void *p1, const void *p2); -static void write_player(char *buf, size_t siz, int i); +static void write_player(char *buf, size_t siz, unsigned int i); static void write_leaderboard(char *buf, size_t siz, u64snowflake userid); static void leaderboard(char *buf, size_t siz, char *txt, u64snowflake userid); @@ -120,7 +120,7 @@ create_slash_leaderboard(struct discord *client) void write_invalid(char *buf, size_t siz) { - unsigned long i; + unsigned int i; strlcpy(buf, "NO WRONG, this is not a valid category.\n", siz); strlcat(buf, "Valid categories are:\n", siz); @@ -151,7 +151,7 @@ compare(const void *p1, const void *p2) } void -write_player(char *buf, size_t siz, int i) +write_player(char *buf, size_t siz, unsigned int i) { size_t ssiz = 32; char *plt, stat[ssiz]; @@ -174,7 +174,7 @@ void write_leaderboard(char *buf, size_t siz, u64snowflake userid) { int in_lb = 0; - unsigned long i, lb_max = MIN(nplayers, LB_MAX); + unsigned int i, lb_max = MIN(nplayers, LB_MAX); size_t psiz = 256, rsiz; char player[psiz]; /* siz = (lb_max + 2) * 64; */ @@ -209,7 +209,7 @@ leaderboard, this is probably because LB_MAX is too big\n"); void leaderboard(char *buf, size_t siz, char *categ, u64snowflake userid) { - unsigned long i = 2; /* ignore name and kingdom */ + unsigned int i = 2; /* ignore name and kingdom */ while (i < LENGTH(fields) - 1 && strcasecmp(fields[i], categ) != 0) diff --git a/src/cmd_uraid.c b/src/cmd_uraid.c index c4473f3..33a38ed 100644 --- a/src/cmd_uraid.c +++ b/src/cmd_uraid.c @@ -69,7 +69,7 @@ parse_file(char *fname, char *username) unsigned long * load_files(char *username) { - int i; + unsigned int i; unsigned long *dmgs = calloc(7, sizeof(unsigned long)); long day = time(NULL) / 86400; char fname[128]; @@ -88,9 +88,10 @@ load_files(char *username) void write_uraid(char *buf, int siz, char *username, unsigned long *dmgs) { - int i, n = 1; char *p; unsigned long total = 0; + unsigned int n = 1; + int i; siz -= snprintf(buf, siz, "%s raids stats for last 7 days\n", username); p = strchr(buf, '\0'); @@ -102,7 +103,6 @@ write_uraid(char *buf, int siz, char *username, unsigned long *dmgs) p = strchr(buf, '\0'); } snprintf(p, siz, "\ntotal: %'lu damage\n", total); - } void @@ -111,7 +111,7 @@ uraid(char *buf, size_t siz, char *username) unsigned long *dmgs; dmgs = load_files(username); - write_uraid(buf, siz, username, dmgs); + write_uraid(buf, (int)siz, username, dmgs); free(dmgs); } @@ -1,8 +1,11 @@ #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <sys/stat.h> #include "nolan.h" +static Player load_player(unsigned int line); + void create_folders(void) { @@ -20,12 +23,11 @@ create_folders(void) } } - void create_stats_file(void) { FILE *fp; - unsigned long i; + unsigned int i; long size = 0; fp = fopen(STATS_FILE, "r"); @@ -54,12 +56,54 @@ create_slash_commands(struct discord *client) create_slash_uraid(client); } +Player +load_player(unsigned int line) +{ + FILE *fp; + Player player; + char buf[LINE_SIZE], *p = NULL, *end; + unsigned int i = 0; + + if (line <= 1) + die("nolan: Tried to load the description line as a player\n"); + if ((fp = fopen(STATS_FILE, "r")) == NULL) + die("nolan: Failed to open %s (read)\n", STATS_FILE); + + while (i++ < line && (p = fgets(buf, LINE_SIZE, fp)) != NULL); + fclose(fp); + if (p == NULL) + die("nolan: Line %d is not present in %s\n", line, STATS_FILE); + + player.name = malloc(DISCORD_MAX_USERNAME_LEN); + player.kingdom = malloc(32 + 1); + i = 0; + end = p; + + /* -1 because the last field in the file finish with a '\n' */ + while (i < LENGTH(fields) - 1 && *++end != '\0') { + if (*end != DELIM) + continue; + *end = '\0'; + if (i <= 1) /* name and kingdom */ + strlcpy(((char **)&player)[i], p, 32 + 1); + else + ((long *)&player)[i] = atol(p); + p = end + 1; + i++; + } + if (i != LENGTH(fields) - 1) + die("nolan: Player on line %d is missing a field\n", line); + player.userid = strtoul(p, NULL, 10); + + return player; +} + void init_players(void) { FILE *fp; char buf[LINE_SIZE]; - unsigned long i; + unsigned int i; if ((fp = fopen(STATS_FILE, "r")) == NULL) die("nolan: Failed to open %s (read)\n", STATS_FILE); @@ -73,7 +117,7 @@ init_players(void) MAX_PLAYERS); for (i = 0; i < nplayers; i++) - players[i] = create_player(i + 2); + players[i] = load_player(i + 2); } void @@ -126,11 +170,10 @@ on_ready(struct discord *client, const struct discord_ready *event) discord_update_presence(client, &status); } - void on_message(struct discord *client, const struct discord_message *event) { - unsigned long i; + unsigned int i; if (event->author->bot) return; diff --git a/src/nolan.h b/src/nolan.h index 9b45e34..9a1d2f5 100644 --- a/src/nolan.h +++ b/src/nolan.h @@ -70,7 +70,6 @@ char *ocr(char *fname); /* stats.c */ char *playtime_to_str(long playtime); -Player create_player(unsigned int line); void on_stats(struct discord *client, const struct discord_message *event); /* raids.c */ diff --git a/src/raids.c b/src/raids.c index 34cdd13..c3d15c2 100644 --- a/src/raids.c +++ b/src/raids.c @@ -9,14 +9,14 @@ static void emsg(struct discord *client, const struct discord_message *event); static char *skip_to_slayers(char *txt); static char *trim_name(char *name); static char *trim_dmg(char *str); -static int get_slayers(Slayer slayers[], char *txt); -static int parse(Slayer slayers[], char *txt); +static size_t get_slayers(Slayer slayers[], char *txt); +static size_t parse(Slayer slayers[], char *txt); static unsigned long adjust(unsigned long dmg, char *raid); -static void save_to_new_file(Slayer slayers[], int nslayers, char *fname, +static void save_to_new_file(Slayer slayers[], size_t nslayers, char *fname, char *raid); static void overcap_msg(char *name, unsigned long dmg, struct discord *client, const struct discord_message *event); -static void save_to_file(Slayer slayers[], int nslayers, char *raid, +static void save_to_file(Slayer slayers[], size_t nslayers, char *raid, struct discord *client, const struct discord_message *event); @@ -37,7 +37,8 @@ void emsg(struct discord *client, const struct discord_message *event) { char buf[128]; - snprintf(buf, 128, "Error: Failed to read image <@%lu>.\nFix me <@%lu>", + snprintf(buf, sizeof(buf), + "Error: Failed to read image <@%lu>.\nFix me <@%lu>", event->author->id, ADMIN); struct discord_create_message msg = { .content = buf @@ -49,13 +50,14 @@ char * skip_to_slayers(char *txt) { char *line = txt, *endline; - int i, found = 0; + unsigned int i; + int found = 0; while (line && !found) { endline = strchr(line, '\n'); if (endline) *endline = '\0'; - for (i = 0; i < (int)LENGTH(delims); i++) { + for (i = 0; i < LENGTH(delims); i++) { if (strcmp(line, delims[i]) == 0) { found = 1; break; @@ -118,11 +120,13 @@ trim_dmg(char *dmg) return dmg; } -int +size_t get_slayers(Slayer slayers[], char *txt) { char *line = txt, *endline; - int n = 0, i, found = 0; + size_t nslayers = 0; + unsigned int i; + int found = 0; if (txt == NULL) return 0; @@ -133,7 +137,7 @@ get_slayers(Slayer slayers[], char *txt) break; *endline = '\0'; if (!found) { /* skip Slayer */ - for (i = 0; i < (int)LENGTH(garbageslayer); i++) { + for (i = 0; i < LENGTH(garbageslayer); i++) { if (strcmp(line, garbageslayer[i]) == 0) { found = 1; break; @@ -145,22 +149,23 @@ get_slayers(Slayer slayers[], char *txt) } } - slayers[n].name = strdup(trim_name(line)); + slayers[nslayers].name = strdup(trim_name(line)); line = endline + 1; endline = strchr(line, '\n'); if (endline == 0) break; *endline = '\0'; - slayers[n].damage = strtoul(trim_dmg(line), NULL, 10); + slayers[nslayers].damage = strtoul(trim_dmg(line), NULL, 10); line = endline + 1; - slayers[n].found_in_file = 0; - n++; + slayers[nslayers].found_in_file = 0; + nslayers++; } - return n; + + return nslayers; } -int +size_t parse(Slayer slayers[], char *txt) { return get_slayers(slayers, skip_to_slayers(txt)); @@ -181,10 +186,10 @@ adjust(unsigned long dmg, char *raid) } void -save_to_new_file(Slayer slayers[], int nslayers, char *fname, char *raid) +save_to_new_file(Slayer slayers[], size_t nslayers, char *fname, char *raid) { FILE *fp; - int i; + unsigned int i; if ((fp = fopen(fname, "w")) == NULL) die("nolan: Failed to open %s\n", fname); for (i = 0; i < nslayers; i++) { @@ -214,12 +219,12 @@ damage he is now at %'lu damage.", name, dmg - DAMAGE_CAP, dmg); } void -save_to_file(Slayer slayers[], int nslayers, char *raid, +save_to_file(Slayer slayers[], size_t nslayers, char *raid, struct discord *client, const struct discord_message *event) { FILE *w, *r; char line[LINE_SIZE], *endname, fname[128], tmpfname[128]; - int i; + unsigned int i; unsigned long olddmg, newdmg; long day = time(NULL) / 86400; @@ -275,7 +280,7 @@ void on_raids(struct discord *client, const struct discord_message *event) { char *txt, fname[64]; - int nslayers; + size_t nslayers; Slayer slayers[MAX_SLAYERS]; struct discord_channel chan; struct discord_ret_channel rchan = { diff --git a/src/stats.c b/src/stats.c index 560d03f..86c9414 100644 --- a/src/stats.c +++ b/src/stats.c @@ -12,52 +12,10 @@ static void for_line(Player *player, char *txt); static void save_player_to_file(Player *player); static char *update_msg(Player *player, int iplayer); -Player -create_player(unsigned int line) -{ - FILE *fp; - Player player; - char buf[LINE_SIZE], *p = NULL, *end; - unsigned int i = 0; - - if (line <= 1) - die("nolan: Tried to load the description line as a player\n"); - if ((fp = fopen(STATS_FILE, "r")) == NULL) - die("nolan: Failed to open %s (read)\n", STATS_FILE); - - while (i++ < line && (p = fgets(buf, LINE_SIZE, fp)) != NULL); - fclose(fp); - if (p == NULL) - die("nolan: Line %d is not present in %s\n", line, STATS_FILE); - - player.name = malloc(DISCORD_MAX_USERNAME_LEN); - player.kingdom = malloc(32 + 1); - i = 0; - end = p; - - /* -1 because the last field in the file finish with a '\n' */ - while (i < LENGTH(fields) - 1 && *++end != '\0') { - if (*end != DELIM) - continue; - *end = '\0'; - if (i <= 1) /* name and kingdom */ - strlcpy(((char **)&player)[i], p, 32 + 1); - else - ((long *)&player)[i] = atol(p); - p = end + 1; - i++; - } - if (i != LENGTH(fields) - 1) - die("nolan: Player on line %d is missing a field\n", line); - player.userid = strtoul(p, NULL, 10); - - return player; -} - int update_players(Player *player) { - unsigned long i = 0, j; + unsigned int i = 0, j; /* while (i < nplayers && players[i].userid != player->userid) */ while (i < nplayers && strcmp(players[i].name, player->name) != 0) @@ -67,18 +25,21 @@ update_players(Player *player) if (nplayers > MAX_PLAYERS) die("nolan: There is too much players (max:%d)\n", MAX_PLAYERS); - players[nplayers] = create_player(nplayers + 2); - nplayers++; - return 0; - } - - /* if (player->name) */ - /* strlcpy(players[i].name, player->name, DISCORD_MAX_USERNAME_LEN); */ - if (player->kingdom) - strlcpy(players[i].kingdom, player->kingdom, 32 + 1); - for (j = 2; j < LENGTH(fields); j++) { - if (((long *)player)[j] != 0) + players[i].name = strndup(player->name, DISCORD_MAX_USERNAME_LEN); + players[i].kingdom = strndup(player->kingdom, 32 + 1); + for (j = 2; j < LENGTH(fields); j++) ((long *)&players[i])[j] = ((long *)player)[j]; + nplayers++; + } else { + /* if (player->name) */ + /* strlcpy(players[i].name, player->name, */ + /* DISCORD_MAX_USERNAME_LEN); */ + if (player->kingdom) + strlcpy(players[i].kingdom, player->kingdom, 32 + 1); + for (j = 2; j < LENGTH(fields); j++) { + if (((long *)player)[j] != 0) + ((long *)&players[i])[j] = ((long *)player)[j]; + } } return i; @@ -261,7 +222,7 @@ save_player_to_file(Player *player) { FILE *w, *r; char line[LINE_SIZE], *endname, tmpfname[128]; - unsigned long i; + unsigned int i; int found = 0; strlcpy(tmpfname, SAVE_FOLDER, sizeof(tmpfname)); @@ -307,7 +268,7 @@ update_msg(Player *player, int iplayer) { int sz = DISCORD_MAX_MESSAGE_LEN; char *buf = malloc(sz), *p, *plto, *pltn, *pltd; - unsigned long i; + unsigned int i; long old, new, diff; sz -= snprintf(buf, sz, "%s's profile has been updated.\n\n", @@ -356,7 +317,7 @@ update_msg(Player *player, int iplayer) void on_stats(struct discord *client, const struct discord_message *event) { - int i; + unsigned int i; int ham = strlen(event->content) > 0 && event->author->id == HAM; char *txt, fname[128]; Player player; @@ -408,7 +369,7 @@ on_stats(struct discord *client, const struct discord_message *event) } } - if ((i = update_players(&player))) { + if ((i = update_players(&player)) < nplayers) { /* FIXME */ txt = update_msg(&player, i); } else { txt = malloc(128); |