Changeset 2b8473c


Ignore:
Timestamp:
2010-06-05T00:20:12Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
7e83e8e4
Parents:
4469e7e
Message:

Put the control channel settings into user-changeable settings.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc_channel.c

    r4469e7e r2b8473c  
    2626#include "bitlbee.h"
    2727
     28static char *set_eval_channel_type( set_t *set, char *value );
    2829static gint irc_channel_user_cmp( gconstpointer a_, gconstpointer b_ );
    2930static const struct irc_channel_funcs control_channel_funcs;
     
    4950        irc->channels = g_slist_prepend( irc->channels, ic );
    5051       
     52        set_add( &ic->set, "type", "control", set_eval_channel_type, ic );
     53       
    5154        if( name[0] == '&' )
    52                 ic->f = &control_channel_funcs;
     55                set_setstr( &ic->set, "type", "control" );
    5356        else /* if( name[0] == '#' ) */
    54                 ic->f = &groupchat_stub_funcs;
    55        
    56         if( ic->f->_init )
    57                 if( !ic->f->_init( ic ) )
    58                 {
    59                         irc_channel_free( ic );
    60                         return NULL;
    61                 }
     57                set_setstr( &ic->set, "type", "chat" );
    6258       
    6359        return ic;
     
    9894       
    9995        return 1;
     96}
     97
     98static char *set_eval_channel_type( set_t *set, char *value )
     99{
     100        struct irc_channel *ic = set->data;
     101        const struct irc_channel_funcs *new;
     102       
     103        if( strcmp( value, "control" ) == 0 )
     104                new = &control_channel_funcs;
     105        else if( strcmp( value, "chat" ) == 0 )
     106                new = &groupchat_stub_funcs;
     107        else
     108                return SET_INVALID;
     109       
     110        /* TODO: Return values. */
     111        if( ic->f && ic->f->_free )
     112                ic->f->_free( ic );
     113       
     114        ic->f = new;
     115       
     116        if( ic->f && ic->f->_init )
     117                ic->f->_init( ic );
     118       
     119        return value;
    100120}
    101121
     
    267287}
    268288
     289static char *set_eval_by_account( set_t *set, char *value );
     290static char *set_eval_fill_by( set_t *set, char *value );
     291static char *set_eval_by_group( set_t *set, char *value );
     292
    269293static gboolean control_channel_init( irc_channel_t *ic )
    270294{
    271295        struct irc_control_channel *icc;
     296       
     297        set_add( &ic->set, "account", NULL, set_eval_by_account, ic );
     298        set_add( &ic->set, "fill_by", "all", set_eval_fill_by, ic );
     299        set_add( &ic->set, "group", NULL, set_eval_by_group, ic );
    272300       
    273301        ic->data = icc = g_new0( struct irc_control_channel, 1 );
    274302        icc->type = IRC_CC_TYPE_DEFAULT;
    275303       
    276         if( ( icc->group = bee_group_by_name( ic->irc->b, ic->name + 1, FALSE ) ) )
     304        if( bee_group_by_name( ic->irc->b, ic->name + 1, FALSE ) )
     305        {
     306                set_setstr( &ic->set, "group", ic->name + 1 );
     307                set_setstr( &ic->set, "fill_by", "group" );
     308        }
     309        else if( set_setstr( &ic->set, "account", ic->name + 1 ) )
     310        {
     311                set_setstr( &ic->set, "fill_by", "account" );
     312        }
     313       
     314        return TRUE;
     315}
     316
     317static char *set_eval_by_account( set_t *set, char *value )
     318{
     319        struct irc_channel *ic = set->data;
     320        struct irc_control_channel *icc = ic->data;
     321        account_t *acc;
     322       
     323        if( !( acc = account_get( ic->irc->b, value ) ) )
     324                return SET_INVALID;
     325       
     326        icc->account = acc;
     327        bee_irc_channel_update( ic->irc, ic, NULL );
     328        return g_strdup_printf( "%s(%s)", acc->prpl->name, acc->user );
     329}
     330
     331static char *set_eval_fill_by( set_t *set, char *value )
     332{
     333        struct irc_channel *ic = set->data;
     334        struct irc_control_channel *icc = ic->data;
     335       
     336        if( strcmp( value, "all" ) == 0 )
     337                icc->type = IRC_CC_TYPE_DEFAULT;
     338        else if( strcmp( value, "rest" ) == 0 )
     339                icc->type = IRC_CC_TYPE_REST;
     340        else if( strcmp( value, "group" ) == 0 )
    277341                icc->type = IRC_CC_TYPE_GROUP;
    278         else if( ( icc->account = account_get( ic->irc->b, ic->name + 1 ) ) )
     342        else if( strcmp( value, "account" ) == 0 )
    279343                icc->type = IRC_CC_TYPE_ACCOUNT;
    280        
     344        else
     345                return SET_INVALID;
     346       
     347        return value;
     348}
     349
     350static char *set_eval_by_group( set_t *set, char *value )
     351{
     352        struct irc_channel *ic = set->data;
     353        struct irc_control_channel *icc = ic->data;
     354       
     355        icc->group = bee_group_by_name( ic->irc->b, value, TRUE );
    281356        bee_irc_channel_update( ic->irc, ic, NULL );
     357        return g_strdup( icc->group->name );
     358}
     359
     360static gboolean control_channel_free( irc_channel_t *ic )
     361{
     362        struct irc_control_channel *icc = ic->data;
     363       
     364        set_del( &ic->set, "account" );
     365        set_del( &ic->set, "fill_by" );
     366        set_del( &ic->set, "group" );
     367       
     368        g_free( icc );
     369        ic->data = NULL;
    282370       
    283371        return TRUE;
     
    292380       
    293381        control_channel_init,
     382        control_channel_free,
    294383};
    295384
Note: See TracChangeset for help on using the changeset viewer.