Changeset fb020ac
- Timestamp:
- 2010-03-07T18:43:23Z (15 years ago)
- Branches:
- master
- Children:
- 279607e
- Parents:
- e08e53c (diff), c32f492 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
account.c
re08e53c rfb020ac 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-20 04Wilmer van der Gaast and others *4 * Copyright 2002-2010 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 69 69 prpl->init( a ); 70 70 71 return( a ); 71 s = set_add( &a->set, "away", NULL, set_eval_account, a ); 72 s->flags |= SET_NULL_OK; 73 74 if( a->flags & ACC_FLAG_STATUS_MESSAGE ) 75 { 76 s = set_add( &a->set, "status", NULL, set_eval_account, a ); 77 s->flags |= SET_NULL_OK; 78 } 79 80 return a; 72 81 } 73 82 … … 121 130 122 131 acc->auto_connect = bool2int( value ); 132 return value; 133 } 134 else if( strcmp( set->key, "away" ) == 0 || 135 strcmp( set->key, "status" ) == 0 ) 136 { 137 if( acc->ic && acc->ic->flags & OPT_LOGGED_IN ) 138 { 139 /* If we're currently on-line, set the var now already 140 (bit of a hack) and send an update. */ 141 g_free( set->value ); 142 set->value = g_strdup( value ); 143 144 imc_away_send_update( acc->ic ); 145 } 146 123 147 return value; 124 148 } … … 267 291 p->max = 86400; 268 292 269 /* Format: /[0-9]+([*+][0-9]+(<[0-9+]) )/ */293 /* Format: /[0-9]+([*+][0-9]+(<[0-9+])?)?/ */ 270 294 while( *value && isdigit( *value ) ) 271 295 p->start = p->start * 10 + *value++ - '0'; -
account.h
re08e53c rfb020ac 37 37 int auto_reconnect_delay; 38 38 int reconnect; 39 int flags; 39 40 40 41 set_t *set; … … 56 57 int account_reconnect_delay( account_t *a ); 57 58 58 #define ACC_SET_NOSAVE 0x01 59 #define ACC_SET_OFFLINE_ONLY 0x02 60 #define ACC_SET_ONLINE_ONLY 0x04 59 typedef enum 60 { 61 ACC_SET_NOSAVE = 0x01, /* Don't save this setting (i.e. stored elsewhere). */ 62 ACC_SET_OFFLINE_ONLY = 0x02, /* Allow changes only if the acct is offline. */ 63 ACC_SET_ONLINE_ONLY = 0x04, /* Allow changes only if the acct is online. */ 64 } account_set_flag_t; 65 66 typedef enum 67 { 68 ACC_FLAG_AWAY_MESSAGE = 0x01, /* Supports away messages instead of just states. */ 69 ACC_FLAG_STATUS_MESSAGE = 0x02, /* Supports status messages (without being away). */ 70 } account_flag_t; 61 71 62 72 #endif -
configure
re08e53c rfb020ac 270 270 detect_ldap() 271 271 { 272 TMPFILE= `mktemp`272 TMPFILE=$(mktemp) 273 273 if $CC -o $TMPFILE -shared -lldap 2>/dev/null >/dev/null; then 274 274 cat<<EOF>>Makefile.settings … … 283 283 ret=0 284 284 fi 285 } 286 287 RESOLV_TESTCODE=' 288 #include <arpa/nameser.h> 289 #include <resolv.h> 290 291 int main() 292 { 293 ns_initparse( NULL, 0, NULL ); 294 ns_parserr( NULL, ns_s_an, 0, NULL ); 295 } 296 ' 297 298 detect_resolv_dynamic() 299 { 300 echo "$RESOLV_TESTCODE" | $CC -o /dev/null -x c - -lresolv >/dev/null 2>/dev/null 301 if [ "$?" = "0" ]; then 302 echo 'EFLAGS+=-lresolv' >> Makefile.settings 303 return 0 304 fi 305 306 return 1 307 } 308 309 detect_resolv_static() 310 { 311 for i in $systemlibdirs; do 312 if [ -f $i/libresolv.a ]; then 313 echo "$RESOLV_TESTCODE" | $CC -o /dev/null -x c - -Wl,$i/libresolv.a >/dev/null 2>/dev/null 314 if [ "$?" = "0" ]; then 315 echo 'EFLAGS+='$i'/libresolv.a' >> Makefile.settings 316 return 0 317 fi 318 fi 319 done 320 321 return 1 285 322 } 286 323 … … 326 363 327 364 ## Yes, you, at the console! How can you authenticate if you don't have any SSL!? 328 if [ "$msn" = "1" ]; then365 if [ "$msn" = "1" -o "$yahoo" = "1" ]; then 329 366 echo 330 echo 'Real SSL support is necessary for MSN authentication, will build without' 331 echo 'MSN protocol support.' 367 echo 'WARNING: The MSN and Yahoo! modules will not work without SSL. Disabling.' 332 368 msn=0 369 yahoo=0 333 370 fi 334 371 … … 352 389 echo 'SSL_CLIENT=ssl_'$ssl'.o' >> Makefile.settings 353 390 354 for i in $systemlibdirs; do 355 if [ -f $i/libresolv.a ]; then 356 echo '#define HAVE_RESOLV_A' >> config.h 357 echo 'EFLAGS+='$i'/libresolv.a' >> Makefile.settings 358 break 359 fi 360 done 391 if detect_resolv_dynamic || detect_resolv_static; then 392 echo '#define HAVE_RESOLV_A' >> config.h 393 fi 361 394 362 395 STORAGES="text xml" -
doc/user-guide/commands.xml
re08e53c rfb020ac 436 436 </bitlbee-setting> 437 437 438 <bitlbee-setting name="away" type="string" scope="both"> 439 <description> 440 <para> 441 To mark yourself as away, it is recommended to just use <emphasis>/away</emphasis>, like on normal IRC networks. If you want to mark yourself as away on only one IM network, you can use this per-account setting. 442 </para> 443 444 <para> 445 You can set it to any value and BitlBee will try to map it to the most appropriate away state for every open IM connection, or set it as a free-form away message where possible. 446 </para> 447 448 <para> 449 Any per-account away setting will override globally set away states. To un-set the setting, use <emphasis>set -del away</emphasis>. 450 </para> 451 </description> 452 </bitlbee-setting> 453 438 454 <bitlbee-setting name="away_devoice" type="boolean" scope="global"> 439 455 <default>true</default> … … 747 763 </bitlbee-setting> 748 764 765 <bitlbee-setting name="status" type="string" scope="both"> 766 <description> 767 <para> 768 Certain protocols (like Jabber/XMPP) support status messages, similar to away messages. They can be used to indicate things like your location or activity, without showing up as away/busy. 769 </para> 770 771 <para> 772 This setting can be used to set such a message. It will be available as a per-account setting for protocols that support it, and also as a global setting (which will then automatically be used for all protocols that support it). 773 </para> 774 775 <para> 776 Away states set using <emphasis>/away</emphasis> or the <emphasis>away</emphasis> setting will override this setting. To un-set the setting, use <emphasis>set -del status</emphasis>. 777 </para> 778 </description> 779 </bitlbee-setting> 780 749 781 <bitlbee-setting name="strip_html" type="boolean" scope="global"> 750 782 <default>true</default> -
doc/user-guide/misc.xml
re08e53c rfb020ac 86 86 87 87 <para> 88 As you might've expected, you can just use the <emphasis>/away</emphasis> command in your IRC client to set an away-state. BitlBee supports most away-states supported by the protocols.88 To mark yourself as away, you can just use the <emphasis>/away</emphasis> command in your IRC client. BitlBee supports most away-states supported by the protocols. 89 89 </para> 90 90 91 91 <para> 92 Not all away states are supported by all protocols, and some protocols have different names for them. BitlBee will try to pick the best available alias from this listfor every connection:92 Away states have different names accross different protocols. BitlBee will try to pick the best available option for every connection: 93 93 </para> 94 94 95 95 <simplelist> 96 <member>Away from computer, Away, Extended away</member>97 <member>NA , N/A, Not available</member>98 <member>Busy, D o not disturb, DND, Occupied</member>99 <member>B e right back, BRB</member>100 <member> On the phone, Phone, On phone</member>101 <member> Out to lunch,Lunch, Food</member>96 <member>Away</member> 97 <member>NA</member> 98 <member>Busy, DND</member> 99 <member>BRB</member> 100 <member>Phone</member> 101 <member>Lunch, Food</member> 102 102 <member>Invisible, Hidden</member> 103 103 </simplelist> 104 104 105 105 <para> 106 So <emphasis>/away Food</emphasis> will set your state to "Out to lunch" on your MSN connection, and for most other connections the default, "Away" or "Away from computer"will be chosen.106 So <emphasis>/away Food</emphasis> will set your state to "Out to lunch" on your MSN connection, and for most other connections the default, "Away" will be chosen. 107 107 </para> 108 108 … … 111 111 </para> 112 112 113 <para> 114 If you want to set an away state for only one of your connections, you can use the per-account <emphasis>away</emphasis> setting. See <emphasis>help set away</emphasis>. 115 </para> 116 113 117 </sect1> 114 118 -
irc.c
re08e53c rfb020ac 78 78 } 79 79 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 80 99 irc_t *irc_new( int fd ) 81 100 { … … 143 162 irc_connection_list = g_slist_append( irc_connection_list, irc ); 144 163 164 s = set_add( &irc->set, "away", NULL, set_eval_away_status, irc ); 165 s->flags |= SET_NULL_OK; 145 166 s = set_add( &irc->set, "away_devoice", "true", set_eval_away_devoice, irc ); 146 167 s = set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc ); … … 163 184 s = set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc ); 164 185 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; 165 188 s = set_add( &irc->set, "strip_html", "true", NULL, irc ); 166 189 s = set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc ); -
irc_commands.c
re08e53c rfb020ac 448 448 user_t *u = user_find( irc, irc->nick ); 449 449 char *away = cmd[1]; 450 account_t *a;451 450 452 451 if( !u ) return; … … 475 474 } 476 475 477 for( a = irc->accounts; a; a = a->next ) 478 { 479 struct im_connection *ic = a->ic; 480 481 if( ic && ic->flags & OPT_LOGGED_IN ) 482 imc_set_away( ic, u->away ); 483 } 476 set_setstr( &irc->set, "away", u->away ); 484 477 } 485 478 -
protocols/jabber/jabber.c
re08e53c rfb020ac 80 80 s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc ); 81 81 s->flags |= ACC_SET_OFFLINE_ONLY; 82 83 acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE; 82 84 } 83 85 … … 364 366 while( bud ) 365 367 { 366 imcb_log( ic, "Buddy %s (%d) information:\nAway state: %s\nAway message: %s", 367 bud->full_jid, bud->priority, 368 bud->away_state ? bud->away_state->full_name : "(none)", 369 bud->away_message ? : "(none)" ); 368 imcb_log( ic, "Buddy %s (%d) information:", bud->full_jid, bud->priority ); 369 if( bud->away_state ) 370 imcb_log( ic, "Away state: %s", bud->away_state->full_name ); 371 imcb_log( ic, "Status message: %s", bud->away_message ? : "(none)" ); 372 370 373 bud = bud->next; 371 374 } … … 377 380 { 378 381 struct jabber_data *jd = ic->proto_data; 379 struct jabber_away_state *state; 380 381 /* Save all this info. We need it, for example, when changing the priority setting. */ 382 state = (void *) jabber_away_state_by_name( state_txt ); 383 jd->away_state = state ? state : (void *) jabber_away_state_list; /* Fall back to "Away" if necessary. */ 382 383 /* state_txt == NULL -> Not away. 384 Unknown state -> fall back to the first defined away state. */ 385 jd->away_state = state_txt ? jabber_away_state_by_name( state_txt ) 386 ? : jabber_away_state_list : NULL; 387 384 388 g_free( jd->away_message ); 385 389 jd->away_message = ( message && *message ) ? g_strdup( message ) : NULL; -
protocols/jabber/jabber.h
re08e53c rfb020ac 84 84 /* After changing one of these two (or the priority setting), call 85 85 presence_send_update() to inform the server about the changes. */ 86 struct jabber_away_state *away_state;86 const struct jabber_away_state *away_state; 87 87 char *away_message; 88 88 -
protocols/jabber/jabber_util.c
re08e53c rfb020ac 228 228 { 229 229 { "away", "Away" }, 230 { "chat", "Free for Chat" }, 230 { "chat", "Free for Chat" }, /* WTF actually uses this? */ 231 231 { "dnd", "Do not Disturb" }, 232 232 { "xa", "Extended Away" }, 233 { "", "Online" },234 233 { "", NULL } 235 234 }; … … 238 237 { 239 238 int i; 239 240 if( code == NULL ) 241 return NULL; 240 242 241 243 for( i = 0; jabber_away_state_list[i].full_name; i ++ ) … … 249 251 { 250 252 int i; 253 254 if( name == NULL ) 255 return NULL; 251 256 252 257 for( i = 0; jabber_away_state_list[i].full_name; i ++ ) -
protocols/jabber/presence.c
re08e53c rfb020ac 190 190 int is_away = 0; 191 191 192 if( send_presence->away_state && !( *send_presence->away_state->code == 0 ||193 strcmp( send_presence->away_state->code, "chat" ) == 0 ))192 if( send_presence->away_state && 193 strcmp( send_presence->away_state->code, "chat" ) != 0 ) 194 194 is_away = OPT_AWAY; 195 195 196 196 imcb_buddy_status( ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away, 197 ( is_away && send_presence->away_state ) ? 198 send_presence->away_state->full_name : NULL, 197 is_away ? send_presence->away_state->full_name : NULL, 199 198 send_presence->away_message ); 200 199 } … … 209 208 struct jabber_data *jd = ic->proto_data; 210 209 struct xt_node *node, *cap; 211 char *show = jd->away_state->code;212 char *status = jd->away_message;213 210 struct groupchat *c; 214 211 int st; … … 216 213 node = jabber_make_packet( "presence", NULL, NULL, NULL ); 217 214 xt_add_child( node, xt_new_node( "priority", set_getstr( &ic->acc->set, "priority" ), NULL ) ); 218 if( show && *show)219 xt_add_child( node, xt_new_node( "show", show, NULL ) );220 if( status)221 xt_add_child( node, xt_new_node( "status", status, NULL ) );215 if( jd->away_state ) 216 xt_add_child( node, xt_new_node( "show", jd->away_state->code, NULL ) ); 217 if( jd->away_message ) 218 xt_add_child( node, xt_new_node( "status", jd->away_message, NULL ) ); 222 219 223 220 /* This makes the packet slightly bigger, but clients interested in -
protocols/msn/msn.c
re08e53c rfb020ac 139 139 140 140 if( l == NULL ) 141 for( i = 0; msn_away_state_list[i].number > -1; i ++ ) 142 l = g_list_append( l, (void*) msn_away_state_list[i].name ); 141 for( i = 0; *msn_away_state_list[i].code; i ++ ) 142 if( *msn_away_state_list[i].name ) 143 l = g_list_append( l, (void*) msn_away_state_list[i].name ); 143 144 144 145 return l; … … 149 150 char buf[1024]; 150 151 struct msn_data *md = ic->proto_data; 151 const struct msn_away_state *st;152 153 if( strcmp( state, GAIM_AWAY_CUSTOM ) == 0 )154 st = msn_away_state_by_name( "Away" );152 153 if( state ) 154 md->away_state = msn_away_state_by_name( state ) ? : 155 msn_away_state_list + 1; 155 156 else 156 st = msn_away_state_by_name( state ); 157 158 if( !st ) st = msn_away_state_list; 159 md->away_state = st; 160 161 g_snprintf( buf, sizeof( buf ), "CHG %d %s\r\n", ++md->trId, st->code ); 157 md->away_state = msn_away_state_list; 158 159 g_snprintf( buf, sizeof( buf ), "CHG %d %s\r\n", ++md->trId, md->away_state->code ); 162 160 msn_write( ic, buf, strlen( buf ) ); 163 161 } -
protocols/msn/msn.h
re08e53c rfb020ac 97 97 struct msn_away_state 98 98 { 99 int number;100 99 char code[4]; 101 100 char name[16]; -
protocols/msn/msn_util.c
re08e53c rfb020ac 374 374 *list = NULL; 375 375 376 imcb_log( ic, ret->str );376 imcb_log( ic, "%s", ret->str ); 377 377 g_string_free( ret, TRUE ); 378 378 } -
protocols/msn/ns.c
re08e53c rfb020ac 420 420 { 421 421 /* FIXME: Warn/Bomb about unknown away state? */ 422 st = msn_away_state_list; 423 } 424 425 imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN | 426 ( st->number ? OPT_AWAY : 0 ), st->name, NULL ); 422 st = msn_away_state_list + 1; 423 } 424 425 imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN | 426 ( st != msn_away_state_list ? OPT_AWAY : 0 ), 427 st->name, NULL ); 427 428 } 428 429 else if( strcmp( cmd[0], "FLN" ) == 0 ) … … 449 450 { 450 451 /* FIXME: Warn/Bomb about unknown away state? */ 451 st = msn_away_state_list; 452 } 453 454 imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN | 455 ( st->number ? OPT_AWAY : 0 ), st->name, NULL ); 452 st = msn_away_state_list + 1; 453 } 454 455 imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN | 456 ( st != msn_away_state_list ? OPT_AWAY : 0 ), 457 st->name, NULL ); 456 458 } 457 459 else if( strcmp( cmd[0], "RNG" ) == 0 ) … … 663 665 } 664 666 665 if( arg1 )g_free( arg1 );666 if( mtype )g_free( mtype );667 g_free( arg1 ); 668 g_free( mtype ); 667 669 } 668 670 else if( g_strncasecmp( ct, "text/x-msmsgsprofile", 20 ) == 0 ) … … 672 674 else if( g_strncasecmp( ct, "text/x-msmsgsinitialemailnotification", 37 ) == 0 ) 673 675 { 674 char *inbox = msn_findheader( body, "Inbox-Unread:", blen ); 675 char *folders = msn_findheader( body, "Folders-Unread:", blen ); 676 677 if( inbox && folders && set_getbool( &ic->acc->set, "mail_notifications" ) ) 676 if( set_getbool( &ic->acc->set, "mail_notifications" ) ) 678 677 { 679 imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders ); 678 char *inbox = msn_findheader( body, "Inbox-Unread:", blen ); 679 char *folders = msn_findheader( body, "Folders-Unread:", blen ); 680 681 if( inbox && folders ) 682 imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders ); 683 684 g_free( inbox ); 685 g_free( folders ); 680 686 } 681 682 g_free( inbox );683 g_free( folders );684 687 } 685 688 else if( g_strncasecmp( ct, "text/x-msmsgsemailnotification", 30 ) == 0 ) 686 689 { 687 char *from = msn_findheader( body, "From-Addr:", blen ); 688 char *fromname = msn_findheader( body, "From:", blen ); 689 690 if( from && fromname && set_getbool( &ic->acc->set, "mail_notifications" ) ) 690 if( set_getbool( &ic->acc->set, "mail_notifications" ) ) 691 691 { 692 imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from ); 692 char *from = msn_findheader( body, "From-Addr:", blen ); 693 char *fromname = msn_findheader( body, "From:", blen ); 694 695 if( from && fromname ) 696 imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from ); 697 698 g_free( from ); 699 g_free( fromname ); 693 700 } 694 701 } -
protocols/msn/tables.c
re08e53c rfb020ac 29 29 const struct msn_away_state msn_away_state_list[] = 30 30 { 31 { 0, "NLN", "Available" },32 { 1, "BSY", "Busy" },33 { 3, "IDL", "Idle" },34 { 5, "BRB", "Be Right Back" },35 { 7, "AWY", "Away" },36 { 9,"PHN", "On the Phone" },37 { 11,"LUN", "Out to Lunch" },38 { 13,"HDN", "Hidden" },39 { -1,"", "" }31 { "NLN", "" }, 32 { "AWY", "Away" }, 33 { "BSY", "Busy" }, 34 { "IDL", "Idle" }, 35 { "BRB", "Be Right Back" }, 36 { "PHN", "On the Phone" }, 37 { "LUN", "Out to Lunch" }, 38 { "HDN", "Hidden" }, 39 { "", "" } 40 40 }; 41 42 const struct msn_away_state *msn_away_state_by_number( int number )43 {44 int i;45 46 for( i = 0; msn_away_state_list[i].number > -1; i ++ )47 if( msn_away_state_list[i].number == number )48 return( msn_away_state_list + i );49 50 return( NULL );51 }52 41 53 42 const struct msn_away_state *msn_away_state_by_code( char *code ) … … 55 44 int i; 56 45 57 for( i = 0; msn_away_state_list[i].number > -1; i ++ )46 for( i = 0; *msn_away_state_list[i].code; i ++ ) 58 47 if( g_strcasecmp( msn_away_state_list[i].code, code ) == 0 ) 59 48 return( msn_away_state_list + i ); 60 49 61 return ( NULL );50 return NULL; 62 51 } 63 52 … … 66 55 int i; 67 56 68 for( i = 0; msn_away_state_list[i].number > -1; i ++ )57 for( i = 0; *msn_away_state_list[i].code; i ++ ) 69 58 if( g_strcasecmp( msn_away_state_list[i].name, name ) == 0 ) 70 59 return( msn_away_state_list + i ); 71 60 72 return ( NULL );61 return NULL; 73 62 } 74 63 -
protocols/nogaim.c
re08e53c rfb020ac 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-20 06Wilmer van der Gaast and others *4 * Copyright 2002-2010 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 276 276 ic->flags |= OPT_LOGGED_IN; 277 277 278 /* Also necessary when we're not away, at least for some of the 279 protocols. */ 280 imc_set_away( ic, u->away ); 278 /* Necessary to send initial presence status, even if we're not away. */ 279 imc_away_send_update( ic ); 281 280 282 281 /* Apparently we're connected successfully, so reset the … … 1078 1077 } 1079 1078 1080 static char *imc_away_alias_find( GList *gcm, char *away ); 1081 1082 int imc_set_away( struct im_connection *ic, char *away ) 1083 { 1084 GList *m, *ms; 1085 char *s; 1086 1087 if( !away ) away = ""; 1088 ms = m = ic->acc->prpl->away_states( ic ); 1089 1090 while( m ) 1091 { 1092 if( *away ) 1093 { 1094 if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 ) 1095 break; 1096 } 1097 else 1098 { 1099 if( g_strcasecmp( m->data, "Available" ) == 0 ) 1100 break; 1101 if( g_strcasecmp( m->data, "Online" ) == 0 ) 1102 break; 1103 } 1104 m = m->next; 1105 } 1106 1107 if( m ) 1108 { 1109 ic->acc->prpl->set_away( ic, m->data, *away ? away : NULL ); 1110 } 1111 else 1112 { 1113 s = imc_away_alias_find( ms, away ); 1114 if( s ) 1115 { 1116 ic->acc->prpl->set_away( ic, s, away ); 1117 if( set_getbool( &ic->irc->set, "debug" ) ) 1118 imcb_log( ic, "Setting away state to %s", s ); 1119 } 1120 else 1121 ic->acc->prpl->set_away( ic, GAIM_AWAY_CUSTOM, away ); 1122 } 1123 1124 return( 1 ); 1079 static char *imc_away_state_find( GList *gcm, char *away, char **message ); 1080 1081 int imc_away_send_update( struct im_connection *ic ) 1082 { 1083 char *away, *msg; 1084 1085 away = set_getstr( &ic->acc->set, "away" ) ? 1086 : set_getstr( &ic->irc->set, "away" ); 1087 if( away && *away ) 1088 { 1089 GList *m = ic->acc->prpl->away_states( ic ); 1090 msg = ic->acc->flags & ACC_FLAG_AWAY_MESSAGE ? away : NULL; 1091 away = imc_away_state_find( m, away, &msg ) ? : m->data; 1092 } 1093 else if( ic->acc->flags & ACC_FLAG_STATUS_MESSAGE ) 1094 { 1095 away = NULL; 1096 msg = set_getstr( &ic->acc->set, "status" ) ? 1097 : set_getstr( &ic->irc->set, "status" ); 1098 } 1099 1100 ic->acc->prpl->set_away( ic, away, msg ); 1101 1102 return 1; 1125 1103 } 1126 1104 … … 1137 1115 }; 1138 1116 1139 static char *imc_away_ alias_find( GList *gcm, char *away)1117 static char *imc_away_state_find( GList *gcm, char *away, char **message ) 1140 1118 { 1141 1119 GList *m; 1142 1120 int i, j; 1143 1121 1122 for( m = gcm; m; m = m->next ) 1123 if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 ) 1124 { 1125 /* At least the Yahoo! module works better if message 1126 contains no data unless it adds something to what 1127 we have in state already. */ 1128 if( strlen( m->data ) == strlen( away ) ) 1129 *message = NULL; 1130 1131 return m->data; 1132 } 1133 1144 1134 for( i = 0; *imc_away_alias_list[i]; i ++ ) 1145 1135 { 1136 int keep_message; 1137 1146 1138 for( j = 0; imc_away_alias_list[i][j]; j ++ ) 1147 1139 if( g_strncasecmp( away, imc_away_alias_list[i][j], strlen( imc_away_alias_list[i][j] ) ) == 0 ) 1140 { 1141 keep_message = strlen( away ) != strlen( imc_away_alias_list[i][j] ); 1148 1142 break; 1143 } 1149 1144 1150 1145 if( !imc_away_alias_list[i][j] ) /* If we reach the end, this row */ … … 1154 1149 for( j = 0; imc_away_alias_list[i][j]; j ++ ) 1155 1150 { 1156 m = gcm; 1157 while( m ) 1158 { 1151 for( m = gcm; m; m = m->next ) 1159 1152 if( g_strcasecmp( imc_away_alias_list[i][j], m->data ) == 0 ) 1160 return( imc_away_alias_list[i][j] ); 1161 m = m->next; 1162 } 1163 } 1164 } 1165 1166 return( NULL ); 1153 { 1154 if( !keep_message ) 1155 *message = NULL; 1156 1157 return imc_away_alias_list[i][j]; 1158 } 1159 } 1160 1161 /* No need to look further, apparently this state doesn't 1162 have any good alias for this protocol. */ 1163 break; 1164 } 1165 1166 return NULL; 1167 1167 } 1168 1168 -
protocols/nogaim.h
re08e53c rfb020ac 49 49 50 50 #define WEBSITE "http://www.bitlbee.org/" 51 #define GAIM_AWAY_CUSTOM "Custom"52 51 53 52 /* Sharing flags between all kinds of things. I just hope I won't hit any … … 219 218 220 219 /* You can tell what away states your protocol supports, so that 221 * BitlBee will try to map the IRC away reasons to them , or use222 * GAIM_AWAY_CUSTOM when calling skype_set_away(). */220 * BitlBee will try to map the IRC away reasons to them. If your 221 * protocol doesn't have any, just return one generic "Away". */ 223 222 GList *(* away_states)(struct im_connection *ic); 224 223 … … 316 315 317 316 /* Actions, or whatever. */ 318 int imc_ set_away( struct im_connection *ic, char *away);317 int imc_away_send_update( struct im_connection *ic ); 319 318 int imc_buddy_msg( struct im_connection *ic, char *handle, char *msg, int flags ); 320 319 int imc_chat_msg( struct groupchat *c, char *msg, int flags ); -
protocols/oscar/oscar.c
re08e53c rfb020ac 380 380 s->flags |= ACC_SET_OFFLINE_ONLY; 381 381 } 382 383 acc->flags |= ACC_FLAG_AWAY_MESSAGE; 382 384 } 383 385 … … 1952 1954 static void oscar_set_away_aim(struct im_connection *ic, struct oscar_data *od, const char *state, const char *message) 1953 1955 { 1956 if (state == NULL) 1957 state = ""; 1954 1958 1955 1959 if (!g_strcasecmp(state, _("Visible"))) { … … 1959 1963 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE); 1960 1964 return; 1961 } /* else... */ 1965 } else if (message == NULL) { 1966 message = state; 1967 } 1962 1968 1963 1969 if (od->rights.maxawaymsglen == 0) … … 2002 2008 } 2003 2009 2004 if ( !g_strcasecmp(state, "Online")) {2010 if (state == NULL) { 2005 2011 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); 2006 2012 } else if (!g_strcasecmp(state, "Away")) { … … 2027 2033 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE); 2028 2034 ic->away = g_strdup(msg); 2029 } else if (!g_strcasecmp(state, GAIM_AWAY_CUSTOM)){2035 } else { 2030 2036 if (no_message) { 2031 2037 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); … … 2276 2282 { 2277 2283 struct oscar_data *od = ic->proto_data; 2278 GList *m = NULL; 2279 2280 if (!od->icq) 2281 return g_list_append(m, GAIM_AWAY_CUSTOM); 2282 2283 m = g_list_append(m, "Online"); 2284 m = g_list_append(m, "Away"); 2285 m = g_list_append(m, "Do Not Disturb"); 2286 m = g_list_append(m, "Not Available"); 2287 m = g_list_append(m, "Occupied"); 2288 m = g_list_append(m, "Free For Chat"); 2289 m = g_list_append(m, "Invisible"); 2290 2291 return m; 2284 2285 if (od->icq) { 2286 static GList *m = NULL; 2287 m = g_list_append(m, "Away"); 2288 m = g_list_append(m, "Do Not Disturb"); 2289 m = g_list_append(m, "Not Available"); 2290 m = g_list_append(m, "Occupied"); 2291 m = g_list_append(m, "Free For Chat"); 2292 m = g_list_append(m, "Invisible"); 2293 return m; 2294 } else { 2295 static GList *m = NULL; 2296 m = g_list_append(m, "Away"); 2297 return m; 2298 } 2292 2299 } 2293 2300 -
protocols/yahoo/libyahoo2.c
re08e53c rfb020ac 1530 1530 newbud = y_new0(struct yahoo_buddy, 1); 1531 1531 newbud->id = strdup(pair->value); 1532 if (cur_group)1532 if (cur_group) { 1533 1533 newbud->group = strdup(cur_group); 1534 else { 1535 struct yahoo_buddy *lastbud = (struct yahoo_buddy *)y_list_nth( 1536 yd->buddies, y_list_length(yd->buddies)-1)->data; 1537 newbud->group = strdup(lastbud->group); 1534 } else { 1535 YList *last; 1536 struct yahoo_buddy *lastbud; 1537 1538 for (last = yd->buddies; last && last->next; last = last->next); 1539 if (last) { 1540 lastbud = last->data; 1541 newbud->group = strdup(lastbud->group); 1542 } else { 1543 newbud->group = strdup("Buddies"); 1544 } 1538 1545 } 1539 1546 … … 2393 2400 { 2394 2401 struct yahoo_https_auth_data *had = req->data; 2395 struct yahoo_input_data *yid = had->yid;2396 struct yahoo_data *yd = yid->yd;2402 struct yahoo_input_data *yid; 2403 struct yahoo_data *yd; 2397 2404 int st; 2405 2406 if (y_list_find(inputs, had->yid) == NULL) 2407 return; 2408 2409 yid = had->yid; 2410 yd = yid->yd; 2398 2411 2399 2412 if (req->status_code != 200) { … … 2436 2449 { 2437 2450 struct yahoo_https_auth_data *had = req->data; 2438 struct yahoo_input_data *yid = had->yid;2439 struct yahoo_data *yd = yid->yd;2451 struct yahoo_input_data *yid; 2452 struct yahoo_data *yd; 2440 2453 struct yahoo_packet *pack; 2441 char *crumb ;2454 char *crumb = NULL; 2442 2455 int st; 2456 2457 if (y_list_find(inputs, had->yid) == NULL) 2458 return; 2459 2460 yid = had->yid; 2461 yd = yid->yd; 2443 2462 2444 2463 md5_byte_t result[16]; … … 4080 4099 4081 4100 yd = yid->yd; 4082 4083 4101 old_status = yd->current_status; 4084 4085 if (msg && strncmp(msg,"Invisible",9)) { 4086 yd->current_status = YAHOO_STATUS_CUSTOM; 4087 } else { 4088 yd->current_status = state; 4089 } 4102 yd->current_status = state; 4090 4103 4091 4104 /* Thank you libpurple :) */ … … 4102 4115 snprintf(s, sizeof(s), "%d", yd->current_status); 4103 4116 yahoo_packet_hash(pkt, 10, s); 4104 4105 if (yd->current_status == YAHOO_STATUS_CUSTOM) { 4106 yahoo_packet_hash(pkt, 19, msg); 4107 } else { 4108 yahoo_packet_hash(pkt, 19, ""); 4109 } 4110 4117 yahoo_packet_hash(pkt, 19, msg && state == YAHOO_STATUS_CUSTOM ? msg : ""); 4111 4118 yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0"); 4112 4113 4119 yahoo_send_packet(yid, pkt, 0); 4114 4120 yahoo_packet_free(pkt); -
protocols/yahoo/yahoo.c
re08e53c rfb020ac 130 130 { 131 131 set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc ); 132 133 acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE; 132 134 } 133 135 … … 197 199 { 198 200 struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; 199 char *away; 200 201 away = NULL; 202 203 if( state && msg && g_strcasecmp( state, msg ) != 0 ) 204 { 205 yd->current_status = YAHOO_STATUS_CUSTOM; 206 away = ""; 207 } 208 else if( state ) 209 { 210 /* Set msg to NULL since (if it isn't NULL already) it's equal 211 to state. msg must be empty if we want to use an existing 212 away state. */ 213 msg = NULL; 214 215 away = ""; 216 if( g_strcasecmp( state, "Available" ) == 0 ) 217 { 218 yd->current_status = YAHOO_STATUS_AVAILABLE; 219 away = NULL; 220 } 221 else if( g_strcasecmp( state, "Be Right Back" ) == 0 ) 201 202 if( state && msg == NULL ) 203 { 204 /* Use these states only if msg doesn't contain additional 205 info since away messages are only supported with CUSTOM. */ 206 if( g_strcasecmp( state, "Be Right Back" ) == 0 ) 222 207 yd->current_status = YAHOO_STATUS_BRB; 223 208 else if( g_strcasecmp( state, "Busy" ) == 0 ) … … 239 224 else if( g_strcasecmp( state, "Invisible" ) == 0 ) 240 225 yd->current_status = YAHOO_STATUS_INVISIBLE; 241 else if( g_strcasecmp( state, GAIM_AWAY_CUSTOM ) == 0 ) 242 { 243 yd->current_status = YAHOO_STATUS_AVAILABLE; 244 245 away = NULL; 246 } 247 } 226 else 227 yd->current_status = YAHOO_STATUS_CUSTOM; 228 } 229 else if( state ) 230 yd->current_status = YAHOO_STATUS_CUSTOM; 248 231 else 249 232 yd->current_status = YAHOO_STATUS_AVAILABLE; 250 233 251 yahoo_set_away( yd->y2_id, yd->current_status, msg, away != NULL? 2 : 0 );234 yahoo_set_away( yd->y2_id, yd->current_status, msg, state ? 2 : 0 ); 252 235 } 253 236 … … 258 241 if( m == NULL ) 259 242 { 260 m = g_list_append( m, "Available" );261 243 m = g_list_append( m, "Be Right Back" ); 262 244 m = g_list_append( m, "Busy" ); … … 269 251 m = g_list_append( m, "Stepped Out" ); 270 252 m = g_list_append( m, "Invisible" ); 271 m = g_list_append( m, GAIM_AWAY_CUSTOM );272 253 } 273 254
Note: See TracChangeset
for help on using the changeset viewer.