/* * examine.c */ #include <stdio.h> #include <ctype.h> #include <time.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <memory.h> #include "config.h" #include "player.h" #include "fix.h" /* externs */ extern int check_password(char *, char *, player *); extern char *crypt(char *, char *); extern void check_list_resident(player *); extern void check_list_newbie(char *); extern void destroy_player(), save_player(), password_mode_on(), password_mode_off(), sub_command(), extract_pipe_global(), tell_room(), extract_pipe_local(), pstack_mid(), prs_record_display(); extern player *find_player_global(), *find_player_absolute_quiet(), *find_player_global_quiet(); extern char *end_string(), *tag_string(), *next_space(), *do_pipe(), *full_name(), *caps(), *sys_time(); extern int global_tag(), emote_no_break(); extern file idle_string_list[]; extern saved_player *find_saved_player(); extern char *convert_time(time_t); extern char *gstring_possessive(player *); extern char *gstring(player *); extern void su_wall(char *), check_clothing(player *); extern char *number2string(int); extern char *get_gender_string(player *); extern char *havehas(player *); extern char *isare(player *); extern char *waswere(player *); extern char *word_time(int); extern char *time_diff(int), *time_diff_sec(time_t, int); extern char sess_name[]; extern int session_reset; extern list_ent *fle_from_save(); extern void ADDSTACK(), ENDSTACK(), TELLPLAYER(); #ifdef TRACK extern int addfunction(char *); #endif /* show what somone can do */ void privs(player * p, char *str) { char *oldstack = stack, name[MAX_NAME + 2], *first; int priv, who = 0; player *p2; player dummy; #ifdef TRACK sprintf(functionin,"privs(%s , SOMETHING)",p->name); addfunction(functionin); #endif /* 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 */ ADDSTACK(" Permissions for %s.\n", name); } else /* the person wants their own privs */ /* so get person's own privs :-) */ priv = p->residency; /* 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"); 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->system_flags & MINISTER) ADDSTACK(" You can perform net-marriages.\n"); if (p->system_flags & BUILDER) ADDSTACK(" You can create elaborate objects.\n"); if (priv & SPOD) ADDSTACK(" You are a spod (but you already KNEW that)\n"); if (priv & NO_TIMEOUT) ADDSTACK(" You will never time-out.\n"); if (priv & PSU) ADDSTACK(" You can see the SU channel.\n"); if (priv & REGULAR_STYLE_CHAN) ADDSTACK(" You are using normal channel commands.\n"); if (priv & FOREST_STYLE_CHAN) ADDSTACK(" You are using forest style commands...\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"); if (priv & SU && !(priv & (ASU | LOWER_ADMIN | ADMIN | HCADMIN))) ADDSTACK(" You are a superuser-in-training.\n"); if (priv & ASU && !(priv & (LOWER_ADMIN | ADMIN | HCADMIN))) ADDSTACK(" You are a Super User.\n"); if (priv & LOWER_ADMIN && !(priv & (ADMIN | HCADMIN))) ADDSTACK(" You are a lower admin.\n"); if (priv & ADMIN && !(priv & HCADMIN)) ADDSTACK(" You are an admin/spoon.\n"); if (priv & HCADMIN) ADDSTACK(" You are a hard-coded admin/spoon.\n"); if (priv & HOUSE) ADDSTACK(" You witnessed the Great OL/DL disaster of '94.\n"); } if (who == 1) /* privs for someone else */ { { if (priv & BASE) ADDSTACK( "%s %s resident.\n",name, isare(p2)); else ADDSTACK("%s %s not resident! EEK!\n",name, isare(p2)); if (priv & LIST) ADDSTACK( "%s %s a list.\n", name, havehas(p2)); else ADDSTACK( "%s %s no 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 %s happily net-married to %s.\n", name, isare(p2), p2->married_to); if (priv & SPOD) if(p2->gender == PLURAL) ADDSTACK( "%s are sad spods.\n", name); else ADDSTACK( "%s is a sad spod.\n", name); if (p2->system_flags & MINISTER) ADDSTACK("%s can perform net-marriages.\n", name); if (p2->system_flags & BUILDER) ADDSTACK("%s can create amazing items.\n", name); if (priv & GIT) ADDSTACK("%s cant do much but sit back and enjoy the view.\n", name); if (priv & PROTECT) ADDSTACK("%s %s carrying a golden parachute.\n", name, isare(p2)); if (priv & NO_TIMEOUT) ADDSTACK("%s will never time-out.\n",name); if (priv & PSU) ADDSTACK("%s can see the SU channel.\n",name); if (priv & FOREST_STYLE_CHAN) ADDSTACK("%s is using forest style channel commands *sigh*\n", name); if (priv & REGULAR_STYLE_CHAN) ADDSTACK("%s is using NORMAL channel commands.\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); if (priv & SU) if (p2->gender == PLURAL) ADDSTACK("%s are superusers-in-training.\n",name); else ADDSTACK("%s is a superuser-in-training.\n",name); if (priv & ASU) if (p2->gender == PLURAL) ADDSTACK("%s are full superusers.\n",name); else ADDSTACK("%s is a full superuser.\n",name); if (priv & LOWER_ADMIN) if (p2->gender == PLURAL) ADDSTACK("%s are lower admins.\n",name); else ADDSTACK("%s is a lower admin.\n",name); if (priv & ADMIN) if (p2->gender == PLURAL) ADDSTACK("%s are admins/spoons.\n",name); else ADDSTACK("%s is an admin/spoon.\n",name); if (priv & HCADMIN) if (p2->gender == PLURAL) ADDSTACK("%s are hard-coded admins/spoons.\n",name); else ADDSTACK("%s is a hard-coded admin/spoon.\n",name); if (priv & HOUSE) if (p2->gender == PLURAL) ADDSTACK("%s have been around the block a few times.\n",name); else ADDSTACK("%s has been around the block a few times.\n",name); } } /* finish off the end of the chunk of data */ ENDSTACK("-----------------------------------\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; #ifdef TRACK sprintf(functionin,"friend_finger (%s , SOMETHING)",p->name); addfunction(functionin); #endif 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, 0); stack = oldstack; return; } /* command to list pinfo about a saved person */ void pinfo_saved_player(player * p, char *str) { player dummy, *p2; char *oldstack; #ifdef TRACK sprintf(functionin,"check_info (%s , SOMETHING)",p->name); addfunction(functionin); #endif oldstack = stack; 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; } stack = strchr(stack, 0); oldstack = stack; sprintf(stack, " Listing pinfo for %s (logged out atm).\n" "======================================================\n" "ENTERMSG :%s %s\nIGNOREMSG: %s \nLOGONMSG :%s %s\n" "LOGOFFMSG:%s %s\nBLOCKMSG :%s %s\nEXITMSG :%s %s\n" "======================================================\n", dummy.name, dummy.name, dummy.enter_msg, dummy.ignore_msg, dummy.name, dummy.logonmsg, dummy.name, dummy.logoffmsg, dummy.name, dummy.blockmsg, dummy.name, dummy.exitmsg); stack = strchr(stack, 0); *stack++ = 0; tell_player(p, oldstack); stack = oldstack; } void pinfo_command(player * p, char *str) { player dummy, *p2; char *oldstack; #ifdef TRACK sprintf(functionin,"pinfo_command (%s , SOMETHING)",p->name); addfunction(functionin); #endif oldstack = stack; if ((*str) && (p->residency & SU)) { p2 = find_player_absolute_quiet(str); if (!p2) { pinfo_saved_player(p, str); return; } else { strcpy(stack, "========================================================" "=====================\n"); stack = strchr(stack, 0); sprintf(stack, " Pinfo for %s. \n", p2->name); stack = strchr(stack, 0); } } else { p2 = p; strcpy(stack, "=====================================================" "======================\n Your Pinfo...\n"); stack = strchr(stack, 0); } strcpy(stack, "========================================================" "===================\n"); stack = strchr(stack, 0); if (p2 == p || p->residency & SU) { if(emote_no_break(*p2->enter_msg)) sprintf(stack, "Your entermsg is ...\n %s%s\n", p2->name, p2->enter_msg); else sprintf(stack, "Your entermsg is ...\n %s %s\n", p2->name, p2->enter_msg); stack = strchr(stack, 0); } if ((p2 == p || p->residency & LOWER_ADMIN) && p2->residency & BASE) { if (strlen(p2->ignore_msg) > 0) sprintf(stack, "Your ignoremsg is set to ...\n %s\n", p2->ignore_msg); else strcpy(stack, "You have not set an ignoremsg yet ...\n"); stack = strchr(stack, 0); } if ((p2 == p || p->residency & SU) && p2->residency & BASE) { if (strlen(p2->logonmsg) > 0) { if(emote_no_break(*p2->logonmsg)) sprintf(stack, "Your logonmsg is set to ...\n %s%s\n", p2->name, p2->logonmsg); else sprintf(stack, "Your logonmsg is set to ...\n %s %s\n", p2->name, p2->logonmsg); } else strcpy(stack, "You have not set a logonmsg yet ...\n"); stack = strchr(stack, 0); } if ((p2 == p || p->residency & SU) && p2->residency & BASE) { if (strlen(p2->logoffmsg) > 0) { if(emote_no_break(*p2->logoffmsg)) sprintf(stack, "Your logoffmsg is set to ...\n %s%s\n", p2->name, p2->logoffmsg); else sprintf(stack, "Your logoffmsg is set to ...\n %s %s\n", p2->name, p2->logoffmsg); } else strcpy(stack, "You have not set a logoffmsg yet ...\n"); stack = strchr(stack, 0); } if (0 && (p2 == p || p->residency & SU) && p2->residency & BASE) { if (strlen(p2->blockmsg) > 0) { if(emote_no_break(*p2->blockmsg)) sprintf(stack, "Your blockmsg is set to ...\n %s%s\n", p2->name, p2->blockmsg); else sprintf(stack, "Your blockmsg is set to ...\n %s %s\n", p2->name, p2->blockmsg); } else strcpy(stack, "You have not set a blockmsg yet ...\n"); stack = strchr(stack, 0); } if ((p2 == p || p->residency & SU) && p2->residency & BASE) { if (strlen(p2->exitmsg) > 0) { if(emote_no_break(*p2->exitmsg)) sprintf(stack, "Your exitmsg is ...\n %s%s\n", p2->name, p2->exitmsg); else sprintf(stack, "Your exitmsg is ...\n %s %s\n", p2->name, p2->exitmsg); } else strcpy(stack, "You have no exitmsg set.\n"); stack = strchr(stack, 0); } strcpy(stack, "========================================================" "===================\n"); 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; #ifdef TRACK sprintf(functionin,"finger (%s , SOMETHING)",p->name); addfunction(functionin); #endif 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, "================================================" "===========================\n" "%s %s \n" "================================================" "===========================\n", 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 %s been logged in for %s since\n%s.\n", full_name(p2), havehas(p2), word_time(time(0) - (p2->on_since)), convert_time(p2->on_since)); } else if (p2->saved) { if (p->jetlag) { sprintf(stack, "%s %s last seen at %s. (Your time)\n", p2->name, waswere(p2), convert_time(jettime)); } else { sprintf(stack, "%s %s last seen at %s.\n", p2->name, waswere(p2), 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 %s spent 100%% of the time in a main room.\n", p2->name, havehas(p2)); else sprintf(stack, "%s %s spent %.2f%% of the time in a main room.\n", p2->name, havehas(p2), partic); } else sprintf(stack, "%s %s spent no time at all in main rooms.\n", p2->name, havehas(p2)); stack = strchr(stack, 0); if (p2->warn_count) { sprintf(stack, "%s %s been warned %d times.\n", p2->name, havehas(p2), p2->warn_count); } stack = strchr(stack, 0); if (p2->booted_count) { sprintf(stack, "%s %s been booted or jailed %d times.\n", p2->name, havehas(p2), p2->booted_count); } stack = strchr(stack, 0); if (p2->idled_out_count) { sprintf(stack, "%s %s idled out of the program %d times.\n", p2->name, havehas(p2), p2->idled_out_count); } stack = strchr(stack, 0); if (p2->eject_count) { sprintf(stack, "%s %s been kicked off the program %d times.\n", p2->name, havehas(p2), 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 (p2->git_string[0]) { pstack_mid(p2->git_by); sprintf(stack, "%s\n", p2->git_string); stack = strchr(stack, 0); } strcpy(stack, "========================================================" "===================\n"); stack = end_string(stack); tell_player(p, oldstack); stack = oldstack; } void su_stats(player * p, char *str) { player dummy, *p2; char *oldstack; int jettime; #ifdef TRACK sprintf(functionin,"finger (%s , SOMETHING)",p->name); addfunction(functionin); #endif oldstack = stack; if (!*str) { tell_player(p, " Format: z <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; } } if (!(p2->residency & PSU)) { tell_player(p, " That person isn't an su..\n"); return; } sprintf(stack, "================================================" "===========================\n" "%s %s \n" "================================================" "===========================\n", 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 %s been logged in for %s since\n%s.\n", full_name(p2), havehas(p2), word_time(time(0) - (p2->on_since)), convert_time(p2->on_since)); } else if (p2->saved) { if (p->jetlag) { sprintf(stack, "%s %s last seen at %s. (Your time)\n", p2->name, waswere(p2), convert_time(jettime)); } else { sprintf(stack, "%s %s last seen at %s.\n", p2->name, waswere(p2), 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->num_ressied) { sprintf(stack, "%s %s granted residency to %d people.\n", p2->name, havehas(p2), p2->num_ressied); } stack = strchr(stack, 0); if (p2->num_warned) { sprintf(stack, "%s %s warned %d people.\n", p2->name, havehas(p2), p2->num_warned); } stack = strchr(stack, 0); if (p2->idled_out_count) { sprintf(stack, "%s %s idled out of the program %d times.\n", p2->name, havehas(p2), p2->idled_out_count); } stack = strchr(stack, 0); if (p2->num_ejected) { sprintf(stack, "%s %s kicked %d gits off the program.\n", p2->name, havehas(p2), 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); strcpy(stack, "========================================================" "===================\n"); stack = end_string(stack); tell_player(p, oldstack); stack = oldstack; } void newfinger(player * p, char *str) { player dummy, *p2; char *oldstack, datastring[15]; int jettime, overtime; float partic; list_ent *l; #ifdef TRACK sprintf(functionin,"finger (%s , SOMETHING)",p->name); addfunction(functionin); #endif oldstack = stack; if (!*str) { tell_player(p, " Format: finger <player>\n"); return; } if (!strcasecmp(str, "friends")) { friend_finger(p); 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; } } 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"); 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; } } if (emote_no_break(*p2->title)) ADDSTACK("================================================" "===========================\n%s %s%s \n" "=================================================" "==========================\n", p2->pretitle, p2->name, p2->title); else ADDSTACK("================================================" "===========================\n%s %s %s \n" "=================================================" "==========================\n", p2->pretitle, p2->name, p2->title); if (p->jetlag) { overtime = p2->on_since + (p->jetlag * 3600); strcpy(datastring, "(Your time)"); } else { overtime = p2->on_since; strcpy(datastring, "(PG time)"); } if (p2->saved) { jettime = p2->saved->last_on + (p->jetlag * 3600); } else { jettime = 0; } if (p2 != &dummy) { ADDSTACK("Time on PG so far : %s\nLogged onto PG 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\n", convert_time(p2->saved->last_on), datastring); } } ADDSTACK("Total login time : %s.\n", word_time(p2->total_login)); ADDSTACK("Truespod login time : %s.\n", word_time(p2->total_login - p2->total_idle_time)); 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 recieved\n"); if (p2->residency && (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 : 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", p2->alt_email); if (p2->hometown[0]) ADDSTACK("Place of residency : %s \n", p2->hometown); if (p2->system_flags & (BUILDER|MINISTER) || p2->residency & (SU|ADMIN)) ADDSTACK("Online Positions : "); if (p2->system_flags & MINISTER) ADDSTACK("Minister "); if (p2->system_flags & BUILDER) ADDSTACK("Builder "); if (p2->residency & SU) ADDSTACK("Staff "); if (p2->residency & ADMIN) ADDSTACK("Administrator "); if (p2->system_flags & (BUILDER|MINISTER) || p2->residency & (SU|ADMIN)) 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", p2->ingredients); break; case MALE: ADDSTACK("He is made from : %s \n", p2->ingredients); break; case PLURAL: ADDSTACK("They are made from : %s \n", p2->ingredients); break; default: ADDSTACK("It is made from : %s \n", p2->ingredients); break; } } else { switch (p2->gender) { case FEMALE: ADDSTACK("She is made from : Sugar and spice and everything nice.\n"); break; case MALE: ADDSTACK("He is made from : Snakes and snails and puppy dog tails.\n"); break; case PLURAL: ADDSTACK("They are made from : Um.. everything but the kitchen sink...\n"); break; default: ADDSTACK("It is made from : If you knew it would have to kill you....\n"); break; } } if (p2->plan[0]) { pstack_mid("plan"); ADDSTACK("%s \n", p2->plan); } ENDSTACK("========================================================" "===================\n"); tell_player(p, oldstack); stack = oldstack; } /* the examine command */ void newexamine(player * p, char *str) { player *p2; char *oldstack; char first[MAX_SPODCLASS], *second; list_ent *l = 0; #ifdef TRACK sprintf(functionin,"examine (%s , SOMETHING)",p->name); addfunction(functionin); #endif oldstack = stack; if (!*str) { tell_player(p, " Format: examine <player>\n"); return; } if (!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]) { if (emote_no_break(*p2->title)) ADDSTACK("===========================================================================\n%s %s%s \n" , p2->pretitle, p2->name, p2->title); else ADDSTACK("===========================================================================\n%s %s %s \n" , p2->pretitle, p2->name, p2->title); pstack_mid("desc"); ADDSTACK("%s \n" "======================================================" "=====================\n", p2->description); } else { if (emote_no_break(*p2->title)) ADDSTACK("===========================================================================\n" "%s %s%s \n===========================================================================\n", p2->pretitle, p2->name, p2->title); else ADDSTACK("===========================================================================\n" "%s %s %s \n===========================================================================\n", 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)", p2->inet_addr, 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"); } 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 (PG time)\n", word_time(time(0) - (p2->on_since)), convert_time(p2->on_since)); ADDSTACK("Total login time : %s\n", word_time(p2->total_login)); ADDSTACK("Truespod login time : %s\n", word_time(p2->total_login - p2->total_idle_time)); 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->irl_name[0]) ADDSTACK("Also known as (irl) : %s \n", p2->irl_name); if (p2->alt_email[0]) ADDSTACK("WWW homepage URL : %s \n", p2->alt_email); if (p2->prs_record) { ADDSTACK("Paper Rock Scissors : "); prs_record_display(p2); } if (p2->system_flags & (BUILDER|MINISTER) || p2->residency & (SU|ADMIN)) ADDSTACK("Online Positions : "); if (p2->system_flags & MINISTER) ADDSTACK("Minister "); if (p2->system_flags & BUILDER) ADDSTACK("Builder "); if (p2->residency & SU) ADDSTACK("Staff "); if (p2->residency & ADMIN) ADDSTACK("Administrator "); if (p2->system_flags & (BUILDER|MINISTER) || p2->residency & (SU|ADMIN)) 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", 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", 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", first, second); } if(p2->hometown[0]) ADDSTACK("Place of residence : %s \n", p2->hometown); if (p2->ingredients[0]) { switch (p2->gender) { case FEMALE: ADDSTACK("She is made from : %s \n", p2->ingredients); break; case MALE: ADDSTACK("He is made from : %s \n", p2->ingredients); break; case PLURAL: ADDSTACK("They are made from : %s \n", p2->ingredients); break; default: ADDSTACK("It is made from : %s \n", p2->ingredients); break; } } else { switch (p2->gender) { case FEMALE: ADDSTACK("She is made from : Sugar and spice and everything nice.\n"); break; case MALE: ADDSTACK("He is made from : Snakes and snails and puppy dog tails.\n"); break; case PLURAL: ADDSTACK("They are made from : Um.. everything but the kitchen sink...\n"); break; default: ADDSTACK("It is made from : If you knew it would have to kill you....\n"); break; } } check_clothing(p2); ENDSTACK("========================================================" "===================\n"); tell_player(p, oldstack); stack = oldstack; }