#include "kernel.h" #include "bprintf.h" #include <unistd.h> #include <stdlib.h> #include "pflags.h" #include "sflags.h" #include "sflag.h" #include "log.h" #include "parse.h" #include "mobile.h" #include "InterMud/intermud.h" #include "InterMud/intermudP.h" int __iConn(char *addr, int port); /******************************************************* * * imInvis * * Toggles a user's visibility to the i3 network. */ void imInvis(void) { if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } setsflag(SFL_I_INVIS,"InterMUD Invisibility"); } /******************************************************* * * imNogos * * Toggles whether or not a user is listening to the imud_gossip line. * */ void imNogos(void) { if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } setsflag(SFL_I_NOGOSSIP,"No InterMUD Gossip"); } /******************************************************* * * imBoot() * * restarts the i3 connection if shutdown. */ void imBoot(void) { extern fd_set sockets_fds; if( plev(mynum) < LVL_GOD ) { bprintf("Pardon?\n"); return; } if( imfd != -1 ) { bprintf("Intermud up and running. Shut down intermud before booting.\n"); return; } if( (imfd = __iConn(raddr, rport) ) == -1 ) { bprintf("Error making connection to router. Try again later.\n"); return; } mudlog("INTERMUD: BOOT by %s\n",pname(mynum) ); FD_SET( imfd, &sockets_fds ); } /******************************************************* * * imShutdownWrap * * Wrapper around the imShutdown function, for when a user * manually shuts down the i3 connection. */ void imShutdownWrap(void) { int delay; if( plev(mynum) < LVL_GOD ) { bprintf("Pardon?\n"); return; } if( imfd == -1 ) { bprintf("Intermud already shutdown.\n"); return; } if( EMPTY(item1) ) delay = 0; else delay = atoi(item1); mudlog("INTERMUD: SHUTDOWN by %s",pname(mynum) ); bprintf("Shutting down intermud.\n"); imShutdown(delay); bprintf("Intermud shut down.\n"); } /******************************************************* * * imShutdown * * Shutsdown the intermud connection, the delay argument * informs the i3 route of an estimage as to how long before * the mud comes back online. */ void imShutdown(int delay) { char buf[2048]; extern fd_set sockets_fds; if (imfd <0) return; mudlog("INTERMUD: Shutting down the intermud connection.\n"); sprintf(buf,"({\"shutdown\",5,\"%s\",0,\"%s\",0,1", mudname,rname/*,delay*/); __iSend(buf); close(imfd); FD_CLR(imfd,&sockets_fds); imfd = -1; } /******************************************************* * * imMudlist * * Display the list of active muds on the i3 network. */ void imMudlist(void) { int x /*,flag = 1*/,c; if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } if(!mudlist) { bprintf("No muds to list yet!\n"); return; } /* sort the array */ arraySort( mudlist ); /* Print it */ bprintf("&+WKnown intermud accessable muds:\n" "&+G%s&*\n",DOUBLELINE); for(x = 0,c=0; x< arrayGetSize( mudlist ); x++) { mudInfo *mud = arrayGet( mudlist, x ); if(!mud) continue; if(!mud->isup) continue; bprintf("%-20.20s &+c%6.6s &+W%40.40s %d\n", mud->name, mud->type, mud->addr, mud->playerPort); c++; } bprintf("&+G%s&*\nTotal of %d muds listed.\n",DOUBLELINE,c); } /******************************************************* * * imGossip * * Sends a user's comments out over channel-m or channel-e * (based on first char of user's text) */ void imGossip(void) { char *text,*type,sendBuf[2048],unquoted[2048],*p,*q; int isemote = 0; if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } if( plev( mynum ) < LVL_WIZARD ) { bprintf("You can't do that now.\n"); return; } if( ststflg( mynum, SFL_I_NOGOSSIP ) ) { bprintf("You don't want to listen to them, why should they have to listen to you?\n"); return; } getreinput(wordbuf); if(EMPTY(wordbuf)) { bprintf("Whatcha wanna say?\n"); return; } if(wordbuf[0] == ':' && wordbuf[1] != '^' && wordbuf[1] !=')') /** it's a line emote... */ { type = "channel-e"; text = wordbuf+1; isemote=1; } else { type = "channel-m"; text = wordbuf; } for ( p = text, q = unquoted; *p; ) { if (*p == '$' || *p == '\\' || *p == '"' ) *q++ = '\\'; *q++ = *p++; } *q = '\0'; sprintf(sendBuf,"({\"%s\",5,\"%s\",\"%s\",0,0,\"imud_gossip\",\"%s\",\"%s%s\",})", type, mudname, pname(mynum), pname(mynum), (isemote)?"$N ":"", unquoted); __iSend(sendBuf); } /******************************************************* * * imWho * * Sends out a who request over the i3 network to another mud. */ void imWho(void) { char *mud = txt1,mesgBuf[2048]; char *x; mudInfo *mi; if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } for( x = mud; *x; x++ ) *x = tolower(*x); if( ! mudlist ) { bprintf("Intermud not initialized.\n"); return; } if( ! ( mi = (mudInfo*)arrayFind(mudlist,(void*)mud) ) ) { bprintf("Mud %s is unknown!\n",mud); return; } sprintf(mesgBuf,"({\"who-req\",5,\"%s\",\"%s\",\"%s\",0,})", mudname, pname(mynum), mi->name); __iSend(mesgBuf); } /******************************************************* * * imLocate * * Sends out a locate request (i.e. find user xxx on all * muds they are on) over the i3 network. */ void imLocate(void) { char mesgBuf[2048]; if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } if(EMPTY(item1)) { bprintf("Locate WHO?\n"); return; } if( ! mudlist ) { bprintf("Intermud not initialized.\n"); return; } sprintf(mesgBuf,"({\"locate-req\",5,\"%s\",\"%s\",0,0,\"%s\",})", mudname,pname(mynum),item1); __iSend(mesgBuf); bprintf("Locate request sent.\nMay take some time for responses to come in.\n"); } /******************************************************* * * imFinger * * Finger a user at another mud */ void imFinger(void) { char *user,*mud,mesgBuf[2048],*x; mudInfo *mi; if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } for( x = txt1; *x; x++ ) *x = tolower(*x); user = strtok(txt1,"@"); mud = strtok(NULL,"@"); if(!user || EMPTY(user)) { bprintf("Finger who?\n"); return; } if(!mud || EMPTY(mud)) { showplayer(); return; } if( ! mudlist ) { bprintf("Intermud not initialized.\n"); return; } if( ! ( mi = (mudInfo*)arrayFind(mudlist,(void*)mud) ) ) { bprintf("Mud %s is unknown!\n",mud); return; } sprintf(mesgBuf,"({\"finger-req\",5,\"%s\",\"%s\",\"%s\",0,\"%s\",})", mudname, pname(mynum), mi->name, user); __iSend(mesgBuf); } /******************************************************* * * imTell * * Send a tell or emoteto packet to a user at another mud. */ void imTell(void) { char *user,*mud,mesgBuf[2048],tempBuf[2048],*p,*q; mudInfo *mi; if( !ptstflg( mynum, PFL_INTERMUD ) ) { bprintf("Pardon?\n"); return; } user = strtok(txt1,"@"); /* The name */ mud = strtok(NULL,"@"); /* The rest of the line */ if(!user || EMPTY(user)) { bprintf("Tell who?\n"); return; } if(!mud || EMPTY(mud ) ) { bprintf("What mud?\n"); return; } /* * let's find the proper name for the mud */ if( ! mudlist ) { bprintf("Intermud not initialized.\n"); return; } /* Try to pull out a valid mud name, step forward one space at a time */ mi = NULL; for( p = mud; *p; p++ ) { if( *p == ' ' ) { *p = '\0'; if( ( mi = (mudInfo*)arrayFind(mudlist,(void*)mud) ) ) break; *p = ' '; } } if ( !mi ) { bprintf("I'm sorry, that mud is not known.\n"); return; } if(EMPTY(++p)) { bprintf("What do you want to tell %s@%s?\n", user,mud); return; } for(q = tempBuf; *p; q++, p++) { if(*p == '$' || *p == '"' || *p == '\\' ) *q++ = '\\'; *q = *p; } *q = '\0'; if( ststflg( mynum, SFL_I_INVIS ) ) { bprintf(" Note: you are invis to the intermud - responses may not come back.\n" ); } if(tempBuf[0] == ':' && tempBuf[1] != '^' && tempBuf[1] !=')') /** it's a line emote... */ { sprintf(mesgBuf,"({\"emoteto\",5,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"$N %s\",})", mudname, pname(mynum), mi->name, user, pname(mynum), &(tempBuf[1])); if( ststflg( mynum, SFL_SAYBACK ) ) bprintf( "You emoteto %s@%s '%s %s'\n",user,mi->name,pname(mynum),&(tempBuf[1]) ); else bprintf("Ok.\n"); } else { sprintf(mesgBuf,"({\"tell\",5,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",})", mudname, pname(mynum), mi->name, user, pname(mynum), tempBuf); if( ststflg( mynum, SFL_SAYBACK ) ) bprintf( "You tell %s@%s '%s'\n",user,mi->name,tempBuf ); else bprintf("Ok.\n"); } mesgBuf[2047] = '\0'; __iSend(mesgBuf); }