home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / doors / chat / chatutil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  13.2 KB  |  552 lines

  1. #include "chat.h"
  2.  
  3. #define SCW 79
  4. #define NODEW 2
  5. #define NAMEW 19
  6. #define LOCW 23
  7. #define ACTW 18
  8. #define STATW (SCW-NODEW-NAMEW-LOCW-ACTW) 
  9.  
  10. #define DISPSIZE 200
  11.  
  12. extern enum Activity act;
  13.  
  14. #define sw1(s) strcpy( actst, s );
  15.  
  16. extern int mynd, nodenum;
  17. extern char mynm[NAMELEN], fname[100], actst[80], namest[50][40];
  18. extern FILE *str;
  19. extern struct JHMessage *Jhmsg,*msg;
  20. extern struct MsgPort *replymp;
  21.  
  22. int ret, tok, spact, dispoff=0;
  23. char log[100];
  24. char nodest[80], locst[80], statst[80];
  25.  
  26. char user[80];
  27.  
  28. chatwho( outmes )
  29. {
  30. int i;
  31.  
  32.  putuserstring( "\tUsing NodeInfo\n",BB_CALLERSLOG);
  33.  
  34.  cr();
  35.  ln1();
  36.  nm();
  37.  ln2();
  38.  
  39.  for( i = NODENUM-1; i >0; i-- ) if( nodevalid( i ) ) break; 
  40.  nodenum = i + 1;
  41.  for( i = 1; i < nodenum; i++ ) { 
  42.   if( ! nodevalid( i ) ) continue;
  43.   assignsp( i );
  44.   if( i < 10 ) sprintf( nodest, "0%d", i );  
  45.   else sprintf( nodest, "%d", i );
  46.   if( i == mynd ) {
  47.    act = NODEINF;
  48.    strcpy( namest[i], mynm );
  49.    getuserstring( locst, DT_LOCATION );
  50.   } 
  51.   else {
  52.    getnodeact( i );
  53.    if( act == ACERR || act == NOCONN ) { showln( i ); continue; };
  54.    if( act == INACT ) { continue; };
  55.   };
  56.   if( checkstatus( i ) ) strcpy( statst, "Y" );
  57.   else strcpy( statst, "N" );
  58.  
  59.   setact( act );
  60.   showln( i );
  61.  
  62.  };
  63.   
  64.  ln3();
  65.  cr();
  66.  cr();  
  67.  switch( outmes ) {
  68.   case 1: putuserstring( "\tReturned back to AEChat\n",BB_CALLERSLOG); break;
  69.   case 2: putuserstring( "\tNodeInfo Completed\n",BB_CALLERSLOG);
  70.  };
  71.  return(0);
  72. }
  73.  
  74. end() { exit(0); return(0);}
  75.  
  76. pad( s, l )
  77. char *s;
  78. {
  79.  memset( &s[strlen(s)], ' ', DISPSIZE - strlen(s) ); 
  80.  s[l+1] = '|';
  81.  s[l+2] = ' ';
  82.  s[l+3] = 0;
  83.  s[SCW-1] = '|';
  84.  s[SCW] = 0;
  85.  return(0);
  86. }
  87.  
  88. ln1()
  89. {
  90. char tm[DISPSIZE];
  91.  
  92.  memset( tm, '-', SCW );
  93.  tm[0] = '.'; tm[SCW-1] = '.';
  94.  tm[SCW] = 0;
  95.  color( tm, 0, SCW, FRAME ); 
  96.  sm1( tm );
  97.  dispoff = 0;
  98.  return(0);
  99. }
  100.  
  101. ln2()
  102. {
  103. char tm[DISPSIZE];
  104.  
  105.  memset( tm, '-', SCW );
  106.  tm[0] = '|';
  107.  tm[NODEW+3] = 
  108.  tm[NODEW+NAMEW+6] = 
  109.  tm[NODEW+NAMEW+LOCW+9] = 
  110.  tm[NODEW+NAMEW+LOCW+ACTW+12] = '+';
  111.  tm[SCW-1] = '|'; tm[SCW] = 0;
  112.  color( tm, 0, 1, FRAME );
  113.  color( tm, 1, SCW-2, INFRAME );
  114.  color( tm, SCW-1, 1, FRAME );
  115.  sm1( tm ); 
  116.  dispoff = 0;
  117.  return(0);
  118. }
  119.  
  120. ln3()
  121. {
  122. char tm[DISPSIZE], ms[100];
  123. int beg = 54; 
  124.  
  125.  memset( tm, '-', SCW );
  126.  tm[0] = '`'; tm[SCW-1] = '\'';
  127.  strcpy( ms, "InfoNode By ]B]E]E]F" );
  128.  memcpy( &tm[beg], ms, strlen(ms) );
  129.  tm[SCW] = 0;
  130.  color( tm, 0, beg, FRAME );
  131.  color( tm, beg, strlen(ms), YELLOW );
  132.  color( tm, beg+strlen(ms), SCW-beg-strlen(ms), FRAME );
  133.  sm1( tm );
  134.  dispoff=0;
  135.  return(0);
  136. }
  137.  
  138. nm() {
  139. char tm[DISPSIZE];
  140.  
  141.  strcpy( tm, "| N#" );
  142.  pad( tm, NODEW+2 );
  143.  strcat( tm, "USER" );
  144.  pad( tm, NODEW+NAMEW+5 );
  145.  strcat( tm, "LOCATION" );
  146.  pad( tm, NODEW+NAMEW+LOCW+8 );
  147.  strcat( tm, "ACTIVITY" );
  148.  pad( tm, NODEW+NAMEW+LOCW+ACTW+11 );
  149.  strcat( tm, "C" );
  150.  padl( tm );
  151.  color( tm, 0, 1, FRAME );
  152.  color( tm, 2, NODEW, YELLOW );
  153.  color( tm, NODEW+3, 1, INFRAME );
  154.  color( tm, NODEW+5, NAMEW, YELLOW );
  155.  color( tm, NODEW+NAMEW+6, 1, INFRAME );
  156.  color( tm, NODEW+NAMEW+8, LOCW, YELLOW );
  157.  color( tm, NODEW+NAMEW+LOCW+9, 1, INFRAME );
  158.  color( tm, NODEW+NAMEW+LOCW+11, ACTW, YELLOW );
  159.  color( tm, SCW-5, 1, INFRAME );
  160.  color( tm, SCW-3, 1, YELLOW );
  161.  color( tm, SCW-1, 1, FRAME );
  162.  sm1( tm ); 
  163.  dispoff = 0;
  164.  return(0);
  165. }
  166.  
  167. padl(tm)
  168. char *tm;
  169. {
  170.  memset( &tm[strlen(tm)], ' ', SCW - strlen(tm) ); 
  171.  tm[SCW-1] = '|'; tm[SCW] = 0;
  172.  return(0);
  173. }
  174.  
  175. checkstatus( un )
  176. {
  177.   sprintf( fname, "env:STATUS@%d", un );
  178.   str = fopen( fname, "r" );
  179.   if( str == NULL ) return( 1 );
  180.   fclose( str );
  181.   return( 0 );
  182. }
  183.  
  184. showln( i )
  185.  {
  186. char disp[DISPSIZE];
  187.  
  188.   strcpy( disp, "| " );
  189.   strcat( disp, nodest );
  190.   pad( disp, NODEW+2 );
  191.   strcat( disp, namest[i] );
  192.   pad( disp, NODEW+NAMEW+5 );
  193.   strcat( disp, locst );
  194.   pad( disp, NODEW+NAMEW+LOCW+8 );
  195.   strcat( disp, actst );
  196.   pad( disp, NODEW+NAMEW+LOCW+ACTW+11 );
  197.   strcat( disp, statst );
  198.   padl( disp );
  199.   color( disp, 0, 1, FRAME );
  200.   color( disp, NODEW+3, 1, INFRAME );
  201.   color( disp, NODEW+NAMEW+6, 1, INFRAME );
  202.   color( disp, NODEW+NAMEW+LOCW+9, 1, INFRAME );
  203.   color( disp, NODEW+NAMEW+LOCW+11, ACTW, CYAN );
  204.   color( disp, SCW-5, 1, INFRAME );
  205.   color( disp, SCW-1, 1, FRAME );
  206.   sm1( disp );
  207.   dispoff = 0;
  208.   ln2();
  209.   return(0);
  210. }
  211.  
  212. color( s, b, l, c )
  213. char *s;
  214. {
  215. char tmp[DISPSIZE];  
  216.  
  217.   strcpy( tmp, s );
  218.   sprintf( &s[b+dispoff], "%dm", c );
  219.   strcat( s, &tmp[b+dispoff] );
  220.   s[b+l+5+dispoff] = 0;
  221.   strcat( s, "" );
  222.   strcat( s, &tmp[b+l+dispoff] );
  223.   dispoff += 9;
  224.   return(0);
  225. }
  226.  
  227. nodevalid( un )
  228. {
  229.   sprintf( fname, "env:STATS@%d", un );
  230.   str = fopen( fname, "r" );
  231.   if( str == NULL ) return( 0 );
  232.   fclose( str );
  233.   return( 1 );
  234. }
  235.  
  236. getusernm( i ) 
  237. {
  238.   sprintf( fname, "bbs:node%d.user", i );
  239.   str = fopen( fname,"r" );
  240.   if( str == NULL ) return( ACERR );
  241.   ret = fread( user, 1, 80, str );
  242.   if( ret <= 0 ) return( ACERR );
  243.   strcpy( namest[i], user );
  244.   strcpy( locst, &user[40] );
  245.   fclose( str );
  246.   return( 0 );
  247. }
  248.  
  249. getnodeact( i )
  250. {
  251. int ret;
  252.  
  253.    act = parsestats( i );
  254.    if( act == INACT ) return(1);
  255.    if( act == ACERR ) return(1);
  256.    if( act != NOCONN ) ret = getusernm( i );
  257.    if( ret == ACERR ) return(1);
  258.    if( act == NOCONN || act == UNKNOWN || act == SPARE ) act = parselog( i );
  259.    return(0);
  260. }
  261.  
  262. assignsp( i )
  263. {
  264.    strcpy( namest[i], " " );
  265.    strcpy( locst, " " );
  266.    strcpy( actst, " " );
  267.    strcpy( statst, " " );
  268.    return(0);
  269. }
  270.  
  271. parsestats( i )
  272. {
  273. char tmp[200];
  274. int stc, ret;
  275.  
  276.    spact = UNKNOWN;
  277.    sprintf( fname, "env:stats@%d", i );
  278.    str = fopen( fname,"r" );
  279.    if( str == NULL ) return( ACERR ); 
  280.    ret = fread( tmp, 1, 100, str );
  281.    if( ret < 35 ) { fclose( str ); return( ACERR ); };
  282.  
  283.    tmp[ret] = 0;
  284.    sscanf( &tmp[36], "%d", &stc );
  285.    switch( stc ) {
  286.     case 0: ret = UNKNOWN; break;
  287.     case 1: ret = SPARE; spact = STDOWN; break;
  288.     case 2: ret = SPARE; spact = STUP; break;
  289.     case 3: ret = SPARE; spact = DOOR; break;
  290.     case 8: ret = SPARE; spact = STSCAN; break;
  291.     case 10: ret = SPARE; spact = VIEWTXT; break;
  292.     case 13: ret = SPARE; spact = COMMOP; break;    
  293.  
  294.  
  295.     case 4: ret = MESBASE; break; 
  296.     case 5: ret = STATS; break;
  297.     case 6: ret = ACEDIT; break;
  298.     case 7: ret = ZOOM; break;
  299.     case 9: ret = BULL; break;
  300.     case 15: ret = EDIT; break;
  301.     case 14: ret = REMOTE; break;
  302.     case 16: ret = JCONF; break;  
  303.     case 21: 
  304.     case 11: ret = LOGIN; break;
  305.     case 12: ret = LOGOFF; break; 
  306.     case 17: ret = OPCHAT; break;
  307.     case 18: ret = LOSSC; break;     
  308.     case 19: ret = OPCHATREQ; break;
  309.  
  310.     case 22: ret = NOCONN; break;
  311.     case 23: ret = MAIL; break;
  312.     case 24: ret = INACT; break;
  313.     default: ret = UNKNOWN; break;
  314.    };
  315.    fclose( str );
  316.    return( ret );
  317. }
  318.  
  319. parse( s )
  320. char *s;
  321. {
  322. char *sc;
  323.  
  324.  if( ( sc = strstr( log, s ) ) == NULL ) return( 0 );
  325.  tok = sc - log;
  326.  return( 1 );
  327.  
  328. parselog(i) 
  329. {
  330. int j, k, l, ret;
  331. char buf[200];
  332.  
  333.    sprintf( fname, "bbs:node%d/callerslog", i );
  334.    str = fopen( fname, "r" );
  335.    if( str == NULL ) return( ACERR );
  336.    /* SEEK_END ?, ok */
  337.    fseek( str, -100L, 2 );
  338.    ret = fread( buf, 100, 1, str );
  339.    if( ret != 1 ) return( ACERR ); 
  340.    buf[99] = 0;
  341.    for( j = 98; j > 0; j-- ) if( buf[j] == '\n' ) break;
  342.    l = 0;
  343.    for( k = j+1; k <= 98; k++ ) {
  344.     if( buf[k] == 9 ) continue;
  345.     log[l++] = buf[k];
  346.    };
  347.    log[l] = 0;
  348.    fclose( str );
  349.  
  350.    if( act == NOCONN ) {
  351.     if( parse( "Password Failure" ) ) return( HACK );
  352.     return( NOCONN );
  353.    };
  354.    if( act == SPARE ) {
  355.     switch( spact ) {
  356.      case STSCAN: if( parse( "Directory Scan for ") ) return( SCAN );
  357.      case STDOWN: if( parse( "Downloading") ) return ( DOWN );
  358.                   break;
  359.      case STUP:   if( parse( "Uploading") ) return( UP );
  360.                   break;
  361.      case DOOR:   if( parse( "Using AEChat") ) return( CHAT ); 
  362.                   if( parse( "Returned back to AEChat") ) return( CHAT ); 
  363.                   break; 
  364.      case VIEWTXT:if( parse( "SysopView") ) return( SYSVIEW );
  365.      case COMMOP: if (parse( "Account editing" ) ) return ( ACEDIT );    
  366.     };
  367.     return( spact );
  368.    };
  369.   
  370.    if( parse( "Using NodeInfo") ) return( NODEINF ); 
  371.    if( parse( "Conference Joined") ) return( ATCONF ); 
  372.    if( parse( "ailed") ) return( FUCK );
  373.    return( IDLE );       
  374.  
  375. }
  376.  
  377. setact( act )
  378. {
  379. int sp, i;
  380. char tmp[100];
  381.  
  382.    switch( act ) {
  383.     case LOSSC:  sw1( "Lost Carrier" ); break;
  384.     case STUP:   sw1( "Uploading" ); break;
  385.     case STDOWN: sw1( "Downloading" ); break;
  386.     case UP:
  387.      log[33] = 0;
  388.      strcpy( tmp, "U/L: " );
  389.      for( i = 10; log[i]; i++ ) if( log[i] == ' ' ) { log[i] = 0; break; }
  390.      strcat( tmp, &log[10] );
  391.      sw1( tmp ); break;
  392.     case DOWN:
  393.      sw1( "D/L: " );
  394.      sp = tok+12;
  395.      while( log[++sp] != ' ' );
  396.      log[sp] = 0;
  397.      tok = sp-1;
  398.      while( log[tok] != ' ' && log[tok] != '/' && log[tok] != ':' ) tok--;
  399.      strcat( actst, &log[tok+1] );
  400.      break;
  401.     case INACT:  sw1( "Inactive node" ); break;
  402.     case STATS:  sw1( "Examining Status" ); break;
  403.     case NODEINF:sw1( "InfoNode (c) v1.22" ); break;
  404.     case CHAT:   sw1( "Chatting" ); break;
  405.     case DOOR:   sw1( "Door Activity" ); break;
  406.     case BULL:   sw1( "Viewing Bulletins" ); break;
  407.     case ACEDIT: sw1( "Account Edit" ); break;
  408.     case IDLE:   sw1( "Idle" ); break;
  409.     case COMMOP: sw1( "SysOp Functions" ); break;
  410.     case JCONF:  sw1( "Joining Conference" ); break;
  411.  
  412.     case VIEWTXT:sw1( "Viewing TXT File" ); break;
  413.     case SYSVIEW:sw1( "Sysop Viewing" ); break;
  414.     case HACK:   sw1( "Hacking Account!" ); break;
  415.     case EDIT:   sw1( "Editing Directories" ); break;
  416.     case REMOTE: sw1( "Remote Shell" ); break;
  417.     case STSCAN: sw1( "Scanning Files" ); break;
  418.     case SCAN:   sw1( "Scanning " ); 
  419.                  strcat( actst, &log[19] ); break;
  420.     case FUCK:   sw1( "Failed Upload!" ); break;
  421.     case LOGIN:  sw1( "Logging In" ); break;
  422.     case LOGOFF: sw1( "Logging Off" ); break;
  423.     case ATCONF: sw1( "Joined " ); 
  424.                  while( log[--tok] != '(');              
  425.                  log[tok-1] = 0;
  426.                  strcat( actst, log ); break;
  427.     case OPCHATREQ: sw1( "Paging Operator" ); break;
  428.     case OPCHAT: sw1( "Chatting Operator" ); break;
  429.     case MESBASE:sw1( "Msg Base Activity" ); break;
  430.     case MAIL:   sw1( "Scanning Mail" ); break;
  431.       default:   sw1( "? ? ? ? ?" ); break;
  432.    };
  433.    return(0);
  434. }
  435.  
  436. page()
  437. {
  438. long t1, t2;
  439. char inp[100], portnm[100], mes[100];
  440. int otnd, ret, tm;
  441. struct MsgPort *otport;
  442. struct JHMessage pagemsg;
  443.  
  444.   chatwho(1); 
  445.   rep:
  446.   sm0( "- Page Which Node? [Node #] Or [Q] To Quit: " ); 
  447.  
  448.   time( &t1 );
  449.   FOREVER {
  450.    if( getkey() ) {
  451.     prompt( "", inp, 2 );
  452.     break;
  453.    }; 
  454.    time( &t2 );
  455.    tm = t2 - t1;
  456.    if( tm > 4 ) {
  457.     sm1( "\n- Timed Out!" );
  458.     goto ex;
  459.    };
  460.   };
  461.  
  462.   if( inp[0] == 'q' || inp[0] == 'Q' ) goto ex;
  463.   if( inp[0] == 0 ) goto rep;
  464.  
  465.   otnd = -1;
  466.   ret = sscanf( inp, "%d", &otnd );
  467.   if( ret != 1 ) { sm1( "- Invalid Entry!" ); goto ex; };
  468.   if( otnd < 1 || otnd >= nodenum ) { sm1( "- Invalid Node!" ); goto ex; };
  469.   if( otnd == mynd ) { sm1( "- Page *Yourself* For A Monologue??!" ); goto ex; };
  470.  
  471.   if( checkstatus( otnd ) == 0 ) {
  472.    sprintf( mes, "- Cannot Page Node:%d. User: [%s] Is Flagged As Unavailable For Chat!",
  473.     otnd, namest[otnd] ); 
  474.    sm1( mes );
  475.    goto ex;
  476.   };
  477.   getnodeact( otnd );
  478.   switch( act ) {
  479.    case NOCONN: case ACERR: case LOSSC: case HACK:
  480.     sprintf( mes, "- No Connection At Node: [%d]", otnd );
  481.     sm1( mes );
  482.     goto ex;
  483.    case CHAT:
  484.     sprintf( mes, "- Node:%d User: [%s] Is Already In Chat Mode!", otnd, namest[otnd]  ); 
  485.     sm1( mes );
  486.     goto ex;
  487.    case STUP: case STDOWN: case DOWN: case UP:
  488.    case EDIT: case ACEDIT: case REMOTE:
  489.     setact( act );
  490.     sprintf( mes, "- Cannot Page Right Now, Node:%d User: [%s] Is: %s",
  491.      otnd, namest[otnd], actst ); 
  492.     sm1( mes );
  493.     goto ex;
  494.    default: break;
  495.   };
  496.   
  497.   sprintf( portnm, "AEServer.%d", otnd );
  498.   otport = FindPort( (UBYTE *)portnm );
  499.   if( otport == 0 ) { sm1( "- Node Unavailable!" ); goto ex; };
  500.   pagemsg.Msg.mn_Node.ln_Type=NT_MESSAGE;
  501.   pagemsg.Msg.mn_Length=sizeof(struct JHMessage);
  502.   pagemsg.Msg.mn_ReplyPort=0;
  503.   pagemsg.Data = 0;
  504.   pagemsg.Command = 3;
  505.   sprintf(pagemsg.String,
  506.    "\a\n\r\n\rChat Request! From Node:%d ) User[%s]\n\r\n\r", mynd, mynm );
  507.   PutMsg(otport, (struct Message *)&pagemsg);
  508.   sprintf(pagemsg.String, "Press [Return] To Resume BBS Operations. Use [CHAT] To Chat With %s\n\r\n\r", mynm );
  509.   PutMsg(otport, (struct Message *)&pagemsg);
  510.   sprintf( mes, "- Chat Request Sent To Node:%d ) User[%s]", otnd, namest[otnd] ); 
  511.   sm1( mes );
  512.   cr();
  513.   return(0);
  514.  
  515.   ex:
  516.   sm1( "- Operation Aborted!\n");
  517.   return(1);
  518.  
  519. }
  520.  
  521. LastCommand()
  522. {
  523.  return(0);
  524. }
  525.  
  526. sm(mstring,nl)
  527. char *mstring;
  528. {
  529. int i;
  530.   Jhmsg->Data = 0;
  531.   Jhmsg->Command = 3;
  532.   strcpy(Jhmsg->String,mstring);
  533.   PutToPort((struct Message *)Jhmsg);
  534.   (void)WaitPort(replymp);
  535.   (void)GetMsg(replymp);
  536.   for( i = 0; i < nl && i < 30; i++ ) cr();
  537.   return(0);
  538. }
  539.  
  540. cr() { sm0( "\r\n" ); return(0);}
  541.  
  542. bs() { sm0( "\b \b" );  return(0);}
  543.  
  544. bsn(n)
  545. {
  546. int i;
  547.  for( i = 0; i < n; i++ ) bs();
  548.  return(0);
  549. }
  550.  
  551.