/* -*- LPC -*- */
/*
* $Locker: $
* $Id: wiz_file_comm.c,v 1.34 2002/06/27 15:55:01 drakkos Exp $
*/
/**
* This file contains all the file related commands and information
* for the creators.
* @author Pinkfish
*/
#include <creator.h>
#include <login_handler.h>
#include <ls.h>
#include <playtesters.h>
#include <player_handler.h>
#include <cmds/friends.h>
#ifdef USE_LE
inherit "/global/le";
#endif
inherit "/global/wiz_object_comm";
inherit "/global/playtester";
inherit "/global/wiz_info_comm";
inherit "/global/wiz_channels";
inherit "/global/wiz_inter_comm";
private int invis;
private string *allowed;
private nosave mixed _in_wiz_editor;
private nosave string *dir_list;
private nosave mixed last_location;
private int change_dir(string str);
private int pushd(string str);
private int popd();
protected int set_home_dir(string str);
private int visible();
private int invisible(string level);
private int allow(string word);
private int disallow(string word);
/* Stuck in to help with the auto load stuff change obvject */
void create() {
playtester::create();
wiz_object_comm::create();
allowed = ({ });
} /* create() */
/**
* This method adds in all the creator commands to the player. This
* will be called when the play initialy logs onto the game.
*/
protected void wiz_commands() {
/* Get the commands from the inherited objects. */
wiz_object_comm::wiz_commands();
wiz_info_comm::wiz_commands();
wiz_inter_comm::wiz_commands();
wiz_channels::wiz_commands();
#ifdef USE_LE
le::le_commands();
#endif
/* Setup our local commands. */
add_command("cd", this_object(), "<string'directory'>", (: change_dir($4[0]) :));
add_command("cd", this_object(), "", (: change_dir(0) :));
add_command("pushd", this_object(), "<string'directory'>", (: pushd($4[0]) :));
add_command("pushd", this_object(), "", (: pushd(0) :));
add_command("popd", this_object(), "", (: popd() :));
add_command("homedir", this_object(), "<string'directory'>", (: set_home_dir($4[0]) :));
add_command("visible", this_object(), "", (: visible() :));
add_command("vis", this_object(), "", (: visible() :));
add_command("invisible", this_object(), "{1|2|3}", (: invisible($4[0]) :));
add_command("invis", this_object(), "", (: invisible("1") :));
if (this_player()->query_director()) {
add_command("invis", this_object(), "{1|2|3}", (: invisible($4[0]) :));
}
add_command("allow", this_object(), "<word'name'>", (: allow($4[0]) :));
add_command("allow", this_object(), "", (: allow(0) :));
add_command("disallow", this_object(), "<word'name'>", (: disallow($4[0]) :));
add_command("disallow", this_object(), "all", (: disallow("all") :));
} /* wiz_commands() */
/**
* This method returns the current invisibility level of the object.
* This will return 0 if the object is not invisible, 1 for creator
* invisible, 2 for director invisible and 3 for trustee invisible.
* @return the current invisibility level
*/
nomask int query_invis() {
return invis;
} /* query_invis() */
/** @ignore yes */
protected void set_invis(int level) {
invis = level;
} /* set_invis() */
/**
* This method returns the current list of people in the allowed array for
* the creator.
* @return the current list of allowed people
*/
nomask string *query_allowed() {
return copy(allowed);
} /* query_allowed() */
/**
* A bunch of stuff for allows to make it work with friends...
* @ignore yes
*/
int is_friend(string str) {
return ::is_friend(str) ||
member_array(str, allowed) != -1;
} /* is_freiend() */
/** @ignore yes */
string query_friend_tag(string str) {
string womble;
if(!userp(previous_object())) {
womble = ::query_friend_tag(str);
if (!womble) {
if (member_array(str, allowed) != -1) {
return "allowed to reference";
}
}
return womble;
}
return "";
} /* query_friend_tag() */
/** @ignore yes */
string* query_friends() {
if (file_name(previous_object()) == FRIENDS_CMD) {
return ::query_friends() | allowed;
}
return ({ });
} /* query_friends() */
/**
* This method is called by the visible command to make the creator
* become visible.
* @return 1 on success
*/
private int visible() {
if (GetForced()) {
return 0;
}
if (!query_invis()) {
return notify_fail("You are already visible.\n");
}
if (invis >= 2) {
invis = 0;
LOGIN_HANDLER->player_logon(this_player()->query_name());
} else {
invis = 0;
}
write("You appear.\n");
return 1;
} /* visible() */
/**
* This method is called by the invisible command to make the creator
* turn invisible.
* @return 1 on success, 0 on failure
*/
private int invisible( string word ) {
int max, type;
if (GetForced()) {
return 0;
}
if (!word) {
word = sprintf("%d", query_invis());
if (word == "0") {
word = "1";
}
}
max = 1 + (int)master()->query_director(query_name()) +
(int)master()->query_trustee(query_name());
if (!sscanf(word, "%d", type) || (type > max) || (type < 1)) {
return notify_fail("Syntax: invisible [1"+ ( max > 1 ? "|2" : "" ) +
( max > 2 ? "|3" : "" ) + "]\n");
}
word = ({ "frog", "creator", "director", "trustee" })[type];
if (type == query_invis()) {
return notify_fail("You are already "+ word +" invisible.\n");
}
if (type < invis && type < 2 && invis >= 2) {
invis = type;
LOGIN_HANDLER->player_login(this_player()->query_name());
} else {
invis = type;
}
write("You become "+ word +" invisible.\n");
return 1;
} /* invisible() */
/**
* This method adds someone to the current allow list of the creator.
* People on the allow list can see the creator while they are
* invisible.
* @param word the person to add to the allow string
* @return 1 on success, 0 on failure
*/
private int allow(string word) {
string player, mud;
if (!word) {
if (!sizeof(allowed)) {
write("You are not allowing anyone to refer to you.\n");
} else {
write("You are currently allowing "+
query_multiple_short( map_array( sort_array(allowed, 0),
(: capitalize( $1 ) :))) +
" to refer to you.\n" );
}
return 1;
}
word = lower_case(word);
if ( word != "playtesters" && !PLAYER_HANDLER->test_user(word) &&
sscanf( word, "%s@%s", player, mud ) != 2 ) {
return notify_fail("There is no user called $C$"+ word +".\n");
}
if (member_array(word, allowed) != -1) {
return notify_fail("You have already allowed $C$"+ word +
" to refer to you.\n");
}
allowed += ({ word });
write(word +" is now allowed to refer to you.\n");
return 1;
} /* allow() */
/**
* This method removes someone from the current allow list of the
* creator. eople on the allow list can see the creator while they are
* invisible.
* @param word the person to remove to the allow string
* @return 1 on success, 0 on failure
*/
private int disallow(string word) {
if (!word) {
return notify_fail("Disallow who?\n");
}
if (word == "all") {
allowed = ({ });
write("Cleared your allow list.\n");
} else {
word = lower_case(word);
allowed -= ({ word });
write(word +" is no longer allowed to refer to you.\n");
}
return 1;
} /* disallow() */
/**
* This method returns the current visibility status of this creator
* in respect to the other object. This does the allow level checking
* and all sorts of exciting things.
* <p>
* It will return 1 for creator invisible, 2 for director invisible, 3 for
* trustee invisible.
* @param thing the object to test the visibility against
* @return 0 if not invisible, non-zero if invisible
*/
int query_visible(object thing) {
string word;
if (thing == this_object()) {
return 1;
}
word = (string)thing->query_name();
if (member_array(word, allowed) != -1) {
return ::query_visible(thing);
} else if((member_array("playtesters", allowed) != -1) &&
PLAYTESTER_HAND->query_playtester(word)) {
return ::query_visible(thing);
}
switch (query_invis()) {
case 3 :
return (int)master()->query_trustee(word);
case 2 :
return (int)master()->query_director(word);
case 1 :
return (int)thing->query_creator();
default :
return ::query_visible(thing);
}
} /* query_visible() */
/**
* This method returns the value of the in editor flag.
* It will return non-zero if the player is in an editor.
* @return non-zero in editor, 0 not in an editor
* @see set_in_editor()
*/
mixed query_in_editor() {
return _in_wiz_editor || ::query_in_editor();
} /* query_in_editor() */
/**
* This method sets the current in editor flag.
* @param what the new value of the in editor flag
* @see query_in_editor()
*/
void set_in_editor(mixed what) {
_in_wiz_editor = what;
} /* set_in_editor() */
/**
* This method is called by the cd command and causes the
* creator to change their current working directory.
* @param str the new working directory
* @return 1 on success, 0 on failure
*/
private int change_dir(string str) {
string *filenames;
object *obs;
if (GetForced()) {
return 0;
}
if (!str) {
if (!query_home_dir()) {
add_failed_mess(this_object(),
"No homedir. Use homedir to set it.\n", ({ }));
return 0;
}
str = query_home_dir();
}
else {
if ( this_object()->query_property( LS_COMMAND_NICKNAME_PROPERTY ) ) {
str = this_object()->expand_nickname( str );
}
}
filenames = get_files(str);
if (sizeof(filenames) > 1) {
add_failed_mess(this_object(),
"Ambiguous directory.\n", ({ }));
return 0;
}
if (!sizeof(filenames)) {
if (!sizeof(obs = WIZ_PRESENT->wiz_present(str, this_object()))) {
add_failed_mess(this_object(),
"No such dir.\n", ({ }));
return 0;
}
if (sizeof(obs) > 1) {
add_failed_mess(this_object(),
"Ambiguous directory.\n", ({ }));
return 0;
}
filenames =
map(obs,
(: sprintf("/%s",implode(explode(file_name($1), "/")[0..<2],
"/")) :));
}
str = filenames[0];
if (file_size(str) != -2) {
printf("cd: %s: Not a directory.\n", str);
} else {
set_current_path(str);
}
printf("%s\n", query_current_path());
return 1;
} /* change_dir() */
/**
* This method is called by the pushd command.
* @return 1 on success, 0 on failure
* @param str the new working directory
*/
private int pushd(string str) {
if (!dir_list) {
dir_list = ({ });
}
dir_list += ({ query_current_path() });
return change_dir(str);
} /* pushd() */
/**
* This method is called by the popd command.
* @return 1 on success, 0 on failure
*/
private int popd() {
string dest;
if (!sizeof(dir_list)) {
return 0;
}
dest = dir_list[sizeof(dir_list)-1];
dir_list = delete(dir_list, sizeof(dir_list)-1, 1);
return change_dir(dest);
} /* popd() */
/**
* This method returns the creators current working directory.
* @return the current working directory
*/
string query_path() {
return query_current_path();
} /* query_path() */
/**
* This method sets the home directory of the player. It is called
* by the homedir command.
* @param str the new home directory
* @return 0 on failure and 1 on success
*/
private int set_home_dir(string str) {
if (GetForced()) {
return 0;
}
if (str) {
::set_home_dir(get_path(str));
}
printf("Home directory set to %s.\n", query_home_dir());
return 1;
} /* set_home_dir() */
/**
* This method returns the saved setup for the inbuild ed command. THis
* allows certain flag settings to be saved between sessions.
* @return the current ed setup flags
* @see set_ed_setup()
*/
int query_ed_setup() {
return query_property("ed_setup");
} /* query_ed_setup() */
/**
* This method sets the current flags for the inbuild ed command. THis
* allows certain flag settings to be saved between sessions.
* @param i the new flags for the ed command
* @see query_ed_setup()
*/
void set_ed_setup(int i) {
add_property("ed_setup", i);
} /* set_ed_setup() */
/**
* This method prints out any interesting bits of reviewable information
* available on the creator. This is used by the review command.
* @return always returns 1
*/
int review() {
playtester::review();
wiz_info_comm::review();
return 1;
} /* review() */
/**
* This method stores the last location of the creator for use by goback.
* @param string location
*/
void set_last_location(mixed loc) { last_location = loc; }
/**
* This method returns the last location of the creator for use by goback.
* @return string last location.
*/
mixed query_last_location() { return last_location; }
protected string process_input(string inp){
int start;
start = strsrch(inp, '@');
if(start > 0){
int space = strsrch(inp, ' ');
if(!(space > 0 && ((space == start+1) || space < start))){
inp = inp[0..start] + " " + inp[start+1..];
}
}
start = strsrch(inp, '`');
if(start > 0){
int end;
end = strsrch(inp, '`', -1);
if(end != start){
string lpc = inp[start+1..end-1];
string err;
mixed ret;
ret = "/secure/cmds/creator/exe_c"->do_exec("return "+lpc, ref err);
if(!err){
if(intp(ret))
ret = ""+ret;
if(objectp(ret))
ret = file_name(ret);
if(arrayp(ret)){
ret = filter(ret, (:stringp($1) || intp($1) || objectp($1):));
ret = map(ret, (:intp($1)?""+$1:(objectp($1)?file_name($1):$1):));
if(sizeof(ret))
ret = implode(ret, ",");
}
if(stringp(ret)){
inp = inp[0..start-1] + ret + inp[end+1..];
}
}
}
}
return ::process_input(inp);
}
protected mixed command( string txt ) {
return ::command( txt );
}