/* player.c */
#include "os.h"
#include "copyright.h"
#include "config.h"
#include "db.h"
#include "interface.h"
#include "externs.h"
extern char *ctime ();
dbref connect_player (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 ((char*)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 (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 ((char*)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 (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 ((char*)old, "XX"), d)) {
notify (player, "Sorry");
} else if (!ok_password (newobj)) {
notify (player, "Bad new password.");
} else {
s_Pass (player, crypt ((char*)newobj, "XX"));
notify (player, "Password changed.");
}
}