Changeset 5a75d15 for irc_im.c


Ignore:
Timestamp:
2010-06-05T22:32:36Z (9 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
c1a8a16
Parents:
f5d87ea
Message:

Chatroom improvements. Merged chatroom stub into normal chatroom stuff,
restored "chat add" behaviour a little bit better (don't clean up a
channel when its room disappears, just disconnect it from the groupchat).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc_im.c

    rf5d87ea r5a75d15  
    318318
    319319/* IM->IRC: Groupchats */
    320 static const struct irc_channel_funcs irc_channel_im_chat_funcs;
     320const struct irc_channel_funcs irc_channel_im_chat_funcs;
    321321
    322322static gboolean bee_irc_chat_new( bee_t *bee, struct groupchat *c )
     
    341341        {
    342342                char name[16];
    343                 sprintf( name, "&chat_%03d", i );
     343                sprintf( name, "#chat_%03d", i );
    344344                if( ( ic = irc_channel_new( irc, name ) ) )
    345345                        break;
     
    351351        c->ui_data = ic;
    352352        ic->data = c;
    353         ic->f = &irc_channel_im_chat_funcs;
    354353       
    355354        topic = g_strdup_printf( "BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", c->title );
     
    367366                irc_channel_printf( ic, "Cleaning up channel, bye!" );
    368367       
    369         irc_channel_free( ic );
     368        /* irc_channel_free( ic ); */
     369       
     370        irc_channel_del_user( ic, ic->irc->user );
     371        ic->data = NULL;
    370372       
    371373        return TRUE;
     
    468470        struct groupchat *c = ic->data;
    469471       
     472        if( c == NULL )
     473                return FALSE;
     474       
    470475        bee_chat_msg( ic->irc->b, c, msg, 0 );
    471476       
    472477        return TRUE;
    473        
     478}
     479
     480static gboolean bee_irc_channel_chat_join( irc_channel_t *ic )
     481{
     482        char *acc_s, *room;
     483        account_t *acc;
     484       
     485        if( strcmp( set_getstr( &ic->set, "chat_type" ), "room" ) != 0 )
     486                return TRUE;
     487       
     488        if( ( acc_s = set_getstr( &ic->set, "account" ) ) &&
     489            ( room = set_getstr( &ic->set, "room" ) ) &&
     490            ( acc = account_get( ic->irc->b, acc_s ) ) &&
     491            acc->ic && acc->prpl->chat_join )
     492        {
     493                char *nick;
     494               
     495                if( !( nick = set_getstr( &ic->set, "nick" ) ) )
     496                        nick = ic->irc->user->nick;
     497               
     498                ic->flags |= IRC_CHANNEL_CHAT_PICKME;
     499                acc->prpl->chat_join( acc->ic, room, nick, NULL );
     500                ic->flags &= ~IRC_CHANNEL_CHAT_PICKME;
     501               
     502                return FALSE;
     503        }
     504        else
     505        {
     506                irc_send_num( ic->irc, 403, "%s :Can't join channel, account offline?", ic->name );
     507                return FALSE;
     508        }
    474509}
    475510
     
    478513        struct groupchat *c = ic->data;
    479514       
    480         if( c->ic->acc->prpl->chat_leave )
     515        if( c && c->ic->acc->prpl->chat_leave )
    481516                c->ic->acc->prpl->chat_leave( c );
    482517       
    483518        return TRUE;
    484        
    485519}
    486520
     
    488522{
    489523        struct groupchat *c = ic->data;
    490         char *topic = g_strdup( new ); /* TODO: Need more const goodness here, sigh */
     524       
     525        if( c == NULL )
     526                return FALSE;
    491527       
    492528        if( c->ic->acc->prpl->chat_topic == NULL )
     
    494530        else
    495531        {
     532                /* TODO: Need more const goodness here, sigh */
     533                char *topic = g_strdup( new );
    496534                c->ic->acc->prpl->chat_topic( c, topic );
     535                g_free( topic );
    497536                return TRUE;
    498537        }
     
    504543{
    505544        struct groupchat *c = ic->data;
    506        
    507         if( iu->bu->ic != c->ic )
    508                 irc_send_num( ic->irc, 482, "%s :Can't mix different IM networks in one groupchat", ic->name );
    509         else if( c->ic->acc->prpl->chat_invite )
    510                 c->ic->acc->prpl->chat_invite( c, iu->bu->handle, NULL );
    511         else
     545        bee_user_t *bu = iu->bu;
     546       
     547        if( bu == NULL )
     548                return FALSE;
     549       
     550        if( c )
     551        {
     552                if( iu->bu->ic != c->ic )
     553                        irc_send_num( ic->irc, 482, "%s :Can't mix different IM networks in one groupchat", ic->name );
     554                else if( c->ic->acc->prpl->chat_invite )
     555                        c->ic->acc->prpl->chat_invite( c, iu->bu->handle, NULL );
     556                else
     557                        irc_send_num( ic->irc, 482, "%s :IM protocol does not support room invitations", ic->name );
     558        }
     559        else if( bu->ic->acc->prpl->chat_with &&
     560                 strcmp( set_getstr( &ic->set, "chat_type" ), "groupchat" ) == 0 )
     561        {
     562                ic->flags |= IRC_CHANNEL_CHAT_PICKME;
     563                iu->bu->ic->acc->prpl->chat_with( bu->ic, bu->handle );
     564                ic->flags &= ~IRC_CHANNEL_CHAT_PICKME;
     565        }
     566        else
     567        {
    512568                irc_send_num( ic->irc, 482, "%s :IM protocol does not support room invitations", ic->name );
    513        
    514         return TRUE;
    515 }
    516 
    517 static const struct irc_channel_funcs irc_channel_im_chat_funcs = {
     569        }
     570       
     571        return TRUE;
     572}
     573
     574static char *set_eval_room_account( set_t *set, char *value );
     575
     576static gboolean bee_irc_channel_init( irc_channel_t *ic )
     577{
     578        set_add( &ic->set, "account", NULL, set_eval_room_account, ic );
     579        set_add( &ic->set, "chat_type", "groupchat", NULL, ic );
     580        set_add( &ic->set, "nick", NULL, NULL, ic );
     581        set_add( &ic->set, "room", NULL, NULL, ic );
     582       
     583        return TRUE;
     584}
     585
     586static char *set_eval_room_account( set_t *set, char *value )
     587{
     588        struct irc_channel *ic = set->data;
     589        account_t *acc;
     590       
     591        if( !( acc = account_get( ic->irc->b, value ) ) )
     592                return SET_INVALID;
     593        else if( !acc->prpl->chat_join )
     594        {
     595                irc_usermsg( ic->irc, "Named chatrooms not supported on that account." );
     596                return SET_INVALID;
     597        }
     598       
     599        return g_strdup_printf( "%s(%s)", acc->prpl->name, acc->user );
     600}
     601
     602static gboolean bee_irc_channel_free( irc_channel_t *ic )
     603{
     604        set_del( &ic->set, "account" );
     605        set_del( &ic->set, "chat_type" );
     606        set_del( &ic->set, "nick" );
     607        set_del( &ic->set, "room" );
     608       
     609        return TRUE;
     610}
     611
     612const struct irc_channel_funcs irc_channel_im_chat_funcs = {
    518613        bee_irc_channel_chat_privmsg,
    519         NULL, /* join */
     614        bee_irc_channel_chat_join,
    520615        bee_irc_channel_chat_part,
    521616        bee_irc_channel_chat_topic,
    522617        bee_irc_channel_chat_invite,
     618
     619        bee_irc_channel_init,
     620        bee_irc_channel_free,
    523621};
    524622
Note: See TracChangeset for help on using the changeset viewer.