/* $Header: /cvsroot/phantasmal/mudlib/usr/System/obj/user.c,v 1.81 2004/10/03 20:43:58 angelbob Exp $ */
#include <kernel/kernel.h>
#include <kernel/user.h>
#include <kernel/rsrc.h>
#include <phantasmal/log.h>
#include <phantasmal/phrase.h>
#include <phantasmal/channel.h>
#include <phantasmal/map.h>
#include <phantasmal/search_locations.h>
#include <phantasmal/lpc_names.h>
#include <type.h>
inherit COMMON_AUTO;
inherit PHANTASMAL_USER;
/* Duplicated in PHANTASMAL_USER */
#define STATE_NORMAL 0
#define STATE_LOGIN 1
#define STATE_OLDPASSWD 2
#define STATE_NEWPASSWD1 3
#define STATE_NEWPASSWD2 4
static mapping commands_map;
/***********************************************************************/
/* THIS USER OBJECT SHOULD *ONLY* EVER BE USED BY TELNETD WHEN *NO* */
/* REGULAR USER OBJECT CAN BE FOUND. IT IS NOT MEANT FOR NORMAL USE, */
/* NOR SHOULD IT EVER HAVE A BODY OR REASONABLE CAPABILITIES. FOR THE */
/* REAL USER OBJECT, SEE /usr/game/obj/user.c OR THE EQUIVALENT IN */
/* YOUR GAME OF CHOICE. */
/***********************************************************************/
/* Prototypes */
void upgraded(varargs int clone);
/* Macros */
#define NEW_PHRASE(x) PHRASED->new_simple_english_phrase(x)
/*
* NAME: create()
* DESCRIPTION: initialize user object
*/
static void create(int clone)
{
::create(clone);
if(!find_object(SYSTEM_WIZTOOL))
compile_object(SYSTEM_WIZTOOL);
if(!find_object(US_SCROLL_TEXT))
compile_object(US_SCROLL_TEXT);
}
void upgraded(varargs int clone) {
if(SYSTEM()) {
::upgraded(clone);
commands_map = ([
"ooc" : "cmd_ooc",
"help" : "cmd_help",
"whoami" : "cmd_whoami",
]);
}
}
/****************/
/* This is a cheat -- the existing userlib is in /usr/System/, but the
Kernel Lib checks to see if an object's creator is System to allow
cloning with a creator other than yourself. That means that a User
object in /usr/game/, even if it inherits PHANTASMAL_USER, can't do
it. This is a cheat to let that happen correctly. */
object clone_wiztool_as(string name) {
string wiztool_name;
if(previous_program() != PHANTASMAL_USER)
error("This function is only usable by PHANTASMAL_USER, not by you!");
return clone_object(SYSTEM_WIZTOOL, name);
}
/****************/
/*
* Returns true if the name isn't allowed
*/
int name_is_forbidden(string name) {
string filename;
if(previous_program() != PHANTASMAL_USER)
return 1;
/* No trailing spaces or slashes in names allowed */
if (!name || strlen(name) == 0 || sscanf(name, "%*s ") != 0 ||
sscanf(name, "%*s/") != 0) {
return 1;
}
filename = username_to_filename(name);
filename = STRINGD->to_lower(filename);
/* These are all bad ideas for security reasons */
if(filename == "" || filename == nil)
return 1;
if(filename == "game")
return 1;
if(sscanf(filename, "common%*s"))
return 1;
if(sscanf(filename, "system%*s"))
return 1;
}
/*
* NAME: player_login()
* DESCRIPTION: Create the player body, set the account info and so on...
*/
void player_login(int first_time)
{
int start_room_num, start_zone;
object start_room;
if(previous_program() != PHANTASMAL_USER)
return;
/* Set the start room to the void */
start_room_num = 0;
start_room = MAPD->get_room_by_num(start_room_num);
start_zone = 0;
if(start_room == nil) {
/* Panic! No void! */
error("Internal Error: no Void!");
}
/* Show room to player */
message("\r\n");
show_room_to_player(location);
}
/*
* NAME: player_logout()
* DESCRIPTION: Deal with player body, update account info and so on...
*/
private void player_logout(void)
{
if(previous_program() != PHANTASMAL_USER)
return;
CHANNELD->unsubscribe_user_from_all(this_object());
}
int process_command(string str)
{
string cmd;
int ctr, size;
int force_command;
mixed* command;
cmd = str;
if (strlen(str) != 0 && str[0] == '!') {
cmd = cmd[1 ..];
force_command = 1;
}
/* Do this unless we're in the editor and didn't start the command
with an exclamation mark */
if (!wiztool || !query_editor(wiztool) || force_command) {
/* check standard commands */
cmd = STRINGD->trim_whitespace(cmd);
if(cmd == "") {
str = nil;
}
if(sscanf(cmd, "%s %s", cmd, str) != 2) {
str = "";
}
if(cmd && strlen(cmd)) {
switch (cmd) {
case "password":
if (password) {
send_system_phrase("Old password: ");
set_state(previous_object(), STATE_OLDPASSWD);
} else {
send_system_phrase("New password: ");
set_state(previous_object(), STATE_NEWPASSWD1);
}
return MODE_NOECHO;
case "quit":
return MODE_DISCONNECT;
}
}
if(commands_map[cmd]) {
call_other(this_object(), /* Call on self */
commands_map[cmd], /* The function */
this_object(), /* This user */
cmd, /* The command */
str == "" ? nil : str); /* str or nil */
str = nil;
}
}
if (str) {
if (wiztool) {
wiztool->command(cmd, str);
} else {
send_system_phrase("No match");
message(": " + cmd + " " + str + "\r\n");
}
}
/* All is well, just print a prompt and wait for next command */
message("No /usr/game/obj/user exists! Use ooc cmd to complain.\r\n");
return -1;
}
/************** User-level commands *************************/
static void cmd_ooc(object user, string cmd, string str) {
if (!str || str == "") {
send_system_phrase("Usage: ");
message(cmd + " <text>\r\n");
return;
}
system_phrase_all_users("(OOC)");
message_all_users(" " + Name + " ");
system_phrase_all_users("chats");
message_all_users(": " + str + "\r\n");
send_system_phrase("(OOC)");
message(" ");
send_system_phrase("You chat");
message(": " + str + "\r\n");
}
static void cmd_whoami(object user, string cmd, string str) {
message("You are '" + name + "'.\r\n");
}