/* login.c */

#include <sys.h>
#include <secure.h>

static init() {
  check_secure(SECURE_BOOTOBJ,NULL);
  set_interactive();
  if (!prototype(this_object())) return;
  add_xverb("","do_huh");
  add_verb("connect","do_connect");
  add_verb("create","do_create");
  add_verb("help","do_help");
  add_verb("quit","do_quit");
  add_verb("QUIT","do_quit");
}

static disconnect() {
  destruct(this_object());
}

connect() {
  if (connected(this_object()))
    alarm(0,"welcome");
}

listen(arg) {
  send_device(arg);
}

static welcome() {
  cat("/login_banner");
}

static do_huh(arg) {
  write(HUH_STRING);
  return 1;
}

static do_help(arg) {
  write("\nLogin Help:\n");
  write("-----------\n");
  write("create <name> <password>\n");
  write("connect <name> <password>\n");
  write("quit\n");
  write("\n");
  return 1;
}

static do_create(arg) {
  string name,password;
  int pos;
  object new_player;

  pos=instr(arg,1," ");
  name=leftstr(arg,pos-1);
  password=rightstr(arg,strlen(arg)-pos);
  if ((!name) || (!password)) return 0;
  if (!is_legal(name)) {
    write("Illegal name.\n");
    return 1;
  }
  if (find_player(name)) {
    write("That player already exists.\n");
    return 1;
  }
  if (find_wiz(name)) {
    write("That player already exists.\n");
    return 1;
  }
  new_player=clone_object("/obj/player");
  call_other(new_player,"set_secure");
  call_other(new_player,"set_name",name);
  call_other(new_player,"set_password",password);
  move_object(new_player,atoo("/obj/room"));
  if (reconnect_device(new_player))
    send_device("Reconnect to "+otoa(new_player)+" failed.\n");
  else
    call_other(new_player,"connect");
  self_destruct();
  return 1;
}

static self_destruct() {
  alarm(1,"do_self_destruct");
}

static do_self_destruct() {
  destruct(this_object());
}

static do_connect(arg) {
  string name,password;
  int pos;
  object player;

  pos=instr(arg,1," ");
  name=leftstr(arg,pos-1);
  password=rightstr(arg,strlen(arg)-pos);
  if (!name) return 0;
  if (!(player=find_player(name))) {
    if (player=find_wiz(name))
      return do_wiz(arg);
    write("That player does not exist.\n");
    return 1;
  }
  if (!call_other(player,"check_password",password)) {
    write("Wrong password.\n");
    return 1;
  }
  if (connected(player)) call_other(player,"force_disconnect");
  if (reconnect_device(player))
    send_device("Reconnect to "+otoa(player)+" failed.\n");
  else
    call_other(player,"connect");
  self_destruct();
  return 1;
}

static do_wiz(arg) {
  string name,password;
  int pos;
  object wizard;

  pos=instr(arg,1," ");
  name=leftstr(arg,pos-1);
  password=rightstr(arg,strlen(arg)-pos);
  if (!name) return 0;
  if (!(wizard=find_wiz(name))) {
    write("That wizard does not exist.\n");
    return 1;
  }
  if (!call_other(wizard,"check_password",password)) {
    write("Wrong password.\n");
    return 1;
  }
  if (connected(wizard)) call_other(wizard,"force_disconnect");
  if (reconnect_device(wizard))
    send_device("Reconnect to "+otoa(wizard)+" failed.\n");
  else
    call_other(wizard,"connect");
  self_destruct();
  return 1;
}

static do_quit(arg) {
  disconnect_device();
  destruct(this_object());
  return 1;
}