/* * Silvercode - intercom2.c * Additional intercom code for IChan. * --------------------------------------------------------------------------- * * IChan (intercom channel) is copyright (c) Richard Lawrence and Mike * Bourdaa. The intercom code is copyright (c) Michael Simms. * * This code may not be redistributed in whole or part IN ANY FORM without * the prior permission of the author who can be contacted at * <silver@ewtoo.org>. * * [ This file should be included from intercom.c ] */ /* takes a message a user has said and sends it to the connected talkers */ static void parse_in_user_ichan_say_command(talker_list * remote_talker, char *str) { char *name, *msg = 0, *ptr, *oldstack; const char *method; name = str; if (name && *name) { msg = strchr(name, ':'); if (msg) *msg++ = 0; } if (!name || !*name || !msg || !*msg) { log("intercom", "Invalid string in parse_in_user_ichan_say_command"); return; } oldstack = stack; ptr = (strchr(msg, 0)) - 1; switch (*ptr) { case '!': method = "exclaims"; break; case '?': method = "asks"; break; default: method = "says"; break; } sprintf(oldstack, "%s@%s %s '%s'", name, remote_talker->abbr, method, msg); stack = end_string(oldstack); send_to_talker("%c%s", ICHAN_MESSAGE, oldstack); stack = oldstack; } /* takes a users emote (which could also be a sing or think) and sends it to the connected talkers */ static void parse_in_user_ichan_emote_command(talker_list * remote_talker, char *str) { char *name, *msg = 0, *oldstack; name = str; if (name && *name) { msg = strchr(name, ':'); if (msg) *msg++ = 0; } if (!name || !*name || !msg || !*msg) { log("intercom", "Invalid string in parse_in_user_ichan_emote_command"); return; } oldstack = stack; if (*msg == '\'') sprintf(oldstack, "%s@%s%s", name, remote_talker->abbr, msg); else sprintf(oldstack, "%s@%s %s", name, remote_talker->abbr, msg); stack = end_string(oldstack); send_to_talker("%c%s", ICHAN_MESSAGE, oldstack); stack = oldstack; } /* sends an action message (ie. logging on/off) to the intercom channel */ static void parse_in_user_ichan_action_command(talker_list * remote_talker, char *str) { char *name, *msg = 0, *oldstack; name = str; if (name && *name) { msg = strchr(name, ':'); if (msg) *msg++ = 0; } if (!name || !*name || !msg || !*msg) { log("intercom", "Invalid string in parse_in_user_ichan_action_command"); return; } oldstack = stack; /* here we place any actions necessary -- please DON'T modify in order for them to stay consistent on every talker */ if (!strcmp(msg, "join")) sprintf(stack, "++ %s@%s joins the channel ++", name, remote_talker->abbr); else if (!strcmp(msg, "leave")) sprintf(stack, "-- %s@%s leaves the channel --", name, remote_talker->abbr); else { sprintf(stack, "Illegal ichan action '%s' received from %s at '%s'", msg, name, remote_talker->name); stack = end_string(stack); log("intercom", oldstack); stack = oldstack; return; } stack = end_string(stack); send_to_talker("%c%s", ICHAN_MESSAGE, oldstack); stack = oldstack; } /* tell a person who is listening to the channel from other talkers */ static void return_ichan_who(talker_list * remote_talker, char *str) { char *user_list = 0, *count_str = 0, *job_str; job_list *this_job; char talker[100]; job_str = str; if (job_str && *job_str) { count_str = strchr(job_str, ':'); if (count_str) { *count_str++ = 0; if (*count_str) { user_list = strchr(count_str, ':'); if (user_list) *user_list++ = 0; } } } if (!user_list || !*user_list || !*count_str || !job_str || !*job_str) { log("intercom", "Bad string in return_ichan_who"); return; } this_job = return_job(job_str); strcpy(current_name, this_job->sender); sprintf(talker, "%s (%s)", remote_talker->name, remote_talker->abbr); tell_personal(" %-30.30s : %s", talker, user_list); } /* set up a job for the intercom channel who command "iw" */ static void do_ichan_who(talker_list * remote_talker, char *str) { job_list *this_job; this_job = make_job_entry(); this_job->job_ref = ATOI(str); strcpy(this_job->originator, remote_talker->abbr); send_to_talker("%c%ld", INTERCOM_ICHAN_WHO, this_job->job_id); } /* request a list of people listening to the intercom channel from other connected talkers */ static void request_ichan_list_global(void) { talker_list *scan; job_list *this_job; this_job = make_job_entry(); strcpy(this_job->sender, current_name); scan = talker_list_anchor; while (scan->next) { scan = scan->next; if (scan->fd > 0) tell_remote_talker(scan, "%c%ld", INTERCOM_ICHAN_WHO, this_job->job_id); } } /* intercom channel list processing */ static void reply_ichan_list_global(char *str) { job_list *this_job; talker_list *remote_talker = 0; char *job_str, *msg = 0; job_str = str; if (job_str && *job_str) { msg = strchr(job_str, ':'); if (msg) *msg++ = 0; } if (!job_str || !*job_str || !msg || !*msg) { log("intercom", "Invalid message sent to reply_ichan_list_global"); return; } this_job = return_job(job_str); if (!this_job) return; if (this_job->originator[0]) remote_talker = match_talker_abbr_absolute(this_job->originator); if (!remote_talker) return; tell_remote_talker(remote_talker, "%c%ld:%s", INTERCOM_ICHAN_LIST, this_job->job_ref, msg); return; }