aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRatakor <ratakor@disroot.org>2023-06-03 14:09:27 +0200
committerRatakor <ratakor@disroot.org>2023-06-03 14:09:27 +0200
commit3374cfbcac033d1ae7910efd5d9835c65e9499c5 (patch)
tree98c753cb632cee136f2283c8ccb9af514ac33716
parent5d7d20319073ac5acd775712d4e5f5d0eae0bd36 (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.c2
-rw-r--r--src/cmd_info.c6
-rw-r--r--src/cmd_lbraid.c29
-rw-r--r--src/cmd_leaderboard.c10
-rw-r--r--src/cmd_uraid.c8
-rw-r--r--src/init.c55
-rw-r--r--src/nolan.h1
-rw-r--r--src/raids.c47
-rw-r--r--src/stats.c77
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);
}
diff --git a/src/init.c b/src/init.c
index c52c1f4..573145f 100644
--- a/src/init.c
+++ b/src/init.c
@@ -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);