/* * IMC2 - an inter-mud communications protocol * * imc-envy.c: Envy2 interface code * * Copyright (C) 1996 Oliver Jowett <oliver@sa-search.massey.ac.nz> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, write to the * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /* Based on imc-rom.c; conversion from ROM to Envy by Erwin S. Andreasen * <erwin@pip.dknet.dk> */ #include <stdlib.h> #include <sys/types.h> #include <sys/time.h> #include <ctype.h> #include <errno.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include "merc.h" #define IMC_INTERNALS #include "imc.h" #include "imc-comm.h" #include "imc-envy.h" #include "imc-mail.h" /* memory allocation hooks */ void *imc_malloc(int size) { return getmem(size); } void imc_free(void *block, int size) { dispose(block, size); } char *imc_strdup(const char *src) { return str_dup(src); } void imc_strfree(char *str) { free_string(str); } /* See imc-envy.h and INSTALL.envy2 for information on how to set the color * stuff up. * Read INSTALL.envy2 on changes made from ROM to Envy2 */ #if 0 #ifdef IMC_NEED_COLOR static char *escapecolor(const char *s) { static char buf[MAX_STRING_LENGTH]; char *p=buf; while (*s) { if (*s==IMC_COLOR_CHAR) *p++=IMC_COLOR_CHAR; *p++=*s++; } *p=0; return buf; } static char *nocolor(const char *s) { static char buf[MAX_STRING_LENGTH]; char *p=buf; while (*s) { if (*s=='@' && *(s+1)=='@') { s+=2; if (*s) s++; } else *p++=*s++; } *p=0; return buf; } #else #define nocolor(x) (x) #define escapecolor(x) (x) #endif #endif /* if 0 */ void imc_markmemory(void (*markfn)(void *)) { int i; imc_reminfo *r; imc_mail *mailp; imc_qnode *queuep; imc_mailid *idp; for (i=0; i<IMC_MAX; i++) if (imc[i].inuse) { markfn(imc[i].inbuf); markfn(imc[i].outbuf); } for (r=imc_remoteinfo; r; r=r->next) markfn(r); for (mailp=imc_ml_head; mailp; mailp=mailp->next) markfn(mailp); for (queuep=imc_mq_head; queuep; queuep=queuep->next) markfn(queuep); for (idp=imc_idlist; idp; idp=idp->next) markfn(idp); } void imc_markstrings(void (*markfn)(char *)) { int i; imc_reminfo *r; imc_mail *mailp; imc_qnode *queuep; imc_mailid *idp; markfn(imc_name); for (i = 0; i < IMC_MAX; i++) if (imc_info[i].inuse) { markfn(imc_info[i].name); markfn(imc_info[i].host); markfn(imc_info[i].serverpw); markfn(imc_info[i].clientpw); } for (r = imc_remoteinfo; r; r = r->next) { markfn(r->name); markfn(r->version); markfn(r->route); } for (i = 0; i < IMC_RIGNORE_MAX; i++) markfn(imc_rignore[i]); for (i = 0; i < IMC_MEMORY; i++) if (imc_memory[i].timer) markfn(imc_memory[i].from); markfn(imc_prefix); for (mailp=imc_ml_head; mailp; mailp=mailp->next) { markfn(mailp->from); markfn(mailp->to); markfn(mailp->date); markfn(mailp->text); markfn(mailp->subject); markfn(mailp->id); } for (queuep=imc_mq_head; queuep; queuep=queuep->next) markfn(queuep->tomud); for (idp=imc_idlist; idp; idp=idp->next) markfn(idp->id); } /* maps IMC standard -> mud local color codes * let's be unique, noone uses ~ :> */ struct { char *imc; /* IMC code to convert */ char *mud; /* Equivalent mud code */ } trans_table[]= { { "~~", "~" }, /* escape raw tildes */ #ifdef IMC_COLOR { "@@", "@ @" }, /* escape our color character */ { "~b", "@@B"}, /* blue */ { "~g", "@@G"}, /* green */ { "~r", "@@R" }, /* red */ { "~y", "@@b"}, /* yellow */ { "~m", "@@m"}, /* magenta */ { "~c", "@@c"}, /* cyan */ { "~w", "@@g"}, /* white */ { "~D", "@@d"}, /* grey */ { "~B", "@@l"}, /* lt. blue */ { "~G", "@@r"}, /* lt. green */ { "~R", "@@e"}, /* lt. red */ { "~Y", "@@y"}, /* lt. yellow */ { "~M", "@@p"}, /* lt. magenta */ { "~C" ,"@@a"}, /* lt. cyan */ { "~W", "@@W"}, /* lt. white */ { "~!", "@@N"}, /* reset */ { "~d", "@@N"}, /* default */ { "~!", "@@x"}, /* reset */ { "~!", "@@f"}, /* default */ { "~!", "@@!"}, /* reset */ { "~!", "@@."}, /* default */ { "~!", "@@n"}, { "~D", "@@k"}, #else { "~b", "" }, /* blue */ { "~g", "" }, /* green */ { "~r", "" }, /* red */ { "~y", "" }, /* yellow */ { "~m", "" }, /* magenta */ { "~c", "" }, /* cyan */ { "~w", "" }, /* white */ { "~D", "" }, /* grey */ { "~B", "" }, /* lt. blue */ { "~G", "" }, /* lt. green */ { "~R", "" }, /* lt. red */ { "~Y", "" }, /* lt. yellow */ { "~M", "" }, /* lt. magenta */ { "~C", "" }, /* lt. cyan */ { "~W", "" }, /* lt. white */ { "~!", "" }, /* reset */ { "~d", "" }, /* default */ #endif }; #define numtrans (sizeof(trans_table)/sizeof(trans_table[0])) /* convert from imc color -> mud color, with optimisation */ const char *color_itom(const char *s) { static char buf[MAX_STRING_LENGTH]; const char *current; char *out; int i, l; int last=-1; for (current=s, out=buf; *current; ) { for (i=0; i<numtrans; i++) { l=strlen(trans_table[i].imc); if (l && !strncmp(current, trans_table[i].imc, l)) break; } if (i==numtrans) /* no match */ *out++=*current++; else /* match */ { if (last!=i) { strcpy(out, trans_table[i].mud); out+=strlen(out); last=i; } current+=l; } } *out=0; return buf; } /* convert from mud color -> imc color */ const char *color_mtoi(const char *s) { static char buf[MAX_STRING_LENGTH]; const char *current; char *out; int i, l; int last=-1; for (current=s, out=buf; *current; ) { for (i=0; i<numtrans; i++) { l=strlen(trans_table[i].mud); if (l && !strncmp(current, trans_table[i].mud, l)) break; } if (i==numtrans) /* no match */ *out++=*current++; else /* match */ { if (last!=i) { strcpy(out, trans_table[i].imc); out+=strlen(out); last=i; } current+=l; } } *out=0; return buf; } /* There are 2 versions of the IS_SILENT macro: one that checks the race_table * and one that doesn't. the RACE_MUTE flag appeared in one of the Envy 2.0 * patches, but not everyone has it. I did NOT have applied it when creating * this patch. */ /* #define IS_SILENT(ch) (IS_AFFECTED(ch,AFF_MUTE) || \ IS_SET(race_table[ch->race].race_abilities, RACE_MUTE) || \ IS_SET(ch->in_room->room_flags, ROOM_CONE_OF_SILENCE)) */ #define IS_SILENT(ch) (IS_SET(ch->act,PLR_SILENCE) || \ IS_SET(ch->in_room->room_flags, ROOM_QUIET)) static struct { int number; const char *name; const char *chatstr; const char *emotestr; int flag; int minlevel; char *to; } /* channels[]= { { "RChat", "@@W[@@yRCHAT@@W] $t:'@@g$T@@W'@@N", "[RChat]$t $T.", IMC_NORCHAT, 5 }, { "RImm", "@@W[@@mRIMM@@W] $t:'@@g$T@@W'@@N", "[RImm]$t $T.", IMC_NORIMM, LEVEL_HERO }, { "RInfo", "@@W[@@aRINFO@@W] $t:'@@g$T@@W'@@N", "[RInfo]$t $T.", IMC_NORINFO, LEVEL_HERO }, { "RCode", "@@W[@@eRCODE@@W] $t:'@@g$T@@W'@@N", "[RCode]$t $T.", IMC_NORCODE, LEVEL_HERO }, { "ALLimm", "@@a*@@W<@@l[$t@@l]@@W>@@a*@@g $T@@N", "[^*^]$t $T.", IMC_NOALLIMM, LEVEL_HERO }, }; */ channels[]= { { 0, /* channel number */ "RChat", /* channel name */ "@@W[@@yRCHAT@@W] $t:'@@g$T@@W'@@N", /* act for normal transmission */ "[RChat]$t $T.", /* act for emoting */ IMC_NORCHAT, /* flag in ch->pcdata->imc to turn it off */ 20, /* min. level to see it */ "*" /* muds to send to */ }, { 1, "RImm", "@@W[@@mRIMM@@W] $t:'@@g$T@@W'@@N", "[RImm]$t $T.", IMC_NORIMM, L_SUP, "*" }, { 2, "RInfo", "@@W[@@aRINFO@@W] $t:'@@g$T@@W'@@N", "[RInfo]$t $T.", IMC_NORINFO, L_SUP, "*", }, { 3, "RCode", "@@W[@@eRCODE@@W] $t:'@@g$T@@W'@@N", "[RCode]$t $T", IMC_NORCODE, L_SUP, "*" }, { 4, "ALLimm", "@@a*@@W<@@l[$t@@l]@@W>@@a*@@g $T@@N", "[^*^]$t $T.", IMC_NOALLIMM, LEVEL_HERO, "SOETEST SOEBLD SOE Abyss AA LOTS" } }; #define numchannels (sizeof(channels)/sizeof(channels[0])) static int getlevel(int l) { if (l<LEVEL_HERO) return l; else return l-MAX_LEVEL-1; } static const imc_char_data *getdata(CHAR_DATA *ch) { static imc_char_data d; if (!ch) /* fake system character */ { d.wizi=d.invis=d.see=0; d.level=-1; d.sex=2; strcpy(d.name, "*"); return &d; } /* Envy2 has only either full wizinvis or no wizinvis */ d.wizi=getlevel( IS_SET(ch->act, PLR_WIZINVIS) ? ch->invis : 0); d.invis=0; if (IS_AFFECTED(ch, AFF_INVISIBLE)) d.invis|=IMC_INVIS; if (IS_AFFECTED(ch, AFF_SNEAK)) d.invis|=IMC_HIDDEN; d.see=0; if (IS_AFFECTED(ch, AFF_DETECT_INVIS)) d.see|=IMC_INVIS; if (IS_AFFECTED(ch, AFF_DETECT_HIDDEN)) d.see|=IMC_HIDDEN; d.level=getlevel(get_trust(ch)); strcpy(d.name, ch->name); d.sex=(ch->sex+1)%2; return &d; } static int visible(const imc_char_data *viewer, const imc_char_data *viewed) { /* If you can follow this, you're better than me :) .. I've got it wrong * at least 3 times now -- Spectrum */ return !( (viewer->level>=0 && /* mortal viewer */ (viewer->see & viewed->invis)!=viewed->invis) || (viewed->wizi<0 && /* imm level wizi */ (viewer->level>=0 || /* mortal viewer */ viewer->level<viewed->wizi)) || /* imm less than wizi level */ (viewed->wizi>0 && /* mortal level wizi */ viewer->level>=0 && /* mortal viewer */ viewer->level<viewed->wizi) /* level less than wizi */ ); } static const char *getname(CHAR_DATA *ch, const imc_char_data *vict) { static char buf[IMC_NAME_LENGTH]; if (visible(getdata(ch),vict)) return vict->name; sprintf(buf, "%s@%s", ( getdata(ch)->wizi ? "A Mystical Being" : "Someone" ), imc_mudof(vict->name)); return buf; } void send_rchannel(CHAR_DATA *ch, char *argument, int number) { char arg[MAX_STRING_LENGTH]; char *arg2; int chan; if ( IS_NPC( ch ) ) return; for (chan=0; chan<numchannels; chan++) if (channels[chan].number==number) break; if (chan==numchannels) return; /* oops */ if (!argument[0]) { if (IS_SET(ch->pcdata->imc, channels[chan].flag)) { sprintf(arg, "%s channel is now ON.\n\r", channels[chan].name); send_to_char(arg, ch); REMOVE_BIT(ch->pcdata->imc, channels[chan].flag); return; } sprintf(arg, "%s channel is now OFF.\n\r", channels[chan].name); send_to_char(arg, ch); SET_BIT(ch->pcdata->imc, channels[chan].flag); return; } if (IS_SET(ch->act, PLR_SILENCE)) { send_to_char("The gods have revoked your channel priviliges.\n\r", ch); return; } if (IS_SILENT(ch)) { send_to_char ("You can't seem to break the silence.\n\r",ch); return; } REMOVE_BIT(ch->pcdata->imc, channels[chan].flag); arg2=one_argument(argument, arg); if (!str_cmp(arg, ",") || !str_cmp(arg, "emote")) imc_send_emote(getdata(ch), chan, color_mtoi(arg2), channels[chan].to); else imc_send_chat(getdata(ch), chan, color_mtoi(argument), channels[chan].to); } void do_rchat(CHAR_DATA *ch, char *argument) { send_rchannel(ch, argument, 0); } void do_rimm(CHAR_DATA *ch, char *argument) { send_rchannel(ch, argument, 1); } void do_rinfo(CHAR_DATA *ch, char *argument) { send_rchannel(ch, argument, 2); } void do_rcode(CHAR_DATA *ch, char *argument) { send_rchannel(ch, argument, 3); } void do_allimm(CHAR_DATA *ch, char *argument) { send_rchannel(ch, argument, 4); } void do_rtell(CHAR_DATA *ch, char *argument) { char buf[MAX_STRING_LENGTH], buf1[MAX_STRING_LENGTH]; argument=one_argument(argument, buf); if (!buf[0] || !strchr(buf, '@') || !argument[0]) { send_to_char("rtell who@where what?\n\r", ch); return; } if (IS_SET(ch->act, PLR_NO_TELL) || IS_SET(ch->act, PLR_SILENCE)) { send_to_char("You cannot rtell!\n\r", ch); return; } if (IS_SILENT(ch)) { send_to_char ("You can't seem to break the silence.\n\r",ch); return; } imc_send_tell(getdata(ch), buf, color_mtoi(argument), 0); sprintf(buf1, "@@NYou @@ertell @@y%s @@W'@@g%s@@W'@@N\n\r", buf, argument ); send_to_char(buf1, ch); } void do_rreply(CHAR_DATA *ch, char *argument) { char buf1[MAX_STRING_LENGTH]; if (IS_NPC(ch)) { send_to_char("Uh... no.\n\r", ch); return; } if (!ch->pcdata->rreply) { send_to_char("rreply to who?\n\r", ch); return; } if (!argument[0]) { send_to_char("rreply what?\n\r", ch); return; } if (IS_SET(ch->act, PLR_NO_TELL)) { send_to_char("You cannot rtell!\n\r", ch); return; } if (IS_SILENT(ch)) { send_to_char ("You can't seem to break the silence.\n\r",ch); return; } imc_send_tell(getdata(ch), ch->pcdata->rreply, color_mtoi(argument), 1); sprintf(buf1, "@@NYou @@ertell @@y%s @@W'@@g%s@@W'@@N\n\r", ch->pcdata->rreply_name, argument); send_to_char(buf1, ch); } void do_rwho(CHAR_DATA *ch, char *argument) { char arg[MAX_STRING_LENGTH]; if (IS_NPC(ch)) { send_to_char("Uh... no.\n\r", ch); return; } argument=one_argument(argument, arg); if (!arg[0]) { send_to_char("rwho where?\n\r", ch); return; } imc_send_who(getdata(ch), arg, argument[0] ? argument : "who"); } void do_rquery(CHAR_DATA *ch, char *argument) { char arg[MAX_STRING_LENGTH]; if (IS_NPC(ch)) { send_to_char("Uh... no.\n\r", ch); return; } argument=one_argument(argument, arg); if (!arg[0]) { send_to_char("rquery where?\n\r", ch); return; } imc_send_who(getdata(ch), arg, argument[0] ? argument : "help"); } void do_mailqueue(CHAR_DATA *ch, char *argument) { send_to_char(imc_mail_showqueue(), ch); } void do_istats(CHAR_DATA *ch, char *argument) { send_to_char(imc_getstats(), ch); } void do_rbeep(CHAR_DATA *ch, char *argument) { char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) { send_to_char("Uh... no.\n\r", ch); return; } if (!argument[0] || !strchr(argument, '@')) { send_to_char("rbeep who@where?\n\r", ch); return; } imc_send_beep(getdata(ch), argument); sprintf(buf, "@@NYou @@erbeep @@y%s@@W.@@N\n\r", argument); send_to_char(buf, ch); } void do_imclist(CHAR_DATA *ch, char *argument) { if (get_trust(ch)>=MAX_LEVEL-1) send_to_char(imc_list(2), ch); else if (IS_IMMORTAL(ch)) send_to_char(imc_list(1), ch); else send_to_char(imc_list(0), ch); send_to_char("\n\r", ch); } void do_rsockets(CHAR_DATA *ch, char *argument) { send_to_char(imc_sockets(), ch); send_to_char("\n\r", ch); } void do_imc(CHAR_DATA *ch, char *argument) { int r; r=imc_command(argument); if (r>0) { send_to_char("Ok.\n\r", ch); return; } else if (r==0) { send_to_char("Syntax: imc add <mudname>\n\r" " imc delete <mudname>\n\r" " imc set <mudname> all <host> <port> <clientpw> <serverpw> [<flags>]\n\r" " imc set <mudname> host|port|clientpw|serverpw|flags <value>\n\r" " imc rename <oldmudname> <newmudname>\n\r", ch); return; } send_to_char(imc_error(), ch); send_to_char("\n\r", ch); } void do_rignore(CHAR_DATA *ch, char *argument) { send_to_char(imc_ignore(argument), ch); send_to_char("\n\r", ch); } void do_rconnect(CHAR_DATA *ch, char *argument) { if (!argument[0]) { send_to_char("rconnect to where?\n\r", ch); return; } if (imc_connect(argument)) { send_to_char("Ok.\n\r", ch); return; } send_to_char(imc_error(), ch); send_to_char("\n\r", ch); } void do_rdisconnect(CHAR_DATA *ch, char *argument) { if (!argument[0]) { send_to_char("rdisconnect where?\n\r", ch); return; } if (imc_disconnect(argument)) { send_to_char("Ok.\n\r", ch); return; } send_to_char(imc_error(), ch); send_to_char("\n\r", ch); } static void do_rchannel(const imc_char_data *from, int chan, const char *argument, int emote) { DESCRIPTOR_DATA *d; CHAR_DATA *victim; const char *str; int position; if (chan>=numchannels) return; str=emote ? channels[chan].emotestr : channels[chan].chatstr; for (d=first_desc; d; d=d->next) { if (d->connected==CON_PLAYING && (victim=d->original ? d->original : d->character)!=NULL && !IS_SET(victim->pcdata->imc, channels[chan].flag) && !IS_SET(victim->in_room->room_flags, ROOM_QUIET) && get_trust(victim)>=channels[chan].minlevel) { char color_string[MSL]; const char *this_name; this_name = getname( victim, from ); sprintf( color_string, "@@m%s@@W%s%s@@a%s@@N", imc_nameof(this_name ), ( ( !str_cmp( imc_mudof( this_name ), imc_name ) ) ? "" : "@" ), ( ( !str_cmp( imc_mudof( this_name ), imc_name ) ) ? "" : "@@" ), ( ( !str_cmp( imc_mudof( this_name ), imc_name ) ) ? "" : imc_mudof( this_name) ) ); position = victim->position; victim->position = POS_STANDING; act(str, victim, color_string, color_itom(argument), TO_CHAR); victim->position = position; } } } void imc_recv_chat(const imc_char_data *from, int channel, const char *argument) { do_rchannel(from, channel, argument, 0); } void imc_recv_emote(const imc_char_data *from, int channel, const char *argument) { do_rchannel(from, channel, argument, 1); } void imc_recv_who(const imc_char_data *from, const char *type) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char output[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; CHAR_DATA *victim; int count=0; char arg[MAX_STRING_LENGTH]; type= imc_getarg(type, arg, MAX_STRING_LENGTH); if (!str_cmp(arg, "who")) { /* bool is_imm = FALSE; bool is_adept = FALSE; bool is_remort = FALSE; */ output[0]=0; sprintf( output, "%s", color_mtoi("@@rWho's Playing " mudnamecolor ":\n\r" )); for (d=first_desc; d; d = d->next) { if (d->connected==CON_PLAYING && (victim = d->original ? d->original : d->character)!=NULL && !IS_NPC(victim) && visible(from, getdata(victim))) { count++; sprintf(buf2, "@@W[@@p%s@@W] @@G%s@@N%s@@N\n\r", ( ( IS_IMMORTAL( victim ) || ( victim->adept_level > 0 ) ) ? victim->pcdata->who_name : is_remort( victim ) ? " @@mREMORT@@N " : " @@cMORTAL@@N " ), victim->name, victim->pcdata->title ); sprintf( buf, "%s", color_mtoi( buf2 )); strcat(output,buf); } } sprintf(output+strlen(output), "\n\rRWHO for %s [total %d]\n\r", imc_name, count); } #ifdef IMC_MUD_INFO else if (!str_cmp(arg, "info")) strcpy(output, IMC_MUD_INFO); #endif else if (!str_cmp(arg, "list")) strcpy(output, imc_list(0)); else if (!str_cmp(arg, "options") || !str_cmp(arg, "services") || !str_cmp(arg, "help")) strcpy(output, "Available rquery types:\n\r" "options,\n\r" "services,\n\r" "help - this list\n\r" "who - who listing\n\r" #ifdef IMC_MUD_INFO "info - mud information\n\r" #endif "list - active IMC connections\n\r"); else strcpy(output, "Sorry, no information is available of that type.\n\r"); imc_send_whoreply(from->name, output); } void imc_recv_whoreply(const char *to, const char *text) { DESCRIPTOR_DATA *d; CHAR_DATA *victim; for (d=first_desc; d; d=d->next) { if (d->connected==CON_PLAYING && (victim=d->original ? d->original : d->character)!=NULL && is_name((char *)to, victim->name)) { send_to_char(color_itom(text), victim); return; } } } void imc_recv_tell(const imc_char_data *from, const char *to, const char *argument, int isreply) { DESCRIPTOR_DATA *d; CHAR_DATA *victim; char buf[IMC_DATA_LENGTH]; int position; if (!strcmp(to, "*")) /* ignore messages to system */ return; for (d=first_desc; d; d=d->next) { if (d->connected==CON_PLAYING && (victim=d->original ? d->original : d->character)!=NULL && is_name((char *)to, victim->name) && (isreply || visible(from, getdata(victim)))) { if ( ( !IS_NPC( victim ) && IS_SET(victim->pcdata->pflags, PFLAG_AFK)) || IS_SET(victim->in_room->room_flags, ROOM_QUIET) ) { sprintf(buf, "@@y%s @@Wis not receiving @@etells@@W.@@N", to); imc_send_tell(NULL, from->name, buf, 1); return; } if (victim->pcdata->rreply) free_string(victim->pcdata->rreply); if (victim->pcdata->rreply_name) free_string(victim->pcdata->rreply_name); victim->pcdata->rreply=str_dup(from->name); victim->pcdata->rreply_name=str_dup(getname(victim, from)); position = victim->position; victim->position = POS_STANDING; act("@@y$t @@ertells @@Wyou '@@g$T@@W'@@N", victim, victim->pcdata->rreply_name, color_itom(argument), TO_CHAR); victim->position = position; return; } } sprintf(buf, "@@y%s @@Wis not here.@@N", to); imc_send_tell(NULL, from->name, buf, 1); } void imc_recv_beep(const imc_char_data *from, const char *to) { DESCRIPTOR_DATA *d; CHAR_DATA *victim; char buf[IMC_DATA_LENGTH]; int position; if (!strcmp(to, "*")) /* ignore messages to system */ return; for (d=first_desc; d; d=d->next) { if (d->connected==CON_PLAYING && (victim=d->original ? d->original : d->character)!=NULL && is_name((char *)to, victim->name) && visible(from, getdata(victim))) { if (IS_SET(victim->in_room->room_flags, ROOM_QUIET )) { sprintf(buf, "@@y%s @@Wis not receiving @@ebeeps@@W.@@N", to); imc_send_tell(NULL, from->name, buf, 1); return; } position = victim->position; victim->position = POS_STANDING; act("\a@@y$t @@erbeeps @@Wyou.@@N", victim, getname(victim, from), NULL, TO_CHAR); victim->position = position; return; } } sprintf(buf, "@@y%s @@Wis not here.@@N", to); imc_send_tell(NULL, from->name, buf, 1); } void imc_log(const char *string) { char buf[MAX_STRING_LENGTH]; sprintf(buf, "imc: %s", string); monitor_chan(buf, MONITOR_CONNECT ); /* wiznet(buf, NULL, NULL, WIZ_IMC, 0, 0); */ } void imc_debug(int i, int out, const char *string) { /* Envy2 does not have an equivalent to wiznet, although it is a very handy thing, so I leave this here if you create something like it */ #if 0 char buf[MAX_STRING_LENGTH]; char *dir; dir=out ? "<" : ">"; sprintf(buf, "%s %s %s", imc_getdescname(i), dir, string); monitor_chan( buf, MONITOR_CONNECT ); /* wiznet(escapecolor(buf), NULL, NULL, WIZ_IMCDEBUG, 0, 0); */ #endif return; } /* * Posting a note: This code mostly copied from act_comm.c of Envy * If you are using my code (ftp://pip.dknet.dk/pub/pip1773/board-2.tgz) * there is another imc_mail_arrived() below - Erwin */ /* char *imc_mail_arrived (const char *from, const char *to, const char *date, const char *subject, const char *text) { NOTE_DATA *pnote, *prev_note; FILE *fp; char *strtime; pnote = alloc_perm (sizeof (*pnote)); pnote->next = NULL; strtime = ctime (¤t_time); strtime[strlen (strtime) - 1] = '\0'; pnote->date = str_dup (strtime); pnote->date_stamp = current_time; pnote->sender = str_dup (from); pnote->to_list = str_dup (to); pnote->date = str_dup (date); pnote->subject = str_dup (subject); pnote->text = str_dup (text); smash_tilde (pnote->sender); smash_tilde (pnote->to_list); smash_tilde (pnote->date); smash_tilde (pnote->subject); smash_tilde (pnote->text); if (!note_list) { note_list = pnote; } else { for (prev_note = note_list; prev_note->next; prev_note = prev_note->next) ; prev_note->next = pnote; } fclose (fpReserve); if (!(fp = fopen (NOTE_FILE, "a"))) { perror (NOTE_FILE); } else { fprintf (fp, "Sender %s~\n", pnote->sender); fprintf (fp, "Date %s~\n", pnote->date); fprintf (fp, "Stamp %ld\n", (unsigned long) pnote->date_stamp); fprintf (fp, "To %s~\n", pnote->to_list); fprintf (fp, "Subject %s~\n", pnote->subject); fprintf (fp, "Text\n%s~\n\n", pnote->text); fclose (fp); } fpReserve = fopen (NULL_FILE, "r"); return NULL; } */ /* If you are using the board snippet: * Note that this assumes that your make_note() does a smash_tilde(), the * latest version of the board snippet does, but your may not. Oh well. */ #if defined (BOARDS) char *imc_mail_arrived (const char *from, const char *to, const char *date, const char *subject, const char *text) { /* make_note ("Personal", from, to, subject, 14, text); */ return "Shades of Evil does not have this implemented yet.\n\r"; } #endif