Changeset d860a8d for protocols


Ignore:
Timestamp:
2010-04-01T03:38:50Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
e63507a
Parents:
81e04e1
Message:

Restored "account" root command and restored enough stuff to be able to
send messages. Also started moving stuff out from nogaim.* into bee_* files.

Location:
protocols
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • protocols/bee.h

    r81e04e1 rd860a8d  
    8080int bee_user_free( bee_t *bee, struct im_connection *ic, const char *handle );
    8181bee_user_t *bee_user_by_handle( bee_t *bee, struct im_connection *ic, const char *handle );
     82int bee_user_msg( bee_t *bee, bee_user_t *bu, const char *msg, int flags );
     83
     84/* Callbacks from IM modules to core: */
     85/* Buddy activity */
     86/* To manipulate the status of a handle.
     87 * - flags can be |='d with OPT_* constants. You will need at least:
     88 *   OPT_LOGGED_IN and OPT_AWAY.
     89 * - 'state' and 'message' can be NULL */
     90G_MODULE_EXPORT void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message );
     91/* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle );
     92/* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
     93G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at );
    8294
    8395#endif /* __BEE_H__ */
  • protocols/bee_user.c

    r81e04e1 rd860a8d  
    8181        return NULL;
    8282}
     83
     84int bee_user_msg( bee_t *bee, bee_user_t *bu, const char *msg, int flags )
     85{
     86        char *buf = NULL;
     87        int st;
     88       
     89        if( ( bu->ic->flags & OPT_DOES_HTML ) && ( g_strncasecmp( msg, "<html>", 6 ) != 0 ) )
     90        {
     91                buf = escape_html( msg );
     92                msg = buf;
     93        }
     94       
     95        st = bu->ic->acc->prpl->buddy_msg( bu->ic, bu->handle, msg, flags );
     96        g_free( buf );
     97       
     98        return st;
     99}
     100
     101
     102/* IM->UI callbacks */
     103void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message )
     104{
     105        bee_t *bee = ic->bee;
     106        bee_user_t *bu, *old;
     107       
     108        if( !( bu = bee_user_by_handle( bee, ic, handle ) ) )
     109        {
     110                if( g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "add" ) == 0 )
     111                {
     112                        bu = bee_user_new( bee, ic, handle );
     113                }
     114                else
     115                {
     116                        if( set_getbool( &ic->bee->set, "debug" ) || g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "ignore" ) != 0 )
     117                        {
     118                                imcb_log( ic, "imcb_buddy_status() for unknown handle %s:", handle );
     119                                imcb_log( ic, "flags = %d, state = %s, message = %s", flags,
     120                                          state ? state : "NULL", message ? message : "NULL" );
     121                        }
     122                       
     123                        return;
     124                }
     125        }
     126       
     127        /* May be nice to give the UI something to compare against. */
     128        old = g_memdup( bu, sizeof( bee_user_t ) );
     129       
     130        /* TODO(wilmer): OPT_AWAY, or just state == NULL ? */
     131        bu->flags = ( flags & OPT_LOGGED_IN ? BEE_USER_ONLINE : 0 ) |
     132                    ( flags & OPT_AWAY ? BEE_USER_AWAY : 0 );
     133        bu->status = g_strdup( ( flags & OPT_AWAY ) && state == NULL ? "Away" : state );
     134        bu->status_msg = g_strdup( message );
     135       
     136        if( bee->ui->user_status )
     137                bee->ui->user_status( bee, bu, old );
     138       
     139        g_free( old->status_msg );
     140        g_free( old->status );
     141        g_free( old );
     142#if 0   
     143        oa = u->away != NULL;
     144        oo = u->online;
     145       
     146        g_free( u->away );
     147        g_free( u->status_msg );
     148        u->away = u->status_msg = NULL;
     149       
     150        if( ( flags & OPT_LOGGED_IN ) && !u->online )
     151        {
     152                irc_spawn( ic->irc, u );
     153                u->online = 1;
     154        }
     155        else if( !( flags & OPT_LOGGED_IN ) && u->online )
     156        {
     157                struct groupchat *c;
     158               
     159                irc_kill( ic->irc, u );
     160                u->online = 0;
     161               
     162                /* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */
     163                for( c = ic->groupchats; c; c = c->next )
     164                        remove_chat_buddy_silent( c, handle );
     165        }
     166       
     167        if( flags & OPT_AWAY )
     168        {
     169                if( state && message )
     170                {
     171                        u->away = g_strdup_printf( "%s (%s)", state, message );
     172                }
     173                else if( state )
     174                {
     175                        u->away = g_strdup( state );
     176                }
     177                else if( message )
     178                {
     179                        u->away = g_strdup( message );
     180                }
     181                else
     182                {
     183                        u->away = g_strdup( "Away" );
     184                }
     185        }
     186        else
     187        {
     188                u->status_msg = g_strdup( message );
     189        }
     190       
     191        /* LISPy... */
     192        if( ( set_getbool( &ic->bee->set, "away_devoice" ) ) &&         /* Don't do a thing when user doesn't want it */
     193            ( u->online ) &&                                            /* Don't touch offline people */
     194            ( ( ( u->online != oo ) && !u->away ) ||                    /* Voice joining people */
     195              ( ( u->online == oo ) && ( oa == !u->away ) ) ) )         /* (De)voice people changing state */
     196        {
     197                char *from;
     198               
     199                if( set_getbool( &ic->bee->set, "simulate_netsplit" ) )
     200                {
     201                        from = g_strdup( ic->irc->myhost );
     202                }
     203                else
     204                {
     205                        from = g_strdup_printf( "%s!%s@%s", ic->irc->mynick, ic->irc->mynick,
     206                                                            ic->irc->myhost );
     207                }
     208                irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,
     209                                                          u->away?'-':'+', u->nick );
     210                g_free( from );
     211        }
     212#endif
     213}
     214
     215void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at )
     216{
     217#if 0
     218        bee_t *bee = ic->bee;
     219        char *wrapped;
     220        user_t *u;
     221       
     222        u = user_findhandle( ic, handle );
     223       
     224        if( !u )
     225        {
     226                char *h = set_getstr( &bee->set, "handle_unknown" );
     227               
     228                if( g_strcasecmp( h, "ignore" ) == 0 )
     229                {
     230                        if( set_getbool( &bee->set, "debug" ) )
     231                                imcb_log( ic, "Ignoring message from unknown handle %s", handle );
     232                       
     233                        return;
     234                }
     235                else if( g_strncasecmp( h, "add", 3 ) == 0 )
     236                {
     237                        int private = set_getbool( &bee->set, "private" );
     238                       
     239                        if( h[3] )
     240                        {
     241                                if( g_strcasecmp( h + 3, "_private" ) == 0 )
     242                                        private = 1;
     243                                else if( g_strcasecmp( h + 3, "_channel" ) == 0 )
     244                                        private = 0;
     245                        }
     246                       
     247                        imcb_add_buddy( ic, handle, NULL );
     248                        u = user_findhandle( ic, handle );
     249                        u->is_private = private;
     250                }
     251                else
     252                {
     253                        imcb_log( ic, "Message from unknown handle %s:", handle );
     254                        u = user_find( irc, irc->mynick );
     255                }
     256        }
     257       
     258        if( ( g_strcasecmp( set_getstr( &ic->bee->set, "strip_html" ), "always" ) == 0 ) ||
     259            ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->bee->set, "strip_html" ) ) )
     260                strip_html( msg );
     261
     262        wrapped = word_wrap( msg, 425 );
     263        irc_msgfrom( irc, u->nick, wrapped );
     264        g_free( wrapped );
     265#endif
     266}
  • protocols/nogaim.c

    r81e04e1 rd860a8d  
    546546        data->handle = g_strdup( handle );
    547547        query_add( ic->irc, ic, s, imcb_ask_add_cb_yes, imcb_ask_add_cb_no, data );
    548 #endif
    549 }
    550 
    551 void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message )
    552 {
    553         bee_t *bee = ic->bee;
    554         bee_user_t *bu, *old;
    555        
    556         if( !( bu = bee_user_by_handle( bee, ic, handle ) ) )
    557         {
    558                 if( g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "add" ) == 0 )
    559                 {
    560                         bu = bee_user_new( bee, ic, handle );
    561                 }
    562                 else
    563                 {
    564                         if( set_getbool( &ic->bee->set, "debug" ) || g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "ignore" ) != 0 )
    565                         {
    566                                 imcb_log( ic, "imcb_buddy_status() for unknown handle %s:", handle );
    567                                 imcb_log( ic, "flags = %d, state = %s, message = %s", flags,
    568                                           state ? state : "NULL", message ? message : "NULL" );
    569                         }
    570                        
    571                         return;
    572                 }
    573         }
    574        
    575         /* May be nice to give the UI something to compare against. */
    576         old = g_memdup( bu, sizeof( bee_user_t ) );
    577        
    578         /* TODO(wilmer): OPT_AWAY, or just state == NULL ? */
    579         bu->flags = ( flags & OPT_LOGGED_IN ? BEE_USER_ONLINE : 0 ) |
    580                     ( flags & OPT_AWAY ? BEE_USER_AWAY : 0 );
    581         bu->status = g_strdup( ( flags & OPT_AWAY ) && state == NULL ? "Away" : state );
    582         bu->status_msg = g_strdup( message );
    583        
    584         if( bee->ui->user_status )
    585                 bee->ui->user_status( bee, bu, old );
    586        
    587         g_free( old->status_msg );
    588         g_free( old->status );
    589         g_free( old );
    590 #if 0   
    591         oa = u->away != NULL;
    592         oo = u->online;
    593        
    594         g_free( u->away );
    595         g_free( u->status_msg );
    596         u->away = u->status_msg = NULL;
    597        
    598         if( ( flags & OPT_LOGGED_IN ) && !u->online )
    599         {
    600                 irc_spawn( ic->irc, u );
    601                 u->online = 1;
    602         }
    603         else if( !( flags & OPT_LOGGED_IN ) && u->online )
    604         {
    605                 struct groupchat *c;
    606                
    607                 irc_kill( ic->irc, u );
    608                 u->online = 0;
    609                
    610                 /* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */
    611                 for( c = ic->groupchats; c; c = c->next )
    612                         remove_chat_buddy_silent( c, handle );
    613         }
    614        
    615         if( flags & OPT_AWAY )
    616         {
    617                 if( state && message )
    618                 {
    619                         u->away = g_strdup_printf( "%s (%s)", state, message );
    620                 }
    621                 else if( state )
    622                 {
    623                         u->away = g_strdup( state );
    624                 }
    625                 else if( message )
    626                 {
    627                         u->away = g_strdup( message );
    628                 }
    629                 else
    630                 {
    631                         u->away = g_strdup( "Away" );
    632                 }
    633         }
    634         else
    635         {
    636                 u->status_msg = g_strdup( message );
    637         }
    638        
    639         /* LISPy... */
    640         if( ( set_getbool( &ic->bee->set, "away_devoice" ) ) &&         /* Don't do a thing when user doesn't want it */
    641             ( u->online ) &&                                            /* Don't touch offline people */
    642             ( ( ( u->online != oo ) && !u->away ) ||                    /* Voice joining people */
    643               ( ( u->online == oo ) && ( oa == !u->away ) ) ) )         /* (De)voice people changing state */
    644         {
    645                 char *from;
    646                
    647                 if( set_getbool( &ic->bee->set, "simulate_netsplit" ) )
    648                 {
    649                         from = g_strdup( ic->irc->myhost );
    650                 }
    651                 else
    652                 {
    653                         from = g_strdup_printf( "%s!%s@%s", ic->irc->mynick, ic->irc->mynick,
    654                                                             ic->irc->myhost );
    655                 }
    656                 irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,
    657                                                           u->away?'-':'+', u->nick );
    658                 g_free( from );
    659         }
    660 #endif
    661 }
    662 
    663 void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at )
    664 {
    665 #if 0
    666         bee_t *bee = ic->bee;
    667         char *wrapped;
    668         user_t *u;
    669        
    670         u = user_findhandle( ic, handle );
    671        
    672         if( !u )
    673         {
    674                 char *h = set_getstr( &bee->set, "handle_unknown" );
    675                
    676                 if( g_strcasecmp( h, "ignore" ) == 0 )
    677                 {
    678                         if( set_getbool( &bee->set, "debug" ) )
    679                                 imcb_log( ic, "Ignoring message from unknown handle %s", handle );
    680                        
    681                         return;
    682                 }
    683                 else if( g_strncasecmp( h, "add", 3 ) == 0 )
    684                 {
    685                         int private = set_getbool( &bee->set, "private" );
    686                        
    687                         if( h[3] )
    688                         {
    689                                 if( g_strcasecmp( h + 3, "_private" ) == 0 )
    690                                         private = 1;
    691                                 else if( g_strcasecmp( h + 3, "_channel" ) == 0 )
    692                                         private = 0;
    693                         }
    694                        
    695                         imcb_add_buddy( ic, handle, NULL );
    696                         u = user_findhandle( ic, handle );
    697                         u->is_private = private;
    698                 }
    699                 else
    700                 {
    701                         imcb_log( ic, "Message from unknown handle %s:", handle );
    702                         u = user_find( irc, irc->mynick );
    703                 }
    704         }
    705        
    706         if( ( g_strcasecmp( set_getstr( &ic->bee->set, "strip_html" ), "always" ) == 0 ) ||
    707             ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->bee->set, "strip_html" ) ) )
    708                 strip_html( msg );
    709 
    710         wrapped = word_wrap( msg, 425 );
    711         irc_msgfrom( irc, u->nick, wrapped );
    712         g_free( wrapped );
    713548#endif
    714549}
     
    1035870   them all from some wrappers. We'll start to define some down here: */
    1036871
    1037 int imc_buddy_msg( struct im_connection *ic, char *handle, char *msg, int flags )
    1038 {
    1039         char *buf = NULL;
    1040         int st;
    1041        
    1042         if( ( ic->flags & OPT_DOES_HTML ) && ( g_strncasecmp( msg, "<html>", 6 ) != 0 ) )
    1043         {
    1044                 buf = escape_html( msg );
    1045                 msg = buf;
    1046         }
    1047        
    1048         st = ic->acc->prpl->buddy_msg( ic, handle, msg, flags );
    1049         g_free( buf );
    1050        
    1051         return st;
    1052 }
    1053 
    1054872int imc_chat_msg( struct groupchat *c, char *msg, int flags )
    1055873{
  • protocols/nogaim.h

    r81e04e1 rd860a8d  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2004 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2010 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    286286G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick );
    287287
    288 /* Buddy activity */
    289 /* To manipulate the status of a handle.
    290  * - flags can be |='d with OPT_* constants. You will need at least:
    291  *   OPT_LOGGED_IN and OPT_AWAY.
    292  * - 'state' and 'message' can be NULL */
    293 G_MODULE_EXPORT void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message );
    294 /* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle );
    295 /* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
    296 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at );
    297288G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags );
     289G_MODULE_EXPORT struct bee_user *imcb_buddy_by_handle( struct im_connection *ic, const char *handle );
    298290G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle );
    299291
     
    320312/* Actions, or whatever. */
    321313int imc_away_send_update( struct im_connection *ic );
    322 int imc_buddy_msg( struct im_connection *ic, char *handle, char *msg, int flags );
    323314int imc_chat_msg( struct groupchat *c, char *msg, int flags );
    324315
Note: See TracChangeset for help on using the changeset viewer.