diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-03-31 23:38:50 -0400 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-03-31 23:38:50 -0400 |
commit | d860a8ddf5039f7208bff4c179bc9fe1549da6da (patch) | |
tree | cb96dfcc222e78bd23d25f480b94f2c69470e373 /protocols/bee_user.c | |
parent | 81e04e162bdc4517b2f357fd16dfd76f68245464 (diff) |
Restored "account" root command and restored enough stuff to be able to
send messages. Also started moving stuff out from nogaim.* into bee_* files.
Diffstat (limited to 'protocols/bee_user.c')
-rw-r--r-- | protocols/bee_user.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/protocols/bee_user.c b/protocols/bee_user.c index 4356c141..66e25faf 100644 --- a/protocols/bee_user.c +++ b/protocols/bee_user.c @@ -80,3 +80,187 @@ bee_user_t *bee_user_by_handle( bee_t *bee, struct im_connection *ic, const char return NULL; } + +int bee_user_msg( bee_t *bee, bee_user_t *bu, const char *msg, int flags ) +{ + char *buf = NULL; + int st; + + if( ( bu->ic->flags & OPT_DOES_HTML ) && ( g_strncasecmp( msg, "<html>", 6 ) != 0 ) ) + { + buf = escape_html( msg ); + msg = buf; + } + + st = bu->ic->acc->prpl->buddy_msg( bu->ic, bu->handle, msg, flags ); + g_free( buf ); + + return st; +} + + +/* IM->UI callbacks */ +void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message ) +{ + bee_t *bee = ic->bee; + bee_user_t *bu, *old; + + if( !( bu = bee_user_by_handle( bee, ic, handle ) ) ) + { + if( g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "add" ) == 0 ) + { + bu = bee_user_new( bee, ic, handle ); + } + else + { + if( set_getbool( &ic->bee->set, "debug" ) || g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "ignore" ) != 0 ) + { + imcb_log( ic, "imcb_buddy_status() for unknown handle %s:", handle ); + imcb_log( ic, "flags = %d, state = %s, message = %s", flags, + state ? state : "NULL", message ? message : "NULL" ); + } + + return; + } + } + + /* May be nice to give the UI something to compare against. */ + old = g_memdup( bu, sizeof( bee_user_t ) ); + + /* TODO(wilmer): OPT_AWAY, or just state == NULL ? */ + bu->flags = ( flags & OPT_LOGGED_IN ? BEE_USER_ONLINE : 0 ) | + ( flags & OPT_AWAY ? BEE_USER_AWAY : 0 ); + bu->status = g_strdup( ( flags & OPT_AWAY ) && state == NULL ? "Away" : state ); + bu->status_msg = g_strdup( message ); + + if( bee->ui->user_status ) + bee->ui->user_status( bee, bu, old ); + + g_free( old->status_msg ); + g_free( old->status ); + g_free( old ); +#if 0 + oa = u->away != NULL; + oo = u->online; + + g_free( u->away ); + g_free( u->status_msg ); + u->away = u->status_msg = NULL; + + if( ( flags & OPT_LOGGED_IN ) && !u->online ) + { + irc_spawn( ic->irc, u ); + u->online = 1; + } + else if( !( flags & OPT_LOGGED_IN ) && u->online ) + { + struct groupchat *c; + + irc_kill( ic->irc, u ); + u->online = 0; + + /* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */ + for( c = ic->groupchats; c; c = c->next ) + remove_chat_buddy_silent( c, handle ); + } + + if( flags & OPT_AWAY ) + { + if( state && message ) + { + u->away = g_strdup_printf( "%s (%s)", state, message ); + } + else if( state ) + { + u->away = g_strdup( state ); + } + else if( message ) + { + u->away = g_strdup( message ); + } + else + { + u->away = g_strdup( "Away" ); + } + } + else + { + u->status_msg = g_strdup( message ); + } + + /* LISPy... */ + if( ( set_getbool( &ic->bee->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */ + ( u->online ) && /* Don't touch offline people */ + ( ( ( u->online != oo ) && !u->away ) || /* Voice joining people */ + ( ( u->online == oo ) && ( oa == !u->away ) ) ) ) /* (De)voice people changing state */ + { + char *from; + + if( set_getbool( &ic->bee->set, "simulate_netsplit" ) ) + { + from = g_strdup( ic->irc->myhost ); + } + else + { + from = g_strdup_printf( "%s!%s@%s", ic->irc->mynick, ic->irc->mynick, + ic->irc->myhost ); + } + irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel, + u->away?'-':'+', u->nick ); + g_free( from ); + } +#endif +} + +void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at ) +{ +#if 0 + bee_t *bee = ic->bee; + char *wrapped; + user_t *u; + + u = user_findhandle( ic, handle ); + + if( !u ) + { + char *h = set_getstr( &bee->set, "handle_unknown" ); + + if( g_strcasecmp( h, "ignore" ) == 0 ) + { + if( set_getbool( &bee->set, "debug" ) ) + imcb_log( ic, "Ignoring message from unknown handle %s", handle ); + + return; + } + else if( g_strncasecmp( h, "add", 3 ) == 0 ) + { + int private = set_getbool( &bee->set, "private" ); + + if( h[3] ) + { + if( g_strcasecmp( h + 3, "_private" ) == 0 ) + private = 1; + else if( g_strcasecmp( h + 3, "_channel" ) == 0 ) + private = 0; + } + + imcb_add_buddy( ic, handle, NULL ); + u = user_findhandle( ic, handle ); + u->is_private = private; + } + else + { + imcb_log( ic, "Message from unknown handle %s:", handle ); + u = user_find( irc, irc->mynick ); + } + } + + if( ( g_strcasecmp( set_getstr( &ic->bee->set, "strip_html" ), "always" ) == 0 ) || + ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->bee->set, "strip_html" ) ) ) + strip_html( msg ); + + wrapped = word_wrap( msg, 425 ); + irc_msgfrom( irc, u->nick, wrapped ); + g_free( wrapped ); +#endif +} |