Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • root_commands.c

    r6fd4d46 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!" );
     224struct cmd_account_del_data
     225{
     226        account_t *a;
     227        irc_t *irc;
     228};
     229
     230void cmd_account_del_yes( void *data )
     231{
     232        struct cmd_account_del_data *cad = data;
     233        account_t *a;
     234       
     235        for( a = cad->irc->accounts; a && a != cad->a; a = a->next );
     236       
     237        if( a == NULL )
     238        {
     239                irc_usermsg( cad->irc, "Account already deleted" );
     240        }
     241        else if( a->ic )
     242        {
     243                irc_usermsg( cad->irc, "Account is still logged in, can't delete" );
     244        }
     245        else
     246        {
     247                account_del( cad->irc, a );
     248                irc_usermsg( cad->irc, "Account deleted" );
     249        }
     250        g_free( data );
     251}
     252
     253void cmd_account_del_no( void *data )
     254{
     255        g_free( data );
    196256}
    197257
     
    226286                set_name = set_full;
    227287               
    228                 head = &irc->b->set;
     288                head = &irc->set;
    229289        }
    230290        else
     
    297357        account_t *a;
    298358       
    299         if( ( a = account_get( irc->b, id ) ) )
     359        if( ( a = account_get( irc, id ) ) )
    300360                return &a->set;
    301361        else
     
    345405                }
    346406
    347                 a = account_add( irc->b, prpl, cmd[3], cmd[4] );
     407                a = account_add( irc, prpl, cmd[3], cmd[4] );
    348408                if( cmd[5] )
    349409                {
     
    359419                MIN_ARGS( 2 );
    360420
    361                 if( !( a = account_get( irc->b, cmd[2] ) ) )
     421                if( !( a = account_get( irc, cmd[2] ) ) )
    362422                {
    363423                        irc_usermsg( irc, "Invalid account" );
     
    369429                else
    370430                {
    371                         account_del( irc->b, a );
    372                         irc_usermsg( irc, "Account deleted" );
     431                        struct cmd_account_del_data *cad;
     432                        char *msg;
     433                       
     434                        cad = g_malloc( sizeof( struct cmd_account_del_data ) );
     435                        cad->a = a;
     436                        cad->irc = irc;
     437                       
     438                        msg = g_strdup_printf( "If you remove this account (%s(%s)), BitlBee will "
     439                                               "also forget all your saved nicknames. If you want "
     440                                               "to change your username/password, use the `account "
     441                                               "set' command. Are you sure you want to delete this "
     442                                               "account?", a->prpl->name, a->user );
     443                        query_add( irc, NULL, msg, cmd_account_del_yes, cmd_account_del_no, cad );
     444                        g_free( msg );
    373445                }
    374446        }
     
    380452                        irc_usermsg( irc, "Account list:" );
    381453               
    382                 for( a = irc->b->accounts; a; a = a->next )
     454                for( a = irc->accounts; a; a = a->next )
    383455                {
    384456                        char *con;
     
    403475                if( cmd[2] )
    404476                {
    405                         if( ( a = account_get( irc->b, cmd[2] ) ) )
     477                        if( ( a = account_get( irc, cmd[2] ) ) )
    406478                        {
    407479                                if( a->ic )
     
    412484                                else
    413485                                {
    414                                         account_on( irc->b, a );
     486                                        account_on( irc, a );
    415487                                }
    416488                        }
     
    423495                else
    424496                {
    425                         if ( irc->b->accounts )
    426                         {
     497                        if ( irc->accounts ) {
    427498                                irc_usermsg( irc, "Trying to get all accounts connected..." );
    428499                       
    429                                 for( a = irc->b->accounts; a; a = a->next )
     500                                for( a = irc->accounts; a; a = a->next )
    430501                                        if( !a->ic && a->auto_connect )
    431                                                 account_on( irc->b, a );
     502                                                account_on( irc, a );
    432503                        }
    433504                        else
     
    443514                        irc_usermsg( irc, "Deactivating all active (re)connections..." );
    444515                       
    445                         for( a = irc->b->accounts; a; a = a->next )
     516                        for( a = irc->accounts; a; a = a->next )
    446517                        {
    447518                                if( a->ic )
    448                                         account_off( irc->b, a );
     519                                        account_off( irc, a );
    449520                                else if( a->reconnect )
    450521                                        cancel_auto_reconnect( a );
    451522                        }
    452523                }
    453                 else if( ( a = account_get( irc->b, cmd[2] ) ) )
     524                else if( ( a = account_get( irc, cmd[2] ) ) )
    454525                {
    455526                        if( a->ic )
    456527                        {
    457                                 account_off( irc->b, a );
     528                                account_off( irc, a );
    458529                        }
    459530                        else if( a->reconnect )
     
    498569        }
    499570       
    500         if( !( a = account_get( irc->b, cmd[1] ) ) )
     571        if( !( a = account_get( irc, cmd[1] ) ) )
    501572        {
    502573                irc_usermsg( irc, "Invalid account" );
     
    516587                        return;
    517588                }
    518                 else if( irc_user_by_name( irc, cmd[3] ) )
     589                else if( user_find( irc, cmd[3] ) )
    519590                {
    520591                        irc_usermsg( irc, "The requested nick `%s' already exists", cmd[3] );
     
    530601                a->ic->acc->prpl->add_buddy( a->ic, cmd[2], NULL );
    531602        else
    532                 /* Only for add -tmp. For regular adds, this callback will
    533                    be called once the IM server confirms. */
    534                 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 );
    535607       
    536608        irc_usermsg( irc, "Adding `%s' to your contact list", cmd[2]  );
    537 }
    538 
    539 static void cmd_remove( irc_t *irc, char **cmd )
    540 {
    541         irc_user_t *iu;
    542         bee_user_t *bu;
    543         char *s;
    544        
    545         if( !( iu = irc_user_by_name( irc, cmd[1] ) ) || !( bu = iu->bu ) )
    546         {
    547                 irc_usermsg( irc, "Buddy `%s' not found", cmd[1] );
    548                 return;
    549         }
    550         s = g_strdup( bu->handle );
    551        
    552         bu->ic->acc->prpl->remove_buddy( bu->ic, bu->handle, NULL );
    553         nick_del( bu->ic->acc, bu->handle );
    554         //TODO(wilmer): bee_user_free() and/or let the IM mod do it? irc_user_free( irc, cmd[1] );
    555        
    556         irc_usermsg( irc, "Buddy `%s' (nick %s) removed from contact list", s, cmd[1] );
    557         g_free( s );
    558        
    559         return;
    560609}
    561610
     
    567616        if( !cmd[2] )
    568617        {
    569                 irc_user_t *iu = irc_user_by_name( irc, cmd[1] );
    570                 if( !iu || !iu->bu )
     618                user_t *u = user_find( irc, cmd[1] );
     619                if( !u || !u->ic )
    571620                {
    572621                        irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
    573622                        return;
    574623                }
    575                 ic = iu->bu->ic;
    576                 cmd[2] = iu->bu->handle;
    577         }
    578         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] ) ) )
    579628        {
    580629                irc_usermsg( irc, "Invalid account" );
     
    599648static void cmd_rename( irc_t *irc, char **cmd )
    600649{
    601         irc_user_t *iu;
    602        
    603         iu = irc_user_by_name( irc, cmd[1] );
    604        
    605         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] ) ) )
    606680        {
    607681                irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
    608682        }
    609         else if( iu == irc->user )
    610         {
    611                 irc_usermsg( irc, "Nick `%s' can't be changed", cmd[1] );
    612         }
    613         else if( !nick_ok( cmd[2] ) )
    614         {
    615                 irc_usermsg( irc, "Nick `%s' is invalid", cmd[2] );
    616         }
    617         else if( irc_user_by_name( irc, cmd[2] ) )
    618         {
    619                 irc_usermsg( irc, "Nick `%s' already exists", cmd[2] );
    620         }
    621         else
    622         {
    623                 if( !irc_user_set_nick( iu, cmd[2] ) )
    624                 {
    625                         irc_usermsg( irc, "Error while changing nick" );
    626                         return;
    627                 }
    628                
    629                 if( iu == irc->root )
    630                 {
     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                       
    631692                        /* If we're called internally (user did "set root_nick"),
    632693                           let's not go O(INF). :-) */
    633694                        if( strcmp( cmd[0], "set_rename" ) != 0 )
    634                                 set_setstr( &irc->b->set, "root_nick", cmd[2] );
    635                 }
    636                 else if( iu->bu )
    637                 {
    638                         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] );
    639700                }
    640701               
     
    643704}
    644705
    645 #if 0
    646706char *set_eval_root_nick( set_t *set, char *new_nick )
    647707{
     
    671731        return strcmp( irc->channel, new_name ) == 0 ? new_name : SET_INVALID;
    672732}
    673 #endif
     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;
     754}
    674755
    675756static void cmd_block( irc_t *irc, char **cmd )
     
    678759        account_t *a;
    679760       
    680         if( !cmd[2] && ( a = account_get( irc->b, cmd[1] ) ) && a->ic )
     761        if( !cmd[2] && ( a = account_get( irc, cmd[1] ) ) && a->ic )
    681762        {
    682763                char *format;
     
    691772                for( l = a->ic->deny; l; l = l->next )
    692773                {
    693                         bee_user_t *bu = bee_user_by_handle( irc->b, a->ic, l->data );
    694                         irc_user_t *iu = bu ? bu->ui_data : NULL;
    695                         irc_usermsg( irc, format, l->data, iu ? iu->nick : "(none)" );
     774                        user_t *u = user_findhandle( a->ic, l->data );
     775                        irc_usermsg( irc, format, l->data, u ? u->nick : "(none)" );
    696776                }
    697777                irc_usermsg( irc, "End of list." );
     
    701781        else if( !cmd[2] )
    702782        {
    703                 irc_user_t *iu = irc_user_by_name( irc, cmd[1] );
    704                 if( !iu || !iu->bu )
     783                user_t *u = user_find( irc, cmd[1] );
     784                if( !u || !u->ic )
    705785                {
    706786                        irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
    707787                        return;
    708788                }
    709                 ic = iu->bu->ic;
    710                 cmd[2] = iu->bu->handle;
    711         }
    712         else if( !( a = account_get( irc->b, cmd[1] ) ) )
     789                ic = u->ic;
     790                cmd[2] = u->handle;
     791        }
     792        else if( !( a = account_get( irc, cmd[1] ) ) )
    713793        {
    714794                irc_usermsg( irc, "Invalid account" );
     
    738818        account_t *a;
    739819       
    740         if( !cmd[2] && ( a = account_get( irc->b, cmd[1] ) ) && a->ic )
     820        if( !cmd[2] && ( a = account_get( irc, cmd[1] ) ) && a->ic )
    741821        {
    742822                char *format;
     
    751831                for( l = a->ic->permit; l; l = l->next )
    752832                {
    753                         bee_user_t *bu = bee_user_by_handle( irc->b, a->ic, l->data );
    754                         irc_user_t *iu = bu ? bu->ui_data : NULL;
    755                         irc_usermsg( irc, format, l->data, iu ? iu->nick : "(none)" );
     833                        user_t *u = user_findhandle( a->ic, l->data );
     834                        irc_usermsg( irc, format, l->data, u ? u->nick : "(none)" );
    756835                }
    757836                irc_usermsg( irc, "End of list." );
     
    761840        else if( !cmd[2] )
    762841        {
    763                 irc_user_t *iu = irc_user_by_name( irc, cmd[1] );
    764                 if( !iu || !iu->bu )
     842                user_t *u = user_find( irc, cmd[1] );
     843                if( !u || !u->ic )
    765844                {
    766845                        irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
    767846                        return;
    768847                }
    769                 ic = iu->bu->ic;
    770                 cmd[2] = iu->bu->handle;
    771         }
    772         else if( !( a = account_get( irc->b, cmd[1] ) ) )
     848                ic = u->ic;
     849                cmd[2] = u->handle;
     850        }
     851        else if( !( a = account_get( irc, cmd[1] ) ) )
    773852        {
    774853                irc_usermsg( irc, "Invalid account" );
     
    837916}
    838917
     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
    839928static void cmd_blist( irc_t *irc, char **cmd )
    840929{
    841930        int online = 0, away = 0, offline = 0;
    842         GSList *l;
     931        user_t *u;
    843932        char s[256];
    844933        char *format;
     
    861950                format = "%-16.16s  %-40.40s  %s";
    862951       
    863         irc_usermsg( irc, format, "Nick", "Handle/Account", "Status" );
    864        
    865         for( l = irc->users; l; l = l->next )
    866         {
    867                 irc_user_t *iu = l->data;
    868                 bee_user_t *bu = iu->bu;
    869                
    870                 if( !bu || ( bu->flags & ( BEE_USER_ONLINE | BEE_USER_AWAY ) ) != BEE_USER_ONLINE )
    871                         continue;
    872                
     952        irc_usermsg( irc, format, "Nick", "User/Host/Network", "Status" );
     953       
     954        for( u = irc->users; u; u = u->next ) if( u->ic && u->online && !u->away )
     955        {
    873956                if( online == 1 )
    874957                {
    875958                        char st[256] = "Online";
    876959                       
    877                         if( bu->status_msg )
    878                                 g_snprintf( st, sizeof( st ) - 1, "Online (%s)", bu->status_msg );
    879                        
    880                         g_snprintf( s, sizeof( s ) - 1, "%s %s(%s)", bu->handle, bu->ic->acc->prpl->name, bu->ic->acc->user );
    881                         irc_usermsg( irc, format, iu->nick, s, st );
     960                        if( u->status_msg )
     961                                g_snprintf( st, sizeof( st ) - 1, "Online (%s)", u->status_msg );
     962                       
     963                        g_snprintf( s, sizeof( s ) - 1, "%s@%s %s(%s)", u->user, u->host, u->ic->acc->prpl->name, u->ic->acc->user );
     964                        irc_usermsg( irc, format, u->nick, s, st );
    882965                }
    883966               
     
    885968        }
    886969
    887         for( l = irc->users; l; l = l->next )
    888         {
    889                 irc_user_t *iu = l->data;
    890                 bee_user_t *bu = iu->bu;
    891                
    892                 if( !bu || !( bu->flags & BEE_USER_ONLINE ) || !( bu->flags & BEE_USER_AWAY ) )
    893                         continue;
    894                
     970        for( u = irc->users; u; u = u->next ) if( u->ic && u->online && u->away )
     971        {
    895972                if( away == 1 )
    896973                {
    897                         g_snprintf( s, sizeof( s ) - 1, "%s %s(%s)", bu->handle, bu->ic->acc->prpl->name, bu->ic->acc->user );
    898                         irc_usermsg( irc, format, iu->nick, s, irc_user_get_away( iu ) );
     974                        g_snprintf( s, sizeof( s ) - 1, "%s@%s %s(%s)", u->user, u->host, u->ic->acc->prpl->name, u->ic->acc->user );
     975                        irc_usermsg( irc, format, u->nick, s, u->away );
    899976                }
    900977                n_away ++;
    901978        }
    902979       
    903         for( l = irc->users; l; l = l->next )
    904         {
    905                 irc_user_t *iu = l->data;
    906                 bee_user_t *bu = iu->bu;
    907                
    908                 if( !bu || bu->flags & BEE_USER_ONLINE )
    909                         continue;
    910                
     980        for( u = irc->users; u; u = u->next ) if( u->ic && !u->online )
     981        {
    911982                if( offline == 1 )
    912983                {
    913                         g_snprintf( s, sizeof( s ) - 1, "%s %s(%s)", bu->handle, bu->ic->acc->prpl->name, bu->ic->acc->user );
    914                         irc_usermsg( irc, format, iu->nick, s, "Offline" );
     984                        g_snprintf( s, sizeof( s ) - 1, "%s@%s %s(%s)", u->user, u->host, u->ic->acc->prpl->name, u->ic->acc->user );
     985                        irc_usermsg( irc, format, u->nick, s, "Offline" );
    915986                }
    916987                n_offline ++;
     
    918989       
    919990        irc_usermsg( irc, "%d buddies (%d available, %d away, %d offline)", n_online + n_away + n_offline, n_online, n_away, n_offline );
     991}
     992
     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        }
    9201019}
    9211020
     
    9401039}
    9411040
    942 #if 0
     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." );
     1045}
     1046
    9431047static set_t **cmd_chat_set_findhead( irc_t *irc, char *id )
    9441048{
     
    10521156        }
    10531157}
    1054 #endif
    1055 
    1056 static void cmd_transfer( irc_t *irc, char **cmd )
    1057 {
    1058         GSList *files = irc->file_transfers;
    1059         enum { LIST, REJECT, CANCEL };
    1060         int subcmd = LIST;
    1061         int fid;
    1062 
    1063         if( !files )
    1064         {
    1065                 irc_usermsg( irc, "No pending transfers" );
    1066                 return;
    1067         }
    1068 
    1069         if( cmd[1] && ( strcmp( cmd[1], "reject" ) == 0 ) )
    1070         {
    1071                 subcmd = REJECT;
    1072         }
    1073         else if( cmd[1] && ( strcmp( cmd[1], "cancel" ) == 0 ) &&
    1074                  cmd[2] && ( sscanf( cmd[2], "%d", &fid ) == 1 ) )
    1075         {
    1076                 subcmd = CANCEL;
    1077         }
    1078 
    1079         for( ; files; files = g_slist_next( files ) )
    1080         {
    1081                 file_transfer_t *file = files->data;
    1082                
    1083                 switch( subcmd ) {
    1084                 case LIST:
    1085                         if ( file->status == FT_STATUS_LISTENING )
    1086                                 irc_usermsg( irc,
    1087                                         "Pending file(id %d): %s (Listening...)", file->local_id, file->file_name);
    1088                         else
    1089                         {
    1090                                 int kb_per_s = 0;
    1091                                 time_t diff = time( NULL ) - file->started ? : 1;
    1092                                 if ( ( file->started > 0 ) && ( file->bytes_transferred > 0 ) )
    1093                                         kb_per_s = file->bytes_transferred / 1024 / diff;
    1094                                        
    1095                                 irc_usermsg( irc,
    1096                                         "Pending file(id %d): %s (%10zd/%zd kb, %d kb/s)", file->local_id, file->file_name,
    1097                                         file->bytes_transferred/1024, file->file_size/1024, kb_per_s);
    1098                         }
    1099                         break;
    1100                 case REJECT:
    1101                         if( file->status == FT_STATUS_LISTENING )
    1102                         {
    1103                                 irc_usermsg( irc, "Rejecting file transfer for %s", file->file_name );
    1104                                 imcb_file_canceled( file->ic, file, "Denied by user" );
    1105                         }
    1106                         break;
    1107                 case CANCEL:
    1108                         if( file->local_id == fid )
    1109                         {
    1110                                 irc_usermsg( irc, "Canceling file transfer for %s", file->file_name );
    1111                                 imcb_file_canceled( file->ic, file, "Canceled by user" );
    1112                         }
    1113                         break;
    1114                 }
    1115         }
    1116 }
    1117 
    1118 /* IMPORTANT: Keep this list sorted! The short command logic needs that. */
     1158
    11191159const 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 },
    11201164        { "account",        1, cmd_account,        0 },
    11211165        { "add",            2, cmd_add,            0 },
     1166        { "info",           1, cmd_info,           0 },
     1167        { "rename",         2, cmd_rename,         0 },
     1168        { "remove",         1, cmd_remove,         0 },
     1169        { "block",          1, cmd_block,          0 },
    11221170        { "allow",          1, cmd_allow,          0 },
    1123         { "blist",          0, cmd_blist,          0 },
    1124         { "block",          1, cmd_block,          0 },
    1125         { "drop",           1, cmd_drop,           0 },
    1126         { "ft",             0, cmd_transfer,       0 },
    1127         { "help",           0, cmd_help,           0 },
    1128         { "identify",       1, cmd_identify,       0 },
    1129         { "info",           1, cmd_info,           0 },
    1130         { "no",             0, cmd_yesno,          0 },
    1131         { "qlist",          0, cmd_qlist,          0 },
    1132         { "register",       1, cmd_register,       0 },
    1133         { "remove",         1, cmd_remove,         0 },
    1134         { "rename",         2, cmd_rename,         0 },
    11351171        { "save",           0, cmd_save,           0 },
    11361172        { "set",            0, cmd_set,            0 },
    1137         { "transfer",       0, cmd_transfer,       0 },
    11381173        { "yes",            0, cmd_yesno,          0 },
    1139 #if 0
     1174        { "no",             0, cmd_yesno,          0 },
     1175        { "blist",          0, cmd_blist,          0 },
     1176        { "nick",           1, cmd_nick,           0 },
     1177        { "qlist",          0, cmd_qlist,          0 },
     1178        { "join_chat",      2, cmd_join_chat,      0 },
    11401179        { "chat",           1, cmd_chat,           0 },
    1141 #endif
    11421180        { NULL }
    11431181};
Note: See TracChangeset for help on using the changeset viewer.