Accounts update 2

This commit is contained in:
kinther 2025-12-26 10:54:47 -08:00
parent 76513050cb
commit a60cf8066a
7 changed files with 203 additions and 12 deletions

View file

@ -1,3 +1,10 @@
/**
* @file accounts.h
* Account loading/saving and utility routines.
*
* This set of code was not originally part of the circlemud distribution.
*/
#include "conf.h"
#include "sysdep.h"
@ -21,6 +28,41 @@ static void set_account_name(struct account_data *account, const char *name)
account->name = strdup(tmp);
}
int account_has_pc(const struct account_data *account, const char *pc_name)
{
int i;
if (!account || !pc_name || !*pc_name)
return 0;
for (i = 0; i < account->pc_count; i++) {
if (!str_cmp(account->pc_list[i], pc_name))
return 1;
}
return 0;
}
void account_add_pc(struct account_data *account, const char *pc_name)
{
char tmp[MAX_INPUT_LENGTH];
int i;
if (!account || !pc_name || !*pc_name)
return;
strlcpy(tmp, pc_name, sizeof(tmp));
CAP(tmp);
if (account_has_pc(account, tmp))
return;
i = account->pc_count;
RECREATE(account->pc_list, char *, account->pc_count + 1);
account->pc_list[i] = strdup(tmp);
account->pc_count++;
}
struct account_data *account_create(const char *name)
{
struct account_data *account;
@ -37,6 +79,7 @@ struct account_data *account_load(const char *name)
char filename[PATH_MAX];
char line[MAX_INPUT_LENGTH + 1];
char tag[6];
int i;
if (!name || !*name)
return NULL;
@ -61,7 +104,9 @@ struct account_data *account_load(const char *name)
if (account->email)
free(account->email);
account->email = strdup(line);
} else if (!strcmp(tag, "Char")) {
} else if (!strcmp(tag, "Char"))
account_add_pc(account, line);
else if (!strcmp(tag, "Curr")) {
if (account->pc_name)
free(account->pc_name);
account->pc_name = strdup(line);
@ -73,6 +118,19 @@ struct account_data *account_load(const char *name)
if (!account->name)
set_account_name(account, name);
if (account->pc_name && account->pc_count == 0)
account_add_pc(account, account->pc_name);
if (!account->pc_name && account->pc_count > 0) {
for (i = account->pc_count - 1; i >= 0; i--) {
int pfilepos = get_ptable_by_name(account->pc_list[i]);
if (pfilepos >= 0 && !IS_SET(player_table[pfilepos].flags, PINDEX_DELETED)) {
account->pc_name = strdup(account->pc_list[i]);
break;
}
}
}
return account;
}
@ -80,6 +138,7 @@ int account_save(const struct account_data *account)
{
FILE *fl;
char filename[PATH_MAX];
int i;
if (!account || !account->name || !*account->name)
return 0;
@ -97,7 +156,9 @@ int account_save(const struct account_data *account)
if (account->email && *account->email)
fprintf(fl, "Mail: %s\n", account->email);
if (account->pc_name && *account->pc_name)
fprintf(fl, "Char: %s\n", account->pc_name);
fprintf(fl, "Curr: %s\n", account->pc_name);
for (i = 0; i < account->pc_count; i++)
fprintf(fl, "Char: %s\n", account->pc_list[i]);
fclose(fl);
return 1;
@ -105,6 +166,8 @@ int account_save(const struct account_data *account)
void account_free(struct account_data *account)
{
int i;
if (!account)
return;
@ -114,6 +177,11 @@ void account_free(struct account_data *account)
free(account->email);
if (account->pc_name)
free(account->pc_name);
if (account->pc_list) {
for (i = 0; i < account->pc_count; i++)
free(account->pc_list[i]);
free(account->pc_list);
}
free(account);
}
@ -149,6 +217,7 @@ void account_set_pc(struct account_data *account, const char *pc_name)
strlcpy(tmp, pc_name, sizeof(tmp));
CAP(tmp);
account->pc_name = strdup(tmp);
account_add_pc(account, tmp);
}
}
@ -164,12 +233,27 @@ void account_clear_pc(struct account_data *account)
void account_refresh_pc(struct account_data *account)
{
int i;
if (!account || !account->pc_name || !*account->pc_name)
return;
goto ensure_active;
if (account_has_alive_pc(account))
return;
account_clear_pc(account);
account_save(account);
ensure_active:
if (!account || account->pc_name || account->pc_count == 0)
return;
for (i = account->pc_count - 1; i >= 0; i--) {
int pfilepos = get_ptable_by_name(account->pc_list[i]);
if (pfilepos >= 0 && !IS_SET(player_table[pfilepos].flags, PINDEX_DELETED)) {
account->pc_name = strdup(account->pc_list[i]);
account_save(account);
break;
}
}
}