/*
* Playground+ - examine.c
* Examine, finger, z and y commands
* ---------------------------------------------------------------------------
*/
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
#include "include/config.h"
#include "include/player.h"
#include "include/fix.h"
#include "include/proto.h"
file ConnectionSpeeds[] =
{
{"Pending", -1},
{"Direct", 20},
{"Blazing", 30},
{"Fast", 60},
{"Speedy", 80},
{"Decent", 100},
{"Sluggish", 120},
{"Slow", 150},
{"Painful", 180},
{"Constipated", 220},
{"Unbearable", 300},
{"Horrid", 500},
{"Lag Attack", 999999},
{"", 0}
};
/* show what somone can do */
void privs(player * p, char *str)
{
char *oldstack = stack, name[MAX_NAME + 2], middle[80];
int priv, who = 0;
player *p2 = 0;
player dummy;
/* assume you are looking at your privs */
strcpy(name, " You");
/* convert possible name to lower case */
lower_case(str);
/* check if the person executing it is an SU */
if (*str && p->residency & (SU | ADMIN))
{
/* look for person on program - this will report if they
are logged out at the time (ie if it fails) */
p2 = find_player_global(str);
if (!p2)
/* if player is logged out, try and load them into dummy */
{
/* setup name */
strcpy(dummy.lower_name, str);
lower_case(dummy.lower_name);
/* and an fd for messages */
dummy.fd = p->fd;
/* actually try loading them */
if (!load_player(&dummy))
/* if we can't load them, report abject failure and exit */
{
tell_player(p, " Couldn't find player in saved files.\n");
return;
}
/* lets see if this fixes banished privs shit.. */
if (dummy.residency & BANISHD)
{
tell_player(p, " That is a banished name or player.\n");
return;
}
/* otherwise set p2 so the gender stuff below works */
p2 = &dummy;
}
/* setup name */
strcpy(name, p2->name);
/* and privs */
priv = p2->residency;
/* flag it as another person's privs */
who = 1;
/* print the title to the stack */
sprintf(middle, "Permissions for %s", name);
pstack_mid(middle);
}
else
{
/* the person wants their own privs so get person's own privs :-) */
priv = p->residency;
pstack_mid("Your permissions");
}
/* capitalise name again */
name[0] = toupper(name[0]);
if (priv == NON_RESIDENT)
{
TELLPLAYER(p, "%s will not be saved... not a resident, you see..\n", name);
stack = oldstack;
return;
}
if (priv == SYSTEM_ROOM)
{
TELLPLAYER(p, "%s is a System Room\n", name);
stack = oldstack;
return;
}
if (who == 0)
/* privs for yourself */
{
if (priv & BASE)
ADDSTACK(" You are a resident.\n");
else
ADDSTACK(" You aren't a resident! EEK! Talk to a superuser!\n");
#ifdef ROBOTS
if (priv & ROBOT_PRIV)
ADDSTACK(" You are a robot.\n");
#endif
if (priv & LIST)
ADDSTACK(" You have a list.\n");
else
ADDSTACK(" You do not have a list.\n");
if (priv & ECHO_PRIV)
ADDSTACK(" You can echo.\n");
else
ADDSTACK(" You cannot echo.\n");
if (priv & BUILD)
ADDSTACK(" You can use room commands.\n");
else
ADDSTACK(" You can't use room commands.\n");
if (priv & MAIL)
ADDSTACK(" You can send mail.\n");
else
ADDSTACK(" You cannot send any mail.\n");
if (priv & SESSION)
ADDSTACK(" You can set sessions.\n");
else
ADDSTACK(" You cannot set sessions.\n");
if (p->system_flags & MARRIED)
ADDSTACK(" You are happily net-married to %s.\n", p->married_to);
if (p->residency & MINISTER)
ADDSTACK(" You can perform net-marriages.\n");
if (p->residency & BUILDER)
ADDSTACK(" You can create elaborate objects.\n");
if (p->residency & SPECIALK)
ADDSTACK(" You can fashion together original socials.\n");
if (priv & SPOD)
ADDSTACK(" You are a spod (but you already KNEW that).\n");
if (priv & DEBUG)
ADDSTACK(" You can see the debug channel.\n");
if (priv & NO_TIMEOUT)
ADDSTACK(" You will never time-out.\n");
if (priv & WARN)
ADDSTACK(" You can warn people.\n");
if (priv & DUMB)
ADDSTACK(" You can dumb people (turn em into tweedles).\n");
if (priv & SCRIPT)
ADDSTACK(" You can use extended scripting.\n");
if (priv & TRACE)
ADDSTACK(" You can trace login sites.\n");
/* added a lil tiny extra for those talkers that get creative
with there privs so staff will know exactly where they stand
*/
ADDSTACK(" Your residency level is ");
if (priv & CODER)
ADDSTACK("%s (coder).\n", get_config_msg("coder_name"));
else if (priv & HCADMIN)
ADDSTACK("%s (hcadmin).\n", get_config_msg("hc_name"));
else if (priv & ADMIN)
ADDSTACK("%s (admin).\n", get_config_msg("admin_name"));
else if (priv & LOWER_ADMIN)
ADDSTACK("%s (lower admin).\n", get_config_msg("la_name"));
else if (priv & ASU)
ADDSTACK("%s (advanced su).\n", get_config_msg("asu_name"));
else if (priv & SU)
ADDSTACK("%s (super user).\n", get_config_msg("su_name"));
else if (priv & PSU)
ADDSTACK("%s (pseudo su).\n", get_config_msg("psu_name"));
else
ADDSTACK("standard resident.\n");
/* in following with the tradition of changing this
as new releases are done.... */
if (priv & HOUSE)
ADDSTACK(" You are one with the inner child\n");
}
if (who == 1)
/* privs for someone else */
{
{
if (priv & BASE)
ADDSTACK("%s is a resident.\n", name);
else
ADDSTACK("%s is not resident! EEK!\n", name);
#ifdef ROBOTS
if (priv & ROBOT_PRIV)
ADDSTACK("%s is a robot.\n", name);
#endif
if (priv & LIST)
ADDSTACK("%s has a list.\n", name);
else
ADDSTACK("%s hasno list.\n", name);
if (priv & ECHO_PRIV)
ADDSTACK("%s can echo.\n", name);
else
ADDSTACK("%s cannot echo.\n", name);
if (priv & BUILD)
ADDSTACK("%s can use room commands.\n", name);
else
ADDSTACK("%s can't use room commands.\n", name);
if (priv & MAIL)
ADDSTACK("%s can send mail.\n", name);
else
ADDSTACK("%s cannot send any mail.\n", name);
if (priv & SESSION)
ADDSTACK("%s can set sessions.\n", name);
else
ADDSTACK("%s cannot set sessions.\n", name);
if (p2->system_flags & MARRIED)
ADDSTACK("%s is happily net-married to %s.\n", name, p2->married_to);
if (priv & SPOD)
ADDSTACK("%s is a sad spod.\n", name);
if (priv & DEBUG)
ADDSTACK("%s can see the debug channel.\n", name);
if (p2->residency & MINISTER)
ADDSTACK("%s can perform net-marriages.\n", name);
if (p2->residency & BUILDER)
ADDSTACK("%s can create amazing items.\n", name);
if (p2->residency & SPECIALK)
ADDSTACK("%s can fashion together original socials.\n", name);
if (priv & GIT)
ADDSTACK("%s cant do much but sit back and enjoy the view.\n", name);
if (priv & PROTECT)
ADDSTACK("%s is carrying a golden parachute.\n", name);
if (priv & NO_TIMEOUT)
ADDSTACK("%s will never time-out.\n", name);
if (priv & WARN)
ADDSTACK("%s can warn people.\n", name);
if (priv & DUMB)
ADDSTACK("%s can dumb people.\n", name);
if (priv & SCRIPT)
ADDSTACK("%s can use extended scripting.\n", name);
if (priv & TRACE)
ADDSTACK("%s can trace login sites.\n", name);
ADDSTACK("%s's residency level is ", name);
if (priv & CODER)
ADDSTACK("%s (coder).\n", get_config_msg("coder_name"));
else if (priv & HCADMIN)
ADDSTACK("%s (hcadmin).\n", get_config_msg("hc_name"));
else if (priv & ADMIN)
ADDSTACK("%s (admin).\n", get_config_msg("admin_name"));
else if (priv & LOWER_ADMIN)
ADDSTACK("%s (lower admin).\n", get_config_msg("la_name"));
else if (priv & ASU)
ADDSTACK("%s (advanced su).\n", get_config_msg("asu_name"));
else if (priv & SU)
ADDSTACK("%s (super user).\n", get_config_msg("su_name"));
else if (priv & PSU)
ADDSTACK("%s (pseudo su).\n", get_config_msg("psu_name"));
else
ADDSTACK("standard resident.\n");
if (priv & HOUSE)
ADDSTACK("%s was rode hard and put up wet.\n", name);
stack += sprintf(stack, "%s " RES_BIT_HEAD "\n"
"Residency %s\n", LINE,
privs_bit_string(p2->residency));
}
}
/* finish off the end of the chunk of data */
ENDSTACK(LINE "\n");
tell_player(p, oldstack);
stack = oldstack;
}
void friend_finger(player * p)
{
char *oldstack, *temp;
list_ent *l;
saved_player *sp;
player dummy, *p2;
int jettime, friend = 0;
memset(&dummy, 0, sizeof(player));
oldstack = stack;
if (!p->saved)
{
tell_player(p, " You have no save information, and therefore no "
"friends ...\n");
return;
}
sp = p->saved;
l = sp->list_top;
if (!l)
{
tell_player(p, " You have no list ...\n");
return;
}
strcpy(stack, "\n Your friends were last seen...\n");
stack = strchr(stack, 0);
do
{
if (l->flags & FRIEND && strcasecmp(l->name, "everyone"))
{
p2 = find_player_absolute_quiet(l->name);
friend = 1;
if (p2)
{
sprintf(stack, " %s is logged on.\n", p2->name);
stack = strchr(stack, 0);
}
else
{
temp = stack;
strcpy(temp, l->name);
lower_case(temp);
strcpy(dummy.lower_name, temp);
dummy.fd = p->fd;
if (load_player(&dummy))
{
switch (dummy.residency)
{
case BANISHED:
sprintf(stack, " %s is banished (Old Style)\n",
dummy.lower_name);
stack = strchr(stack, 0);
break;
case SYSTEM_ROOM:
sprintf(stack, " %s is a system room ...\n", dummy.name);
stack = strchr(stack, 0);
break;
default:
if (dummy.residency == BANISHD)
{
sprintf(stack, " %s is banished. (Name Only)\n",
dummy.lower_name);
stack = strchr(stack, 0);
}
else if (dummy.residency & BANISHD)
{
sprintf(stack, " %s is banished.\n", dummy.lower_name);
stack = strchr(stack, 0);
}
else
{
if (dummy.saved)
jettime = dummy.saved->last_on + (p->jetlag * 3600);
else
jettime = dummy.saved->last_on;
sprintf(stack, " %s was last seen at %s.\n", dummy.name,
convert_time(jettime));
stack = strchr(stack, 0);
}
break;
}
}
else
{
sprintf(stack, " %s doesn't exist.\n", l->name);
stack = strchr(stack, 0);
}
}
}
l = l->next;
}
while (l);
if (!friend)
{
tell_player(p, " But you have no friends !!\n");
stack = oldstack;
return;
}
stack = strchr(stack, 0);
*stack++ = '\n';
*stack++ = 0;
pager(p, oldstack);
stack = oldstack;
return;
}
/* command to list pinfo about a saved person */
void pinfo_saved_player(player * p, char *str)
{
player dummy;
char *oldstack = stack, top[70];
memset(&dummy, 0, sizeof(player));
strcpy(dummy.lower_name, str);
lower_case(dummy.lower_name);
dummy.fd = p->fd;
if (!load_player(&dummy))
{
tell_player(p, " No such person in saved files.\n");
return;
}
switch (dummy.residency)
{
case SYSTEM_ROOM:
tell_player(p, " Standard rooms file\n");
return;
default:
if (dummy.residency & BANISHD)
{
if (dummy.residency == BANISHD)
tell_player(p, "BANISHED (Name only).\n");
else
tell_player(p, "BANISHED.\n");
return;
}
break;
}
sprintf(top, "Pinfo for %s (logged out)", dummy.name);
pstack_mid(top);
if (emote_no_break(*dummy.enter_msg))
sprintf(stack, "Entermsg : %s%s\n", dummy.name, dummy.enter_msg);
else
sprintf(stack, "Entermsg : %s %s\n", dummy.name, dummy.enter_msg);
stack = strchr(stack, 0);
if (strlen(dummy.ignore_msg) > 0)
sprintf(stack, "Ignoremsg : %s\n", dummy.ignore_msg);
else
strcpy(stack, "Ignoremsg : \n");
stack = strchr(stack, 0);
if (strlen(dummy.logonmsg) > 0)
{
if (emote_no_break(*dummy.logonmsg))
sprintf(stack, "Logonmsg : %s%s\n", dummy.name, dummy.logonmsg);
else
sprintf(stack, "Logonmsg : %s %s\n", dummy.name, dummy.logonmsg);
}
else
strcpy(stack, "Logonmsg : \n");
stack = strchr(stack, 0);
if (strlen(dummy.logoffmsg) > 0)
{
if (emote_no_break(*dummy.logoffmsg))
sprintf(stack, "Logoffmsg : %s%s\n", dummy.name, dummy.logoffmsg);
else
sprintf(stack, "Logoffmsg : %s %s\n",
dummy.name, dummy.logoffmsg);
}
else
strcpy(stack, "Logoffmsg : \n");
stack = strchr(stack, 0);
if (strlen(dummy.blockmsg) > 0)
{
if (emote_no_break(*dummy.blockmsg))
sprintf(stack, "Blockmsg : %s%s\n", dummy.name, dummy.blockmsg);
else
sprintf(stack, "Blockmsg : %s %s\n", dummy.name, dummy.blockmsg);
}
else
strcpy(stack, "Blockmsg : \n");
stack = strchr(stack, 0);
if (strlen(dummy.exitmsg) > 0)
{
if (emote_no_break(*dummy.exitmsg))
sprintf(stack, "Exitmsg : %s%s\n", dummy.name, dummy.exitmsg);
else
sprintf(stack, "Exitmsg : %s %s\n", dummy.name, dummy.exitmsg);
}
else
strcpy(stack, "Exitmsg : \n");
stack = strchr(stack, 0);
strcpy(stack, LINE "\n");
stack = end_string(stack);
tell_player(p, oldstack);
stack = oldstack;
}
void pinfo_command(player * p, char *str)
{
player *p2;
char *oldstack;
char top[70];
oldstack = stack;
if ((*str) && (p->residency & SU))
{
p2 = find_player_global(str);
if (!p2)
{
stack = oldstack;
pinfo_saved_player(p, str);
return;
}
else
{
sprintf(top, "Pinfo for %s", p2->name);
pstack_mid(top);
}
}
else
{
p2 = p;
pstack_mid("Your Pinfo");
}
if (emote_no_break(*p2->enter_msg))
sprintf(stack, "Entermsg : %s%s\n",
p2->name, p2->enter_msg);
else
sprintf(stack, "Entermsg : %s %s\n",
p2->name, p2->enter_msg);
stack = strchr(stack, 0);
if (strlen(p2->ignore_msg) > 0)
sprintf(stack, "Ignoremsg : %s\n", p2->ignore_msg);
else
strcpy(stack, "Ignoremsg : \n");
stack = strchr(stack, 0);
if (strlen(p2->logonmsg) > 0)
{
if (emote_no_break(*p2->logonmsg))
sprintf(stack, "Logonmsg : %s%s\n",
p2->name, p2->logonmsg);
else
sprintf(stack, "Logonmsg : %s %s\n",
p2->name, p2->logonmsg);
}
else
strcpy(stack, "Logonmsg : \n");
stack = strchr(stack, 0);
if (strlen(p2->logoffmsg) > 0)
{
if (emote_no_break(*p2->logoffmsg))
sprintf(stack, "Logoffmsg : %s%s\n",
p2->name, p2->logoffmsg);
else
sprintf(stack, "Logoffmsg : %s %s\n",
p2->name, p2->logoffmsg);
}
else
strcpy(stack, "Logoffmsg : \n");
stack = strchr(stack, 0);
if (strlen(p2->blockmsg) > 0)
{
if (emote_no_break(*p2->blockmsg))
sprintf(stack, "Blockmsg : %s%s\n",
p2->name, p2->blockmsg);
else
sprintf(stack, "Blockmsg : %s %s\n",
p2->name, p2->blockmsg);
}
else
strcpy(stack, "Blockmsg : \n");
stack = strchr(stack, 0);
if (strlen(p2->exitmsg) > 0)
{
if (emote_no_break(*p2->exitmsg))
sprintf(stack, "Exitmsg : %s%s\n",
p2->name, p2->exitmsg);
else
sprintf(stack, "Exitmsg : %s %s\n",
p2->name, p2->exitmsg);
}
else
strcpy(stack, "Exitmsg : \n");
stack = strchr(stack, 0);
strcpy(stack, LINE);
stack = strchr(stack, 0);
*stack++ = 0;
tell_player(p, oldstack);
stack = oldstack;
}
void su_examine(player * p, char *str)
{
player dummy, *p2;
char *oldstack;
float partic;
int jettime;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: y <player>\n");
return;
}
if (!strcasecmp(str, "me"))
p2 = p;
else
{
p2 = find_player_absolute_quiet(str);
if (!p2)
{
strcpy(dummy.lower_name, str);
lower_case(dummy.lower_name);
dummy.fd = p->fd;
if (!load_player(&dummy))
{
tell_player(p, " No such person in saved files.\n");
return;
}
p2 = &dummy;
}
}
switch (p2->residency)
{
case BANISHED:
tell_player(p, " That player has been banished from this program.\n");
return;
case SYSTEM_ROOM:
tell_player(p, " That is where some of the standard rooms are stored."
"\n");
return;
default:
if (p2->residency == BANISHD)
{
tell_player(p, " That name has been banished from this program.\n");
return;
}
else if (p2->residency & BANISHD)
{
tell_player(p, " That player has been banished from"
" this program.\n");
return;
}
}
sprintf(stack, LINE
"%s %s \n"
LINE,
p2->name, p2->title);
stack = strchr(stack, 0);
if (p2->saved)
{
jettime = p2->saved->last_on + (p->jetlag * 3600);
}
else
{
jettime = 0;
}
if (p2 != &dummy)
{
sprintf(stack, "%s has been logged in for %s since\n%s.\n",
full_name(p2), word_time(time(0) - (p2->on_since)),
convert_time(p2->on_since));
}
else if (p2->saved)
{
if (p->jetlag)
{
sprintf(stack, "%s was last seen at %s. (Your time)\n",
p2->name, convert_time(jettime));
}
else
{
sprintf(stack, "%s was last seen at %s.\n", p2->name,
convert_time(p2->saved->last_on));
}
}
stack = strchr(stack, 0);
sprintf(stack, "%s total login time is %s.\n", caps(gstring_possessive(p2)),
word_time(p2->total_login));
stack = strchr(stack, 0);
sprintf(stack, "%s total adjusted spod time is %s.\n", caps(gstring_possessive(p2)),
word_time(p2->total_login - p2->total_idle_time));
stack = strchr(stack, 0);
if (p2->residency & BASE)
{
sprintf(stack, "%s was ressied by %s on %s\n",
p2->name, p2->ressied_by, convert_time(p2->first_login_date));
}
stack = strchr(stack, 0);
if (p2->time_in_main && p2->total_login)
{
partic = ((float) p2->time_in_main / (float) p2->total_login) * 100;
if (partic >= 100)
sprintf(stack, "%s has spent 100%% of the time in a main room.\n", p2->name);
else
sprintf(stack, "%s has spent %.2f%% of the time in a main room.\n", p2->name, partic);
}
else
sprintf(stack, "%s has spent no time at all in main rooms.\n", p2->name);
stack = strchr(stack, 0);
if (p2->warn_count)
{
sprintf(stack, "%s has been warned %d times.\n",
p2->name, p2->warn_count);
}
stack = strchr(stack, 0);
if (p2->booted_count)
{
sprintf(stack, "%s has been booted or jailed %d times.\n",
p2->name, p2->booted_count);
}
stack = strchr(stack, 0);
if (p2->idled_out_count)
{
sprintf(stack, "%s has idled out of the program %d times.\n",
p2->name, p2->idled_out_count);
}
stack = strchr(stack, 0);
if (p2->eject_count)
{
sprintf(stack, "%s has been kicked off the program %d times.\n",
p2->name, p2->eject_count);
}
stack = strchr(stack, 0);
if (p2->system_flags & SAVE_NO_SING)
{
sprintf(stack, "%s cannot sing -- ever.\n", p2->name);
}
else if (p2 != &dummy && p2->no_sing)
{
sprintf(stack, "%s cannot sing for %d more seconds.\n",
p2->name, p2->no_shout);
}
stack = strchr(stack, 0);
if (p2->system_flags & SAVENOSHOUT)
{
sprintf(stack, "%s cannot shout -- ever.\n", p2->name);
}
else if (p2 != &dummy && p2->no_shout)
{
sprintf(stack, "%s cannot shout for %d more seconds.\n",
p2->name, p2->no_shout);
}
stack = strchr(stack, 0);
if (p2->system_flags & SAVEDFROGGED)
{
sprintf(stack, "%s is currently \"dum\"med down.\n", p2->name);
}
stack = strchr(stack, 0);
if (p2->system_flags & NO_MSGS)
{
sprintf(stack, "%s cannot change pinfo, x or f data.\n", p2->name);
}
stack = strchr(stack, 0);
if (p2->system_flags & DECAPPED)
{
sprintf(stack, "%s cannot use capital letters.\n", p2->name);
}
stack = strchr(stack, 0);
if (strlen(p2->swarn_sender) > 0)
{
sprintf(stack, "%s has a saved warning from %s: %s.\n", p2->name, p2->swarn_sender, p2->swarn_message);
}
stack = strchr(stack, 0);
if (p->residency & LOWER_ADMIN)
{
if (p2->num_ressied)
{
sprintf(stack, "%s has granted residency to %d people.\n",
p2->name, p2->num_ressied);
}
stack = strchr(stack, 0);
if (p2->num_warned)
{
sprintf(stack, "%s has warned %d people.\n",
p2->name, p2->num_warned);
}
stack = strchr(stack, 0);
if (p2->num_ejected)
{
sprintf(stack, "%s has kicked %d gits off the program.\n",
p2->name, p2->num_ejected);
}
stack = strchr(stack, 0);
if (p2->num_rmd)
{
sprintf(stack, "%s removed %d shouts, sings and moves.\n",
p2->name, p2->num_rmd);
}
stack = strchr(stack, 0);
if (p2->num_booted)
{
sprintf(stack, "%s booted or jailed %d morons.\n",
p2->name, p2->num_booted);
}
stack = strchr(stack, 0);
}
if (p2->git_string[0])
{
pstack_mid(p2->git_by);
sprintf(stack, "%s\n", p2->git_string);
stack = strchr(stack, 0);
}
strcpy(stack, LINE);
stack = end_string(stack);
pager(p, oldstack);
stack = oldstack;
}
void newfinger(player * p, char *str)
{
player dummy, *p2;
char *oldstack = stack, datastring[50];
int jettime, overtime;
float partic;
list_ent *l = 0;
#ifdef INTERCOM
if (strchr(str, '@'))
{
do_intercom_finger(p, str);
return;
}
#endif
/* if (!strcasecmp(str, "friends")) -- blimey */
if (p && p->location && !strcasecmp(str, "friends"))
{
friend_finger(p);
return;
}
if (!*str || !strcasecmp(str, "me"))
p2 = p;
else
{
if (reserved_name(str))
{
tell_player(p, " That is a reserved name.\n");
return;
}
p2 = find_player_absolute_quiet(str);
if (!p2)
{
strcpy(dummy.lower_name, str);
lower_case(dummy.lower_name);
dummy.fd = p->fd;
if (!load_player(&dummy))
{
if (!p->location)
{
if (!*str)
tell_player(p, " You need to specify a name in order to finger someone!\n");
else
TELLPLAYER(p, " No resident of the name '%s' found in files.\n", str);
}
return;
}
p2 = &dummy;
}
}
if (p2->residency & LIST && !(p2->residency & NO_SYNC))
l = fle_from_save(p2->saved, p->lower_name);
switch (p2->residency)
{
case BANISHED:
tell_player(p, " That player has been banished from this program.\n");
if (!(p->residency & SU))
return;
break;
case SYSTEM_ROOM:
tell_player(p, " That is where some of the standard rooms are stored."
"\n");
return;
default:
if (p2->residency == BANISHD)
{
tell_player(p, " That name has been banished from this program.\n");
return;
}
else if (p2->residency & BANISHD)
{
tell_player(p, " That player has been banished from"
" this program.\n");
if (!(p->residency & SU))
return;
}
}
if (*p2->pretitle)
{
if (emote_no_break(*p2->title))
ADDSTACK(LINE "%s %s%s^N \n"
LINE, p2->pretitle, p2->name, p2->title);
else
ADDSTACK(LINE "%s %s %s^N \n"
LINE, p2->pretitle, p2->name, p2->title);
}
else
ADDSTACK(LINE "%s %s^N \n"
LINE, p2->name, p2->title);
if (p->jetlag)
{
overtime = p2->on_since + (p->jetlag * 3600);
strcpy(datastring, "(Your time)");
}
else
{
overtime = p2->on_since;
sprintf(datastring, "(%s time)", get_config_msg("talker_name"));
}
if (p2->saved)
{
jettime = p2->saved->last_on + (p->jetlag * 3600);
}
else
{
jettime = 0;
}
if (p2 != &dummy)
{
ADDSTACK("Time on so far : %s\nLogged on at : %s %s\n",
word_time(time(0) - (p2->on_since)), convert_time(overtime), datastring);
}
else if (p2->saved)
{
if (p->jetlag)
{
ADDSTACK("Date last logged on : %s %s\n",
convert_time(jettime), datastring);
}
else
{
ADDSTACK("Date last logged on : %s %s\n",
convert_time(p2->saved->last_on), datastring);
}
}
ADDSTACK("Total login time : %s.\n", word_time(p2->total_login));
/* This is a (very poor) fix when truespod time becomes negative */
if (p2->total_idle_time > p2->total_login)
p2->total_idle_time = 0;
if (config_flags & cfUSETRUESPOD)
ADDSTACK("Truespod login time : %s.\n",
word_time(p2->total_login - p2->total_idle_time));
calc_spodlist();
ADDSTACK("Spodlist position : %d (out of %d)\n", find_spodlist_position(p2->name), people_in_spodlist());
if (p2->total_login && p2->first_login_date)
{
partic = ((float) p2->total_login / (float) (time(0) - p2->first_login_date)) * 100;
if (partic < 100)
ADDSTACK("Chronic spod factor : %.2f%%\n", partic);
else
ADDSTACK("Chronic spod factor : 100%%\n");
}
if (p2->age)
ADDSTACK("Years of age : %d\n", p2->age);
if (p2->birthday)
ADDSTACK("Date of birth : %s\n", birthday_string(p2->birthday));
if (p2->system_flags & NEW_MAIL)
ADDSTACK("Mailbox status : New mail received\n");
/* blimey -- added check for p->location, in case someone is using
finger from the login prompt */
if (p->location && p2->residency && (p == p2 || ((p->residency & (LOWER_ADMIN | ADMIN)) && p->location)
|| !(p2->custom_flags & PRIVATE_EMAIL) ||
(l && l->flags & FRIEND && p2->custom_flags & FRIEND_EMAIL)))
{
if (!(p2->email[0]))
ADDSTACK("Email address : Not set.\n");
else if (p2->email[0] == ' ')
ADDSTACK("Email address : Set as validated.\n");
else
{
ADDSTACK("Email address : %s", p2->email);
if (p2->custom_flags & FRIEND_EMAIL)
ADDSTACK(" (friends)\n");
else if (!(p2->custom_flags & PRIVATE_EMAIL))
ADDSTACK(" \n");
else
ADDSTACK(" (private)\n");
}
}
/* alt_email stolen for URL -- you probably knew that tho :P */
if (p2->alt_email[0])
ADDSTACK("WWW homepage URL : %s^N \n", p2->alt_email);
if (p2->icq)
ADDSTACK("ICQ number : %d\n", p2->icq);
if (p2->hometown[0])
ADDSTACK("Place of residency : %s^N \n", p2->hometown);
if (p2->residency & (BUILDER | MINISTER | SPECIALK | SU | ADMIN | SPOD))
ADDSTACK("Online Positions : ");
if (p2->residency & SPOD)
ADDSTACK("Spod ");
if (p2->residency & MINISTER)
ADDSTACK("Minister ");
if (p2->residency & BUILDER)
ADDSTACK("Builder ");
if (p2->residency & SPECIALK)
ADDSTACK("Creator ");
if (p2->residency & ADMIN)
ADDSTACK("Administrator ");
else if (p2->residency & SU)
ADDSTACK("Staff ");
if (p2->residency & (BUILDER | MINISTER | SPECIALK | SU | ADMIN | SPOD))
ADDSTACK("\n");
if (p2->system_flags & (MARRIED | FLIRT_BACHELOR | ENGAGED) || !(p2->system_flags & BACHELOR_HIDE))
{
ADDSTACK("Marital status : ");
stack = strchr(stack, 0);
if (p2->system_flags & MARRIED)
ADDSTACK("Happily net.married to %s\n", p2->married_to);
else if (p2->system_flags & ENGAGED)
ADDSTACK("Net.engaged to %s\n", p2->married_to);
else if (p2->system_flags & FLIRT_BACHELOR)
ADDSTACK("Horrible net.flirt =)\n");
else if (p2->gender == FEMALE)
ADDSTACK("Swinging net.bachelorette\n");
else
ADDSTACK("Swinging net.bachelor\n");
}
if (p2->ingredients[0])
{
switch (p2->gender)
{
case FEMALE:
ADDSTACK("She is made from : %s^N\n", p2->ingredients);
break;
case MALE:
ADDSTACK("He is made from : %s^N\n", p2->ingredients);
break;
default:
ADDSTACK("It is made from : %s^N\n", p2->ingredients);
break;
}
}
else
{
switch (p2->gender)
{
case FEMALE:
ADDSTACK("She is made from : %s^N\n", get_config_msg("female_made"));
break;
case MALE:
ADDSTACK("He is made from : %s^N\n", get_config_msg("male_made"));
break;
default:
ADDSTACK("It is made from : %s^N\n", get_config_msg("neuter_made"));
break;
}
}
if (p2->plan[0])
{
pstack_mid("plan");
ADDSTACK("%s^N \n", p2->plan);
}
if (p2->finger_message[0])
{
pstack_mid("finger message");
ADDSTACK("%s^N \n", p2->finger_message);
}
ENDSTACK(LINE);
tell_player(p, oldstack);
stack = oldstack;
if (config_flags & cfSHOWXED)
if (p->location && p != p2 && p2 != &dummy &&
!(p->residency & (ADMIN | CODER | HCADMIN)) &&
strcasecmp(p->name, "someone@intercom"))
TELLPLAYER(p2, " (%s just took a peek at your finger file)\n",
p->name);
}
/* ping information */
char *ping_string(player * p)
{
int i;
for (i = 0; ConnectionSpeeds[i].where[0]; i++)
if ((p->last_ping / 10000) <= (long) ConnectionSpeeds[i].length)
return ConnectionSpeeds[i].where;
return "Spanked!";
}
/* the examine command */
void newexamine(player * p, char *str)
{
player *p2;
char *oldstack = stack;
char first[MAX_SPODCLASS], *second;
list_ent *l = 0;
#ifdef INTERCOM
if (strchr(str, '@'))
{
do_intercom_examine(p, str);
return;
}
#endif
if (!*str || !strcasecmp("me", str))
p2 = p;
else
p2 = find_player_global(str);
if (!p2)
return;
if (p2->saved && p2->residency & LIST && !(p2->residency & NO_SYNC))
l = fle_from_save(p2->saved, p->lower_name);
else
l = 0;
if (p2->description[0])
{
ADDSTACK(LINE);
if (*p2->pretitle)
ADDSTACK("%s ", p2->pretitle);
if (emote_no_break(*p2->title))
ADDSTACK("%s%s^N \n", p2->name, p2->title);
else
ADDSTACK("%s %s^N \n", p2->name, p2->title);
pstack_mid("Description");
ADDSTACK("%s^N \n"
LINE, p2->description);
}
else
{
if (emote_no_break(*p2->title))
ADDSTACK(LINE
"%s %s%s^N \n" LINE, p2->pretitle, p2->name, p2->title);
else
ADDSTACK(LINE
"%s %s %s^N \n" LINE, p2->pretitle, p2->name, p2->title);
}
if (p == p2 || p->residency & SU || p2->custom_flags & PUBLIC_SITE ||
(l && l->flags & FRIEND && p2->custom_flags & FRIEND_SITE))
{
ADDSTACK("Site logged on from : %s (%s)", get_address(p2, p), p2->num_addr);
if (p2->custom_flags & FRIEND_SITE)
ADDSTACK(" (friends)\n");
else if (p2->custom_flags & PUBLIC_SITE)
ADDSTACK(" \n");
else
ADDSTACK(" (private)\n");
}
/* Connection speed */
ADDSTACK("Connection speed : %s (%ld.%02ld seconds lag time)\n", ping_string(p2), p2->last_ping / 1000000, (p2->last_ping / 10000) % 1000000);
if (p->jetlag)
ADDSTACK("Time logged on so far : %s\n"
"Time logged in : %s (Your time)\n",
word_time(time(0) - (p2->on_since)),
convert_time((p2->on_since + (p->jetlag * 3600))));
else
ADDSTACK("Time logged on so far : %s\n"
"Time logged in : %s (%s time)\n",
word_time(time(0) - (p2->on_since)), convert_time(p2->on_since),
get_config_msg("talker_name"));
ADDSTACK("Total login time : %s\n", word_time(p2->total_login));
/* A (very poor) fix when truespod time becomes negative */
if (p2->total_idle_time > p2->total_login)
p2->total_idle_time = 0;
if (config_flags & cfUSETRUESPOD)
ADDSTACK("Truespod login time : %s\n",
word_time(p2->total_login - p2->total_idle_time));
calc_spodlist();
ADDSTACK("Spodlist position : %d (out of %d)\n", find_spodlist_position(p2->name), people_in_spodlist());
if (p2->tag_flags & (BLOCK_TELLS | BLOCK_SHOUT | BLOCK_FRIENDS | SINGBLOCK))
{
ADDSTACK("Block modes active : ");
if (p2->tag_flags & BLOCK_SHOUT)
ADDSTACK("shouts, ");
if (p2->tag_flags & BLOCK_TELLS)
ADDSTACK("tells, ");
if (p2->tag_flags & BLOCK_FRIENDS && !(p2->tag_flags & BLOCK_TELLS))
ADDSTACK("friend tells, ");
if (p2->tag_flags & SINGBLOCK)
ADDSTACK("singing, ");
stack -= 2;
*stack++ = '.';
*stack++ = '\n';
}
if (p2->age)
{
ADDSTACK("Years of age : %d\n", p2->age);
}
if (p2->birthday)
{
ADDSTACK("Date of birth : %s\n", birthday_string(p2->birthday));
}
if (p2->residency && p2->saved && (p == p2 || p->residency & (LOWER_ADMIN | ADMIN)
|| !(p2->custom_flags & PRIVATE_EMAIL) ||
(l && l->flags & FRIEND && p2->custom_flags & FRIEND_EMAIL)))
{
if (!(p2->email[0]))
ADDSTACK("Email address : None set.\n");
else if (p2->email[0] == ' ')
ADDSTACK("Email address : Validated.\n");
else
{
ADDSTACK("Email address : %s", p2->email);
if (p2->custom_flags & FRIEND_EMAIL)
ADDSTACK(" (friends)\n");
else if (!(p2->custom_flags & PRIVATE_EMAIL))
ADDSTACK(" \n");
else
ADDSTACK(" (private)\n");
}
}
if (p2->icq)
ADDSTACK("ICQ number : %d\n", p2->icq);
if (p2->alt_email[0])
ADDSTACK("WWW homepage URL : %s^N \n", p2->alt_email);
if (p2->irl_name[0])
ADDSTACK("Also known as (irl) : %s^N \n", p2->irl_name);
if (p2->prs_record)
{
ADDSTACK("Paper Rock Scissors : ");
prs_record_display(p2);
}
if (p2->ttt_win + p2->ttt_loose + p2->ttt_draw != 0)
ADDSTACK("Tic Tac Toe : %d wins, %d losses, %d ties\n", p2->ttt_win, p2->ttt_loose, p2->ttt_draw);
if (p2->residency & (BUILDER | MINISTER | SPECIALK | SU | ADMIN | SPOD))
ADDSTACK("Online Positions : ");
if (p2->residency & SPOD)
ADDSTACK("Spod ");
if (p2->residency & MINISTER)
ADDSTACK("Minister ");
if (p2->residency & BUILDER)
ADDSTACK("Builder ");
if (p2->residency & SPECIALK)
ADDSTACK("Creator ");
if (p2->residency & ADMIN)
ADDSTACK("Administrator ");
else if (p2->residency & SU)
ADDSTACK("Staff ");
if (p2->residency & (BUILDER | MINISTER | SPECIALK | SU | ADMIN | SPOD))
ADDSTACK("\n");
if (p2->system_flags & (MARRIED | FLIRT_BACHELOR | ENGAGED)
|| !(p2->system_flags & BACHELOR_HIDE))
{
ADDSTACK("Marital status : ");
if (p2->system_flags & MARRIED)
ADDSTACK("Happily net.married to %s\n", p2->married_to);
else if (p2->system_flags & ENGAGED)
ADDSTACK("Net.engaged to %s\n", p2->married_to);
else if (p2->system_flags & FLIRT_BACHELOR)
ADDSTACK("Horrible net.flirt =)\n");
else if (p2->gender == FEMALE)
ADDSTACK("Swinging net.bachelorette\n");
else
ADDSTACK("Swinging net.bachelor\n");
}
strcpy(first, "");
second = 0;
if (p2->favorite1[0])
{
strcpy(first, p2->favorite1);
second = next_space(first);
*second++ = 0;
ADDSTACK("Favorite %-12.12s : %s^N \n", first, second);
}
strcpy(first, "");
second = 0;
if (p2->favorite2[0])
{
strcpy(first, p2->favorite2);
second = next_space(first);
*second++ = 0;
ADDSTACK("Favorite %-12.12s : %s^N \n", first, second);
}
strcpy(first, "");
second = 0;
if (p2->favorite3[0])
{
strcpy(first, p2->favorite3);
second = next_space(first);
*second++ = 0;
ADDSTACK("Favorite %-12.12s : %s^N \n", first, second);
}
if (p2->hometown[0])
ADDSTACK("Place of residence : %s^N \n", p2->hometown);
if (p2->ingredients[0])
{
switch (p2->gender)
{
case FEMALE:
ADDSTACK("She is made from : %s^N\n", p2->ingredients);
break;
case MALE:
ADDSTACK("He is made from : %s^N\n", p2->ingredients);
break;
default:
ADDSTACK("It is made from : %s^N\n", p2->ingredients);
break;
}
}
else
{
switch (p2->gender)
{
case FEMALE:
ADDSTACK("She is made from : %s^N\n", get_config_msg("female_made"));
break;
case MALE:
ADDSTACK("He is made from : %s^N\n", get_config_msg("male_made"));
break;
default:
ADDSTACK("It is made from : %s^N\n", get_config_msg("neuter_made"));
break;
}
}
check_clothing(p2);
ENDSTACK(LINE);
tell_player(p, oldstack);
stack = oldstack;
if (config_flags & cfSHOWXED)
if (p != p2 && !(p->residency & (ADMIN | CODER | HCADMIN)) && strcasecmp(p->name, "someone@intercom"))
TELLPLAYER(p2, " (%s just took a peek at your examine)\n",
p->name);
}
/* Dynamic Staff List by Silver */
int most_highest_priv(saved_player * sp)
{
if (sp->residency & CODER)
return CODER;
if (sp->residency & HCADMIN)
return HCADMIN;
if (sp->residency & ADMIN)
return ADMIN;
if (sp->residency & LOWER_ADMIN)
return LOWER_ADMIN;
if (sp->residency & ASU)
return ASU;
if (sp->residency & SU)
return SU;
if (sp->residency & PSU)
return PSU;
return BASE;
}
/* thought this would make things nice... ~phypor */
int greatest_common_factor(int x, int y)
{
int factor_x[51] =
{0};
int factor_y[51] =
{0};
int c, i;
/* factorize x */
for (i = 0, c = x; (c > 0 && i < 50); c--)
if (!(x % c))
factor_x[i++] = c;
/* factorize y */
for (i = 0, c = y; (c > 0 && i < 50); c--)
if (!(y % c))
factor_y[i++] = c;
i++;
/* get the gfc */
for (i = 0; i < 50; i++)
for (c = 0; c < 50; c++)
if (factor_x[i] == factor_y[c])
return factor_x[i];
return 1;
}
void staff_list(player * p, char *str)
{
char *oldstack = stack;
char temp[70];
int i = 1, counter, charcounter, flag = 0, len, numres = 0, numstaff = 0;
int ratio_staff = 0, ratio_res = 0, gcf, maxi = 8;
saved_player *scanlist, **hlist;
sprintf(temp, "%s Staff", get_config_msg("talker_name"));
pstack_mid(temp);
sprintf(stack, "\n");
stack = strchr(stack, 0);
/* Only psu's and above can see psu's listed on "staff" */
if (!(p->residency & (PSU | SU | ADMIN)))
maxi = 7;
for (i = 1; i < maxi; i++)
{
switch (i)
{
case 1:
sprintf(stack, "%-18.18s - ", get_config_msg("hc_name"));
stack = strchr(stack, 0);
break;
case 2:
sprintf(stack, "%-18.18s - ", get_config_msg("coder_name"));
stack = strchr(stack, 0);
break;
case 3:
sprintf(stack, "%-18.18s - ", get_config_msg("admin_name"));
stack = strchr(stack, 0);
break;
case 4:
sprintf(stack, "%-18.18s - ", get_config_msg("la_name"));
stack = strchr(stack, 0);
break;
case 5:
sprintf(stack, "%-18.18s - ", get_config_msg("asu_name"));
stack = strchr(stack, 0);
break;
case 6:
sprintf(stack, "%-18.18s - ", get_config_msg("su_name"));
stack = strchr(stack, 0);
break;
case 7:
sprintf(stack, "%-18.18s - ", get_config_msg("psu_name"));
stack = strchr(stack, 0);
break;
}
flag = 0;
len = 22;
numres = 0;
for (charcounter = 0; charcounter < 26; charcounter++)
{
hlist = saved_hash[charcounter];
for (counter = 0; counter < HASH_SIZE; counter++, hlist++)
for (scanlist = *hlist; scanlist; scanlist = scanlist->next)
{
switch (scanlist->residency)
{
case SYSTEM_ROOM:
case BANISHED:
case BANISHD:
break;
default:
numres++;
/*
if (((scanlist->residency & HCADMIN) && i == 1 &&
!(scanlist->residency & CODER)) ||
((scanlist->residency & CODER) && i == 2) ||
((scanlist->residency & ADMIN) && i == 3 &&
!(scanlist->residency & HCADMIN) &&
!(scanlist->residency & CODER)) ||
((scanlist->residency & LOWER_ADMIN) && i == 4 &&
!(scanlist->residency & ADMIN) &&
!(scanlist->residency & CODER)) ||
((scanlist->residency & ASU) && i == 5 &&
!(scanlist->residency & LOWER_ADMIN) &&
!(scanlist->residency & CODER)) ||
((scanlist->residency & SU) && i == 6 &&
!(scanlist->residency & ASU) &&
!(scanlist->residency & CODER)) ||
((scanlist->residency & PSU) && i == 7 &&
!(scanlist->residency & SU) &&
!(scanlist->residency & CODER)))
*/
if ((i == 1 && most_highest_priv(scanlist) == HCADMIN) ||
(i == 2 && most_highest_priv(scanlist) == CODER) ||
(i == 3 && most_highest_priv(scanlist) == ADMIN) ||
(i == 4 && most_highest_priv(scanlist) == LOWER_ADMIN) ||
(i == 5 && most_highest_priv(scanlist) == ASU) ||
(i == 6 && most_highest_priv(scanlist) == SU) ||
(i == 7 && most_highest_priv(scanlist) == PSU))
{
len += strlen(scanlist->lower_name) + 2;
if (len > 65)
{
sprintf(stack, "\n "); /* 22 spaces */
stack = strchr(stack, 0);
len = 22;
}
sprintf(stack, "%s, ", check_legal_entry(p, scanlist->lower_name, 0));
stack = strchr(stack, 0);
flag = 1;
numstaff++;
}
break;
}
}
}
if (flag)
{
stack--;
stack--;
sprintf(stack, ".\n");
}
else
sprintf(stack, "\n");
stack = strchr(stack, 0);
}
sprintf(stack, "\n");
stack = strchr(stack, 0);
/* Calculate ratios */
/* this got the lowest common factor
ratio_staff = numstaff;
ratio_res = numres;
for (i = 2; i <= numstaff; i++)
{
flag = 1;
while (flag)
{
if (ratio_res % i == 0 && ratio_staff % i == 0)
{
ratio_res /= i;
ratio_staff /= i;
flag = 1;
}
else
flag = 0;
}
}
*/
if (numstaff != 0)
{
gcf = greatest_common_factor(numres, numstaff);
ratio_staff = numstaff / gcf;
ratio_res = numres / gcf;
}
sprintf(temp, "%d staff listed (staff to resident ratio is %d:%d)", numstaff, ratio_staff, ratio_res);
pstack_mid(temp);
*stack++ = 0;
pager(p, oldstack);
stack = oldstack;
}