/* player.c */

#include "copyright.h"
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>

#include "config.h"
#include "db.h"
#include "interface.h"
#include "externs.h"


extern char *ctime();

dbref connect_player(name, password)
    const char *name;
    const char *password;
{
  dbref player;
  time_t tt;
  char *s;
  ATTR *a;

  if ((player = lookup_player(name)) == NOTHING)
    return NOTHING;
  if ((a = atr_get(player, "XYXXY")) &&
      strcmp(uncompress(a->value), password) &&
      strcmp(crypt(password, "XX"), uncompress(a->value)))
    return NOTHING;

  tt = time((time_t *) 0);
  s = ctime(&tt);
  s[strlen(s) - 1] = 0;
  /* compare to last connect see if player gets salary */
  a = atr_get(player, "LAST");
  if (a && (strncmp(uncompress(a->value), s, 10) != 0))
    giveto(player, PAY_CHECK);
  (void) atr_add(player, "LAST", s, GOD, NOTHING);
  db[player].pageto = NOTHING;
  return player;
}

dbref create_player(name, password)
    const char *name;
    const char *password;
{
  dbref player;
  time_t tt;
  char *s;
  if (!ok_player_name(name) || !ok_password(password))
    return NOTHING;

  /* else he doesn't already exist, create him */
  tt = time((time_t *) 0);
  s = ctime(&tt);
  s[strlen(s) - 1] = 0;
  player = new_object();

  /* initialize everything */
  SET(db[player].name, name);
  db[player].location = PLAYER_START;
  db[player].exits = PLAYER_START;	/* home */
  db[player].owner = player;
  db[player].pageto = NOTHING;
  db[player].flags = TYPE_PLAYER;
  s_Pass(player, crypt(password, "XX"));
  giveto(player, START_BONUS);	/* starting bonus */
  (void) atr_add(player, "LAST", s, GOD, NOTHING);
#ifdef QUOTA
  (void) atr_add(player, "RQUOTA", START_QUOTA, GOD, NOTHING);
#endif /* QUOTA */
  /* link him to PLAYER_START */
  PUSH(player, db[PLAYER_START].contents);

  add_player(player);

  return player;
}

void do_password(player, old, newobj)
    dbref player;
    const char *old;
    const char *newobj;
{
  ATTR *a;
  const char *d;

#ifdef GUEST_RESTRICT
  if (Guest(player)) {
    notify(player, "Guests may not change their passwords.");
    return;
  }
#endif

  if((a = atr_get(player, "XYXXY")) &&
     *(d = uncompress(a->value)) &&
     strcmp(d, old) &&
     strcmp(crypt(old, "XX"), d)) {
    notify(player, "Sorry");
  } else if (!ok_password(newobj)) {
    notify(player, "Bad new password.");
  } else {
    s_Pass(player, crypt(newobj, "XX"));
    notify(player, "Password changed.");
  }
}