Changeset aea8b68


Ignore:
Timestamp:
2010-05-06T00:28:56Z (15 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
f1a0890
Parents:
9438323
Message:

Starting to restore chatroom stuff. Only enough to create and be joined
into a room. More will follow soon.

Files:
10 edited

Legend:

Unmodified
Added
Removed
  • irc.h

    r9438323 raea8b68  
    147147       
    148148        const struct irc_channel_funcs *f;
     149        void *data;
    149150} irc_channel_t;
    150151
  • irc_im.c

    r9438323 raea8b68  
    203203}
    204204
     205
     206/* Groupchats */
     207gboolean bee_irc_chat_new( bee_t *bee, struct groupchat *c )
     208{
     209        irc_t *irc = bee->ui_data;
     210        irc_channel_t *ic;
     211        char *topic;
     212        int i;
     213       
     214        for( i = 0; i <= 999; i ++ )
     215        {
     216                char name[16];
     217                sprintf( name, "&chat_%03d", i );
     218                if( ( ic = irc_channel_new( irc, name ) ) )
     219                        break;
     220        }
     221       
     222        if( ic == NULL )
     223                return FALSE;
     224       
     225        c->ui_data = ic;
     226        ic->data = c;
     227       
     228        topic = g_strdup_printf( "BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", c->title );
     229        irc_channel_set_topic( ic, topic, irc->root );
     230        g_free( topic );
     231       
     232        return TRUE;
     233}
     234
     235gboolean bee_irc_chat_free( bee_t *bee, struct groupchat *c )
     236{
     237        irc_channel_t *ic = c->ui_data;
     238       
     239        if( ic->flags & IRC_CHANNEL_JOINED )
     240                irc_channel_printf( ic, "Cleaning up channel, bye!" );
     241       
     242        irc_channel_free( ic );
     243       
     244        return TRUE;
     245}
     246
     247gboolean bee_irc_chat_log( bee_t *bee, struct groupchat *c, const char *format, ... )
     248{
     249}
     250
     251gboolean bee_irc_chat_msg( bee_t *bee, struct groupchat *c, const char *who, const char *msg, time_t sent_at )
     252{
     253}
     254
     255gboolean bee_irc_chat_add_user( bee_t *bee, struct groupchat *c, bee_user_t *bu )
     256{
     257        irc_t *irc = bee->ui_data;
     258       
     259        irc_channel_add_user( c->ui_data, bu == bee->user ? irc->user : bu->ui_data );
     260}
     261
     262gboolean bee_irc_chat_remove_user( bee_t *bee, struct groupchat *c, bee_user_t *bu )
     263{
     264}
     265
     266
    205267/* File transfers */
    206268static file_transfer_t *bee_irc_ft_in_start( bee_t *bee, bee_user_t *bu, const char *file_name, size_t file_size )
     
    237299        bee_irc_user_typing,
    238300       
     301        bee_irc_chat_new,
     302        bee_irc_chat_free,
     303        NULL,
     304        NULL,
     305        bee_irc_chat_add_user,
     306        NULL,
     307       
    239308        bee_irc_ft_in_start,
    240309        bee_irc_ft_out_start,
  • protocols/Makefile

    r9438323 raea8b68  
    1010
    1111# [SH] Program variables
    12 objects = account.o bee.o bee_ft.o bee_user.o nogaim.o
     12objects = account.o bee.o bee_chat.o bee_ft.o bee_user.o nogaim.o
    1313
    1414
  • protocols/bee.c

    r9438323 raea8b68  
    4747        s = set_add( &b->set, "strip_html", "true", NULL, b );
    4848       
     49        b->user = g_malloc( 1 );
     50       
    4951        return b;
    5052}
     
    7072                set_del( &b->set, b->set->key );
    7173       
     74        g_free( b->user );
    7275        g_free( b );
    7376}
  • protocols/bee.h

    r9438323 raea8b68  
    2828
    2929struct bee_ui_funcs;
     30struct groupchat;
    3031
    3132typedef struct bee
     
    3536        GSList *users;
    3637        struct account *accounts; /* TODO(wilmer): Use GSList here too? */
     38       
     39        /* Symbolic, to refer to the local user (who has no real bee_user
     40           object). Not to be used by anything except so far imcb_chat_add/
     41           remove_buddy(). This seems slightly cleaner than abusing NULL. */
     42        struct bee_user *user;
    3743       
    3844        const struct bee_ui_funcs *ui;
     
    7379        gboolean (*user_typing)( bee_t *bee, bee_user_t *bu, guint32 flags );
    7480       
     81        gboolean (*chat_new)( bee_t *bee, struct groupchat *c );
     82        gboolean (*chat_free)( bee_t *bee, struct groupchat *c );
     83        gboolean (*chat_log)( bee_t *bee, struct groupchat *c, const char *format, ... );
     84        gboolean (*chat_msg)( bee_t *bee, struct groupchat *c, const char *who, const char *msg, time_t sent_at );
     85        gboolean (*chat_add_user)( bee_t *bee, struct groupchat *c, bee_user_t *bu );
     86        gboolean (*chat_remove_user)( bee_t *bee, struct groupchat *c, bee_user_t *bu );
     87       
    7588        struct file_transfer* (*ft_in_start)( bee_t *bee, bee_user_t *bu, const char *file_name, size_t file_size );
    7689        gboolean (*ft_out_start)( struct im_connection *ic, struct file_transfer *ft );
     
    101114G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, guint32 flags, time_t sent_at );
    102115
     116/* bee_chat.c */
     117#if 0
     118struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle );
     119void imcb_chat_name_hint( struct groupchat *c, const char *name );
     120void imcb_chat_free( struct groupchat *c );
     121void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at );
     122void imcb_chat_log( struct groupchat *c, char *format, ... );
     123void imcb_chat_topic( struct groupchat *c, char *who, char *topic, time_t set_at );
     124void imcb_chat_add_buddy( struct groupchat *b, const char *handle );
     125void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason );
     126static int remove_chat_buddy_silent( struct groupchat *b, const char *handle );
     127#endif
     128
    103129#endif /* __BEE_H__ */
  • protocols/jabber/conference.c

    r9438323 raea8b68  
    9292{
    9393        char *normalized = jabber_normalize( name );
     94        GSList *l;
    9495        struct groupchat *ret;
    9596        struct jabber_chat *jc;
    9697       
    97         for( ret = ic->groupchats; ret; ret = ret->next )
    98         {
     98        for( l = ic->groupchats; l; l = l->next )
     99        {
     100                ret = l->data;
    99101                jc = ret->data;
    100102                if( strcmp( normalized, jc->name ) == 0 )
  • protocols/jabber/jabber.c

    r9438323 raea8b68  
    282282       
    283283        while( ic->groupchats )
    284                 jabber_chat_free( ic->groupchats );
     284                jabber_chat_free( ic->groupchats->data );
    285285       
    286286        if( jd->r_inpa >= 0 )
  • protocols/jabber/presence.c

    r9438323 raea8b68  
    206206        struct xt_node *node, *cap;
    207207        struct groupchat *c;
     208        GSList *l;
    208209        int st;
    209210       
     
    229230        /* Have to send this update to all groupchats too, the server won't
    230231           do this automatically. */
    231         for( c = ic->groupchats; c && st; c = c->next )
    232         {
     232        for( l = ic->groupchats; l && st; l = l->next )
     233        {
     234                struct groupchat *c = l->data;
    233235                struct jabber_chat *jc = c->data;
    234236               
  • protocols/nogaim.c

    r9438323 raea8b68  
    536536        return bee_user_by_handle( ic->bee, ic, handle );
    537537}
    538 
    539 struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle )
    540 {
    541 #if 0
    542         struct groupchat *c;
    543        
    544         /* This one just creates the conversation structure, user won't see anything yet */
    545        
    546         if( ic->groupchats )
    547         {
    548                 for( c = ic->groupchats; c->next; c = c->next );
    549                 c = c->next = g_new0( struct groupchat, 1 );
    550         }
    551         else
    552                 ic->groupchats = c = g_new0( struct groupchat, 1 );
    553        
    554         c->ic = ic;
    555         c->title = g_strdup( handle );
    556         c->channel = g_strdup_printf( "&chat_%03d", ic->irc->c_id++ );
    557         c->topic = g_strdup_printf( "BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", c->title );
    558        
    559         if( set_getbool( &ic->bee->set, "debug" ) )
    560                 imcb_log( ic, "Creating new conversation: (id=%p,handle=%s)", c, handle );
    561        
    562         return c;
    563 #endif
    564         return NULL;
    565 }
    566 
    567 void imcb_chat_name_hint( struct groupchat *c, const char *name )
    568 {
    569 #if 0
    570         if( !c->joined )
    571         {
    572                 struct im_connection *ic = c->ic;
    573                 char stripped[MAX_NICK_LENGTH+1], *full_name;
    574                
    575                 strncpy( stripped, name, MAX_NICK_LENGTH );
    576                 stripped[MAX_NICK_LENGTH] = '\0';
    577                 nick_strip( stripped );
    578                 if( set_getbool( &ic->irc->set, "lcnicks" ) )
    579                         nick_lc( stripped );
    580                
    581                 full_name = g_strdup_printf( "&%s", stripped );
    582                
    583                 if( stripped[0] &&
    584                     nick_cmp( stripped, ic->irc->channel + 1 ) != 0 &&
    585                     irc_chat_by_channel( ic->irc, full_name ) == NULL )
    586                 {
    587                         g_free( c->channel );
    588                         c->channel = full_name;
    589                 }
    590                 else
    591                 {
    592                         g_free( full_name );
    593                 }
    594         }
    595 #endif
    596 }
    597 
    598 void imcb_chat_free( struct groupchat *c )
    599 {
    600 #if 0
    601         struct im_connection *ic = c->ic;
    602         struct groupchat *l;
    603         GList *ir;
    604        
    605         if( set_getbool( &ic->bee->set, "debug" ) )
    606                 imcb_log( ic, "You were removed from conversation %p", c );
    607        
    608         if( c )
    609         {
    610                 if( c->joined )
    611                 {
    612                         user_t *u, *r;
    613                        
    614                         r = user_find( ic->irc, ic->irc->mynick );
    615                         irc_privmsg( ic->irc, r, "PRIVMSG", c->channel, "", "Cleaning up channel, bye!" );
    616                        
    617                         u = user_find( ic->irc, ic->irc->nick );
    618                         irc_kick( ic->irc, u, c->channel, r );
    619                         /* irc_part( ic->irc, u, c->channel ); */
    620                 }
    621                
    622                 /* Find the previous chat in the linked list. */
    623                 for( l = ic->groupchats; l && l->next != c; l = l->next );
    624                
    625                 if( l )
    626                         l->next = c->next;
    627                 else
    628                         ic->groupchats = c->next;
    629                
    630                 for( ir = c->in_room; ir; ir = ir->next )
    631                         g_free( ir->data );
    632                 g_list_free( c->in_room );
    633                 g_free( c->channel );
    634                 g_free( c->title );
    635                 g_free( c->topic );
    636                 g_free( c );
    637         }
    638 #endif
    639 }
    640 
    641 void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at )
    642 {
    643 #if 0
    644         struct im_connection *ic = c->ic;
    645         char *wrapped;
    646         user_t *u;
    647        
    648         /* Gaim sends own messages through this too. IRC doesn't want this, so kill them */
    649         if( g_strcasecmp( who, ic->acc->user ) == 0 )
    650                 return;
    651        
    652         u = user_findhandle( ic, who );
    653        
    654         if( ( g_strcasecmp( set_getstr( &ic->bee->set, "strip_html" ), "always" ) == 0 ) ||
    655             ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->bee->set, "strip_html" ) ) )
    656                 strip_html( msg );
    657        
    658         wrapped = word_wrap( msg, 425 );
    659         if( c && u )
    660         {
    661                 char *ts = NULL;
    662                 if( set_getbool( &ic->irc->set, "display_timestamps" ) )
    663                         ts = format_timestamp( ic->irc, sent_at );
    664                 irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, ts ? : "", wrapped );
    665                 g_free( ts );
    666         }
    667         else
    668         {
    669                 imcb_log( ic, "Message from/to conversation %s@%p (unknown conv/user): %s", who, c, wrapped );
    670         }
    671         g_free( wrapped );
    672 #endif
    673 }
    674 
    675 void imcb_chat_log( struct groupchat *c, char *format, ... )
    676 {
    677 #if 0
    678         irc_t *irc = c->ic->irc;
    679         va_list params;
    680         char *text;
    681         user_t *u;
    682        
    683         va_start( params, format );
    684         text = g_strdup_vprintf( format, params );
    685         va_end( params );
    686        
    687         u = user_find( irc, irc->mynick );
    688        
    689         irc_privmsg( irc, u, "PRIVMSG", c->channel, "System message: ", text );
    690        
    691         g_free( text );
    692 #endif
    693 }
    694 
    695 void imcb_chat_topic( struct groupchat *c, char *who, char *topic, time_t set_at )
    696 {
    697 #if 0
    698         struct im_connection *ic = c->ic;
    699         user_t *u = NULL;
    700        
    701         if( who == NULL)
    702                 u = user_find( ic->irc, ic->irc->mynick );
    703         else if( g_strcasecmp( who, ic->acc->user ) == 0 )
    704                 u = user_find( ic->irc, ic->irc->nick );
    705         else
    706                 u = user_findhandle( ic, who );
    707        
    708         if( ( g_strcasecmp( set_getstr( &ic->bee->set, "strip_html" ), "always" ) == 0 ) ||
    709             ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->bee->set, "strip_html" ) ) )
    710                 strip_html( topic );
    711        
    712         g_free( c->topic );
    713         c->topic = g_strdup( topic );
    714        
    715         if( c->joined && u )
    716                 irc_write( ic->irc, ":%s!%s@%s TOPIC %s :%s", u->nick, u->user, u->host, c->channel, topic );
    717 #endif
    718 }
    719 
    720 void imcb_chat_add_buddy( struct groupchat *b, const char *handle )
    721 {
    722 #if 0
    723         user_t *u = user_findhandle( b->ic, handle );
    724         int me = 0;
    725        
    726         if( set_getbool( &b->ic->bee->set, "debug" ) )
    727                 imcb_log( b->ic, "User %s added to conversation %p", handle, b );
    728        
    729         /* It might be yourself! */
    730         if( b->ic->acc->prpl->handle_cmp( handle, b->ic->acc->user ) == 0 )
    731         {
    732                 u = user_find( b->ic->irc, b->ic->irc->nick );
    733                 if( !b->joined )
    734                         irc_join( b->ic->irc, u, b->channel );
    735                 b->joined = me = 1;
    736         }
    737        
    738         /* Most protocols allow people to join, even when they're not in
    739            your contact list. Try to handle that here */
    740         if( !u )
    741         {
    742                 imcb_add_buddy( b->ic, handle, NULL );
    743                 u = user_findhandle( b->ic, handle );
    744         }
    745        
    746         /* Add the handle to the room userlist, if it's not 'me' */
    747         if( !me )
    748         {
    749                 if( b->joined )
    750                         irc_join( b->ic->irc, u, b->channel );
    751                 b->in_room = g_list_append( b->in_room, g_strdup( handle ) );
    752         }
    753 #endif
    754 }
    755 
    756 /* This function is one BIG hack... :-( EREWRITE */
    757 void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason )
    758 {
    759 #if 0
    760         user_t *u;
    761         int me = 0;
    762        
    763         if( set_getbool( &b->ic->bee->set, "debug" ) )
    764                 imcb_log( b->ic, "User %s removed from conversation %p (%s)", handle, b, reason ? reason : "" );
    765        
    766         /* It might be yourself! */
    767         if( g_strcasecmp( handle, b->ic->acc->user ) == 0 )
    768         {
    769                 if( b->joined == 0 )
    770                         return;
    771                
    772                 u = user_find( b->ic->irc, b->ic->irc->nick );
    773                 b->joined = 0;
    774                 me = 1;
    775         }
    776         else
    777         {
    778                 u = user_findhandle( b->ic, handle );
    779         }
    780        
    781         if( me || ( remove_chat_buddy_silent( b, handle ) && b->joined && u ) )
    782                 irc_part( b->ic->irc, u, b->channel );
    783 #endif
    784 }
    785 
    786 #if 0
    787 static int remove_chat_buddy_silent( struct groupchat *b, const char *handle )
    788 {
    789         GList *i;
    790        
    791         /* Find the handle in the room userlist and shoot it */
    792         i = b->in_room;
    793         while( i )
    794         {
    795                 if( g_strcasecmp( handle, i->data ) == 0 )
    796                 {
    797                         g_free( i->data );
    798                         b->in_room = g_list_remove( b->in_room, i->data );
    799                         return( 1 );
    800                 }
    801                
    802                 i = i->next;
    803         }
    804        
    805         return 0;
    806 }
    807 #endif
    808538
    809539
  • protocols/nogaim.h

    r9438323 raea8b68  
    8989        bee_t *bee;
    9090       
    91         struct groupchat *groupchats;
     91        GSList *groupchats;
    9292};
    9393
     
    100100         * already, for example to avoid adding somebody two times. */
    101101        GList *in_room;
    102         GList *ignored;
    103        
    104         struct groupchat *next;
    105         char *channel;
     102        //GList *ignored;
     103       
     104        //struct groupchat *next;
    106105        /* The title variable contains the ID you gave when you created the
    107106         * chat using imcb_chat_new(). */
     
    114113         * structure for your protocol's needs. */
    115114        void *data;
     115        void *ui_data;
    116116};
    117117
Note: See TracChangeset for help on using the changeset viewer.