/* -*- LPC -*- */
/*
* $Locker: $
* $Id: finger.c,v 1.14 2003/07/16 18:21:53 pinkfish Exp $
* $Log: finger.c,v $
* Revision 1.14 2003/07/16 18:21:53 pinkfish
* Make $NEW_LINE$ force a new line in a desc.
*
* Revision 1.13 2003/07/13 09:50:24 pinkfish
* Fix up the email querying for the options command.
*
* Revision 1.12 2003/04/03 19:12:49 ceres
* Fixed to handle ramdisk
*
* Revision 1.11 2003/03/19 21:35:09 ceres
* Allowed /secure/nlogin to alter the password
*
* Revision 1.10 2003/03/01 21:18:33 pinkfish
* Put in only one space.
*
* Revision 1.9 2003/02/21 02:10:24 pinkfish
* Add in stuff to allow zone based descriptions.
*
* Revision 1.8 2001/12/28 02:35:13 presto
* When clearing the description, remove the mapping entry. Also, if
* player_info["desc"] is undefined, return "" for the description
*
* Revision 1.7 2001/12/17 02:13:32 presto
* Add a RESET to the end of the description in query_desc()
*
* Revision 1.6 2001/03/12 01:36:40 ceres
* Protected email addresses.
* &&
*
* Revision 1.5 2000/06/26 23:14:44 ceres
* Made password require 6 char passwords
*
* Revision 1.4 1999/08/30 01:15:31 pinkfish
* Modify a few things and make the birthday use the UNKNOWN_BIRTHDAY
* define.
*
* Revision 1.3 1999/08/30 00:58:39 ceres
* Forcibly unlocked by pinkfish
*
* Revision 1.2 1998/04/13 12:17:00 pinkfish
* Adding documentaion and making the code a bit neater.
*
* Revision 1.1 1998/01/06 04:54:05 ceres
* Initial revision
*
*/
/**
* This file contains all of the information related to a player,
* their password, real name, birthday, location etc.
* @author Pinkfish
*/
#include <player.h>
#include <mail.h>
#include <clothing.h>
private mapping player_info;
private string password;
private nosave string tmppassword;
string query_name();
private int change_password();
private int change_password2(mixed pass);
private int change_password3(string pass);
private int change_password4(string pass);
int add_command(string command, object ob, mixed format, function func);
/**
* The commands related to the fingering of a player.
* Just the change password command at the moment.
*/
void finger_commands() {
add_command("password", this_object(), "", (: change_password() :));
add_command("passwd", this_object(), "", (: change_password() :));
} /* finger_commands() */
/**
* This method sets the description of the player. The
* description is the little bit of text seen in the long.
* @param str the new description of the player
* @see query_desc()
*/
void set_desc(string str) {
if (!player_info) {
player_info = ([ ]);
}
if (!str) {
map_delete(player_info, "desc");
} else {
player_info["desc"] = str;
}
}
/**
* This method returns the current description of the player.
* @see set_desc()
* @return the current description
*/
string query_desc() {
if (!player_info || undefinedp(player_info["desc"])) {
return "";
}
return player_info["desc"] + "%^RESET%^";
} /* query_desc() */
/**
* This method sets the description for the specific area of the body.
* @param zone the zone to set the description for
* @param desc the description for that zone
*/
void set_zone_desc(string zone, string desc) {
if (!player_info["zone desc"]) {
player_info["zone desc"] = ([ ]);
}
if (!desc) {
map_delete(player_info["zone desc"], zone);
} else {
player_info["zone desc"][zone] = desc;
}
}
/**
* This method returns the zone description for the specified zone.
* @param zone the zone to get the description for
* @return the zone description
*/
string query_zone_desc(string zone) {
if (!player_info["zone desc"]) {
return 0;
}
return player_info["zone desc"][zone];
}
/**
* This method returns all the zones there are currently descriptions for.
* @return the zones there are descriptions for
*/
string* query_zone_desc_names() {
if (!player_info["zone desc"]) {
return ({ });
}
return keys(player_info["zone desc"]);
}
/**
* This method returns the main zone description to use in the
* long of the player.
* @return the main zone description
*/
string query_main_zone_desc(object* wearing) {
object bing;
string zone;
string type;
string eq_type;
string str;
mixed types;
mapping covered;
if (!sizeof(player_info["zone desc"])) {
return "";
}
covered = ([ ]);
foreach (bing in wearing) {
types = bing->query_type();
if (!arrayp(types)) {
types = ({ types });
}
foreach (type in types) {
eq_type = CLOTHING_HANDLER->query_equivilant_type(type);
if (eq_type) {
foreach (zone in CLOTHING_HANDLER->query_zone_names(eq_type)) {
covered[zone] = 1;
}
} else {
foreach (zone in CLOTHING_HANDLER->query_zone_names(type)) {
covered[zone] = 1;
}
}
}
}
str = "";
foreach (zone in query_zone_desc_names()) {
if (!covered[zone]) {
str += " " + replace_string(query_zone_desc(zone), "$NEW_LINE$", "\n");
}
}
return str;
}
/**
* This method changes the password of the player. It can only
* be called by the login object at startup.
* @param pass the new password
*/
void set_password(string pass) {
if (file_name(previous_object())[0..12] == "/secure/login" ||
file_name(previous_object())[0..13] == "/secure/nlogin") {
password = pass;
}
} /* set_password() */
/**
* This method is called when the password is attempted to be changed.
* @return 1 if successful, 0 on failure
*/
private int change_password() {
if (password) {
write("Please enter your old password : ");
input_to((: change_password2 :),1);
return 1;
}
change_password2(0);
return 1;
} /* change_password() */
private int change_password2(mixed pass) {
string str;
if (password) {
str = crypt(pass,password);
if (str != password) {
write("\nIncorrect.\n");
return 1;
}
}
write("\nEnter new Password : ");
input_to((: change_password3 :),1);
return 1;
} /* change_password2() */
private int change_password3(string pass) {
tmppassword = pass;
if(sizeof(pass) < 6) {
write("\nPassword is too short, must be at least 6 characters.\n");
write("Enter new Password :");
input_to((: change_password3 :),1);
return 1;
}
write("\nPlease enter again : ");
input_to((: change_password4 :),1);
return 1;
} /* change_password3() */
private int change_password4(string pass) {
if (tmppassword != pass) {
write("\nIncorrect.\n");
return 1;
}
password = crypt(pass,password);
write("\nOk.\n");
return 1;
} /* change_password4() */
/**
* Find out which IP addresses this user wants to be able to login from.
*/
string *query_rhosts() {
if(!player_info)
return 0;
return player_info["allowed_ips"];
}
void set_rhosts(string *ips) {
if(file_name(previous_object())[0..18] != "/cmds/player/access" &&
file_name(previous_object())[0..19] != "/cmds/lord/authorise")
return ;
if(!player_info)
player_info = ([ ]);
player_info["allowed_ips"] = ips;
}
/**
* This will return the real name of the player.
* @return the real name of the player
* @see set_real_name()
*/
string query_real_name() {
if (!player_info) {
return 0;
}
return player_info["real_name"];
} /* query_real_name() */
/**
* This will set the real name of the player.
* @see query_name()
* @param str the new real name of the player
*/
void set_real_name(string str) {
if (!player_info) {
player_info = ([ ]);
}
player_info["real_name"] = str;
} /* set_real_name() */
/**
* This methoid returns the location of the player. The location
* is the location in their funger infor, so like "Perth, oz, whatever".
* @return their currently set location
* @see set_where()
*/
string query_where() {
if (!player_info) {
return "";
}
return player_info["location"];
} /* query_where() */
/**
* This method sets the currnet location of the player.
* @see query_location()
* @param str the new location
*/
void set_where(string str) {
if (!player_info) {
player_info = ([ ]);
}
player_info["location"] = str;
} /* set_where() */
/**
* This method returns the players birthday. The birthday will be
* of the form "4th of july".
* @return the current birthday
* @see set_birthday()
* @see query_is_birthday_today()
*/
string query_birthday() {
if (!player_info) {
return UNKNOWN_BIRTHDAY;
}
if (!player_info["birthday"]) {
return UNKNOWN_BIRTHDAY;
}
return player_info["birthday"];
} /* query_birthday() */
/**
* This method sets the players current birthday. The birthday
* needs to be of the form: "4th of July".
* @param i the new birthday to set
* @see query_birthday()
* @see query_is_birthday_today()
*/
void set_birthday(string i) {
if (!player_info) {
player_info = ([]);
}
player_info["birthday"] = i;
} /* set_birthday() */
/**
* This method checks to see if it is currently the players birthday.
* @return 1 if it is their birthday, 0 if not
* @see set_birthday()
* @see query_birthday()
*/
int query_is_birthday_today() {
string cmonth;
string dummy;
string bmonth;
int cdate;
int bdate;
if (sscanf(ctime(time()), "%s %s %d %s", dummy, cmonth, cdate, dummy)!=4) {
return 0; /* error in date */
}
if (sscanf(query_birthday(), "%d%s of %s", bdate, dummy, bmonth) !=3) {
return 0; /* no bday set */
}
if (cmonth == bmonth[0..2] && cdate == bdate) {
return 1;
}
} /* query_is_birthday_today() */
/**
* This method returns the current email address of the player.
* @see set_email()
* @return the current email address
*/
string query_email() {
if(file_name(previous_object())[0..13] != "/secure/finger" &&
file_name(previous_object())[0..27] != "/obj/handlers/player_handler" &&
file_name(previous_object())[0..28] != "/obj/handlers/options_handler") {
return "";
}
if (!player_info) {
return "";
}
return player_info["email"];
}
/**
* This method sets the current email address of the player.
* @see query_email()
* @param str the new email address
*/
nomask void set_email(string str) {
if (!player_info) {
player_info = ([]);
}
player_info["email"] = str;
} /* set_email() */
/**
* This method queries the current homepage for the player.
* @see set_homepage()
* @return their homepage url
*/
string query_homepage() {
if (!player_info) {
player_info = ([ ]);
}
return player_info["homepage"];
} /* query_homepage() */
/**
* This method sets the players homepage.
* @see query_homepage()
* @param their homepage url
*/
nomask void set_homepage(string str) {
if (!player_info) {
player_info = ([]);
}
player_info["homepage"] = str;
} /* set_homepage() */
/**
* This method returns whether the player has set their finger info.
* @return 1 if they have their finger information set, 0 if not
*/
int finger_set() {
if (!player_info ||
player_info == ([ ]) ||
sizeof(keys(player_info)) == 1) {
return 0;
}
return 1;
} /* finger_set() */