ui.c
上传用户:ai20ln
上传日期:2007-01-05
资源大小:79k
文件大小:31k
源码类别:

ICQ/即时通讯

开发平台:

Unix_Linux

  1. /*********************************************
  2. **********************************************
  3. This file has the "ui" functions that read input
  4. and send messages etc.
  5. This software is provided AS IS to be used in
  6. whatever way you see fit and is placed in the
  7. public domain.
  8. Author : Matthew Smith April 23, 1998
  9. Contributors : Nicolas Sahlqvist April 27, 1998
  10.                Michael Ivey May 4, 1998
  11.                Ulf Hedlund -- Windows Support
  12.                Michael Holzt May 5, 1998
  13. Changes :
  14. 22-6-98 Added the save and alter command and the
  15.         new implementation of auto
  16. **********************************************
  17. **********************************************/
  18. #define color_cmd "color"
  19. #define sound_cmd "sound"
  20. #include "micq.h"
  21. #include "datatype.h"
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #ifdef _WIN32
  25.   #include <winsock2.h>
  26. #else
  27.   #include <unistd.h>
  28.   #include <netinet/in.h>
  29.   #include <sys/types.h>
  30.   #include <sys/stat.h>
  31.   #include <sys/time.h>
  32.   #include <sys/socket.h>
  33.   #include <arpa/inet.h>
  34.   #include <netdb.h>
  35. #endif
  36. #include <fcntl.h>
  37. #include <time.h>
  38. #include <stdarg.h>
  39. #include <string.h>
  40. #include <ctype.h>
  41. #include <assert.h>
  42. #include "ui.h"
  43. USER_INFO_STRUCT user;
  44. #ifdef UNIX
  45. char *strdup( const char * );
  46. int strcasecmp( const char *, const char * );
  47. #endif
  48. BOOL Do_Multiline( SOK_T sok, char *buf )
  49. {
  50.    static int offset=0;
  51.    static char msg[1024];
  52.    
  53.    msg[ offset ] = 0;
  54.    if ( strcmp( buf, END_MSG_STR ) == 0 )
  55.    {
  56.       icq_sendmsg( sok, multi_uin, msg, NORM_MESS );
  57.       M_print( "Message sent to " );
  58.       Print_UIN_Name( multi_uin );
  59.       M_print( "n");
  60.       last_uin = multi_uin;
  61.       offset = 0;
  62.       return FALSE;
  63.    }
  64.    else if ( strcmp( buf, CANCEL_MSG_STR ) == 0 )
  65.    {
  66.       M_print( "Message canceled!n" );
  67.       last_uin = multi_uin;
  68.       offset = 0;
  69.       return FALSE;
  70.    }
  71.    else
  72.    {
  73.       if ( offset + strlen( buf ) < 450 )
  74.       {
  75.          strcat( msg, buf );
  76.          strcat( msg, "rn" );
  77.          offset += strlen( buf ) + 2;
  78.          return TRUE;
  79.       }
  80.       else
  81.       {
  82.          M_print( "Message sent before last line buffer is fulln" );
  83.          M_print( "Message sent to " );
  84.          Print_UIN_Name( multi_uin );
  85.          M_print( "n");
  86.          icq_sendmsg( sok, multi_uin, msg, NORM_MESS );
  87.          last_uin = multi_uin;
  88.          offset = 0;
  89.          return FALSE;
  90.       }
  91.    }
  92. }
  93. void Info_Update( SOK_T sok, char *buf )
  94. {
  95.    
  96.    switch ( status ) {
  97.    case NEW_NICK:
  98.       user.nick = strdup( (char *) buf );
  99.     M_print ( "Enter Your New First Name : ");
  100.     fflush(stdout);
  101.       status++;
  102.       break;
  103.    case NEW_FIRST:
  104.       user.first = strdup( (char *) buf );
  105.     M_print ( "Enter Your New Last Name : ");
  106.     fflush(stdout);
  107.       status++;
  108.       break;
  109.    case NEW_LAST:
  110.       user.last = strdup( (char *) buf );
  111.     M_print ( "Enter Your New Email Address : ");
  112.     fflush(stdout);
  113.       status++;
  114.       break;
  115.    case NEW_EMAIL:
  116.       user.email = strdup( (char *) buf );
  117.     M_print ( "Do you want to require Mirabilis users to request your authorization? : ");
  118.     fflush(stdout);
  119.       status++;
  120.       break;
  121.    case NEW_AUTH:
  122.       if ( ! strcasecmp( buf, NO_STR ) )
  123.       {
  124.          user.auth = FALSE;
  125.          Update_User_Info( sok, &user );
  126. /*         free( user.nick );
  127.          free( user.last );
  128.          free( user.first );
  129.          free( user.email ); */
  130.          status = 0;
  131.       }
  132.       else if ( ! strcasecmp( buf, YES_STR ) )
  133.       {
  134.          user.auth = TRUE;
  135.          Update_User_Info( sok, &user );
  136.          free( user.nick );
  137.          free( user.last );
  138.          free( user.first );
  139.          free( user.email );
  140.          status = 0;
  141.       }
  142.       else
  143.       {
  144.          M_print( "Please enter %s or %s.n", YES_STR, NO_STR );
  145.        M_print( "Do you want to require Mirabilis users to request your authorization? : ");
  146.        fflush(stdout);
  147.       }
  148.       break;
  149.    }
  150. }
  151. BOOL Do_Multiline_All( SOK_T sok, char *buf )
  152. {
  153.    static int offset=0;
  154.    static char msg[1024];
  155.    int i;
  156.    
  157.    msg[ offset ] = 0;
  158.    if ( strcmp( buf, END_MSG_STR ) == 0 )
  159.    {
  160.       for ( i=0; i < Num_Contacts; i++ )
  161.          icq_sendmsg( sok, Contacts[i].uin, msg, MRNORM_MESS );
  162.       M_print( "Message sent!n" );
  163.       offset = 0;
  164.       return FALSE;
  165.    }
  166.    else if ( strcmp( buf, CANCEL_MSG_STR ) == 0 )
  167.    {
  168.       M_print( "Message canceled!n" );
  169.       offset = 0;
  170.       return FALSE;
  171.    }
  172.    else
  173.    {
  174.       if ( offset + strlen( buf ) < 450 )
  175.       {
  176.          strcat( msg, buf );
  177.          strcat( msg, "rn" );
  178.          offset += strlen( buf ) + 2;
  179.          return TRUE;
  180.       }
  181.       else
  182.       {
  183.          M_print( "Message sent before last line buffer is fulln" );
  184.          for ( i=0; i < Num_Contacts; i++ )
  185.             icq_sendmsg( sok, Contacts[i].uin, msg, MRNORM_MESS );
  186.          offset = 0;
  187.          return FALSE;
  188.       }
  189.    }
  190. }
  191. /******************************************************
  192. Read a line of input and processes it.
  193. *******************************************************/
  194. void Get_Input( SOK_T sok )
  195. {
  196.    char buf[1024]; /* This is hopefully enough */
  197.    char *cmd;
  198.    char *arg1;
  199.    char *arg2;
  200.    int i;
  201.    
  202.    memset( buf, 0, 1024 );
  203.    M_fdnreadln( STDIN, buf, 1024 ); /* assumes we're line buffered input */
  204.    buf[1023]=0; /* be safe */
  205.    if ( status == 1 )
  206.    {
  207.       if ( ! Do_Multiline( sok, buf ) )
  208.       {
  209.          status = 2;
  210.       } else {
  211.    M_print ( "msg> ");
  212.    fflush(stdout);
  213.     }
  214.    }
  215.    else if ( status == 3 )
  216.    {
  217.       if ( ! Do_Multiline_All( sok, buf ) ) {
  218.          status = 2;
  219.       } else {
  220.        M_print ( "msg all> ");
  221.        fflush(stdout);
  222.     }
  223.    }
  224.    else if ( ( status >= NEW_NICK) && ( status <= NEW_AUTH) )
  225.    {  Info_Update( sok, buf ); }
  226.    else
  227.    {
  228.       if ( buf[0] != 0 )
  229.       {
  230.         if ( '!' == buf[0] )
  231.         {
  232.    system( &buf[1] );
  233.            Prompt();
  234.            return;
  235.         }
  236.          cmd = strtok( buf, " nt" );
  237.         if ( NULL == cmd )
  238.         {
  239.            Prompt();
  240.            return;
  241.         }
  242.          /* goto's removed and code fixed by Paul Laufer. Enjoy! */
  243.          if ( ( strcasecmp( cmd , "quit" ) == 0 ) ||
  244.               ( strcasecmp( cmd , "/quit" ) == 0 ) )
  245.             {  Quit = TRUE; }
  246.          else if ( strcasecmp( cmd, quit_cmd ) == 0 )
  247.             {  Quit = TRUE; }
  248.          else if ( strcasecmp( cmd, sound_cmd ) == 0 )
  249.          {
  250.             if ( SOUND_ON == Sound )
  251.             {
  252.                Sound = SOUND_OFF;
  253.                M_print( "Sound" SERVCOL " OFF" NOCOL ".n" );
  254.             }
  255.             else if ( SOUND_OFF == Sound )
  256.             {
  257.                Sound = SOUND_ON;
  258.                M_print( "Sound" SERVCOL  " ON" NOCOL ".n" );
  259.             }
  260.          }
  261.          else if ( strcasecmp( cmd, change_cmd ) == 0 )
  262.             {  Change_Function( sok ); }
  263.          else if ( strcasecmp( cmd, "rand" ) == 0 )
  264.             {  Random_Function( sok ); }
  265.          else if ( strcasecmp( cmd, "set" ) == 0 )
  266.             {  Random_Set_Function( sok ); }
  267.             else if ( ! strcasecmp( cmd, color_cmd ) )
  268.             { 
  269.                Color = !Color;
  270.                if ( Color )
  271.                {
  272.                   M_print( "Color is " MESSCOL "on" NOCOL ".n" );
  273.                }
  274.                else
  275.                {
  276.                   M_print( "Color is " MESSCOL "off" NOCOL ".n" );
  277.                }
  278.             }
  279.       else if ( ! strcasecmp( cmd, online_cmd ) ) /* online command */
  280.           {   CHANGE_STATUS( STATUS_ONLINE ); }
  281.       else if ( ! strcasecmp( cmd, away_cmd ) ) /* away command */
  282.          {   CHANGE_STATUS( STATUS_AWAY ); }
  283.       else if ( ! strcasecmp( cmd, na_cmd ) ) /* Not Available command */
  284.           {   CHANGE_STATUS( STATUS_NA ); }
  285.       else if ( ! strcasecmp( cmd, occ_cmd ) ) /* Occupied command */
  286.          {   CHANGE_STATUS( STATUS_OCCUPIED ); }
  287.       else if ( ! strcasecmp( cmd, dnd_cmd ) ) /* Do not Disturb  command */
  288.           {   CHANGE_STATUS( STATUS_DND ); }
  289.       else if ( ! strcasecmp( cmd, ffc_cmd ) ) /* Free For Chat command */
  290.           {   CHANGE_STATUS( STATUS_FREE_CHAT ); }
  291.       else if ( ! strcasecmp( cmd, inv_cmd ) ) /* Invisible command */
  292.           {   CHANGE_STATUS( STATUS_INVISIBLE ); }
  293.       else if ( ! strcasecmp( cmd, search_cmd ) )
  294.        {
  295.              arg1 = strtok( NULL, "n" );
  296.              if ( arg1 == NULL )
  297.              {
  298.                M_print("Must enter email address.n");
  299.              }
  300.              else
  301.              {
  302.               start_search( sok, arg1, "", "", "" );
  303.              }
  304.       }
  305.          else if ( ! strcasecmp( cmd, status_cmd ) ) 
  306.          {  Show_Status(); }
  307.          else if ( ! strcasecmp( cmd, list_cmd ) ) 
  308.          {  Show_Quick_Status(); }
  309.          else if ( ! strcasecmp( cmd, msga_cmd ) )
  310.          {
  311.             status = 3;
  312.             M_print( "msg all> " );
  313.             fflush(stdout);
  314.          }
  315.          else if ( ! strcasecmp( cmd, reply_cmd ) ) /* reply command */
  316.          {
  317.             Reply_Function( sok );
  318.          }
  319.          else if ( ! strcasecmp( cmd, "reg" ) )
  320.          {
  321.             arg1 = strtok( NULL, "" );
  322.             if ( arg1 != NULL )
  323.             {  reg_new_user( sok, arg1 ); }
  324.          }
  325.          else if ( ! strcasecmp( cmd, again_cmd ) ) /* again command */
  326.          {  Again_Function( sok ); }
  327.          else if ( ! strcasecmp( cmd, "clear"))
  328.        { clrscr(); }
  329.          else if ( ! strcasecmp( cmd, info_cmd ) )
  330.          {  Info_Function( sok ); }
  331.          else if ( ! strcasecmp( cmd, "ver" ) )
  332.          { M_print( "Micq Version : " MESSCOL MICQ_VERSION NOCOL " Compiled on "__TIME__ " "  __DATE__"n" ); }
  333.          else if ( ! strcasecmp( cmd, add_cmd ) )
  334.          {
  335.             arg1 = strtok( NULL, " t" );
  336.             if ( arg1 != NULL )
  337.             {
  338.                uin = atoi( arg1 );
  339.                arg1 = strtok( NULL, "" );
  340.                if ( arg1 != NULL )
  341.                {
  342.                   Add_User( sok, uin, arg1 );
  343.                   M_print( "%s added.n", arg1 );
  344.                }
  345.             }
  346.             else
  347.             {
  348.                M_print( SERVCOL "Must specify a nick name" NOCOL "n" );
  349.             }
  350.          }
  351.          else if ( strcasecmp( cmd, "verbose" ) == 0 )
  352.          { Verbose_Function(); }
  353.          else if ( strcasecmp( cmd, "rinfo" ) == 0 )
  354.          {
  355.             Print_UIN_Name( last_recv_uin );
  356.             M_print( "'s IP address is " );
  357.             Print_IP( last_recv_uin );
  358.             M_print( "tThe port is %dn",(WORD) Get_Port( last_recv_uin ) );
  359.             M_print( "n" );
  360.             send_info_req( sok, last_recv_uin );
  361.             send_ext_info_req( sok, last_recv_uin );
  362.          }
  363.          else if ( ( strcasecmp( cmd, "/help" ) == 0 ) ||/* Help command */
  364.                    ( strcasecmp( cmd, "help" ) == 0 ) )
  365.          {  Help_Function(); }
  366.          else if ( strcasecmp( cmd, auth_cmd ) == 0 )
  367.          {
  368.              arg1 = strtok( NULL, "" );
  369.              if ( arg1 == NULL )
  370.              {
  371.                 M_print( "Need uin to send ton" );
  372.              }
  373.              else
  374.              {
  375.               uin = nick2uin( arg1 );
  376.               if ( -1 == uin )
  377.               {
  378.                  M_print( "%s not recognized as a nick namen", arg1 );
  379.               }
  380.               else icq_sendauthmsg( sok, uin );
  381.              }         
  382.          }
  383.          else if ( strcasecmp( cmd, message_cmd ) == 0 ) /* "/msg" */
  384.          {
  385.             Message_Function( sok );
  386.          }
  387.       else if ( strcasecmp( cmd, url_cmd ) == 0 ) /* "/msg" */
  388.       {
  389.       arg1 = strtok( NULL, " " );
  390.       if ( arg1 == NULL )
  391.       {
  392.       M_print( "Need uin to send ton" );
  393.       }
  394.       else
  395.       {
  396.       uin = nick2uin( arg1 );
  397.       if ( uin == -1 )
  398.       {
  399.       M_print( "%s not recognized as a nick namen", arg1 );
  400.       }
  401.       else
  402.       {
  403.       arg1 = strtok( NULL, " " );
  404.       last_uin = uin;
  405.       if ( arg1 != NULL )
  406.       {
  407.       arg2 = strtok(NULL, "");
  408. /*       sM_print(arg1, "%s%c%s", arg1, 'xFE', arg2);*/
  409.       icq_sendurl( sok, uin, arg1, arg2 );
  410.       M_print( "URL sent to ");
  411.       Print_UIN_Name( last_uin );
  412.       M_print( "!n");
  413.       } else {
  414.       M_print("Need URL please.n");
  415.       } 
  416.       }
  417.       }
  418.       }
  419.          else if ( ! strcasecmp( cmd, alter_cmd ) ) /* alter command */
  420.          {  Alter_Function(); }
  421.          else if ( ! strcasecmp( cmd, save_cmd ) ) /* save command */
  422.          {
  423.             i=Save_RC();
  424.             if (i==-1)
  425.                M_print("Sorry saving your personal reply messages went wrong!n");
  426.             else
  427.                M_print("Your personal settings have been saved!n");
  428.          }
  429.          else if ( ! strcasecmp( cmd, "update" ) )
  430.          {
  431.             status = NEW_NICK;
  432.             M_print( "Enter Your New Nickname : " );
  433.             fflush(stdout);
  434.          }
  435.          else if ( strcasecmp( cmd, auto_cmd ) == 0 )
  436.          {  Auto_Function( sok ); }
  437.          else 
  438.          {  M_print( "Unknown command %s, type /help for help.n", cmd ); }
  439.       }
  440.    }
  441.    multi_uin = last_uin;
  442.    if ( ( status == 0 ) || ( status == 2) )
  443.    {
  444.       if ( ! Quit )
  445.          Prompt();
  446.    }
  447. }
  448. /**************************************************************
  449. most detailed contact list display
  450. ***************************************************************/
  451. static void Show_Status( void )
  452. {
  453.    int i;
  454.    M_print( W_SEPERATOR );
  455.    M_print( "Your status is " );
  456.    Print_Status( Current_Status );
  457.    M_print( "n" );
  458.    /*  First loop sorts thru all offline users */
  459.    M_print( W_SEPERATOR );
  460.    M_print( "Users offline: n" );
  461.    for ( i=0; i< Num_Contacts; i++ )
  462.    {
  463.       if ( ( S_DWORD )Contacts[ i ].uin > 0 )
  464.       {
  465.          if ( FALSE == Contacts[ i ].invis_list )
  466.  {
  467.             if ( Contacts[ i ].status == STATUS_OFFLINE )
  468.             {
  469.                if ( Contacts[i].vis_list ) {
  470.            M_print( "%s*%s", SERVCOL, NOCOL );
  471.                } else {
  472.            M_print( " " );
  473.                }
  474.                M_print( "%8ld=", Contacts[ i ].uin );
  475.                M_print( CONTACTCOL "%-20st%s(", Contacts[ i ].nick, MESSCOL );
  476.                Print_Status( Contacts[ i ].status );
  477.                M_print( ")%s", NOCOL );
  478.                if ( -1L != Contacts[ i ].last_time )
  479.                {
  480.            if ( Contacts[ i ].status  == STATUS_OFFLINE )
  481.                      M_print( " Last online at %s", ctime( (time_t *) &Contacts[ i ].last_time ) );
  482.            else
  483.                      M_print( " Online since %s", ctime( (time_t *) &Contacts[ i ].last_time )  );
  484.                }
  485.                else
  486.                {
  487.            M_print( " Last on-line unknown.n" );
  488.            /* if time is unknow they can't be logged on cause we */
  489.            /* set the time at login */
  490.                }
  491.             }
  492.  }
  493.       }
  494.    }
  495.    /* The second loop displays all the online users */
  496.    M_print( W_SEPERATOR );
  497.    M_print( "Users online: n" );
  498.    for ( i=0; i< Num_Contacts; i++ )
  499.    {
  500.       if ( ( S_DWORD )Contacts[ i ].uin > 0 )
  501.       {
  502.          if ( FALSE == Contacts[ i ].invis_list )
  503.  {
  504.             if ( Contacts[ i ].status != STATUS_OFFLINE )
  505.             {
  506.                if ( Contacts[i].vis_list ) {
  507.            M_print( "%s*%s", SERVCOL, NOCOL );
  508.                } else {
  509.            M_print( " " );
  510.                }
  511.                M_print( "%8ld=", Contacts[ i ].uin );
  512.                M_print( CONTACTCOL "%-20st%s(", Contacts[ i ].nick, MESSCOL );
  513.                Print_Status( Contacts[ i ].status );
  514.                M_print( ")%s", NOCOL );
  515.                if ( -1L != Contacts[ i ].last_time )
  516.                {
  517.            if ( Contacts[ i ].status  == STATUS_OFFLINE )
  518.                      M_print( " Last online at %s", ctime( (time_t *) &Contacts[ i ].last_time ) );
  519.            else
  520.                      M_print( " Online since %s", ctime( (time_t *) &Contacts[ i ].last_time )  );
  521.                }
  522.                else
  523.                {
  524.            M_print( " Last on-line unknown.n" );
  525.            /* if time is unknow they can't be logged on cause we */
  526.            /* set the time at login */
  527.                }
  528.             }
  529.  }
  530.       }
  531.    }
  532.    M_print( W_SEPERATOR );
  533. }
  534. /***************************************************************
  535. nice clean "w" display
  536. ****************************************************************/
  537. void Show_Quick_Status( void )
  538. {
  539.    int i;
  540.    
  541.    M_print( "nn" W_SEPERATOR );
  542.    M_print( "%lu: ", UIN );
  543.    M_print( "Your status is " );
  544.    Print_Status( Current_Status );
  545.    M_print( "n" );
  546.    /*  First loop sorts thru all offline users */
  547.    /*  This comes first so that if there are many contacts */
  548.    /*  The online ones will be less likely to scroll off the screen */
  549.    M_print( W_SEPERATOR );
  550.    M_print( "Users offline: n" );
  551.    for ( i=0; i< Num_Contacts; i++ )
  552.    {
  553.       if ( ( S_DWORD )Contacts[ i ].uin > 0 )
  554.       {
  555.          if ( FALSE == Contacts[ i ].invis_list )
  556.  {
  557.             if ( Contacts[ i ].status == STATUS_OFFLINE )
  558.             {
  559.                if ( Contacts[i].vis_list ) {
  560.            M_print( "%s*%s", SERVCOL, NOCOL );
  561.                } else {
  562.            M_print( " " );
  563.                }
  564.                M_print( CONTACTCOL "%-20st" MESSCOL "(" , Contacts[ i ].nick );
  565.                Print_Status( Contacts[ i ].status );
  566.                M_print( ")" NOCOL "n" );
  567.             }
  568.  }
  569.       }
  570.    }
  571.    /* The second loop displays all the online users */
  572.    M_print( W_SEPERATOR );
  573.    M_print( "Users online: n" );
  574.    for ( i=0; i< Num_Contacts; i++ )
  575.    {
  576.       if ( ( S_DWORD )Contacts[ i ].uin > 0 )
  577.       {
  578.          if ( FALSE == Contacts[ i ].invis_list )
  579.  {
  580.             if ( Contacts[ i ].status != STATUS_OFFLINE )
  581.             {
  582.                if ( Contacts[i].vis_list ) {
  583.            M_print( "%s*%s", SERVCOL, NOCOL );
  584.                } else {
  585.            M_print( " " );
  586.                }
  587.                M_print( CONTACTCOL "%-20st" MESSCOL "(", Contacts[ i ].nick );
  588.                Print_Status( Contacts[ i ].status );
  589.                M_print( ")" NOCOL "n" );
  590.             }
  591.  }
  592.       }
  593.    }
  594.    M_print( W_SEPERATOR );
  595. }
  596. /***************************************************
  597. Do not call unless you've already made a call to strtok()
  598. ****************************************************/
  599. static void Change_Function( SOK_T sok )
  600. {
  601.    char *arg1;
  602.    arg1 = strtok( NULL, " nr" );
  603.    if ( arg1 == NULL )
  604.    {
  605.       M_print(  CLIENTCOL "Status modes: n" );
  606.       M_print( "Status online         %dn", STATUS_ONLINE );
  607.       M_print( "Status Away           %dn", STATUS_AWAY );
  608.       M_print( "Status Do not Disturb %dn", STATUS_DND );
  609.       M_print( "Status Not Available  %dn", STATUS_NA );
  610.       M_print( "Status Free for Chat  %dn", STATUS_FREE_CHAT );
  611.       M_print( "Status Occupied       %dn", STATUS_OCCUPIED );
  612.       M_print( "Status Invisible      %dn", STATUS_INVISIBLE );
  613.       M_print( NOCOL "n" );
  614.    }
  615.    else
  616.    {
  617.       icq_change_status( sok, atoi( arg1 ) );
  618.       Print_Status( Current_Status );
  619.       M_print( "n" );
  620.    }
  621. }
  622. /***************************************************
  623. Do not call unless you've already made a call to strtok()
  624. ****************************************************/
  625. static void Random_Function( SOK_T sok )
  626. {
  627.    char *arg1;
  628.    arg1 = strtok( NULL, " nr" );
  629.    if ( arg1 == NULL )
  630.    {
  631.       M_print(  CLIENTCOL "Groups: n" );
  632.       M_print( "General                    1n" );
  633.       M_print( "Romance                    2n" );
  634.       M_print( "Games                      3n" );
  635.       M_print( "Students                   4n" );
  636.       M_print( "20 something               6n" );
  637.       M_print( "30 something               7n" );
  638.       M_print( "40 something               8n" );
  639.       M_print( "50+                        9n" );
  640.       M_print( "Man chat requesting women 10n" );
  641.       M_print( "Woman chat requesting men 11n" );
  642.       M_print( "Micq                      49 (might not work but try it)n" );
  643.       M_print( NOCOL "n" );
  644.    }
  645.    else
  646.    {
  647.       icq_rand_user_req( sok, atoi( arg1 ) );
  648.       M_print( "n" );
  649.    }
  650. }
  651. /***************************************************
  652. Do not call unless you've already made a call to strtok()
  653. ****************************************************/
  654. static void Random_Set_Function( SOK_T sok )
  655. {
  656.    char *arg1;
  657.    arg1 = strtok( NULL, " nr" );
  658.    if ( arg1 == NULL )
  659.    {
  660.       M_print(  CLIENTCOL "Groups: n" );
  661.       M_print( "None                      -1n" );
  662.       M_print( "General                    1n" );
  663.       M_print( "Romance                    2n" );
  664.       M_print( "Games                      3n" );
  665.       M_print( "Students                   4n" );
  666.       M_print( "20 something               6n" );
  667.       M_print( "30 something               7n" );
  668.       M_print( "40 something               8n" );
  669.       M_print( "50+                        9n" );
  670.       M_print( "Man chat requesting women 10n" );
  671.       M_print( "Woman chat requesting men 11n" );
  672.       M_print( "Micq                      49 (might not work but try it)n" );
  673.       M_print( NOCOL "n" );
  674.    }
  675.    else
  676.    {
  677.       icq_rand_set( sok, atoi( arg1 ) );
  678.       M_print( "n" );
  679.    }
  680. }
  681. /*****************************************************************
  682. Displays help information.
  683. ******************************************************************/
  684. static void Help_Function( void )
  685. {
  686.     M_print( MESSCOL "reg password" NOCOL "ttCreates a new UIN with the specified password.n");
  687.     M_print( MESSCOL "verbose #" NOCOL "tSet the verbosity level ( default = 0 ).n");
  688.     M_print( MESSCOL "%s" NOCOL "ttMark as Online.n",online_cmd);
  689.     M_print( MESSCOL "%s" NOCOL "ttMark as Away.n",away_cmd);
  690.             M_print( MESSCOL "%s" NOCOL "ttMark as Not Available.n",na_cmd);
  691.             M_print( MESSCOL "%s" NOCOL "ttMark as Occupied.n",occ_cmd);
  692.             M_print( MESSCOL "%s" NOCOL "ttMark as Do not Disturb.n",dnd_cmd);
  693.             M_print( MESSCOL "%s" NOCOL "ttMark as Free for Chat.n",ffc_cmd);
  694.             M_print( MESSCOL "%s" NOCOL "ttMark as Invisible.n",inv_cmd);
  695.             M_print( MESSCOL "clear" NOCOL "ttClears the screen.n" );
  696.             M_print( MESSCOL "%s" NOCOL"ttDisplays your autoreply statusn",auto_cmd );
  697.             M_print( MESSCOL "%s [on|off]" NOCOL "tToggles sending messages when your status is DND, NA, etc.n",auto_cmd );
  698.             M_print( MESSCOL "%s status message" NOCOL "tSets the message to send as an auto reply for the statusn",auto_cmd );
  699.             M_print( MESSCOL "%s old command new command" NOCOL "tThis command allows you to alter your command set on the fly.n",alter_cmd);
  700.             M_print( MESSCOL "%s" NOCOL "ttDisplays the current status of everyone on your contact listn",list_cmd);
  701.             M_print( MESSCOL "%s [#]" NOCOL "tChanges your status to the status number.nttWithout a number it lists the available modes.n",change_cmd);
  702.             M_print( MESSCOL "%s uin" NOCOL "t Displays general info on uinn", info_cmd );
  703.             M_print( MESSCOL "%s email@host" NOCOL "tSearches for a ICQ user with the specified email address.n", search_cmd );
  704.     M_print( MESSCOL "rand [#]" NOCOL "tFinds a random user in the specified group or lists the groups.n" );
  705.     M_print( MESSCOL "set [#]" NOCOL "tSets your random user group.n" );
  706.     M_print( MESSCOL "%s" NOCOL "tUpdates your basic info (email, nickname, etc.)n",update_cmd);
  707.             M_print( MESSCOL "%st" NOCOL "tLogs off and quitsn",quit_cmd );
  708.             M_print( MESSCOL "%stt" NOCOL "Sends a multiline message to everyone on your list.n", msga_cmd );
  709.             M_print( MESSCOL "%s uint" NOCOL "Authorize uin to add you to their listn", auth_cmd );
  710.             M_print( MESSCOL "%s uin/message" NOCOL "tSends a message to uinn", message_cmd );
  711.             M_print( MESSCOL "%s uin url message" NOCOL "tSends a url and message to uinn", url_cmd );
  712.             M_print( MESSCOL "%s uin nick" NOCOL "tAdds the uin number to your contact list with nickname.n", add_cmd );
  713.             M_print( MESSCOL "%s message" NOCOL "tSends a message to the last person you sent a message ton", again_cmd);
  714.             M_print( MESSCOL "%s message" NOCOL "tReplys to the last person to send you a messagen", reply_cmd);
  715.             M_print( MESSCOL "%s" NOCOL "ttToggles beeping when recieving new messages.n", sound_cmd);
  716.             M_print( MESSCOL "%s" NOCOL "ttToggles displaying colors.n", color_cmd);
  717.             M_print( CLIENTCOL "tSending a blank message will put the client into multiline mode.ntUse . on a line by itself to end message." NOCOL "n" );
  718. #if 0
  719. M_print( CLIENTCOL "nHmm with the auto command try using auto status message for a change.n ");
  720.             M_print( "The status commands are the same as you normaly use to alter your status." NOCOL "n");
  721. #ifdef FUNNY_MSGS         
  722.             M_print( CLIENTCOL "For me it could be auto dnd Don't disturb me! I'm drinking beer!" NOCOL "n");
  723. #endif
  724. #endif   
  725. }
  726. /****************************************************
  727. Retrieves info a certain user
  728. *****************************************************/
  729. static void Info_Function( SOK_T sok )
  730. {
  731.    char * arg1;
  732.    arg1 = strtok( NULL, "" );
  733.    if ( arg1 == NULL )
  734.    {
  735.       M_print( "Need uin to send ton" );
  736.       return;
  737.    }
  738.    uin = nick2uin( arg1 );
  739.    if ( -1 == uin )
  740.    {
  741.       M_print( "%s not recognized as a nick namen", arg1 );
  742.       return;
  743.    }
  744.    M_print( "%s's IP address is ", arg1 );
  745.    Print_IP( uin );
  746.    M_print( "tThe port is %dn",(WORD) Get_Port( uin ) );
  747.    M_print( "n" );
  748.    send_info_req( sok, uin );
  749.    send_ext_info_req( sok, uin );
  750. }
  751. /**********************************************************
  752. Handles automatic reply messages
  753. ***********************************************************/
  754. static void Auto_Function( SOK_T sok )
  755. {
  756.    char *cmd;
  757.    char *arg1;
  758.    
  759.    cmd = strtok( NULL, "" );
  760.    if ( cmd == NULL )
  761.    {
  762.       M_print( "Automatic replies are %sn", auto_resp ? "On" : "Off" );
  763.       M_print( "The Do not disturb message is: %sn", auto_rep_str_dnd );
  764.       M_print( "The Away message is          : %sn", auto_rep_str_away );
  765.    M_print( "The Not available message is  : %sn", auto_rep_str_na );
  766.      M_print( "The Occupied message is      : %sn", auto_rep_str_occ );
  767.      M_print( "The Invisible message is     : %sn", auto_rep_str_inv );
  768.      return;
  769.    }
  770.    else if ( strcasecmp( cmd, "on" ) == 0 )
  771.    {
  772.       auto_resp = TRUE;
  773.       M_print( "Automatic replies are on.n" );
  774.    }
  775.    else if ( strcasecmp( cmd, "off" ) == 0 )
  776.    {
  777.       auto_resp = FALSE;
  778.       M_print( "Automatic replies are off.n" );
  779.    }
  780.    else
  781.    {
  782.        M_print( "Automatic reply settingn" );
  783.        arg1 = strtok( cmd," ");
  784.      if (arg1 == NULL)
  785.      {
  786.      M_print( "Sorry wrong syntax, can't find a status somewhere.rn");
  787.          return;
  788.      }
  789.   if ( ! strcasecmp (arg1 , dnd_cmd ) )
  790.   {
  791.    cmd = strtok( NULL,"");
  792.    strcpy( auto_rep_str_dnd, cmd);
  793.   }
  794.   else if ( !strcasecmp (arg1 ,away_cmd ))
  795.      {
  796.     cmd = strtok( NULL,"");
  797.     strcpy( auto_rep_str_away,cmd);
  798.      }
  799.      else if ( !strcasecmp (arg1,na_cmd))
  800.      {
  801.       cmd =strtok(NULL,"");
  802.       strcpy(auto_rep_str_na,cmd);
  803.      }
  804.      else if ( !strcasecmp (arg1,occ_cmd))
  805.      {
  806.       cmd = strtok(NULL,"");
  807.       strcpy (auto_rep_str_occ,cmd);
  808.      }
  809.      else if (!strcasecmp (arg1,inv_cmd))
  810.      {
  811.      cmd = strtok(NULL,"");
  812.      strcpy (auto_rep_str_inv,cmd);
  813.      }
  814.      else
  815.      M_print ("Sorry wrong syntax. Read tha help man!rn");
  816.   }
  817. }
  818. /*************************************************************
  819. Alters one of the commands
  820. **************************************************************/
  821. static void Alter_Function( void )
  822. {
  823.    char * cmd;
  824.    
  825.    cmd = strtok (NULL," ");
  826.    if ( cmd == NULL )
  827.    {
  828.      M_print( "Need a command to alter!n" );
  829.      return;
  830.    }
  831.    if ( ! strcasecmp(cmd, auto_cmd))
  832.      strncpy(auto_cmd,strtok(NULL," nt"),16);
  833.    else if ( !strcasecmp(cmd ,message_cmd))
  834.      strncpy(message_cmd,strtok(NULL," nt"),16);
  835.    else if (!strcasecmp(cmd,add_cmd))
  836.      strncpy(add_cmd,strtok(NULL," nt"),16);
  837.    else if (!strcasecmp(cmd,info_cmd))
  838.      strncpy(info_cmd,strtok(NULL," nt"),16);
  839.    else if (!strcasecmp(cmd,quit_cmd))
  840.      strncpy(quit_cmd,strtok(NULL," nt"),16);
  841.    else if (!strcasecmp(cmd,reply_cmd))
  842.         strncpy(reply_cmd,strtok(NULL," nt"),16);
  843.    else if (!strcasecmp(cmd,again_cmd))
  844.            strncpy(again_cmd,strtok(NULL," nt"),16);
  845.    else if (!strcasecmp(cmd,list_cmd))
  846.            strncpy(list_cmd,strtok(NULL," nt"),16);
  847.    else if (!strcasecmp(cmd,away_cmd))
  848.            strncpy(away_cmd,strtok(NULL," nt"),16);
  849.    else if (!strcasecmp(cmd,na_cmd))
  850.            strncpy(na_cmd,strtok(NULL," nt"),16);
  851.    else if (!strcasecmp(cmd,dnd_cmd))
  852.            strncpy(dnd_cmd,strtok(NULL," tn"),16);
  853.    else if (!strcasecmp(cmd,online_cmd))
  854.            strncpy(online_cmd,strtok(NULL," nt"),16);
  855.    else if (!strcasecmp(cmd,occ_cmd))
  856.            strncpy(occ_cmd,strtok(NULL," tn"),16);
  857.    else if (!strcasecmp(cmd,ffc_cmd))
  858.            strncpy(ffc_cmd,strtok(NULL," tn"),16);
  859.    else if (!strcasecmp(cmd,inv_cmd))
  860.             strncpy(inv_cmd,strtok(NULL," tn"),16);
  861.    else if (!strcasecmp(cmd,status_cmd))
  862.            strncpy(status_cmd,strtok(NULL," tn"),16);
  863.    else if (!strcasecmp(cmd,auth_cmd))
  864.            strncpy(status_cmd,strtok(NULL," nt"),16);
  865.    else if (!strcasecmp(cmd,change_cmd))
  866.            strncpy(change_cmd,strtok(NULL," nt"),16);
  867.    else if (!strcasecmp(cmd,search_cmd))
  868.            strncpy(search_cmd,strtok(NULL," tn"),16);
  869.    else if (!strcasecmp(cmd,save_cmd))
  870.            strncpy(save_cmd,strtok(NULL," tn"),16);
  871.    else if (!strcasecmp(cmd,alter_cmd))
  872.            strncpy(alter_cmd,strtok(NULL," tn"),16);
  873.    else if (!strcasecmp(cmd,msga_cmd))
  874.           strncpy(msga_cmd,strtok(NULL," nt"),16);
  875.    else
  876.      M_print("Type help to see your current command, because this  one you typed wasn't one!n");
  877. }
  878. /*************************************************************
  879. Processes user input to send a message to a specified user
  880. **************************************************************/
  881. static void Message_Function( SOK_T sok )
  882. {
  883.    char * arg1;
  884.    
  885.    arg1 = strtok( NULL, UIN_DELIMS );
  886.    if ( arg1 == NULL )
  887.    {
  888.       M_print( "Need uin to send ton" );
  889.       return;
  890.    }
  891.    uin = nick2uin( arg1 );
  892.    if ( -1 == uin )
  893.    {
  894.       M_print( "%s not recognized as a nick namen", arg1 );
  895.       return;
  896.    }
  897.    arg1 = strtok( NULL, "" );
  898.    last_uin = uin;
  899.    if ( arg1 != NULL )
  900.    {
  901.       icq_sendmsg( sok, uin, arg1, NORM_MESS );
  902.       M_print( "Message sent to ");
  903.       Print_UIN_Name( last_uin );
  904.       M_print( "!n");
  905.    }
  906.    else
  907.    {
  908.       status = 1;
  909.       M_print( "msg> " );
  910.       fflush(stdout);
  911.    }
  912. }
  913. /*******************************************************
  914. Sends a reply message to the last person to message you.
  915. ********************************************************/
  916. static void Reply_Function( SOK_T sok )
  917. {
  918.    char * arg1;
  919.    
  920.    if ( last_recv_uin == 0 )
  921.    {
  922.       M_print( "Must receive a message firstn" );
  923.       return;
  924.    }
  925.    arg1 = strtok( NULL, "" );
  926.    last_uin = last_recv_uin;
  927.    if ( arg1 != NULL )
  928.    {
  929.       icq_sendmsg( sok, last_recv_uin, arg1, NORM_MESS );
  930.       M_print( "Message sent to " );
  931.       Print_UIN_Name( last_recv_uin );
  932.       M_print( "n");
  933.    }
  934.    else
  935.    {
  936.       status = 1;
  937.       M_print( "msg> " );
  938.       fflush(stdout);
  939.    }
  940. }
  941. static void Again_Function( SOK_T sok )
  942. {
  943.    char * arg1;
  944.    
  945.    if ( last_uin == 0 )
  946.    {
  947.       M_print( "Must write one message firstn" );
  948.       return;
  949.    }
  950.    arg1 = strtok( NULL, "" );
  951.    if ( arg1 != NULL )
  952.    {
  953.       icq_sendmsg( sok, last_uin, arg1, NORM_MESS );
  954.       M_print( "Message sent to ");
  955.       Print_UIN_Name( last_uin );
  956.       M_print( "!n");  
  957.    } else {
  958.       status = 1;
  959.       M_print( "msg> " );
  960.       fflush(stdout);
  961.    }
  962. }
  963. static void Verbose_Function( void )
  964. {
  965.    char * arg1;
  966.    
  967.    arg1 = strtok( NULL, "" );
  968.    if ( arg1 != NULL )
  969.    {
  970.       Verbose = atoi( arg1 );
  971.    }
  972.    M_print( "Verbosity level is %d.n", Verbose );
  973. }