nakedmudv3.3/
nakedmudv3.3/lib/
nakedmudv3.3/lib/logs/
nakedmudv3.3/lib/misc/
nakedmudv3.3/lib/players/
nakedmudv3.3/lib/txt/
nakedmudv3.3/lib/world/
nakedmudv3.3/lib/world/examples/
nakedmudv3.3/lib/world/examples/mproto/
nakedmudv3.3/lib/world/examples/oproto/
nakedmudv3.3/lib/world/examples/reset/
nakedmudv3.3/lib/world/examples/rproto/
nakedmudv3.3/lib/world/examples/trigger/
nakedmudv3.3/lib/world/limbo/
nakedmudv3.3/lib/world/limbo/room/
nakedmudv3.3/lib/world/limbo/rproto/
nakedmudv3.3/src/alias/
nakedmudv3.3/src/char_vars/
nakedmudv3.3/src/editor/
nakedmudv3.3/src/example_module/
nakedmudv3.3/src/help/
nakedmudv3.3/src/set_val/
nakedmudv3.3/src/socials/
nakedmudv3.3/src/time/
//*****************************************************************************
//
// 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);
    }
  }
}