/*
* session.c
*/
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include "config.h"
#include "player.h"
#include "fix.h"
extern char session[];
extern int session_reset;
extern player *p_sess;
extern char sess_name[];
extern char *end_string(char *);
extern char *word_time(int);
void set_session(player * p, char *str)
{
char *oldstack;
time_t t;
player *scan;
int wait, yessu = 0;
oldstack = stack;
t = time(0);
if (session_reset)
wait = session_reset - (int) t;
else
wait = 0;
if (wait < 0)
wait = 0;
if (strlen(session) == 0)
{
strncpy(session, "Set Me Please", MAX_SESSION - 3);
strcpy(sess_name, "No-One");
}
if (!*str)
{
sprintf(stack, " The session is currently '%s'\n", session);
stack = strchr(stack, 0);
sprintf(stack, " It was set by %s, and can be reset in %s.\n",
sess_name, word_time(wait));
stack = end_string(stack);
tell_player(p, oldstack);
stack = oldstack;
return;
}
if (wait > 0 /* && p != p_sess */)
{
sprintf(stack, " Session can be reset in %s\n", word_time(wait));
stack = end_string(stack);
tell_player(p, oldstack);
stack = oldstack;
return;
}
if (strlen(str) > 55)
{
tell_player(p, " Too long a session name ...\n");
stack = oldstack;
return;
}
if (strstr(str, "^"))
sprintf(session, "%s^N", str);
else
sprintf(session, "%s", str);
sprintf(stack, " You reset the session message to be '%s^N'\n", str);
stack = end_string(stack);
tell_player(p, oldstack);
/* reset comments */
for (scan = flatlist_start; scan; scan = scan->flat_next)
strncpy(scan->comment, "", MAX_COMMENT - 3);
stack = oldstack;
sprintf(stack, "%s set%s the session to be '%s'\n", p->name,
single_s(p), str);
stack = end_string(stack);
command_type |= EVERYONE;
for (scan = flatlist_start; scan; scan = scan->flat_next)
if (scan != p && !(scan->custom_flags & YES_SESSION))
tell_player(scan, oldstack);
stack = oldstack;
if (strcmp(sess_name, p->name) || wait <= 0)
session_reset = t + (60 * 12);
p_sess = p;
strcpy(sess_name, p->name);
sprintf(stack, "%s- %s", p->name, session);
stack = end_string(stack);
log("session", oldstack);
stack = oldstack;
}
void reset_session(player * p, char *str)
{
char *oldstack;
player *scan;
time_t t;
int wait, yessu = 0;
oldstack = stack;
if (*str)
{
if(strstr(str, "^"))
sprintf(session, "%s^N", str);
else
sprintf(session, "%s", str);
sprintf(stack, " You reset the session message to be '%s^N'\n", str);
stack = end_string(stack);
tell_player(p, oldstack);
/* reset comments */
for (scan = flatlist_start; scan; scan = scan->flat_next)
strncpy(scan->comment, "", MAX_COMMENT - 3);
stack = oldstack;
sprintf(stack, "%s reset%s the session to be '%s'\n", p->name,
single_s(p),str);
stack = end_string(stack);
command_type |= EVERYONE;
for (scan = flatlist_start; scan; scan = scan->flat_next)
if (scan != p && !(scan->custom_flags & YES_SESSION))
tell_player(scan, oldstack);
stack = oldstack;
p_sess = p;
strcpy(sess_name, p->name);
sprintf(stack, "%s- %s", p->name, session);
stack = end_string(stack);
log("session", oldstack);
stack = oldstack;
}
session_reset = 0;
tell_player(p, " Session timer reset.\n");
}
void set_comment(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " You reset your session comment.\n");
strncpy(p->comment, "", MAX_COMMENT - 3);
return;
}
strncpy(p->comment, str, MAX_COMMENT - 3);
sprintf(stack, " You set your session comment to be '%s'\n", p->comment);
stack = end_string(stack);
tell_player(p, oldstack);
stack = oldstack;
}
/*
* void view_session(player *p,char *str) { char *oldstack,middle[80]; player
* *scan; int page,pages=0,count; oldstack=stack;
*
* page=atoi(str); if (page<=0) page=1; page--;
*
* comment out line pages=(current_players-1)/(TERM_LINES-2);
*
* for (scan=flatlist_start;scan;scan=scan->flat_next) if (scan->comment[0]!=0 ||
* scan==p_sess) pages++;
*
* if (page>pages) page=pages;
*
* if (strlen(session)==0) strncpy(session,"not set",MAX_SESSION-2);
*
* strcpy(middle,session);
*
* pstack_mid(middle);
*
* count=page*(TERM_LINES-2); for(scan=flatlist_start;count;scan=scan->flat_next)
* if (!scan) { tell_player(p,"Bad who listing, abort.\n"); log("error","Bad
* who list (session.c)"); stack=oldstack; return; } else if (scan->name[0])
* count--; for(count=0;(count<(TERM_LINES-1) && scan);scan=scan->flat_next)
* if ((scan->name[0] && scan->location) && (scan==p_sess ||
* scan->comment[0]!=0)) { if (scan==p_sess) sprintf(stack,"%-20s*
* %s\n",scan->name,scan->comment); else sprintf(stack,"%-20s-
* %s\n",scan->name,scan->comment); stack=strchr(stack,0); count++; }
*
* sprintf(middle,"Page %d of %d",page+1,pages+1); pstack_mid(middle); stack++=0;
* if (count) tell_player(p,oldstack); else { stack=oldstack;
* sprintf(stack,"Noone has commented on the session '%s'\n",session);
* stack=end_string(stack); tell_player(p,oldstack); } stack=oldstack; }
*/
void view_session(player * p, char *str)
{
char *oldstack, middle[80];
player *scan;
int page, pages, count;
oldstack = stack;
page = atoi(str);
if (page <= 0)
page = 1;
page--;
pages = (current_players - 1) / (TERM_LINES - 2);
if (page > pages)
page = pages;
if (strlen(session) == 0) {
strncpy(session, "Set Me Please", MAX_SESSION - 3);
strcpy(sess_name, "No-One");
}
strcpy(middle, session);
pstack_mid(middle);
count = page * (TERM_LINES - 2);
for (scan = flatlist_start; count; scan = scan->flat_next)
if (!scan)
{
tell_player(p, " Bad who listing, abort.\n");
log("error", "Bad who list (session.c)");
stack = oldstack;
return;
} else if (scan->name[0])
count--;
for (count = 0; (count < (TERM_LINES - 1) && scan); scan = scan->flat_next)
if (scan->name[0] && scan->location)
{
/*
if (scan == p_sess)
*/
if (!strcasecmp(sess_name, scan->lower_name))
sprintf(stack, "%-19s*", scan->name);
else
sprintf(stack, "%-19s ", scan->name);
stack = strchr(stack, 0);
if (scan->misc_flags & SYSTEM_COLOR)
{
if (scan->misc_flags & NOCOLOR)
strcpy(stack, "S ");
else
strcpy(stack, "+ ");
}
else
{
if (scan->misc_flags & NOCOLOR)
strcpy(stack, "- ");
else
strcpy(stack, "C ");
}
stack = strchr(stack, 0);
strcpy(stack, scan->comment);
stack = strchr(stack, 0);
*stack++ = '\n';
count++;
}
sprintf(middle, "Page %d of %d", page + 1, pages + 1);
pstack_mid(middle);
*stack++ = 0;
tell_player(p, oldstack);
stack = oldstack;
}
/* new version of view_session, to try and show only those who have commented
Hope this works... */
void comments(player * p, char *str)
{
player *scan,*start;
int pages=1,page,line;
char *oldstack,middle[80];
oldstack=stack;
if (strlen(str)<1)
page=1;
else
page=atoi(str);
if (page<1)
{
tell_player (p," Usage : comments [<pagenumber>]\n");
return;
}
scan=flatlist_start;
start=NULL;
line=0;
for (scan = flatlist_start; scan; scan = scan->flat_next)
{
if (pages<=page && line==0)
start=scan;
if (scan->comment[0] != 0)
line++;
if (line>TERM_LINES-2)
{
line=0;
pages++;
}
}
if (page>pages)
page=pages;
if (strlen(session)<1) {
strncpy(session, "Set Me Please", MAX_SESSION - 3);
strcpy(sess_name, "No-One");
}
pstack_mid(session);
line=0;
for (; start; start = start->flat_next)
{
if (line>TERM_LINES)
break;
if (start->comment[0]!=0)
{
if (!strcasecmp(sess_name, start->lower_name))
sprintf(stack, "%-19s*", start->name);
else
sprintf(stack, "%-19s ", start->name);
stack = strchr(stack, 0);
if (start->misc_flags & SYSTEM_COLOR)
{
if (start->misc_flags & NOCOLOR)
strcpy(stack, "S ");
else
strcpy(stack, "+ ");
}
else
{
if (start->misc_flags & NOCOLOR)
strcpy(stack, "- ");
else
strcpy(stack, "C ");
}
strcat(stack, start->comment);
stack = strchr(stack, 0);
*stack++ = '\n';
line++;
}
}
sprintf(middle, "Page %d of %d", page,pages);
pstack_mid(middle);
*stack++ = 0;
tell_player(p, oldstack);
stack = oldstack;
return;
#ifdef 0
char *oldstack, middle[80];
player *scan, *start;
int page, pages, count, count2;
oldstack = stack;
/* work out where to start the page on...
Basically count down n multiples of TERM_LINES-2 and then have a
pointer left to there */
/* set up a count and the initial value of the pointer to start
listing from */
count = 0;
start = flatlist_start;
/* count down the list, setting start to be the top of the page each
time, ie the (n * (TERMLINES -2))th person to have set a comment */
ccount = 0; /* the count of people who have commented */
scan = flatlist_start; /* current person being checked */
/* count the number of peeps who have commented */
/* ASSUMPTION: that the flatlist_start list is NULL terminated */
/* the original view_session had a check for a damaged who list
by checking that current_players matched the number of people
processed. This is not implemented here */
for (scan = flatlist_start; scan; scan = scan->flat_next)
if (scan->comment[0] != 0) ccount++;
/* work out number of pages */
pages = (ccount / (TERM_LINES -2)) + 1;
/* find out which page we want */
page = atoi(str);
if (page <= 0)
page = 1;
/* check for page > pages and correct if so */
if (page > pages)
page = pages;
/* now look down until we find the first comment for the page */
count = 0;
for (start = flatlist_start; (page * (TERM_LINES -2) - count); count++)
start = start->flatlist_next;
/* fix session if it is not set */
if (strlen(session) == 0) {
strncpy(session, "Set Me Please", MAX_SESSION - 3);
strcpy(sess_name, "No-One");
}
/* build the start of the text on the stack */
strcpy(middle, session);
pstack_mid(middle);
/* build each comment line */
/* build footer */
#endif
}
/* REPLYS */
/* save a list of who sent you the last list of names, for reply */
void make_reply_list(player * p, player ** list, int matches, int friend)
{
char *oldstack, *send, *mark, *scan;
player **step;
time_t t;
int i, count, timeout;
oldstack = stack;
t = time(0);
timeout = t + (2 * 60);
if (matches < 2)
return;
sprintf(stack, "%s.,", p->lower_name);
count = strlen(stack);
stack = strchr(stack, 0);
for (step = list, i = 0; i < matches; i++, step++)
if (*step != p)
{
count += (strlen((*step)->lower_name) + 1);
if (count < (MAX_REPLY - 2))
{
sprintf(stack, "%s.,", (*step)->lower_name);
stack = strchr(stack, 0);
} else
log("reply", "Too longer reply string !!!");
}
stack = end_string(stack);
/* should have string in oldstack */
send = stack;
for (step = list, i = 0; i < matches; i++, step++, mark = 0)
{
char buffer[50];
sprintf(buffer,".,%s.,",(*step)->lower_name);
mark = strstr(oldstack, buffer);
if (mark)
mark +=2;
if (!mark)
{
sprintf(buffer,"%s.,",(*step)->lower_name);
mark=strstr(oldstack, buffer);
if (mark!=oldstack)
mark=0;
}
if (!mark)
{
log("reply", "Can't find player in reply string!!");
return;
}
for (scan = oldstack; scan != mark;)
*stack++ = *scan++;
while (*scan != ',')
scan++;
scan++;
while (*scan)
*stack++ = *scan++;
*stack = 0;
strcpy((*step)->reply, send);
(*step)->reply_time = timeout;
stack = send;
}
}
/* Reply command itself */
void reply(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: reply <msg>\n");
return;
}
if (!*(p->reply) || (p->reply_time < (int) time(0)))
{
tell_player(p, " You don't have anyone to reply to!\n");
return;
}
sprintf(stack, "%s ", p->reply);
stack = strchr(stack, 0);
strcpy(stack, str);
stack = end_string(stack);
sys_flags |= REPLY_TAG;
tell(p, oldstack);
stack = oldstack;
sys_flags &= ~REPLY_TAG;
}
/* And the emote reply command itself */
void ereply(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: ereply <msg>\n");
return;
}
if (!*(p->reply) || (p->reply_time < (int) time(0)))
{
tell_player(p, " You don't have anyone to reply to!\n");
return;
}
sprintf(stack, "%s ", p->reply);
stack = strchr(stack, 0);
strcpy(stack, str);
stack = end_string(stack);
sys_flags |= REPLY_TAG;
remote(p, oldstack);
stack = oldstack;
sys_flags &= ~REPLY_TAG;
}
/*
* Well, hopefully this WILL remove the player from all reply strings they are
* in
*/
void reply_remove_me(player * p, char *str)
{
/*
* We need to remove p's name from all the lists they are in, which should
* be all the ppl they have in their reply string. So cycle through those
* and remove this player
*/
}
void report_idea(player * p, char *str)
{
/* char *oldstack; */
if (!*str)
{
tell_player(p, " Format: idea <whatever you thought of>\n");
return;
}
if (strlen(str) > 240)
{
tell_player(p, " Make it a little smaller.\n");
return;
}
tell_player(p, " Idea logged, thank you.\n");
/* oldstack = stack;
sprintf(stack, "%s . o O ( %s )", p->name, str);
stack = end_string(stack);
log("idea", oldstack);
stack = oldstack; */
LOGF("idea", "%s - %s ", p->name, str);
}
void report_error(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: bug <whatever the sodding bug is>\n");
return;
}
if (strlen(str) > 240)
{
tell_player(p, " Make it a little smaller.\n");
return;
}
tell_player(p, " Your bug report has been logged, and will be looked into by an admin soon.\n");
oldstack = stack;
sprintf(stack, "%s: %s", p->name, str);
stack = end_string(stack);
log("bug", oldstack);
stack = oldstack;
}
void show_exits(player * p, char *str)
{
if (p->custom_flags & SHOW_EXITS)
{
tell_player(p, " You won't see exits when you enter a room now.\n");
p->custom_flags &= ~SHOW_EXITS;
} else
{
tell_player(p, " When you enter a room you will now see the exits.\n");
p->custom_flags |= SHOW_EXITS;
}
}
/* And the think reply command itself */
void treply(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: treply <msg>\n");
return;
}
if (!*(p->reply) || (p->reply_time < (int) time(0)))
{
tell_player(p, " You don't have anyone to reply to!\n");
return;
}
sprintf(stack, "%s ", p->reply);
stack = strchr(stack, 0);
strcpy(stack, str);
stack = end_string(stack);
sys_flags |= REPLY_TAG;
remote_think(p, oldstack);
stack = oldstack;
sys_flags &= ~REPLY_TAG;
}
/* And the premote reply command itself */
void preply(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: preply <msg>\n");
return;
}
if (!*(p->reply) || (p->reply_time < (int) time(0)))
{
tell_player(p, " You don't have anyone to reply to!\n");
return;
}
sprintf(stack, "%s ", p->reply);
stack = strchr(stack, 0);
strcpy(stack, str);
stack = end_string(stack);
sys_flags |= REPLY_TAG;
premote(p, oldstack);
stack = oldstack;
sys_flags &= ~REPLY_TAG;
}
/* And the rsing reply command itself */
void sreply(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: sreply <msg>\n");
return;
}
if (!*(p->reply) || (p->reply_time < (int) time(0)))
{
tell_player(p, " You don't have anyone to reply to!\n");
return;
}
sprintf(stack, "%s ", p->reply);
stack = strchr(stack, 0);
strcpy(stack, str);
stack = end_string(stack);
sys_flags |= REPLY_TAG;
rsing(p, oldstack);
stack = oldstack;
sys_flags &= ~REPLY_TAG;
}
/* And the beep_tell reply command itself */
void yreply(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: yreply <msg>\n");
return;
}
if (!*(p->reply) || (p->reply_time < (int) time(0)))
{
tell_player(p, " You don't have anyone to reply to!\n");
return;
}
sprintf(stack, "%s ", p->reply);
stack = strchr(stack, 0);
strcpy(stack, str);
stack = end_string(stack);
sys_flags |= REPLY_TAG;
beep_tell(p, oldstack);
stack = oldstack;
sys_flags &= ~REPLY_TAG;
}
/* And the echo reply command itself */
void echoreply(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: oreply <msg>\n");
return;
}
if (!*(p->reply) || (p->reply_time < (int) time(0)))
{
tell_player(p, " You don't have anyone to reply to!\n");
return;
}
sprintf(stack, "%s ", p->reply);
stack = strchr(stack, 0);
strcpy(stack, str);
stack = end_string(stack);
sys_flags |= REPLY_TAG;
recho(p, oldstack);
stack = oldstack;
sys_flags &= ~REPLY_TAG;
}
void view_people_and_flags(player * p, char *str)
{
char *oldstack, middle[80];
player *scan;
int page, pages, count;
oldstack = stack;
page = atoi(str);
if (page <= 0)
page = 1;
page--;
pages = (current_players - 1) / (TERM_LINES - 2);
if (page > pages)
page = pages;
strcpy(middle, "Listing all people and flags");
pstack_mid(middle);
count = page * (TERM_LINES - 2);
for (scan = flatlist_start; count; scan = scan->flat_next)
if (!scan)
{
tell_player(p, " Bad who listing, abort.\n");
log("error", "Bad who list (session.c)");
stack = oldstack;
return;
} else if (scan->name[0])
count--;
for (count = 0; (count < (TERM_LINES - 1) && scan); scan = scan->flat_next)
if (scan->name[0] && scan->location)
{
/*
if (scan == p_sess)
*/
sprintf(stack, "%-20s=", scan->name);
stack = strchr(stack, 0);
if (scan->misc_flags & SYSTEM_COLOR)
strcpy(stack, "SysC ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->misc_flags & NOCOLOR)
strcpy(stack, " ");
else
strcpy(stack, "Col ");
stack = strchr(stack, 0);
if (scan->tag_flags & BLOCK_TELLS)
strcpy(stack, "BkTl ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->tag_flags & BLOCK_SHOUT)
strcpy(stack, "BkSht ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->tag_flags & BLOCK_FRIENDS)
strcpy(stack, "BkFT ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->tag_flags & SINGBLOCK)
strcpy(stack, "BkSg ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->tag_flags & NOBEEPS)
strcpy(stack, "BkBp ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->tag_flags & BLOCKCHANS)
strcpy(stack, "BkChAn ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->tag_flags & NO_FACCESS)
strcpy(stack, "NoF ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
if (scan->tag_flags & BLOCK_ROOM_DESC)
strcpy(stack, "NoRDesc ");
else
strcpy(stack, " ");
stack = strchr(stack, 0);
*stack++ = '\n';
count++;
}
sprintf(middle, "Page %d of %d", page + 1, pages + 1);
pstack_mid(middle);
*stack++ = 0;
tell_player(p, oldstack);
stack = oldstack;
}
void view_player_url(player * p, char *str)
{
player *scan,*start;
int pages=1,page,line;
char *oldstack,middle[80];
oldstack=stack;
if (strlen(str)<1)
page=1;
else
page=atoi(str);
if (page<1)
{
tell_player (p," Usage : list_url [<pagenumber>]\n");
return;
}
scan=flatlist_start;
start=NULL;
line=0;
for (scan = flatlist_start; scan; scan = scan->flat_next)
{
if (pages<=page && line==0)
start=scan;
if (scan->alt_email[0] != 0)
line++;
if (line>TERM_LINES-2)
{
line=0;
pages++;
}
}
if (page>pages)
page=pages;
pstack_mid("Listing of all active player's URLs");
line=0;
for (; start; start = start->flat_next)
{
if (line>TERM_LINES)
break;
if (start->alt_email[0]!=0)
{
sprintf(stack, "%-19s *", start->name);
stack = strchr(stack, 0);
strcpy(stack, start->alt_email);
stack = strchr(stack, 0);
*stack++ = '\n';
line++;
}
}
sprintf(middle, "Page %d of %d", page,pages);
pstack_mid(middle);
*stack++ = 0;
tell_player(p, oldstack);
stack = oldstack;
return;
}