/* * 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, "not set", MAX_SESSION - 2); 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; } strcpy(session, str); sprintf(stack, " You reset the session message to be '%s'\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 - 2); 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->saved_flags & YES_SESSION)) tell_player(scan, oldstack); stack = oldstack; if (strcmp(sess_name, p->name) || wait <= 0) session_reset = t + (60 * 15); 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) { strcpy(session, str); sprintf(stack, " You reset the session message to be '%s'\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 - 2); 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->saved_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 - 2); return; } strncpy(p->comment, str, MAX_COMMENT - 2); 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, "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) { /* if (scan == p_sess) */ if (!strcasecmp(sess_name, scan->lower_name)) sprintf(stack, "%-20s* ", scan->name); else sprintf(stack, "%-20s- ", scan->name); 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, "not set", MAX_SESSION - 2); 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, "%-20s* ", start->name); else sprintf(stack, "%-20s- ", start->name); 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, "not set", MAX_SESSION - 2); /* 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_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, " Bug logged, thankyou.\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->saved_flags & SHOW_EXITS) { tell_player(p, " You won't see exits when you enter a room now.\n"); p->saved_flags &= ~SHOW_EXITS; } else { tell_player(p, " When you enter a room you will now see the exits.\n"); p->saved_flags |= SHOW_EXITS; } }