//*****************************************************************************
//
// accedit.c
//
// Accedit allows admins to edit player accounts online. Passwords and
// character lists can be edited.
//
//*****************************************************************************
#include "../mud.h"
#include "../utils.h"
#include "../account.h"
#include "../socket.h"
#include "../character.h"
#include "../save.h"
#include "olc.h"
//*****************************************************************************
// account editing
//*****************************************************************************
#define ACCEDIT_NEW_CHAR 1
#define ACCEDIT_DELETE_CHAR 2
#define ACCEDIT_PASSWORD 3
void accedit_menu(SOCKET_DATA *sock, ACCOUNT_DATA *acct) {
LIST_ITERATOR *ch_i = newListIterator(accountGetChars(acct));
char *ch = NULL;
send_to_socket(sock, "{g[{c%s{g]\r\n", accountGetName(acct));
send_to_socket(sock, "Character list:{c\r\n");
ITERATE_LIST(ch, ch_i) {
send_to_socket(sock, " %s\r\n", ch);
} deleteListIterator(ch_i);
send_to_socket(sock,
"\r\n"
"{cN{n) Add new character\r\n"
"{cD{n) Delete character from account\r\n"
"{cP{n) Change password\r\n");
}
int accedit_chooser(SOCKET_DATA *sock, ACCOUNT_DATA *acct, const char *option) {
switch(toupper(*option)) {
case 'N':
text_to_buffer(sock, "Enter character's name: ");
return ACCEDIT_NEW_CHAR;
case 'D':
text_to_buffer(sock, "Enter character's name: ");
return ACCEDIT_DELETE_CHAR;
case 'P':
text_to_buffer(sock, "Enter new password: ");
return ACCEDIT_PASSWORD;
default:
return MENU_CHOICE_INVALID;
}
}
bool accedit_parser(SOCKET_DATA *sock, ACCOUNT_DATA *acct, int choice,
const char *arg) {
switch(choice) {
case ACCEDIT_NEW_CHAR:
if(!*arg)
return TRUE;
else if(!player_exists(arg))
return FALSE;
else {
listPutWith(accountGetChars(acct), strdup(arg), strcasecmp);
return TRUE;
}
case ACCEDIT_DELETE_CHAR: {
char *name = listRemoveWith(accountGetChars(acct), arg, strcasecmp);
if(name != NULL) free(name);
return TRUE;
}
case ACCEDIT_PASSWORD:
// make sure the password meets our length requirements
if(strlen(arg) < 4 || strlen(arg) > 12)
return FALSE;
else {
accountSetPassword(acct, crypt(arg, accountGetName(acct)));
return TRUE;
}
default:
return FALSE;
}
}
COMMAND(cmd_accedit) {
if(!arg || !*arg)
send_to_char(ch, "You must supply an account name, first!\r\n");
else {
ACCOUNT_DATA *acct = get_account(arg);
if(acct == NULL)
send_to_char(ch, "Account '%s' does not exist!\r\n", arg);
else {
do_olc(charGetSocket(ch), accedit_menu, accedit_chooser, accedit_parser,
NULL, NULL, unreference_account, save_account, acct);
}
}
}