Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • root_commands.c

    r24b8bbb r0baed0d  
    2626#define BITLBEE_CORE
    2727#include "commands.h"
     28#include "crypting.h"
    2829#include "bitlbee.h"
    2930#include "help.h"
     
    3233#include <string.h>
    3334
    34 void root_command_string( irc_t *irc, char *command )
    35 {
    36         root_command( irc, split_command_parts( command ) );
     35void root_command_string( irc_t *irc, user_t *u, char *command, int flags )
     36{
     37        char *cmd[IRC_MAX_ARGS];
     38        char *s;
     39        int k;
     40        char q = 0;
     41       
     42        memset( cmd, 0, sizeof( cmd ) );
     43        cmd[0] = command;
     44        k = 1;
     45        for( s = command; *s && k < ( IRC_MAX_ARGS - 1 ); s ++ )
     46                if( *s == ' ' && !q )
     47                {
     48                        *s = 0;
     49                        while( *++s == ' ' );
     50                        if( *s == '"' || *s == '\'' )
     51                        {
     52                                q = *s;
     53                                s ++;
     54                        }
     55                        if( *s )
     56                        {
     57                                cmd[k++] = s;
     58                                s --;
     59                        }
     60                        else
     61                        {
     62                                break;
     63                        }
     64                }
     65                else if( *s == '\\' && ( ( !q && s[1] ) || ( q && q == s[1] ) ) )
     66                {
     67                        char *cpy;
     68                       
     69                        for( cpy = s; *cpy; cpy ++ )
     70                                cpy[0] = cpy[1];
     71                }
     72                else if( *s == q )
     73                {
     74                        q = *s = 0;
     75                }
     76        cmd[k] = NULL;
     77       
     78        root_command( irc, cmd );
    3779}
    3880
     
    5193void root_command( irc_t *irc, char *cmd[] )
    5294{       
    53         int i, len;
     95        int i;
    5496       
    5597        if( !cmd[0] )
    5698                return;
    5799       
    58         len = strlen( cmd[0] );
    59100        for( i = 0; commands[i].command; i++ )
    60                 if( g_strncasecmp( commands[i].command, cmd[0], len ) == 0 )
    61                 {
    62                         if( commands[i+1].command &&
    63                             g_strncasecmp( commands[i+1].command, cmd[0], len ) == 0 )
    64                                 /* Only match on the first letters if the match is unique. */
    65                                 break;
    66                        
     101                if( g_strcasecmp( commands[i].command, cmd[0] ) == 0 )
     102                {
    67103                        MIN_ARGS( commands[i].required_parameters );
    68104                       
     
    126162                irc->status |= USTATUS_IDENTIFIED;
    127163                irc_umode_set( irc, "+R", 1 );
    128                 if( set_getbool( &irc->b->set, "auto_connect" ) )
     164                if( set_getbool( &irc->set, "auto_connect" ) )
    129165                        cmd_account( irc, account_on );
    130166                break;
     
    166202        storage_status_t status;
    167203       
    168         status = storage_remove (irc->user->nick, cmd[1]);
     204        status = storage_remove (irc->nick, cmd[1]);
    169205        switch (status) {
    170206        case STORAGE_NO_SUCH_USER:
     
    178214                irc->status &= ~USTATUS_IDENTIFIED;
    179215                irc_umode_set( irc, "-R", 1 );
    180                 irc_usermsg( irc, "Account `%s' removed", irc->user->nick );
     216                irc_usermsg( irc, "Account `%s' removed", irc->nick );
    181217                break;
    182218        default:
     
    186222}
    187223
    188 static void cmd_save( irc_t *irc, char **cmd )
    189 {
    190         if( ( irc->status & USTATUS_IDENTIFIED ) == 0 )
    191                 irc_usermsg( irc, "Please create an account first" );
    192         else if( storage_save( irc, NULL, TRUE ) == STORAGE_OK )
    193                 irc_usermsg( irc, "Configuration saved" );
    194         else
    195                 irc_usermsg( irc, "Configuration could not be saved!" );
    196 }
    197 
    198224struct cmd_account_del_data
    199225{
     
    207233        account_t *a;
    208234       
    209         for( a = cad->irc->b->accounts; a && a != cad->a; a = a->next );
     235        for( a = cad->irc->accounts; a && a != cad->a; a = a->next );
    210236       
    211237        if( a == NULL )
     
    219245        else
    220246        {
    221                 account_del( cad->irc->b, a );
     247                account_del( cad->irc, a );
    222248                irc_usermsg( cad->irc, "Account deleted" );
    223249        }
     
    260286                set_name = set_full;
    261287               
    262                 head = &irc->b->set;
     288                head = &irc->set;
    263289        }
    264290        else
     
    331357        account_t *a;
    332358       
    333         if( ( a = account_get( irc->b, id ) ) )
     359        if( ( a = account_get( irc, id ) ) )
    334360                return &a->set;
    335361        else
     
    379405                }
    380406
    381                 a = account_add( irc->b, prpl, cmd[3], cmd[4] );
     407                a = account_add( irc, prpl, cmd[3], cmd[4] );
    382408                if( cmd[5] )
    383409                {
     
    393419                MIN_ARGS( 2 );
    394420
    395                 if( !( a = account_get( irc->b, cmd[2] ) ) )
     421                if( !( a = account_get( irc, cmd[2] ) ) )
    396422                {
    397423                        irc_usermsg( irc, "Invalid account" );
     
    415441                                               "set' command. Are you sure you want to delete this "
    416442                                               "account?", a->prpl->name, a->user );
    417                         //query_add( irc, NULL, msg, cmd_account_del_yes, cmd_account_del_no, cad );
     443                        query_add( irc, NULL, msg, cmd_account_del_yes, cmd_account_del_no, cad );
    418444                        g_free( msg );
    419445                }
     
    426452                        irc_usermsg( irc, "Account list:" );
    427453               
    428                 for( a = irc->b->accounts; a; a = a->next )
     454                for( a = irc->accounts; a; a = a->next )
    429455                {
    430456                        char *con;
     
    449475                if( cmd[2] )
    450476                {
    451                         if( ( a = account_get( irc->b, cmd[2] ) ) )
     477                        if( ( a = account_get( irc, cmd[2] ) ) )
    452478                        {
    453479                                if( a->ic )
     
    458484                                else
    459485                                {
    460                                         account_on( irc->b, a );
     486                                        account_on( irc, a );
    461487                                }
    462488                        }
     
    469495                else
    470496                {
    471                         if ( irc->b->accounts )
    472                         {
     497                        if ( irc->accounts ) {
    473498                                irc_usermsg( irc, "Trying to get all accounts connected..." );
    474499                       
    475                                 for( a = irc->b->accounts; a; a = a->next )
     500                                for( a = irc->accounts; a; a = a->next )
    476501                                        if( !a->ic && a->auto_connect )
    477                                                 account_on( irc->b, a );
     502                                                account_on( irc, a );
    478503                        }
    479504                        else
     
    489514                        irc_usermsg( irc, "Deactivating all active (re)connections..." );
    490515                       
    491                         for( a = irc->b->accounts; a; a = a->next )
     516                        for( a = irc->accounts; a; a = a->next )
    492517                        {
    493518                                if( a->ic )
    494                                         account_off( irc->b, a );
     519                                        account_off( irc, a );
    495520                                else if( a->reconnect )
    496521                                        cancel_auto_reconnect( a );
    497522                        }
    498523                }
    499                 else if( ( a = account_get( irc->b, cmd[2] ) ) )
     524                else if( ( a = account_get( irc, cmd[2] ) ) )
    500525                {
    501526                        if( a->ic )
    502527                        {
    503                                 account_off( irc->b, a );
     528                                account_off( irc, a );
    504529                        }
    505530                        else if( a->reconnect )
     
    544569        }
    545570       
    546         if( !( a = account_get( irc->b, cmd[1] ) ) )
     571        if( !( a = account_get( irc, cmd[1] ) ) )
    547572        {
    548573                irc_usermsg( irc, "Invalid account" );
     
    562587                        return;
    563588                }
    564                 else if( irc_user_by_name( irc, cmd[3] ) )
     589                else if( user_find( irc, cmd[3] ) )
    565590                {
    566591                        irc_usermsg( irc, "The requested nick `%s' already exists", cmd[3] );
     
    576601                a->ic->acc->prpl->add_buddy( a->ic, cmd[2], NULL );
    577602        else
    578                 /* Only for add -tmp. For regular adds, this callback will
    579                    be called once the IM server confirms. */
    580                 bee_user_new( irc->b, a->ic, cmd[2] );
     603                /* Yeah, officially this is a call-*back*... So if we just
     604                   called add_buddy, we'll wait for the IM server to respond
     605                   before we do this. */
     606                imcb_add_buddy( a->ic, cmd[2], NULL );
    581607       
    582608        irc_usermsg( irc, "Adding `%s' to your contact list", cmd[2]  );
    583 }
    584 
    585 static void cmd_remove( irc_t *irc, char **cmd )
    586 {
    587         irc_user_t *iu;
    588         bee_user_t *bu;
    589         char *s;
    590        
    591         if( !( iu = irc_user_by_name( irc, cmd[1] ) ) || !( bu = iu->bu ) )
    592         {
    593                 irc_usermsg( irc, "Buddy `%s' not found", cmd[1] );
    594                 return;
    595         }
    596         s = g_strdup( bu->handle );
    597        
    598         bu->ic->acc->prpl->remove_buddy( bu->ic, bu->handle, NULL );
    599         nick_del( bu->ic->acc, bu->handle );
    600         //TODO(wilmer): bee_user_free() and/or let the IM mod do it? irc_user_free( irc, cmd[1] );
    601        
    602         irc_usermsg( irc, "Buddy `%s' (nick %s) removed from contact list", s, cmd[1] );
    603         g_free( s );
    604        
    605         return;
    606609}
    607610
     
    613616        if( !cmd[2] )
    614617        {
    615                 irc_user_t *iu = irc_user_by_name( irc, cmd[1] );
    616                 if( !iu || !iu->bu )
     618                user_t *u = user_find( irc, cmd[1] );
     619                if( !u || !u->ic )
    617620                {
    618621                        irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
    619622                        return;
    620623                }
    621                 ic = iu->bu->ic;
    622                 cmd[2] = iu->bu->handle;
    623         }
    624         else if( !( a = account_get( irc->b, cmd[1] ) ) )
     624                ic = u->ic;
     625                cmd[2] = u->handle;
     626        }
     627        else if( !( a = account_get( irc, cmd[1] ) ) )
    625628        {
    626629                irc_usermsg( irc, "Invalid account" );
     
    645648static void cmd_rename( irc_t *irc, char **cmd )
    646649{
    647         irc_user_t *iu;
    648        
    649         iu = irc_user_by_name( irc, cmd[1] );
    650        
    651         if( iu == NULL )
     650        user_t *u;
     651       
     652        if( g_strcasecmp( cmd[1], irc->nick ) == 0 )
     653        {
     654                irc_usermsg( irc, "Nick `%s' can't be changed", cmd[1] );
     655        }
     656        else if( g_strcasecmp( cmd[1], irc->channel ) == 0 )
     657        {
     658                if( strchr( CTYPES, cmd[2][0] ) && nick_ok( cmd[2] + 1 ) )
     659                {
     660                        u = user_find( irc, irc->nick );
     661                       
     662                        irc_part( irc, u, irc->channel );
     663                        g_free( irc->channel );
     664                        irc->channel = g_strdup( cmd[2] );
     665                        irc_join( irc, u, irc->channel );
     666                       
     667                        if( strcmp( cmd[0], "set_rename" ) != 0 )
     668                                set_setstr( &irc->set, "control_channel", cmd[2] );
     669                }
     670        }
     671        else if( user_find( irc, cmd[2] ) && ( nick_cmp( cmd[1], cmd[2] ) != 0 ) )
     672        {
     673                irc_usermsg( irc, "Nick `%s' already exists", cmd[2] );
     674        }
     675        else if( !nick_ok( cmd[2] ) )
     676        {
     677                irc_usermsg( irc, "Nick `%s' is invalid", cmd[2] );
     678        }
     679        else if( !( u = user_find( irc, cmd[1] ) ) )
    652680        {
    653681                irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
    654682        }
    655         else if( iu == irc->user )
    656         {
    657                 irc_usermsg( irc, "Nick `%s' can't be changed", cmd[1] );
    658         }
    659         else if( !nick_ok( cmd[2] ) )
    660         {
    661                 irc_usermsg( irc, "Nick `%s' is invalid", cmd[2] );
    662         }
    663         else if( irc_user_by_name( irc, cmd[2] ) )
    664         {
    665                 irc_usermsg( irc, "Nick `%s' already exists", cmd[2] );
    666         }
    667         else
    668         {
    669                 if( !irc_user_set_nick( iu, cmd[2] ) )
    670                 {
    671                         irc_usermsg( irc, "Error while changing nick" );
    672                         return;
    673                 }
    674                
    675                 if( iu == irc->root )
    676                 {
     683        else
     684        {
     685                user_rename( irc, cmd[1], cmd[2] );
     686                irc_write( irc, ":%s!%s@%s NICK %s", cmd[1], u->user, u->host, cmd[2] );
     687                if( g_strcasecmp( cmd[1], irc->mynick ) == 0 )
     688                {
     689                        g_free( irc->mynick );
     690                        irc->mynick = g_strdup( cmd[2] );
     691                       
    677692                        /* If we're called internally (user did "set root_nick"),
    678693                           let's not go O(INF). :-) */
    679694                        if( strcmp( cmd[0], "set_rename" ) != 0 )
    680                                 set_setstr( &irc->b->set, "root_nick", cmd[2] );
    681                 }
    682                 else if( iu->bu )
    683                 {
    684                         nick_set( iu->bu->ic->acc, iu->bu->handle, cmd[2] );
     695                                set_setstr( &irc->set, "root_nick", cmd[2] );
     696                }
     697                else if( u->send_handler == buddy_send_handler )
     698                {
     699                        nick_set( u->ic->acc, u->handle, cmd[2] );
    685700                }
    686701               
     
    689704}
    690705
    691 #if 0
    692706char *set_eval_root_nick( set_t *set, char *new_nick )
    693707{
     
    716730       
    717731        return strcmp( irc->channel, new_name ) == 0 ? new_name : SET_INVALID;
     732}
     733
     734static void cmd_remove( irc_t *irc, char **cmd )
     735{
     736        user_t *u;
     737        char *s;
     738       
     739        if( !( u = user_find( irc, cmd[1] ) ) || !u->ic )
     740        {
     741                irc_usermsg( irc, "Buddy `%s' not found", cmd[1] );
     742                return;
     743        }
     744        s = g_strdup( u->handle );
     745       
     746        u->ic->acc->prpl->remove_buddy( u->ic, u->handle, NULL );
     747        nick_del( u->ic->acc, u->handle );
     748        user_del( irc, cmd[1] );
     749       
     750        irc_usermsg( irc, "Buddy `%s' (nick %s) removed from contact list", s, cmd[1] );
     751        g_free( s );
     752       
     753        return;
    718754}
    719755
     
    836872        }
    837873}
    838 #endif
    839874
    840875static void cmd_yesno( irc_t *irc, char **cmd )
     
    881916}
    882917
    883 #if 0
     918static void cmd_save( irc_t *irc, char **cmd )
     919{
     920        if( ( irc->status & USTATUS_IDENTIFIED ) == 0 )
     921                irc_usermsg( irc, "Please create an account first" );
     922        else if( storage_save( irc, NULL, TRUE ) == STORAGE_OK )
     923                irc_usermsg( irc, "Configuration saved" );
     924        else
     925                irc_usermsg( irc, "Configuration could not be saved!" );
     926}
     927
    884928static void cmd_blist( irc_t *irc, char **cmd )
    885929{
     
    947991}
    948992
     993static void cmd_nick( irc_t *irc, char **cmd )
     994{
     995        account_t *a;
     996
     997        if( !cmd[1] || !( a = account_get( irc, cmd[1] ) ) )
     998        {
     999                irc_usermsg( irc, "Invalid account");
     1000        }
     1001        else if( !( a->ic && ( a->ic->flags & OPT_LOGGED_IN ) ) )
     1002        {
     1003                irc_usermsg( irc, "That account is not on-line" );
     1004        }
     1005        else if ( !cmd[2] )
     1006        {
     1007                irc_usermsg( irc, "Your name is `%s'" , a->ic->displayname ? a->ic->displayname : "NULL" );
     1008        }
     1009        else if ( !a->prpl->set_my_name )
     1010        {
     1011                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     1012        }
     1013        else
     1014        {
     1015                irc_usermsg( irc, "Setting your name to `%s'", cmd[2] );
     1016               
     1017                a->prpl->set_my_name( a->ic, cmd[2] );
     1018        }
     1019}
     1020
    9491021static void cmd_qlist( irc_t *irc, char **cmd )
    9501022{
     
    9651037                else
    9661038                        irc_usermsg( irc, "%d, BitlBee: %s", num, q->question );
     1039}
     1040
     1041static void cmd_join_chat( irc_t *irc, char **cmd )
     1042{
     1043        irc_usermsg( irc, "This command is now obsolete. "
     1044                          "Please try the `chat' command instead." );
    9671045}
    9681046
     
    10791157}
    10801158
    1081 static void cmd_transfer( irc_t *irc, char **cmd )
    1082 {
    1083         GSList *files = irc->file_transfers;
    1084         enum { LIST, REJECT, CANCEL };
    1085         int subcmd = LIST;
    1086         int fid;
    1087 
    1088         if( !files )
    1089         {
    1090                 irc_usermsg( irc, "No pending transfers" );
    1091                 return;
    1092         }
    1093 
    1094         if( cmd[1] && ( strcmp( cmd[1], "reject" ) == 0 ) )
    1095         {
    1096                 subcmd = REJECT;
    1097         }
    1098         else if( cmd[1] && ( strcmp( cmd[1], "cancel" ) == 0 ) &&
    1099                  cmd[2] && ( sscanf( cmd[2], "%d", &fid ) == 1 ) )
    1100         {
    1101                 subcmd = CANCEL;
    1102         }
    1103 
    1104         for( ; files; files = g_slist_next( files ) )
    1105         {
    1106                 file_transfer_t *file = files->data;
    1107                
    1108                 switch( subcmd ) {
    1109                 case LIST:
    1110                         if ( file->status == FT_STATUS_LISTENING )
    1111                                 irc_usermsg( irc,
    1112                                         "Pending file(id %d): %s (Listening...)", file->local_id, file->file_name);
    1113                         else
    1114                         {
    1115                                 int kb_per_s = 0;
    1116                                 time_t diff = time( NULL ) - file->started ? : 1;
    1117                                 if ( ( file->started > 0 ) && ( file->bytes_transferred > 0 ) )
    1118                                         kb_per_s = file->bytes_transferred / 1024 / diff;
    1119                                        
    1120                                 irc_usermsg( irc,
    1121                                         "Pending file(id %d): %s (%10zd/%zd kb, %d kb/s)", file->local_id, file->file_name,
    1122                                         file->bytes_transferred/1024, file->file_size/1024, kb_per_s);
    1123                         }
    1124                         break;
    1125                 case REJECT:
    1126                         if( file->status == FT_STATUS_LISTENING )
    1127                         {
    1128                                 irc_usermsg( irc, "Rejecting file transfer for %s", file->file_name );
    1129                                 imcb_file_canceled( file, "Denied by user" );
    1130                         }
    1131                         break;
    1132                 case CANCEL:
    1133                         if( file->local_id == fid )
    1134                         {
    1135                                 irc_usermsg( irc, "Canceling file transfer for %s", file->file_name );
    1136                                 imcb_file_canceled( file, "Canceled by user" );
    1137                         }
    1138                         break;
    1139                 }
    1140         }
    1141 }
    1142 #endif
    1143 
    1144 /* IMPORTANT: Keep this list sorted! The short command logic needs that. */
    11451159const command_t commands[] = {
     1160        { "help",           0, cmd_help,           0 },
     1161        { "identify",       1, cmd_identify,       0 },
     1162        { "register",       1, cmd_register,       0 },
     1163        { "drop",           1, cmd_drop,           0 },
    11461164        { "account",        1, cmd_account,        0 },
    11471165        { "add",            2, cmd_add,            0 },
    1148         { "drop",           1, cmd_drop,           0 },
    1149         { "help",           0, cmd_help,           0 },
    1150         { "identify",       1, cmd_identify,       0 },
    11511166        { "info",           1, cmd_info,           0 },
    1152         { "no",             0, cmd_yesno,          0 },
    1153         { "register",       1, cmd_register,       0 },
     1167        { "rename",         2, cmd_rename,         0 },
    11541168        { "remove",         1, cmd_remove,         0 },
    1155         { "rename",         2, cmd_rename,         0 },
     1169        { "block",          1, cmd_block,          0 },
     1170        { "allow",          1, cmd_allow,          0 },
    11561171        { "save",           0, cmd_save,           0 },
    11571172        { "set",            0, cmd_set,            0 },
    11581173        { "yes",            0, cmd_yesno,          0 },
    1159 #if 0
    1160         { "allow",          1, cmd_allow,          0 },
     1174        { "no",             0, cmd_yesno,          0 },
    11611175        { "blist",          0, cmd_blist,          0 },
    1162         { "block",          1, cmd_block,          0 },
     1176        { "nick",           1, cmd_nick,           0 },
     1177        { "qlist",          0, cmd_qlist,          0 },
     1178        { "join_chat",      2, cmd_join_chat,      0 },
    11631179        { "chat",           1, cmd_chat,           0 },
    1164         { "ft",             0, cmd_transfer,       0 },
    1165         { "join_chat",      2, cmd_join_chat,      0 },
    1166         { "qlist",          0, cmd_qlist,          0 },
    1167         { "transfer",       0, cmd_transfer,       0 },
    1168 #endif
    11691180        { NULL }
    11701181};
Note: See TracChangeset for help on using the changeset viewer.