diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2007-04-15 21:01:13 -0700 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2007-04-15 21:01:13 -0700 |
commit | 6bbb939e953bbe1ca9ed3101a1569abe4521f543 (patch) | |
tree | 66ad8cc5189d69c57733a12c6d64c50a86a7ff1d | |
parent | 84b045d409f1e8da6d8bf379c6fef7236dcd9bcd (diff) |
Split serv_got_update() into imcb_buddy_(status|times). (Well, the second
one isn't implemented yet, but I'll do that later.) At last I got rid of
the hack called get_status_string(). And now Yahoo seems to mess up away
messages...
-rw-r--r-- | irc_commands.c | 2 | ||||
-rw-r--r-- | protocols/jabber/iq.c | 2 | ||||
-rw-r--r-- | protocols/jabber/presence.c | 15 | ||||
-rw-r--r-- | protocols/msn/msn.c | 11 | ||||
-rw-r--r-- | protocols/msn/ns.c | 8 | ||||
-rw-r--r-- | protocols/nogaim.c | 57 | ||||
-rw-r--r-- | protocols/nogaim.h | 24 | ||||
-rw-r--r-- | protocols/oscar/oscar.c | 79 | ||||
-rw-r--r-- | protocols/yahoo/yahoo.c | 101 |
9 files changed, 140 insertions, 159 deletions
diff --git a/irc_commands.c b/irc_commands.c index 016b6f84..8d841aaa 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -262,7 +262,7 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) { irc->is_private = 1; } - irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? IM_FLAG_AWAY : 0 ); + irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? OPT_AWAY : 0 ); } } diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c index 53be819e..46ae9a64 100644 --- a/protocols/jabber/iq.c +++ b/protocols/jabber/iq.c @@ -387,7 +387,7 @@ static xt_status jabber_parse_roster( struct im_connection *ic, struct xt_node * /* Don't have any API call for this yet! So let's just try to handle this as well as we can. */ jabber_buddy_remove_bare( ic, jid ); - serv_got_update( ic, jid, 0, 0, 0, 0, 0, 0 ); + imcb_buddy_status( ic, jid, 0, NULL, NULL ); /* FIXME! */ } } diff --git a/protocols/jabber/presence.c b/protocols/jabber/presence.c index 4007c84e..6bc8117f 100644 --- a/protocols/jabber/presence.c +++ b/protocols/jabber/presence.c @@ -37,6 +37,8 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ) if( type == NULL ) { + int is_away = 0; + if( !( bud = jabber_buddy_by_jid( ic, from, GET_BUDDY_EXACT | GET_BUDDY_CREAT ) ) ) { if( set_getbool( &ic->irc->set, "debug" ) ) @@ -51,7 +53,11 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ) bud->away_message = NULL; if( ( c = xt_find_node( node->children, "show" ) ) && c->text_len > 0 ) + { bud->away_state = (void*) jabber_away_state_by_code( c->text ); + if( strcmp( c->text, "chat" ) != 0 ) + is_away = OPT_AWAY; + } else { bud->away_state = NULL; @@ -65,8 +71,9 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ) else bud->priority = 0; - serv_got_update( ic, bud->bare_jid, 1, 0, 0, 0, - bud->away_state ? UC_UNAVAILABLE : 0, 0 ); + /* FIXME: What to send if there are other resources??? */ + imcb_buddy_status( ic, bud->bare_jid, OPT_LOGGED_IN | is_away, + bud->away_state->full_name, bud->away_message ); } else if( strcmp( type, "unavailable" ) == 0 ) { @@ -86,13 +93,13 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ) /* Only count this as offline if there's no other resource available anymore. */ if( jabber_buddy_by_jid( ic, from, 0 ) == NULL ) - serv_got_update( ic, from, 0, 0, 0, 0, 0, 0 ); + imcb_buddy_status( ic, from, 0, NULL, NULL ); *s = '/'; } else { - serv_got_update( ic, from, 0, 0, 0, 0, 0, 0 ); + imcb_buddy_status( ic, from, 0, NULL, NULL ); } } else if( strcmp( type, "subscribe" ) == 0 ) diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c index 676a8ad7..5eea68af 100644 --- a/protocols/msn/msn.c +++ b/protocols/msn/msn.c @@ -191,16 +191,6 @@ static GList *msn_away_states( struct im_connection *ic ) return l; } -static char *msn_get_status_string( struct im_connection *ic, int number ) -{ - const struct msn_away_state *st = msn_away_state_by_number( number ); - - if( st ) - return( (char*) st->name ); - else - return( "" ); -} - static void msn_set_away( struct im_connection *ic, char *state, char *message ) { char buf[1024]; @@ -398,7 +388,6 @@ void msn_initmodule() ret->logout = msn_logout; ret->send_im = msn_send_im; ret->away_states = msn_away_states; - ret->get_status_string = msn_get_status_string; ret->set_away = msn_set_away; ret->get_info = msn_get_info; ret->set_my_name = msn_set_my_name; diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index ba428d82..c80fc177 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -399,12 +399,13 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts ) st = msn_away_state_list; } - serv_got_update( ic, cmd[3], 1, 0, 0, 0, st->number, 0 ); + imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN | + ( st->number ? OPT_AWAY : 0 ), st->name, NULL ); } else if( strcmp( cmd[0], "FLN" ) == 0 ) { if( cmd[1] ) - serv_got_update( ic, cmd[1], 0, 0, 0, 0, 0, 0 ); + imcb_buddy_status( ic, cmd[1], 0, NULL, NULL ); } else if( strcmp( cmd[0], "NLN" ) == 0 ) { @@ -427,7 +428,8 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts ) st = msn_away_state_list; } - serv_got_update( ic, cmd[2], 1, 0, 0, 0, st->number, 0 ); + imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN | + ( st->number ? OPT_AWAY : 0 ), st->name, NULL ); } else if( strcmp( cmd[0], "RNG" ) == 0 ) { diff --git a/protocols/nogaim.c b/protocols/nogaim.c index 6121d398..ef30f749 100644 --- a/protocols/nogaim.c +++ b/protocols/nogaim.c @@ -186,7 +186,7 @@ static void serv_got_crap( struct im_connection *ic, char *format, ... ) va_end( params ); if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) || - ( ( ic->flags & OPT_CONN_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) + ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) strip_html( text ); /* Try to find a different connection on the same protocol. */ @@ -493,32 +493,31 @@ void imcb_ask_add( struct im_connection *ic, char *handle, const char *realname /* server.c */ -void serv_got_update( struct im_connection *ic, char *handle, int loggedin, int evil, time_t signon, time_t idle, int type, guint caps ) +void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message ) { user_t *u; int oa, oo; - u = user_findhandle( ic, handle ); + u = user_findhandle( ic, (char*) handle ); if( !u ) { if( g_strcasecmp( set_getstr( &ic->irc->set, "handle_unknown" ), "add" ) == 0 ) { - add_buddy( ic, NULL, handle, NULL ); - u = user_findhandle( ic, handle ); + add_buddy( ic, NULL, (char*) handle, NULL ); + u = user_findhandle( ic, (char*) handle ); } else { if( set_getbool( &ic->irc->set, "debug" ) || g_strcasecmp( set_getstr( &ic->irc->set, "handle_unknown" ), "ignore" ) != 0 ) { - imcb_log( ic, "serv_got_update() for handle %s:", handle ); - imcb_log( ic, "loggedin = %d, type = %d", loggedin, type ); + 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; } - /* Why did we have this here.... - return; */ } oa = u->away != NULL; @@ -530,12 +529,12 @@ void serv_got_update( struct im_connection *ic, char *handle, int loggedin, int u->away = NULL; } - if( loggedin && !u->online ) + if( ( flags & OPT_LOGGED_IN ) && !u->online ) { irc_spawn( ic->irc, u ); u->online = 1; } - else if( !loggedin && u->online ) + else if( !( flags & OPT_LOGGED_IN ) && u->online ) { struct groupchat *c; @@ -544,19 +543,29 @@ void serv_got_update( struct im_connection *ic, char *handle, int loggedin, int /* Remove him/her from the conversations to prevent PART messages after he/she QUIT already */ for( c = ic->conversations; c; c = c->next ) - remove_chat_buddy_silent( c, handle ); + remove_chat_buddy_silent( c, (char*) handle ); } - if( ( type & UC_UNAVAILABLE ) && ( strcmp( ic->acc->prpl->name, "oscar" ) == 0 || strcmp( ic->acc->prpl->name, "icq" ) == 0 ) ) - { - u->away = g_strdup( "Away" ); - } - else if( ( type & UC_UNAVAILABLE ) && ic->acc->prpl->get_status_string ) + if( flags & OPT_AWAY ) { - u->away = g_strdup( ic->acc->prpl->get_status_string( ic, type ) ); + 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->away = NULL; + /* else waste_any_state_information_for_now(); */ /* LISPy... */ if( ( set_getbool( &ic->irc->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */ @@ -611,7 +620,7 @@ void serv_got_im( struct im_connection *ic, char *handle, char *msg, guint32 fla } if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) || - ( ( ic->flags & OPT_CONN_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) + ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) strip_html( msg ); while( strlen( msg ) > 425 ) @@ -717,7 +726,7 @@ void serv_got_chat_in( struct groupchat *c, char *who, int whisper, char *msg, t u = user_findhandle( ic, who ); if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) || - ( ( ic->flags & OPT_CONN_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) + ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) strip_html( msg ); if( c && u ) @@ -924,7 +933,7 @@ int imc_buddy_msg( struct im_connection *ic, char *handle, char *msg, int flags char *buf = NULL; int st; - if( ( ic->flags & OPT_CONN_HTML ) && ( g_strncasecmp( msg, "<html>", 6 ) != 0 ) ) + if( ( ic->flags & OPT_DOES_HTML ) && ( g_strncasecmp( msg, "<html>", 6 ) != 0 ) ) { buf = escape_html( msg ); msg = buf; @@ -940,7 +949,7 @@ int imc_chat_msg( struct groupchat *c, char *msg, int flags ) { char *buf = NULL; - if( ( c->ic->flags & OPT_CONN_HTML ) && ( g_strncasecmp( msg, "<html>", 6 ) != 0 ) ) + if( ( c->ic->flags & OPT_DOES_HTML ) && ( g_strncasecmp( msg, "<html>", 6 ) != 0 ) ) { buf = escape_html( msg ); msg = buf; diff --git a/protocols/nogaim.h b/protocols/nogaim.h index cc2dcea4..62d8db41 100644 --- a/protocols/nogaim.h +++ b/protocols/nogaim.h @@ -5,7 +5,8 @@ \********************************************************************/ /* - * nogaim + * nogaim, soon to be known as im_api. Not a separate product (unless + * someone would be interested in such a thing), just a new name. * * Gaim without gaim - for BitlBee * @@ -14,7 +15,7 @@ * * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> * (and possibly other members of the Gaim team) - * Copyright 2002-2004 Wilmer van der Gaast <wilmer@gaast.net> + * Copyright 2002-2007 Wilmer van der Gaast <wilmer@gaast.net> */ /* @@ -43,7 +44,6 @@ #include "md5.h" #include "sha.h" - #define BUF_LEN MSG_LEN #define BUF_LONG ( BUF_LEN * 2 ) #define MSG_LEN 2048 @@ -53,18 +53,19 @@ #define BUDDY_ALIAS_MAXLEN 388 /* because MSN names can be 387 characters */ #define WEBSITE "http://www.bitlbee.org/" -#define IM_FLAG_AWAY 0x0020 #define GAIM_AWAY_CUSTOM "Custom" -#define OPT_CONN_HTML 0x00000001 -#define OPT_LOGGED_IN 0x00010000 -#define OPT_LOGGING_OUT 0x00020000 +/* Sharing flags between buddies and connections. Or planning to, at least... */ +#define OPT_LOGGED_IN 0x00000001 +#define OPT_LOGGING_OUT 0x00000002 +#define OPT_AWAY 0x00000004 +#define OPT_DOES_HTML 0x00000010 /* ok. now the fun begins. first we create a connection structure */ struct im_connection { account_t *acc; - guint32 flags; + u_int32_t flags; /* each connection then can have its own protocol-specific data */ void *proto_data; @@ -163,9 +164,6 @@ struct prpl { struct groupchat * (* chat_join) (struct im_connection *, char *chat, char *nick, char *password); - /* DIE! */ - char *(* get_status_string) (struct im_connection *ic, int stat); - GList *(* away_states)(struct im_connection *ic); /* Mainly for AOL, since they think "Bung hole" == "Bu ngho le". *sigh* */ @@ -200,7 +198,6 @@ G_MODULE_EXPORT struct groupchat *serv_got_joined_chat( struct im_connection *ic G_MODULE_EXPORT void serv_got_chat_in( struct groupchat *c, char *who, int whisper, char *msg, time_t mtime ); G_MODULE_EXPORT void serv_got_chat_left( struct groupchat *c ); struct groupchat *chat_by_channel( char *channel ); -struct groupchat *chat_by_id( int id ); /* Buddy management */ G_MODULE_EXPORT void add_buddy( struct im_connection *ic, char *group, char *handle, char *realname ); @@ -208,7 +205,8 @@ G_MODULE_EXPORT struct buddy *find_buddy( struct im_connection *ic, char *handle G_MODULE_EXPORT void serv_buddy_rename( struct im_connection *ic, char *handle, char *realname ); /* Buddy activity */ -G_MODULE_EXPORT void serv_got_update( struct im_connection *ic, char *handle, int loggedin, int evil, time_t signon, time_t idle, int type, guint caps ); +G_MODULE_EXPORT void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message ); +/* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle ); G_MODULE_EXPORT void serv_got_im( struct im_connection *ic, char *handle, char *msg, guint32 flags, time_t mtime, gint len ); G_MODULE_EXPORT void serv_got_typing( struct im_connection *ic, char *handle, int timeout, int type ); diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index 99f839e4..d05868b0 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -364,7 +364,7 @@ static void oscar_login(account_t *acc) { Not touching this anymore now that it belongs to account_t! Let's hope nothing will break. ;-) */ } else { - ic->flags |= OPT_CONN_HTML; + ic->flags |= OPT_DOES_HTML; } sess = g_new0(aim_session_t, 1); @@ -967,45 +967,35 @@ static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { struct oscar_data *od = ic->proto_data; aim_userinfo_t *info; time_t time_idle = 0, signon = 0; - int type = 0; - int caps = 0; - char *tmp; + int flags = OPT_LOGGED_IN; + char *tmp, *state_string = NULL; va_list ap; va_start(ap, fr); info = va_arg(ap, aim_userinfo_t *); va_end(ap); - if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) - caps = info->capabilities; - if (info->flags & AIM_FLAG_ACTIVEBUDDY) - type |= UC_AB; - if ((!od->icq) && (info->present & AIM_USERINFO_PRESENT_FLAGS)) { - if (info->flags & AIM_FLAG_UNCONFIRMED) - type |= UC_UNCONFIRMED; - if (info->flags & AIM_FLAG_ADMINISTRATOR) - type |= UC_ADMIN; - if (info->flags & AIM_FLAG_AOL) - type |= UC_AOL; - if (info->flags & AIM_FLAG_FREE) - type |= UC_NORMAL; if (info->flags & AIM_FLAG_AWAY) - type |= UC_UNAVAILABLE; - if (info->flags & AIM_FLAG_WIRELESS) - type |= UC_WIRELESS; + flags |= OPT_AWAY; } + if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { - type = (info->icqinfo.status << 7); if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { - type |= UC_UNAVAILABLE; + flags |= OPT_AWAY; } + + if( info->icqinfo.status & AIM_ICQ_STATE_DND ) + state_string = "Do Not Disturb"; + else if( info->icqinfo.status & AIM_ICQ_STATE_OUT ) + state_string = "Not Available"; + else if( info->icqinfo.status & AIM_ICQ_STATE_BUSY ) + state_string = "Occupied"; + else if( info->icqinfo.status & AIM_ICQ_STATE_INVISIBLE ) + state_string = "Invisible"; } - if (caps & AIM_CAPS_ICQ) - caps ^= AIM_CAPS_ICQ; - if (info->present & AIM_USERINFO_PRESENT_IDLE) { time(&time_idle); time_idle -= info->idletime*60; @@ -1019,8 +1009,8 @@ static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { g_snprintf(ic->displayname, sizeof(ic->displayname), "%s", info->sn); g_free(tmp); - serv_got_update(ic, info->sn, 1, info->warnlevel/10, signon, - time_idle, type, caps); + imcb_buddy_status(ic, info->sn, flags, state_string, NULL); + /* imcb_buddy_times(ic, info->sn, signon, time_idle); */ return 1; } @@ -1034,7 +1024,7 @@ static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { info = va_arg(ap, aim_userinfo_t *); va_end(ap); - serv_got_update(ic, info->sn, 0, 0, 0, 0, 0, 0); + imcb_buddy_status(ic, info->sn, 0, NULL, NULL ); return 1; } @@ -1045,7 +1035,7 @@ static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_ int flags = 0; if (args->icbmflags & AIM_IMFLAGS_AWAY) - flags |= IM_FLAG_AWAY; + flags |= OPT_AWAY; if ((args->icbmflags & AIM_IMFLAGS_UNICODE) || (args->icbmflags & AIM_IMFLAGS_ISO_8859_1)) { char *src; @@ -1820,7 +1810,7 @@ static void oscar_keepalive(struct im_connection *ic) { static int oscar_send_im(struct im_connection *ic, char *name, char *message, int imflags) { struct oscar_data *odata = (struct oscar_data *)ic->proto_data; int ret = 0, len = strlen(message); - if (imflags & IM_FLAG_AWAY) { + if (imflags & OPT_AWAY) { ret = aim_send_im(odata->sess, name, AIM_IMFLAGS_AWAY, message); } else { struct aim_sendimext_args args; @@ -2444,34 +2434,6 @@ int gaim_parsemtn(aim_session_t *sess, aim_frame_t *fr, ...) return 1; } -static char *oscar_get_status_string( struct im_connection *ic, int number ) -{ - struct oscar_data *od = ic->proto_data; - - if( ! number & UC_UNAVAILABLE ) - { - return( NULL ); - } - else if( od->icq ) - { - number >>= 7; - if( number & AIM_ICQ_STATE_DND ) - return( "Do Not Disturb" ); - else if( number & AIM_ICQ_STATE_OUT ) - return( "Not Available" ); - else if( number & AIM_ICQ_STATE_BUSY ) - return( "Occupied" ); - else if( number & AIM_ICQ_STATE_INVISIBLE ) - return( "Invisible" ); - else - return( "Away" ); - } - else - { - return( "Away" ); - } -} - int oscar_send_typing(struct im_connection *ic, char * who, int typing) { struct oscar_data *od = ic->proto_data; @@ -2632,7 +2594,6 @@ void oscar_initmodule() ret->rem_permit = oscar_rem_permit; ret->rem_deny = oscar_rem_deny; ret->set_permit_deny = oscar_set_permit_deny; - ret->get_status_string = oscar_get_status_string; ret->send_typing = oscar_send_typing; ret->handle_cmp = aim_sncmp; diff --git a/protocols/yahoo/yahoo.c b/protocols/yahoo/yahoo.c index e380d0ae..dec42bdc 100644 --- a/protocols/yahoo/yahoo.c +++ b/protocols/yahoo/yahoo.c @@ -292,45 +292,6 @@ static void byahoo_remove_buddy( struct im_connection *ic, char *who, char *grou } } -static char *byahoo_get_status_string( struct im_connection *ic, int stat ) -{ - enum yahoo_status a = stat >> 1; - - switch (a) - { - case YAHOO_STATUS_BRB: - return "Be Right Back"; - case YAHOO_STATUS_BUSY: - return "Busy"; - case YAHOO_STATUS_NOTATHOME: - return "Not At Home"; - case YAHOO_STATUS_NOTATDESK: - return "Not At Desk"; - case YAHOO_STATUS_NOTINOFFICE: - return "Not In Office"; - case YAHOO_STATUS_ONPHONE: - return "On Phone"; - case YAHOO_STATUS_ONVACATION: - return "On Vacation"; - case YAHOO_STATUS_OUTTOLUNCH: - return "Out To Lunch"; - case YAHOO_STATUS_STEPPEDOUT: - return "Stepped Out"; - case YAHOO_STATUS_INVISIBLE: - return "Invisible"; - case YAHOO_STATUS_CUSTOM: - return "Away"; - case YAHOO_STATUS_IDLE: - return "Idle"; - case YAHOO_STATUS_OFFLINE: - return "Offline"; - case YAHOO_STATUS_NOTIFY: - return "Notify"; - default: - return "Away"; - } -} - static void byahoo_chat_send( struct groupchat *c, char *message, int flags ) { struct byahoo_data *yd = (struct byahoo_data *) c->ic->proto_data; @@ -392,7 +353,6 @@ void byahoo_initmodule( ) ret->set_away = byahoo_set_away; ret->add_buddy = byahoo_add_buddy; ret->remove_buddy = byahoo_remove_buddy; - ret->get_status_string = byahoo_get_status_string; ret->send_typing = byahoo_send_typing; ret->chat_send = byahoo_chat_send; @@ -585,10 +545,65 @@ void ext_yahoo_got_cookies( int id ) void ext_yahoo_status_changed( int id, char *who, int stat, char *msg, int away ) { struct im_connection *ic = byahoo_get_ic_by_id( id ); + char *state_string = NULL; + int flags = OPT_LOGGED_IN; + + if( away ) + flags |= OPT_AWAY; + + switch (stat) + { + case YAHOO_STATUS_BRB: + state_string = "Be Right Back"; + break; + case YAHOO_STATUS_BUSY: + state_string = "Busy"; + break; + case YAHOO_STATUS_NOTATHOME: + state_string = "Not At Home"; + break; + case YAHOO_STATUS_NOTATDESK: + state_string = "Not At Desk"; + break; + case YAHOO_STATUS_NOTINOFFICE: + state_string = "Not In Office"; + break; + case YAHOO_STATUS_ONPHONE: + state_string = "On Phone"; + break; + case YAHOO_STATUS_ONVACATION: + state_string = "On Vacation"; + break; + case YAHOO_STATUS_OUTTOLUNCH: + state_string = "Out To Lunch"; + break; + case YAHOO_STATUS_STEPPEDOUT: + state_string = "Stepped Out"; + break; + case YAHOO_STATUS_INVISIBLE: + state_string = "Invisible"; + break; + case YAHOO_STATUS_CUSTOM: + state_string = "Away"; + break; + case YAHOO_STATUS_IDLE: + state_string = "Idle"; + break; + case YAHOO_STATUS_OFFLINE: + state_string = "Offline"; + flags = 0; + break; + case YAHOO_STATUS_NOTIFY: + state_string = "Notify"; + break; + } + + imcb_buddy_status( ic, who, flags, state_string, msg ); - serv_got_update( ic, who, stat != YAHOO_STATUS_OFFLINE, 0, 0, - ( stat == YAHOO_STATUS_IDLE ) ? away : 0, - ( stat != YAHOO_STATUS_AVAILABLE ) | ( stat << 1 ), 0 ); + /* Not implemented yet... + if( stat == YAHOO_STATUS_IDLE ) + imcb_buddy_times( ic, who, 0, away ); + */ } void ext_yahoo_got_im( int id, char *who, char *msg, long tm, int stat, int utf8 ) |