Changeset 0298d11


Ignore:
Timestamp:
2006-01-13T23:51:21Z (18 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
c22c210
Parents:
277674c
Message:

Moved all IRC commands to separate functions in irc_commands.c. At least the PASS command doesn't work yet in this form.

Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    r277674c r0298d11  
    1010
    1111# Program variables
    12 objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.o util.o
     12objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o irc_commands.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.o util.o
    1313subdirs = protocols
    1414
  • commands.c

    r277674c r0298d11  
    3232#include <string.h>
    3333
    34 const command_t commands[] = {
    35         { "help",           0, cmd_help },
    36         { "identify",       1, cmd_identify },
    37         { "register",       1, cmd_register },
    38         { "drop",           1, cmd_drop },
    39         { "account",        1, cmd_account },
    40         { "add",            2, cmd_add },
    41         { "info",           1, cmd_info },
    42         { "rename",         2, cmd_rename },
    43         { "remove",         1, cmd_remove },
    44         { "block",          1, cmd_block },
    45         { "allow",          1, cmd_allow },
    46         { "save",           0, cmd_save },
    47         { "set",            0, cmd_set },
    48         { "yes",            0, cmd_yesno },
    49         { "no",             0, cmd_yesno },
    50         { "blist",          0, cmd_blist },
    51         { "nick",           1, cmd_nick },
    52         { "import_buddies", 1, cmd_import_buddies },
    53         { "qlist",          0, cmd_qlist },
    54         { NULL }
    55 };
    56 
    5734int root_command_string( irc_t *irc, user_t *u, char *command, int flags )
    5835{
     
    11491}
    11592
    116 int cmd_help( irc_t *irc, char **cmd )
     93static int cmd_help( irc_t *irc, char **cmd )
    11794{
    11895        char param[80];
     
    143120}
    144121
    145 int cmd_identify( irc_t *irc, char **cmd )
     122static int cmd_identify( irc_t *irc, char **cmd )
    146123{
    147124        storage_status_t status = storage_load( irc->nick, cmd[1], irc );
     
    166143}
    167144
    168 int cmd_register( irc_t *irc, char **cmd )
     145static int cmd_register( irc_t *irc, char **cmd )
    169146{
    170147        if( global.conf->authmode == AUTHMODE_REGISTERED )
     
    193170}
    194171
    195 int cmd_drop( irc_t *irc, char **cmd )
     172static int cmd_drop( irc_t *irc, char **cmd )
    196173{
    197174        storage_status_t status;
     
    217194}
    218195
    219 int cmd_account( irc_t *irc, char **cmd )
     196static int cmd_account( irc_t *irc, char **cmd )
    220197{
    221198        account_t *a;
     
    377354}
    378355
    379 int cmd_add( irc_t *irc, char **cmd )
     356static int cmd_add( irc_t *irc, char **cmd )
    380357{
    381358        account_t *a;
     
    417394}
    418395
    419 int cmd_info( irc_t *irc, char **cmd )
     396static int cmd_info( irc_t *irc, char **cmd )
    420397{
    421398        struct gaim_connection *gc;
     
    454431}
    455432
    456 int cmd_rename( irc_t *irc, char **cmd )
     433static int cmd_rename( irc_t *irc, char **cmd )
    457434{
    458435        user_t *u;
     
    495472}
    496473
    497 int cmd_remove( irc_t *irc, char **cmd )
     474static int cmd_remove( irc_t *irc, char **cmd )
    498475{
    499476        user_t *u;
     
    517494}
    518495
    519 int cmd_block( irc_t *irc, char **cmd )
     496static int cmd_block( irc_t *irc, char **cmd )
    520497{
    521498        struct gaim_connection *gc;
     
    558535}
    559536
    560 int cmd_allow( irc_t *irc, char **cmd )
     537static int cmd_allow( irc_t *irc, char **cmd )
    561538{
    562539        struct gaim_connection *gc;
     
    600577}
    601578
    602 int cmd_yesno( irc_t *irc, char **cmd )
     579static int cmd_yesno( irc_t *irc, char **cmd )
    603580{
    604581        query_t *q = NULL;
     
    640617}
    641618
    642 int cmd_set( irc_t *irc, char **cmd )
     619static int cmd_set( irc_t *irc, char **cmd )
    643620{
    644621        if( cmd[1] && cmd[2] )
     
    666643}
    667644
    668 int cmd_save( irc_t *irc, char **cmd )
     645static int cmd_save( irc_t *irc, char **cmd )
    669646{
    670647        if( storage_save( irc, TRUE ) == STORAGE_OK )
     
    676653}
    677654
    678 int cmd_blist( irc_t *irc, char **cmd )
     655static int cmd_blist( irc_t *irc, char **cmd )
    679656{
    680657        int online = 0, away = 0, offline = 0;
     
    722699}
    723700
    724 int cmd_nick( irc_t *irc, char **cmd )
     701static int cmd_nick( irc_t *irc, char **cmd )
    725702{
    726703        account_t *a;
     
    758735}
    759736
    760 int cmd_qlist( irc_t *irc, char **cmd )
     737static int cmd_qlist( irc_t *irc, char **cmd )
    761738{
    762739        query_t *q = irc->queries;
     
    780757}
    781758
    782 int cmd_import_buddies( irc_t *irc, char **cmd )
     759static int cmd_import_buddies( irc_t *irc, char **cmd )
    783760{
    784761        struct gaim_connection *gc;
     
    832809        return( 0 );
    833810}
     811
     812const command_t commands[] = {
     813        { "help",           0, cmd_help,           0 },
     814        { "identify",       1, cmd_identify,       0 },
     815        { "register",       1, cmd_register,       0 },
     816        { "drop",           1, cmd_drop,           0 },
     817        { "account",        1, cmd_account,        0 },
     818        { "add",            2, cmd_add,            0 },
     819        { "info",           1, cmd_info,           0 },
     820        { "rename",         2, cmd_rename,         0 },
     821        { "remove",         1, cmd_remove,         0 },
     822        { "block",          1, cmd_block,          0 },
     823        { "allow",          1, cmd_allow,          0 },
     824        { "save",           0, cmd_save,           0 },
     825        { "set",            0, cmd_set,            0 },
     826        { "yes",            0, cmd_yesno,          0 },
     827        { "no",             0, cmd_yesno,          0 },
     828        { "blist",          0, cmd_blist,          0 },
     829        { "nick",           1, cmd_nick,           0 },
     830        { "import_buddies", 1, cmd_import_buddies, 0 },
     831        { "qlist",          0, cmd_qlist,          0 },
     832        { NULL }
     833};
  • commands.h

    r277674c r0298d11  
    2929#include "bitlbee.h"
    3030
    31 typedef struct command_t
     31typedef struct command
    3232{
    3333        char *command;
    3434        int required_parameters;
    3535        int (*execute)(irc_t *, char **args);
     36        int flags;
    3637} command_t;
    37 
    38 int cmd_account( irc_t *irc, char **cmd );
    39 int cmd_help( irc_t *irc, char **args);
    40 int cmd_info( irc_t *irc, char **args);
    41 int cmd_add( irc_t *irc, char **args) ;
    42 int cmd_rename( irc_t *irc, char **args );
    43 int cmd_remove( irc_t *irc, char **args );
    44 int cmd_block( irc_t *irc, char **args );
    45 int cmd_allow( irc_t *irc, char **args );
    46 int cmd_save( irc_t *irc, char **args );
    47 int cmd_set( irc_t *irc, char **args );
    48 int cmd_yesno( irc_t *irc, char **args );
    49 int cmd_identify( irc_t *irc, char **args );
    50 int cmd_register( irc_t *irc, char **args );
    51 int cmd_drop( irc_t *irc, char **args );
    52 int cmd_blist( irc_t *irc, char **cmd );
    53 int cmd_nick( irc_t *irc, char **cmd );
    54 int cmd_qlist( irc_t *irc, char **cmd );
    55 int cmd_import_buddies( irc_t *irc, char **cmd );
    56 int cmd_dump( irc_t *irc, char **cmd );
    5738
    5839extern const command_t commands[];
    5940
     41#define IRC_CMD_PRE_LOGIN       1
     42#define IRC_CMD_LOGGED_IN       2
     43#define IRC_CMD_OPER_ONLY       4
     44
    6045#endif
  • irc.c

    r277674c r0298d11  
    419419}
    420420
    421 int irc_exec( irc_t *irc, char **cmd )
    422 {       
    423         int i;
    424 
    425         if( (global.conf)->authmode == AUTHMODE_CLOSED && irc->status < USTATUS_AUTHORIZED )
    426         {
    427                 if( g_strcasecmp( cmd[0], "PASS" ) == 0 )
    428                 {
    429                         if( !cmd[1] )
    430                         {
    431                                 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    432                         }
    433                         else if( strcmp( cmd[1], (global.conf)->auth_pass ) == 0 )
    434                         {
    435                                 irc->status = USTATUS_AUTHORIZED;
    436                         }
    437                         else
    438                         {
    439                                 irc_reply( irc, 464, ":Nope, maybe you should try it again..." );
    440                         }
    441                 }
    442                 else
    443                 {
    444                         irc_reply( irc, 464, ":Uhh, fine, but I want the password first." );
    445                 }
    446                
    447                 return( 1 );
    448         }
    449        
    450         if( g_strcasecmp( cmd[0], "USER" ) == 0 )
    451         {
    452                 if( !( cmd[1] && cmd[2] && cmd[3] && cmd[4] ) )
    453                 {
    454                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    455                 }
    456                 else if( irc->user )
    457                 {
    458                         irc_reply( irc, 462, ":You can't change your nick/userinfo" );
    459                 }
    460                 else
    461                 {
    462                         irc->user = g_strdup( cmd[1] );
    463                         irc->realname = g_strdup( cmd[4] );
    464                         if( irc->nick ) irc_login( irc );
    465                 }
    466                 return( 1 );
    467         }
    468         else if( g_strcasecmp( cmd[0], "NICK" ) == 0 )
    469         {
    470                 if( !cmd[1] )
    471                 {
    472                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    473                 }
    474                 else if( irc->nick )
    475                 {
    476                         irc_reply( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" );
    477                 }
    478                 /* This is not clean, but for now it'll have to be like this... */
    479                 else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) )
    480                 {
    481                         irc_reply( irc, 433, ":This nick is already in use" );
    482                 }
    483                 else if( !nick_ok( cmd[1] ) )
    484                 {
    485                         /* [SH] Invalid characters. */
    486                         irc_reply( irc, 432, ":This nick contains invalid characters" );
    487                 }
    488                 else
    489                 {
    490                         irc->nick = g_strdup( cmd[1] );
    491                         if( irc->user ) irc_login( irc );
    492                 }
    493                 return( 1 );
    494         }
    495         else if( g_strcasecmp( cmd[0], "QUIT" ) == 0 )
    496         {
    497                 irc_write( irc, "ERROR :%s%s", cmd[1]?"Quit: ":"", cmd[1]?cmd[1]:"Client Quit" );
    498                 g_io_channel_close( irc->io_channel );
    499                 return( 0 );
    500         }
    501        
    502         if( !irc->user || !irc->nick )
    503         {
    504                 irc_reply( irc, 451, ":Register first" );
    505                 return( 1 );
    506         }
    507        
    508         if( g_strcasecmp( cmd[0], "PING" ) == 0 )
    509         {
    510                 irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost );
    511         }
    512         else if( g_strcasecmp( cmd[0], "OPER" ) == 0 )
    513         {
    514                 if( !cmd[2] )
    515                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    516                 else if( strcmp( cmd[2], global.conf->oper_pass ) == 0 )
    517                         irc_umode_set( irc, "+o", 1 );
    518                 // else
    519                         /* FIXME/TODO: Find out which reply to send now. */
    520         }
    521         else if( g_strcasecmp( cmd[0], "MODE" ) == 0 )
    522         {
    523                 if( !cmd[1] )
    524                 {
    525                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    526                 }
    527                 else if( *cmd[1] == '#' || *cmd[1] == '&' )
    528                 {
    529                         if( cmd[2] )
    530                         {
    531                                 if( *cmd[2] == '+' || *cmd[2] == '-' )
    532                                         irc_reply( irc, 477, "%s :Can't change channel modes", cmd[1] );
    533                                 else if( *cmd[2] == 'b' )
    534                                         irc_reply( irc, 368, "%s :No bans possible", cmd[1] );
    535                         }
    536                         else
    537                                 irc_reply( irc, 324, "%s +%s", cmd[1], CMODE );
    538                 }
    539                 else
    540                 {
    541                         if( nick_cmp( cmd[1], irc->nick ) == 0 )
    542                         {
    543                                 if( cmd[2] )
    544                                         irc_umode_set( irc, cmd[2], 0 );
    545                         }
    546                         else
    547                                 irc_reply( irc, 502, ":Don't touch their modes" );
    548                 }
    549         }
    550         else if( g_strcasecmp( cmd[0], "NAMES" ) == 0 )
    551         {
    552                 irc_names( irc, cmd[1]?cmd[1]:irc->channel );
    553         }
    554         else if( g_strcasecmp( cmd[0], "PART" ) == 0 )
    555         {
    556                 struct conversation *c;
    557                
    558                 if( !cmd[1] )
    559                 {
    560                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    561                 }
    562                 else if( g_strcasecmp( cmd[1], irc->channel ) == 0 )
    563                 {
    564                         user_t *u = user_find( irc, irc->nick );
    565                        
    566                         /* Not allowed to leave control channel */
    567                         irc_part( irc, u, irc->channel );
    568                         irc_join( irc, u, irc->channel );
    569                 }
    570                 else if( ( c = conv_findchannel( cmd[1] ) ) )
    571                 {
    572                         user_t *u = user_find( irc, irc->nick );
    573                        
    574                         irc_part( irc, u, c->channel );
    575                        
    576                         if( c->gc && c->gc->prpl )
    577                         {
    578                                 c->joined = 0;
    579                                 c->gc->prpl->chat_leave( c->gc, c->id );
    580                         }
    581                 }
    582                 else
    583                 {
    584                         irc_reply( irc, 403, "%s :No such channel", cmd[1] );
    585                 }
    586         }
    587         else if( g_strcasecmp( cmd[0], "JOIN" ) == 0 )
    588         {
    589                 if( !cmd[1] )
    590                 {
    591                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    592                 }
    593                 else if( g_strcasecmp( cmd[1], irc->channel ) == 0 )
    594                         ; /* Dude, you're already there...
    595                              RFC doesn't have any reply for that though? */
    596                 else if( cmd[1] )
    597                 {
    598                         if( ( cmd[1][0] == '#' || cmd[1][0] == '&' ) && cmd[1][1] )
    599                         {
    600                                 user_t *u = user_find( irc, cmd[1] + 1 );
    601                                
    602                                 if( u && u->gc && u->gc->prpl && u->gc->prpl->chat_open )
    603                                 {
    604                                         irc_reply( irc, 403, "%s :Initializing groupchat in a different channel", cmd[1] );
    605                                        
    606                                         if( !u->gc->prpl->chat_open( u->gc, u->handle ) )
    607                                         {
    608                                                 irc_usermsg( irc, "Could not open a groupchat with %s, maybe you don't have a connection to him/her yet?", u->nick );
    609                                         }
    610                                 }
    611                                 else
    612                                 {
    613                                         irc_reply( irc, 403, "%s :Groupchats are not possible with %s", cmd[1], cmd[1]+1 );
    614                                 }
    615                         }
    616                         else
    617                         {
    618                                 irc_reply( irc, 403, "%s :No such channel", cmd[1] );
    619                         }
    620                 }
    621         }
    622         else if( g_strcasecmp( cmd[0], "INVITE" ) == 0 )
    623         {
    624                 if( cmd[1] && cmd[2] )
    625                         irc_invite( irc, cmd[1], cmd[2] );
    626                 else
    627                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    628         }
    629         else if( g_strcasecmp( cmd[0], "PRIVMSG" ) == 0 || g_strcasecmp( cmd[0], "NOTICE" ) == 0 )
    630         {
    631                 if( !cmd[1] )
    632                 {
    633                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    634                 }
    635                 else if ( !cmd[2] )
    636                 {
    637                         irc_reply( irc, 412, ":No text to send" );
    638                 }
    639                 else if ( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 )
    640                 {
    641                         irc_write( irc, ":%s!%s@%s %s %s :%s", irc->nick, irc->user, irc->host, cmd[0], cmd[1], cmd[2] );
    642                 }
    643                 else
    644                 {
    645                         if( g_strcasecmp( cmd[1], irc->channel ) == 0 )
    646                         {
    647                                 unsigned int i;
    648                                 char *t = set_getstr( irc, "default_target" );
    649                                
    650                                 if( g_strcasecmp( t, "last" ) == 0 && irc->last_target )
    651                                         cmd[1] = irc->last_target;
    652                                 else if( g_strcasecmp( t, "root" ) == 0 )
    653                                         cmd[1] = irc->mynick;
    654                                
    655                                 for( i = 0; i < strlen( cmd[2] ); i ++ )
    656                                 {
    657                                         if( cmd[2][i] == ' ' ) break;
    658                                         if( cmd[2][i] == ':' || cmd[2][i] == ',' )
    659                                         {
    660                                                 cmd[1] = cmd[2];
    661                                                 cmd[2] += i;
    662                                                 *cmd[2] = 0;
    663                                                 while( *(++cmd[2]) == ' ' );
    664                                                 break;
    665                                         }
    666                                 }
    667                                
    668                                 irc->is_private = 0;
    669                                
    670                                 if( cmd[1] != irc->last_target )
    671                                 {
    672                                         if( irc->last_target )
    673                                                 g_free( irc->last_target );
    674                                         irc->last_target = g_strdup( cmd[1] );
    675                                 }
    676                         }
    677                         else
    678                         {
    679                                 irc->is_private = 1;
    680                         }
    681                         irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? IM_FLAG_AWAY : 0 );
    682                 }
    683         }
    684         else if( g_strcasecmp( cmd[0], "WHO" ) == 0 )
    685         {
    686                 irc_who( irc, cmd[1] );
    687         }
    688         else if( g_strcasecmp( cmd[0], "USERHOST" ) == 0 )
    689         {
    690                 user_t *u;
    691                
    692                 if( !cmd[1] )
    693                 {
    694                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    695                 }
    696                 /* [TV] Usable USERHOST-implementation according to
    697                         RFC1459. Without this, mIRC shows an error
    698                         while connecting, and the used way of rejecting
    699                         breaks standards.
    700                 */
    701                
    702                 for( i = 1; cmd[i]; i ++ )
    703                         if( ( u = user_find( irc, cmd[i] ) ) )
    704                         {
    705                                 if( u->online && u->away )
    706                                         irc_reply( irc, 302, ":%s=-%s@%s", u->nick, u->user, u->host );
    707                                 else
    708                                         irc_reply( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host );
    709                         }
    710         }
    711         else if( g_strcasecmp( cmd[0], "ISON" ) == 0 )
    712         {
    713                 user_t *u;
    714                 char buff[IRC_MAX_LINE];
    715                 int lenleft;
    716                
    717                 buff[0] = '\0';
    718                
    719                 /* [SH] Leave room for : and \0 */
    720                 lenleft = IRC_MAX_LINE - 2;
    721                
    722                 for( i = 1; cmd[i]; i ++ )
    723                 {
    724                         if( ( u = user_find( irc, cmd[i] ) ) && u->online )
    725                         {
    726                                 /* [SH] Make sure we don't use too much buffer space. */
    727                                 lenleft -= strlen( u->nick ) + 1;
    728                                
    729                                 if( lenleft < 0 )
    730                                 {
    731                                         break;
    732                                 }
    733                                
    734                                 /* [SH] Add the nick to the buffer. Note
    735                                  * that an extra space is always added. Even
    736                                  * if it's the last nick in the list. Who
    737                                  * cares?
    738                                  */
    739                                
    740                                 strcat( buff, u->nick );
    741                                 strcat( buff, " " );
    742                         }
    743                 }
    744                
    745                 /* [WvG] Well, maybe someone cares, so why not remove it? */
    746                 if( strlen( buff ) > 0 )
    747                         buff[strlen(buff)-1] = '\0';
    748                
    749                 /* [SH] By the way, that really *was* WvG talking. */
    750                 /* [WvG] Really? */
    751                 /* [SH] Yeah... But *this* is WvG talking too. ;-P */
    752                 /* [WvG] *sigh* */
    753                
    754                 irc_reply( irc, 303, ":%s", buff );
    755         }
    756         else if( g_strcasecmp( cmd[0], "WATCH" ) == 0 )
    757         {
    758                 /* Obviously we could also mark a user structure as being
    759                    watched, but what if the WATCH command is sent right
    760                    after connecting? The user won't exist yet then... */
    761                 for( i = 1; cmd[i]; i ++ )
    762                 {
    763                         char *nick;
    764                         user_t *u;
    765                        
    766                         if( !cmd[i][0] || !cmd[i][1] )
    767                                 break;
    768                        
    769                         nick = g_strdup( cmd[i] + 1 );
    770                         nick_lc( nick );
    771                        
    772                         u = user_find( irc, nick );
    773                        
    774                         if( cmd[i][0] == '+' )
    775                         {
    776                                 if( !g_hash_table_lookup( irc->watches, nick ) )
    777                                         g_hash_table_insert( irc->watches, nick, nick );
    778                                
    779                                 if( u && u->online )
    780                                         irc_reply( irc, 604, "%s %s %s %d :%s", u->nick, u->user, u->host, time( NULL ), "is online" );
    781                                 else
    782                                         irc_reply( irc, 605, "%s %s %s %d :%s", nick, "*", "*", time( NULL ), "is offline" );
    783                         }
    784                         else if( cmd[i][0] == '-' )
    785                         {
    786                                 gpointer okey, ovalue;
    787                                
    788                                 if( g_hash_table_lookup_extended( irc->watches, nick, &okey, &ovalue ) )
    789                                 {
    790                                         g_free( okey );
    791                                         g_hash_table_remove( irc->watches, okey );
    792                                        
    793                                         irc_reply( irc, 602, "%s %s %s %d :%s", nick, "*", "*", 0, "Stopped watching" );
    794                                 }
    795                         }
    796                 }
    797         }
    798         else if( g_strcasecmp( cmd[0], "TOPIC" ) == 0 )
    799         {
    800                 if( cmd[1] && cmd[2] )
    801                         irc_reply( irc, 482, "%s :Cannot change topic", cmd[1] );
    802                 else if( cmd[1] )
    803                         irc_topic( irc, cmd[1] );
    804                 else
    805                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    806         }
    807         else if( g_strcasecmp( cmd[0], "AWAY" ) == 0 )
    808         {
    809                 irc_away( irc, cmd[1] );
    810         }
    811         else if( g_strcasecmp( cmd[0], "WHOIS" ) == 0 )
    812         {
    813                 if( cmd[1] )
    814                 {
    815                         irc_whois( irc, cmd[1] );
    816                 }
    817                 else
    818                 {
    819                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    820                 }
    821         }
    822         else if( g_strcasecmp( cmd[0], "WHOWAS" ) == 0 )
    823         {
    824                 /* For some reason irssi tries a whowas when whois fails. We can
    825                    ignore this, but then the user never gets a "user not found"
    826                    message from irssi which is a bit annoying. So just respond
    827                    with not-found and irssi users will get better error messages */
    828                
    829                 if( cmd[1] )
    830                 {
    831                         irc_reply( irc, 406, "%s :Nick does not exist", cmd[1] );
    832                         irc_reply( irc, 369, "%s :End of WHOWAS", cmd[1] );
    833                 }
    834                 else
    835                 {
    836                         irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );
    837                 }
    838         }
    839         else if( ( g_strcasecmp( cmd[0], "NICKSERV" ) == 0 ) || ( g_strcasecmp( cmd[0], "NS" ) == 0 ) )
    840         {
    841                 /* [SH] This aliases the NickServ command to PRIVMSG root */
    842                 /* [TV] This aliases the NS command to PRIVMSG root as well */
    843                 root_command( irc, cmd + 1 );
    844         }
    845         else if( g_strcasecmp( cmd[0], "MOTD" ) == 0 )
    846         {
    847                 irc_motd( irc );
    848         }
    849         else if( g_strcasecmp( cmd[0], "PONG" ) == 0 )
    850         {
    851                 /* We could check the value we get back from the user, but in
    852                    fact we don't care, we're just happy he's still alive. */
    853                 irc->last_pong = gettime();
    854                 irc->pinging = 0;
    855         }
    856         else if( g_strcasecmp( cmd[0], "COMPLETIONS" ) == 0 )
    857         {
    858                 user_t *u = user_find( irc, irc->mynick );
    859                 help_t *h;
    860                 set_t *s;
    861                 int i;
    862                
    863                 irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "OK" );
    864                
    865                 for( i = 0; commands[i].command; i ++ )
    866                         irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", commands[i].command );
    867                
    868                 for( h = global.help; h; h = h->next )
    869                         irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS help ", h->string );
    870                
    871                 for( s = irc->set; s; s = s->next )
    872                         irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS set ", s->key );
    873                
    874                 irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "END" );
    875         }
    876         else if( set_getint( irc, "debug" ) )
    877         {
    878                 irc_usermsg( irc, "\002--- Unknown command:" );
    879                 for( i = 0; cmd[i]; i ++ ) irc_usermsg( irc, "%s", cmd[i] );
    880                 irc_usermsg( irc, "\002--------------------" );
    881         }
    882        
    883         return( 1 );
    884 }
    885 
    886421void irc_reply( irc_t *irc, int code, char *format, ... )
    887422{
     
    1038573       
    1039574        irc_reply( irc, 366, "%s :End of /NAMES list", channel );
    1040 }
    1041 
    1042 void irc_who( irc_t *irc, char *channel )
    1043 {
    1044         user_t *u = irc->users;
    1045         struct conversation *c;
    1046         GList *l;
    1047        
    1048         if( !channel || *channel == '0' || *channel == '*' || !*channel )
    1049                 while( u )
    1050                 {
    1051                         irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", u->online ? irc->channel : "*", u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname );
    1052                         u = u->next;
    1053                 }
    1054         else if( g_strcasecmp( channel, irc->channel ) == 0 )
    1055                 while( u )
    1056                 {
    1057                         if( u->online )
    1058                                 irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname );
    1059                         u = u->next;
    1060                 }
    1061         else if( ( c = conv_findchannel( channel ) ) )
    1062                 for( l = c->in_room; l; l = l->next )
    1063                 {
    1064                         if( ( u = user_findhandle( c->gc, l->data ) ) )
    1065                                 irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname );
    1066                 }
    1067         else if( ( u = user_find( irc, channel ) ) )
    1068                 irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname );
    1069        
    1070         irc_reply( irc, 315, "%s :End of /WHO list.", channel?channel:"**" );
    1071575}
    1072576
     
    1180684}
    1181685
    1182 void irc_whois( irc_t *irc, char *nick )
    1183 {
    1184         user_t *u = user_find( irc, nick );
    1185        
    1186         if( u )
    1187         {
    1188                 irc_reply( irc, 311, "%s %s %s * :%s", u->nick, u->user, u->host, u->realname );
    1189                
    1190                 if( u->gc )
    1191                         irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->user->username,
    1192                                    *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", u->gc->prpl->name );
    1193                 else
    1194                         irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO );
    1195                
    1196                 if( !u->online )
    1197                         irc_reply( irc, 301, "%s :%s", u->nick, "User is offline" );
    1198                 else if( u->away )
    1199                         irc_reply( irc, 301, "%s :%s", u->nick, u->away );
    1200                
    1201                 irc_reply( irc, 318, "%s :End of /WHOIS list", nick );
    1202         }
    1203         else
    1204         {
    1205                 irc_reply( irc, 401, "%s :Nick does not exist", nick );
    1206         }
    1207 }
    1208 
    1209 
    1210686void irc_umode_set( irc_t *irc, char *s, int allow_priv )
    1211687{
     
    1237713}
    1238714
    1239 int irc_away( irc_t *irc, char *away )
    1240 {
    1241         user_t *u = user_find( irc, irc->nick );
    1242         GSList *c = get_connections();
    1243        
    1244         if( !u ) return( 0 );
    1245        
    1246         if( away && *away )
    1247         {
    1248                 int i, j;
    1249                
    1250                 /* Copy away string, but skip control chars. Mainly because
    1251                    Jabber really doesn't like them. */
    1252                 u->away = g_malloc( strlen( away ) + 1 );
    1253                 for( i = j = 0; away[i]; i ++ )
    1254                         if( ( u->away[j] = away[i] ) >= ' ' )
    1255                                 j ++;
    1256                 u->away[j] = 0;
    1257                
    1258                 irc_reply( irc, 306, ":You're now away: %s", u->away );
    1259                 /* irc_umode_set( irc, irc->myhost, "+a" ); */
    1260         }
    1261         else
    1262         {
    1263                 if( u->away ) g_free( u->away );
    1264                 u->away = NULL;
    1265                 /* irc_umode_set( irc, irc->myhost, "-a" ); */
    1266                 irc_reply( irc, 305, ":Welcome back" );
    1267         }
    1268        
    1269         while( c )
    1270         {
    1271                 if( ((struct gaim_connection *)c->data)->flags & OPT_LOGGED_IN )
    1272                         proto_away( c->data, u->away );
    1273                
    1274                 c = c->next;
    1275         }
    1276        
    1277         return( 1 );
    1278 }
    1279 
    1280715void irc_spawn( irc_t *irc, user_t *u )
    1281716{
     
    1329764        }
    1330765        g_free( nick );
    1331 }
    1332 
    1333 void irc_invite( irc_t *irc, char *nick, char *channel )
    1334 {
    1335         struct conversation *c = conv_findchannel( channel );
    1336         user_t *u = user_find( irc, nick );
    1337        
    1338         if( u && c && ( u->gc == c->gc ) )
    1339                 if( c->gc && c->gc->prpl && c->gc->prpl->chat_invite )
    1340                 {
    1341                         c->gc->prpl->chat_invite( c->gc, c->id, "", u->handle );
    1342                         irc_reply( irc, 341, "%s %s", nick, channel );
    1343                         return;
    1344                 }
    1345        
    1346         irc_reply( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel );
    1347766}
    1348767
Note: See TracChangeset for help on using the changeset viewer.