/* -*- LPC -*- */
/*
* $Locker: $
* $Id: who.c,v 1.58 2003/03/03 00:58:25 pinkfish Exp $
*
*/
/* who command, trial out by Turrican for a commands daemon. */
#include <clubs.h>
#include <playtesters.h>
#include <config.h>
inherit "/cmds/base";
#include <player.h>
string who_string(int width, int cre, int verbose, string name);
string who_line(object ob, int cre, int width);
mapping _nationalities;
void create() {
string file;
object ob;
::create();
_nationalities = ([ ]);
foreach(file in get_dir("/std/nationality/*.c")) {
ob = find_object("/std/nationality/" + file);
if(ob && ob->query_name())
_nationalities[ob->query_name()] = base_name(ob);
}
}
/**
* This is used by the other who commands to do the object mapping
* to figure out who to include in the list.
* @param tarr the array to get the filtered list from
* @param name the name of the guilds to filter on
* @param no_cres do not include any creators
* @return the array of filtered objects
*/
object *filter_users(object *tarr, string name, int no_cres) {
string *guilds;
string guild;
string start_guild;
string *domains;
object *ret_arr;
object *arr;
int not_tag;
name = lower_case(name);
name = replace(name, ({"assassins", "assassin",
"priests", "priest",
"thieves", "thief",
"warriors", "warrior",
"witches", "witch",
"wizards", "wizard",
"creators", "creator",
"liaisons", "liaison",
"adventurers", "adventurer",
"fighters", "warrior",
"fighter", "warrior",
"killers", "killer",
"helpers", "helper",
"playtesters", "playtester",
"friends", "friend",
"families", "family" }));
guilds = explode(name, "&") - ({ "" });
if (sizeof(guilds) > 1) {
arr = filter_users(tarr, guilds[0], no_cres);
foreach (guild in guilds[1..]) {
arr &= filter_users(tarr, guild, no_cres);
}
return arr;
}
guilds = explode(name, ",") - ({ "", 0 });
domains = "/secure/master"->query_domains();
ret_arr = ({ });
foreach (guild in guilds) {
start_guild = guild;
guild = replace(guild, " ", "", "\t", "");
if (guild[0] == '-') {
not_tag = 1;
guild = guild[1..];
} else {
not_tag = 0;
}
arr = ({ });
if (guild == "adventurer") {
arr += filter(tarr, (: !$1->query_guild_ob() &&
(!$(no_cres) || !$1->query_creator()) :));
} else if (guild == "friend") {
arr += filter(tarr, (: !$1->query_login_ob() && this_player()->is_friend($1->query_name()) :));
} else if (guild == "creator") {
arr += filter(tarr, (: $1->query_creator() &&
$1->query_visible(this_player()) :) );
} else if (guild == "helper") {
arr += filter( tarr, (: !$1->query_creator() &&
$1->query_property( "newbie helper" ) :) );
} else if (guild == "killer") {
arr += filter(tarr, (: $1->query_player_killer() &&
(!$(no_cres) || !$1->query_creator()) :));
} else if (guild == "family") {
arr += filter(tarr, (: $1->query_family_name() :));
} else if (guild == "playtester") {
arr += filter(tarr,
(: PLAYTESTER_HAND->query_playtester($1->query_name()) :));
} else if (member_array(guild, domains) > -1) {
arr += filter(tarr, (: $1->query_creator() &&
("/d/"+$(guild)+"/master")->query_member($1->query_name()) &&
$1->query_visible(this_player()) :));
} else if(member_array(guild, keys(_nationalities)) > -1) {
arr += filter(tarr, (: $1->query_nationality() == $2 :),
_nationalities[guild]);
} else {
if (file_size("/std/guilds/" + guild + ".c") > 0) {
arr += filter(tarr,
(: (!$(no_cres) || !$1->query_creator()) &&
stringp($1->query_guild_ob()) &&
$1->query_guild_ob() == "/std/guilds/" + $(guild) :));
} else if (CLUB_HANDLER->is_family(start_guild)) {
arr += filter(tarr, (: CLUB_HANDLER->is_member_of($(start_guild), $1) :));
} else if (CLUB_HANDLER->is_club(start_guild)) {
if (!CLUB_HANDLER->query_club_secret(start_guild) ||
CLUB_HANDLER->is_member_of(start_guild, this_player()->query_name())) {
arr += filter(tarr, (: CLUB_HANDLER->is_member_of($(start_guild), $1->query_name()) :));
}
} else {
arr += filter(tarr, (: $1->query_deity() == $2 &&
(!$(no_cres) || !$1->query_creator()) :),
guild);
}
}
if (not_tag) {
ret_arr |= (tarr - arr);
} else {
ret_arr |= arr;
}
}
return ret_arr;
} /* filter_users() */
int cmd(string str, int verbose) {
this_player()->more_string( who_string(this_player()->query_cols(),
this_player()->query_creator(),
verbose,
str),
"Who", 1 );
return 1;
} /* cmd() */
/**
* This method returns the string used in the who command.
* @return the line for the who line
*/
string who_string(int width, int cre, int verbose, string name) {
object *arr;
int number;
string tmp;
string tmp2;
string prt;
int x;
if (name == "here") {
arr = filter(all_inventory(environment(this_player())), (: userp($1) &&
$1->query_visible(this_player()) :) );
} else {
arr = filter(users(), (: strsrch(file_name($1), "secure/login") == -1 :));
if (name && sizeof(arr)) {
arr = filter_users(arr, name, 1);
}
}
number = sizeof(arr);
if (number == 0) {
if (name) {
return "There are no guild(s) or members of " + name + " online.\n";
}
return "There is no one on " + mud_name() + "?\n";
}
prt = sprintf("%|*'-'s\n", width-1, "==========] " + mud_name() + " [===========");
arr = sort_array(arr, (: strcmp($1->query_name(), $2->query_name() ) :) );
tmp2 = "";
if(!name && verbose == 0) {
int i;
// remove all creators except liaisons.
#ifndef __DISTRIBUTION_LIB__
arr = filter_array(arr, (: !$1->query_creator() ||
"/d/liaison/master"->query_member($1->query_name()) :) );
#endif
for (i = 0; i < sizeof(arr); i++) {
tmp = (string)arr[i]->query_cap_name();
if(!tmp) {
--number;
} else {
x = 14;
if (arr[i]->query_creator()) {
if ("/secure/master"->query_trustee(arr[i]->query_name())) {
tmp += " (%^RED%^T";
} else if("/secure/master"->query_director(arr[i]->query_name())){
tmp += " (%^RED%^D";
} else if("/secure/master"->query_senior(arr[i]->query_name())){
tmp += " (%^RED%^S";
} else {
tmp += " (%^RED%^C";
}
x += 16;
if ( "/d/liaison/master"->query_member(arr[i]->query_name())) {
tmp += "%^YELLOW%^l";
x += 10;
}
if(this_player()->is_friend(arr[i]->query_name())) {
tmp += "%^GREEN%^F";
x += 9;
}
tmp += "%^RESET%^)";
} else if(this_player()->is_friend(arr[i]->query_name())) {
tmp += " (%^GREEN%^F%^RESET%^)";
x += 18;
}
tmp2 += sprintf("%-" + x + "s ", tmp);
if((i+1) % (width/15) == 0 && tmp2 != "") {
prt += this_player()->fix_string(" " + tmp2 + "\n", width, 10);
tmp2 = "";
}
}
}
prt += this_player()->fix_string(" " + tmp2 + "\n", width, 10);
} else {
int i;
for (i = 0; i < sizeof(arr); i++) {
tmp = who_line(arr[i], cre, width);
if ( !tmp ) {
--number;
} else {
prt += this_player()->fix_string(tmp + "\n", width, 10);
}
}
}
if ( name == "here" ) {
if (number == 1)
tmp = "> You are all by yourself. <";
else
tmp = "> There are " + query_num(number, 500) + " people here. <";
} else if ( name ) {
tmp = "> There " + (number > 1 ? "are " : "is ") +
query_num(number, 500) +
(number > 1 ? " members of" : " member of");
if (strsrch(name, ",") != -1) {
tmp += " those guilds on the " + mud_name() + ". <";
} else {
tmp += " this guild on the " + mud_name() + ". <";
}
} else if (number < 2) {
tmp = "> You are all alone on the " + mud_name() + ". <";
} else {
tmp = "> There are " + query_num(number, 500) +
" mudders on the " + mud_name() + ". <";
}
prt += sprintf("%*'-'|s\n", width-1, tmp);
return prt;
}
/**
* This method returns the line used for each player in the who
* command.
* @return the who line
* @param ob the player to show
* @param cre are we a cre
* @param width the width of the line
*/
string who_line(object ob, int cre, int width) {
string s;
string tmp;
tmp = ob->query_player_title();
if (tmp) {
tmp += " ";
} else {
tmp = "";
}
s = tmp + ob->query_cap_name();
if ( !s ) {
return 0;
}
tmp = ob->query_family_name();
if (tmp) {
s += " " + tmp;
}
if ( "/d/liaison/master"->query_member( (string)ob->query_name() ) ) {
s += " (%^YELLOW%^Liaison%^RESET%^)";
}
if (ob->query_creator()) {
if ("/secure/master"->query_trustee((string)ob->query_name())) {
s += " (%^RED%^Trustee%^RESET%^)";
} else if("/secure/master"->query_director((string)ob->query_name())){
s += " (%^RED%^Director%^RESET%^)";
} else if("/secure/master"->query_senior((string)ob->query_name())) {
s += " (%^RED%^Senior%^RESET%^)";
} else {
s += " (%^RED%^Creator%^RESET%^)";
}
if (ob->query_invis() == 1) {
s += " (Invisible)";
} if (ob->query_invis() > 1) {
s += " (Super Invisible)";
}
}
if (cre) {
if ((tmp = (string)ob->query_in_editor())) {
s += " (editing: " + tmp + ")";
}
}
if (ob->query_property("guest")) {
s += " guest of " + mud_name() + "";
} else if (tmp = (string)ob->query_gtitle()) {
s += " " + tmp;
} else {
s += " the Adventurer";
}
if (tmp = (string)ob->query_property("player_title")) {
s += ", " + tmp;
}
tmp = (string)ob->query_title();
if ( tmp && ( tmp != "" ) ) {
s += ", " + tmp;
}
if ( PLAYTESTER_HAND->query_playtester( ob->query_name() ) ) {
if ( PLAYTESTER_HAND->query_senior_playtester( ob->query_name() ) ) {
s += ", (%^BOLD%^%^CYAN%^Senior Playtester%^RESET%^)";
}
else {
s += ", (%^CYAN%^Playtester%^RESET%^)";
}
}
if (interactive(ob)) {
if (query_idle(ob) > 120) {
s += " (Idle: " + (query_idle(ob) / 60) + ")";
}
}
return s + "%^RESET%^";
} /* who_line() */
mixed *query_patterns() {
return ({ "", (: cmd(0, 0) :),
"verbose", (: cmd(0, 1) :),
"here", (: cmd("here", 1) :),
"<string'guild|liaisons|creators|killers|helpers|playtesters|friends|families|nationality'>", (: cmd( $4[0], 0 ) :) });
} /* query_patterns() */