Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc.c

    r435f552 r823de9d  
    2929#include "crypting.h"
    3030#include "ipc.h"
     31#include <sys/types.h>
     32#include <sys/wait.h>
    3133
    3234static gboolean irc_userping( gpointer _irc, int fd, b_input_condition cond );
     35static void irc_welcome( irc_t* irc );
    3336
    3437GSList *irc_connection_list = NULL;
     
    7881}
    7982
    80 static char *set_eval_away_status( set_t *set, char *value )
    81 {
    82         irc_t *irc = set->data;
    83         account_t *a;
    84        
    85         g_free( set->value );
    86         set->value = g_strdup( value );
    87        
    88         for( a = irc->accounts; a; a = a->next )
    89         {
    90                 struct im_connection *ic = a->ic;
    91                
    92                 if( ic && ic->flags & OPT_LOGGED_IN )
    93                         imc_away_send_update( ic );
    94         }
    95        
    96         return value;
    97 }
    98 
    9983irc_t *irc_new( int fd )
    10084{
     
    161145
    162146        irc_connection_list = g_slist_append( irc_connection_list, irc );
    163        
    164         s = set_add( &irc->set, "away", NULL,  set_eval_away_status, irc );
    165         s->flags |= SET_NULL_OK;
    166         s = set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
     147
    167148        s = set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
    168         s = set_add( &irc->set, "auto_reconnect", "true", set_eval_bool, irc );
     149        s = set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
    169150        s = set_add( &irc->set, "auto_reconnect_delay", "5*3<900", set_eval_account_reconnect_delay, irc );
    170151        s = set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
    171152        s = set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
    172153        s = set_add( &irc->set, "charset", "utf-8", set_eval_charset, irc );
     154        s = set_add( &irc->set, "color_encrypted", "true", set_eval_bool, irc );
    173155        s = set_add( &irc->set, "debug", "false", set_eval_bool, irc );
    174156        s = set_add( &irc->set, "default_target", "root", NULL, irc );
    175157        s = set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc );
    176158        s = set_add( &irc->set, "handle_unknown", "root", NULL, irc );
     159        s = set_add( &irc->set, "halfop_buddies", "encrypted", set_eval_halfop_buddies, irc );
    177160        s = set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc );
    178         s = set_add( &irc->set, "ops", "both", set_eval_ops, irc );
     161        s = set_add( &irc->set, "op_buddies", "trusted", set_eval_op_buddies, irc );
     162        s = set_add( &irc->set, "op_root", "true", set_eval_op_root, irc );
     163        s = set_add( &irc->set, "otr_policy", "oppurtunistic", set_eval_otr_policy, irc );
    179164        s = set_add( &irc->set, "password", NULL, set_eval_password, irc );
    180165        s->flags |= SET_NULL_OK;
     
    184169        s = set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc );
    185170        s = set_add( &irc->set, "simulate_netsplit", "true", set_eval_bool, irc );
    186         s = set_add( &irc->set, "status", NULL,  set_eval_away_status, irc );
    187         s->flags |= SET_NULL_OK;
    188171        s = set_add( &irc->set, "strip_html", "true", NULL, irc );
    189172        s = set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc );
    190173        s = set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );
     174        s = set_add( &irc->set, "voice_buddies", "notaway", set_eval_voice_buddies, irc);
    191175       
    192176        conf_loaddefaults( irc );
    193        
     177
     178        irc->otr = otr_new();
     179
    194180        /* Evaluator sets the iconv/oconv structures. */
    195181        set_eval_charset( set_find( &irc->set, "charset" ), set_getstr( &irc->set, "charset" ) );
     
    343329       
    344330        g_free( irc->last_target );
     331
     332        otr_free(irc->otr);
    345333       
    346334        g_free( irc );
    347        
     335
    348336        if( global.conf->runmode == RUNMODE_INETD ||
    349337            global.conf->runmode == RUNMODE_FORKDAEMON ||
     
    430418                        }
    431419                       
    432                         if( lines[i] && ( cmd = irc_parse_line( lines[i] ) ) )
    433                         {
     420                        if( lines[i] )
     421                        {
     422                                if( ( cmd = irc_parse_line( lines[i] ) ) == NULL )
     423                                        continue;
    434424                                irc_exec( irc, cmd );
    435425                                g_free( cmd );
     
    506496        if( line[0] == ':' )
    507497        {
    508                 for( i = 0; line[i] && line[i] != ' '; i ++ );
     498                for( i = 0; line[i] != ' '; i ++ );
    509499                line = line + i;
    510500        }
     
    714704}
    715705
     706const char *user_mode_prefix( irc_t *irc, user_t *u )
     707{
     708        static char op[] = "@";
     709        static char halfop[] = "%";
     710        static char voice[] = "+";
     711        static char none[] = "";
     712
     713        int or = set_getbool(&irc->set, "op_root");
     714        int ou = set_getbool(&irc->set, "op_user");
     715        char *ob = set_getstr(&irc->set, "op_buddies");
     716        char *hb = set_getstr(&irc->set, "halfop_buddies");
     717        char *vb = set_getstr(&irc->set, "voice_buddies");
     718
     719        if( (!strcmp(u->nick, irc->mynick) && or) ||
     720            (!strcmp(u->nick, irc->nick) && ou) ||
     721        (!u->away && !strcmp(ob, "notaway")) ||
     722        (u->encrypted && !strcmp(ob, "encrypted")) ||
     723        (u->encrypted>1 && !strcmp(ob, "trusted"))
     724      )
     725                return op;
     726        else if( (!u->away && !strcmp(hb, "notaway")) ||
     727             (u->encrypted && !strcmp(hb, "encrypted")) ||
     728             (u->encrypted>1 && !strcmp(hb, "trusted"))
     729               )
     730                return halfop;
     731        else if( (!u->away && !strcmp(vb, "notaway")) ||
     732             (u->encrypted && !strcmp(vb, "encrypted")) ||
     733             (u->encrypted>1 && !strcmp(vb, "trusted"))
     734               )
     735                return voice;
     736        else
     737                return none;
     738}
     739                       
    716740void irc_names( irc_t *irc, char *channel )
    717741{
     
    719743        char namelist[385] = "";
    720744        struct groupchat *c = NULL;
    721         char *ops = set_getstr( &irc->set, "ops" );
    722745       
    723746        /* RFCs say there is no error reply allowed on NAMES, so when the
     
    734757                        }
    735758                       
    736                         if( u->ic && !u->away && set_getbool( &irc->set, "away_devoice" ) )
    737                                 strcat( namelist, "+" );
    738                         else if( ( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) == 0 ) ) ||
    739                                  ( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) == 0 ) ) )
    740                                 strcat( namelist, "@" );
    741                        
     759                        strcat( namelist, user_mode_prefix(irc, u) );
    742760                        strcat( namelist, u->nick );
    743761                        strcat( namelist, " " );
     
    750768                /* root and the user aren't in the channel userlist but should
    751769                   show up in /NAMES, so list them first: */
    752                 sprintf( namelist, "%s%s %s%s ", strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->mynick,
    753                                                  strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->nick );
     770                sprintf( namelist, "%s%s %s%s ", set_getbool(&irc->set, "op_root") ? "@" : "", irc->mynick,
     771                                                 set_getbool(&irc->set, "op_user") ? "@" : "", irc->nick );
    754772               
    755773                for( l = c->in_room; l; l = l->next ) if( ( u = user_findhandle( c->ic, l->data ) ) )
     
    761779                        }
    762780                       
     781                        strcat( namelist, user_mode_prefix(irc, u) );
    763782                        strcat( namelist, u->nick );
    764783                        strcat( namelist, " " );
     
    802821        irc_reply( irc,   3, ":%s", IRCD_INFO );
    803822        irc_reply( irc,   4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES );
    804         irc_reply( irc,   5, "PREFIX=(ov)@+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee "
    805                              "CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server",
    806                              CTYPES, CMODES, MAX_NICK_LENGTH - 1 );
     823        irc_reply( irc,   5, "PREFIX=(ohv)@%%+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 );
    807824        irc_motd( irc );
    808825        irc->umode[0] = '\0';
    809826        irc_umode_set( irc, "+" UMODE, 1 );
    810 
    811         u = user_add( irc, irc->mynick );
     827u = user_add( irc, irc->mynick );
    812828        u->host = g_strdup( irc->myhost );
    813829        u->realname = g_strdup( ROOT_FN );
     
    831847        irc_spawn( irc, u );
    832848       
    833         irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n"
    834                           "If you've never used BitlBee before, please do read the help "
    835                           "information using the \x02help\x02 command. Lots of FAQs are "
    836                           "answered there.\n"
    837                           "If you already have an account on this server, just use the "
    838                           "\x02identify\x02 command to identify yourself." );
     849        irc_welcome( irc );
    839850       
    840851        if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON )
     
    851862                root_command( irc, send_cmd );
    852863                g_free( send_cmd[1] );
     864        }
     865}
     866
     867static void irc_welcome( irc_t *irc )
     868{
     869        FILE *f;
     870       
     871        f = fopen( global.conf->welcomefile, "r" );
     872        if( !f )
     873        {
     874                irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n"
     875                                  "If you've never used BitlBee before, please do read the help "
     876                                  "information using the \x02help\x02 command. Lots of FAQs are "
     877                                  "answered there.\n"
     878                                  "OTR users please note: Private key files are owned by the user "
     879                                  "BitlBee is running as.\n"
     880                                  "If you already have an account on this server, just use the "
     881                                  "\x02identify\x02 command to identify yourself." );
     882        }
     883        else
     884        {
     885                char linebuf[380];
     886               
     887                while( fgets( linebuf, 380, f ) )
     888                {
     889                        irc_usermsg( irc, linebuf );
     890                }
     891               
     892                fclose( f );
    853893        }
    854894}
     
    10451085        user_t *u = NULL;
    10461086       
    1047         if( strchr( CTYPES, *nick ) )
     1087        if( *nick == '#' || *nick == '&' )
    10481088        {
    10491089                if( !( c = irc_chat_by_channel( irc, nick ) ) )
Note: See TracChangeset for help on using the changeset viewer.