| 316 buddy = NULL; |
316 buddy = NULL; |
| 317 } |
317 } |
| 318 |
318 |
| 319 /* create new buddy */ |
319 /* create new buddy */ |
| 320 buddy = purple_buddy_new( session->acc, contact->username, contact->alias ); |
320 buddy = purple_buddy_new( session->acc, contact->username, contact->alias ); |
| 321 buddy->proto_data = contact; |
321 purple_buddy_set_protocol_data(buddy, contact); |
| 322 |
322 |
| 323 /* add new buddy to list */ |
323 /* add new buddy to list */ |
| 324 purple_blist_add_buddy( buddy, NULL, group, NULL ); |
324 purple_blist_add_buddy( buddy, NULL, group, NULL ); |
| 325 } |
325 } |
| 326 else { |
326 else { |
| 327 /* buddy was found in the group */ |
327 /* buddy was found in the group */ |
| 328 |
328 |
| |
329 gpointer data = NULL; |
| |
330 |
| 329 /* now update the buddy's alias */ |
331 /* now update the buddy's alias */ |
| 330 purple_blist_alias_buddy( buddy, contact->alias ); |
332 purple_blist_alias_buddy( buddy, contact->alias ); |
| 331 |
333 |
| 332 /* replace the buddy's contact struct */ |
334 /* replace the buddy's contact struct */ |
| 333 if ( buddy->proto_data ) |
335 if ( ( data = purple_buddy_get_protocol_data( buddy ) ) ) |
| 334 free( buddy->proto_data ); |
336 free( data ); |
| 335 buddy->proto_data = contact; |
337 purple_buddy_set_protocol_data( buddy, contact ); |
| 336 } |
338 } |
| 337 |
339 |
| 338 /* load buddy's avatar id */ |
340 /* load buddy's avatar id */ |
| 339 id = purple_buddy_icons_get_checksum_for_user( buddy ); |
341 id = purple_buddy_icons_get_checksum_for_user( buddy ); |
| 340 if ( id ) |
342 if ( id ) |
| 377 if ( !buddy ) { |
379 if ( !buddy ) { |
| 378 purple_debug_warning( MXIT_PLUGIN_ID, "mxit_update_buddy_presence: unable to find the buddy '%s'\n", username ); |
380 purple_debug_warning( MXIT_PLUGIN_ID, "mxit_update_buddy_presence: unable to find the buddy '%s'\n", username ); |
| 379 return; |
381 return; |
| 380 } |
382 } |
| 381 |
383 |
| 382 contact = buddy->proto_data; |
384 contact = purple_buddy_get_protocol_data( buddy ); |
| 383 if ( !contact ) |
385 if ( !contact ) |
| 384 return; |
386 return; |
| 385 |
387 |
| 386 contact->presence = presence; |
388 contact->presence = presence; |
| 387 contact->mood = mood; |
389 contact->mood = mood; |
| 437 list = purple_find_buddies( session->acc, NULL ); |
439 list = purple_find_buddies( session->acc, NULL ); |
| 438 |
440 |
| 439 for ( i = 0; i < g_slist_length( list ); i++ ) { |
441 for ( i = 0; i < g_slist_length( list ); i++ ) { |
| 440 buddy = g_slist_nth_data( list, i ); |
442 buddy = g_slist_nth_data( list, i ); |
| 441 |
443 |
| 442 if ( !buddy->proto_data ) { |
444 if ( !purple_buddy_get_protocol_data( buddy ) ) { |
| |
445 const gchar *alias = purple_buddy_get_alias( buddy ); |
| |
446 const gchar *name = purple_buddy_get_name( buddy ); |
| |
447 |
| 443 /* this buddy should be removed, because we did not receive him in our roster update from MXit */ |
448 /* this buddy should be removed, because we did not receive him in our roster update from MXit */ |
| 444 purple_debug_info( MXIT_PLUGIN_ID, "Removed 'old' buddy from the blist '%s' (%s)\n", buddy->alias, buddy->name ); |
449 purple_debug_info( MXIT_PLUGIN_ID, "Removed 'old' buddy from the blist '%s' (%s)\n", alias, name ); |
| 445 purple_blist_remove_buddy( buddy ); |
450 purple_blist_remove_buddy( buddy ); |
| 446 } |
451 } |
| 447 } |
452 } |
| 448 |
453 |
| 449 /* tell the UI to update the blist */ |
454 /* tell the UI to update the blist */ |
| 558 { |
563 { |
| 559 struct MXitSession* session = (struct MXitSession*) gc->proto_data; |
564 struct MXitSession* session = (struct MXitSession*) gc->proto_data; |
| 560 GSList* list = NULL; |
565 GSList* list = NULL; |
| 561 PurpleBuddy* mxbuddy = NULL; |
566 PurpleBuddy* mxbuddy = NULL; |
| 562 unsigned int i; |
567 unsigned int i; |
| 563 |
568 const gchar * buddy_name = purple_buddy_get_name( buddy ); |
| 564 purple_debug_info( MXIT_PLUGIN_ID, "mxit_add_buddy '%s' (group='%s')\n", buddy->name, group->name ); |
569 const gchar * buddy_alias = purple_buddy_get_alias( buddy ); |
| 565 |
570 const gchar * group_name = purple_group_get_name( group ); |
| 566 list = purple_find_buddies( session->acc, buddy->name ); |
571 |
| |
572 purple_debug_info( MXIT_PLUGIN_ID, "mxit_add_buddy '%s' (group='%s')\n", buddy_name, group_name ); |
| |
573 |
| |
574 list = purple_find_buddies( session->acc, buddy_name ); |
| 567 if ( g_slist_length( list ) == 1 ) { |
575 if ( g_slist_length( list ) == 1 ) { |
| 568 purple_debug_info( MXIT_PLUGIN_ID, "mxit_add_buddy (scenario 1) (list:%i)\n", g_slist_length( list ) ); |
576 purple_debug_info( MXIT_PLUGIN_ID, "mxit_add_buddy (scenario 1) (list:%i)\n", g_slist_length( list ) ); |
| 569 /* |
577 /* |
| 570 * we only send an invite to MXit when the user is not already inside our |
578 * we only send an invite to MXit when the user is not already inside our |
| 571 * blist. this is done because purple does an add_buddy() call when |
579 * blist. this is done because purple does an add_buddy() call when |
| 572 * you accept an invite. so in that case the user is already |
580 * you accept an invite. so in that case the user is already |
| 573 * in our blist and ready to be chatted to. |
581 * in our blist and ready to be chatted to. |
| 574 */ |
582 */ |
| 575 mxit_send_invite( session, buddy->name, buddy->alias, group->name ); |
583 mxit_send_invite( session, buddy_name, buddy_alias, group_name ); |
| 576 } |
584 } |
| 577 else { |
585 else { |
| 578 purple_debug_info( MXIT_PLUGIN_ID, "mxit_add_buddy (scenario 2) (list:%i)\n", g_slist_length( list ) ); |
586 purple_debug_info( MXIT_PLUGIN_ID, "mxit_add_buddy (scenario 2) (list:%i)\n", g_slist_length( list ) ); |
| 579 /* |
587 /* |
| 580 * we already have the buddy in our list, so we will only update |
588 * we already have the buddy in our list, so we will only update |
| 583 |
591 |
| 584 /* find the correct buddy */ |
592 /* find the correct buddy */ |
| 585 for ( i = 0; i < g_slist_length( list ); i++ ) { |
593 for ( i = 0; i < g_slist_length( list ); i++ ) { |
| 586 mxbuddy = g_slist_nth_data( list, i ); |
594 mxbuddy = g_slist_nth_data( list, i ); |
| 587 |
595 |
| 588 if ( mxbuddy->proto_data != NULL ) { |
596 if ( purple_buddy_get_protocol_data( mxbuddy ) != NULL ) { |
| 589 /* this is our REAL MXit buddy! */ |
597 /* this is our REAL MXit buddy! */ |
| 590 |
598 |
| 591 /* now update the buddy's alias */ |
599 /* now update the buddy's alias */ |
| 592 purple_blist_alias_buddy( mxbuddy, buddy->alias ); |
600 purple_blist_alias_buddy( mxbuddy, buddy_alias ); |
| 593 |
601 |
| 594 /* now update the buddy's group */ |
602 /* now update the buddy's group */ |
| 595 // mxbuddy = mxit_update_buddy_group( session, mxbuddy, group ); |
603 // mxbuddy = mxit_update_buddy_group( session, mxbuddy, group ); |
| 596 |
604 |
| 597 /* send the update to the MXit server */ |
605 /* send the update to the MXit server */ |
| 598 mxit_send_update_contact( session, mxbuddy->name, mxbuddy->alias, group->name ); |
606 mxit_send_update_contact( session, purple_buddy_get_name( mxbuddy ), purple_buddy_get_alias( mxbuddy ), group_name ); |
| 599 } |
607 } |
| 600 } |
608 } |
| 601 } |
609 } |
| 602 |
610 |
| 603 /* |
611 /* |
| 621 * @param group The group the buddy was in |
629 * @param group The group the buddy was in |
| 622 */ |
630 */ |
| 623 void mxit_remove_buddy( PurpleConnection* gc, PurpleBuddy* buddy, PurpleGroup* group ) |
631 void mxit_remove_buddy( PurpleConnection* gc, PurpleBuddy* buddy, PurpleGroup* group ) |
| 624 { |
632 { |
| 625 struct MXitSession* session = (struct MXitSession*) gc->proto_data; |
633 struct MXitSession* session = (struct MXitSession*) gc->proto_data; |
| 626 |
634 const gchar * buddy_name = purple_buddy_get_name( buddy ); |
| 627 purple_debug_info( MXIT_PLUGIN_ID, "mxit_remove_buddy '%s'\n", buddy->name ); |
635 |
| 628 |
636 purple_debug_info( MXIT_PLUGIN_ID, "mxit_remove_buddy '%s'\n", buddy_name ); |
| 629 mxit_send_remove( session, buddy->name ); |
637 |
| |
638 mxit_send_remove( session, buddy_name ); |
| 630 } |
639 } |
| 631 |
640 |
| 632 |
641 |
| 633 /*------------------------------------------------------------------------ |
642 /*------------------------------------------------------------------------ |
| 634 * The user changed the buddy's alias. |
643 * The user changed the buddy's alias. |
| 657 if ( !group ) { |
666 if ( !group ) { |
| 658 purple_debug_warning( MXIT_PLUGIN_ID, "mxit_buddy_alias: unable to find the group for buddy '%s'\n", who ); |
667 purple_debug_warning( MXIT_PLUGIN_ID, "mxit_buddy_alias: unable to find the group for buddy '%s'\n", who ); |
| 659 return; |
668 return; |
| 660 } |
669 } |
| 661 |
670 |
| 662 mxit_send_update_contact( session, who, alias, group->name ); |
671 mxit_send_update_contact( session, who, alias, purple_group_get_name( group ) ); |
| 663 } |
672 } |
| 664 |
673 |
| 665 |
674 |
| 666 /*------------------------------------------------------------------------ |
675 /*------------------------------------------------------------------------ |
| 667 * The user changed the group for a single buddy. |
676 * The user changed the group for a single buddy. |
| 683 if ( !buddy ) { |
692 if ( !buddy ) { |
| 684 purple_debug_warning( MXIT_PLUGIN_ID, "mxit_buddy_group: unable to find the buddy '%s'\n", who ); |
693 purple_debug_warning( MXIT_PLUGIN_ID, "mxit_buddy_group: unable to find the buddy '%s'\n", who ); |
| 685 return; |
694 return; |
| 686 } |
695 } |
| 687 |
696 |
| 688 mxit_send_update_contact( session, who, buddy->alias, new_group ); |
697 mxit_send_update_contact( session, who, purple_buddy_get_alias( buddy ), new_group ); |
| 689 } |
698 } |
| 690 |
699 |
| 691 |
700 |
| 692 /*------------------------------------------------------------------------ |
701 /*------------------------------------------------------------------------ |
| 693 * The user has selected to rename a group, so update all contacts in that |
702 * The user has selected to rename a group, so update all contacts in that |
| 702 { |
711 { |
| 703 struct MXitSession* session = (struct MXitSession*) gc->proto_data; |
712 struct MXitSession* session = (struct MXitSession*) gc->proto_data; |
| 704 PurpleBuddy* buddy = NULL; |
713 PurpleBuddy* buddy = NULL; |
| 705 GList* item = NULL; |
714 GList* item = NULL; |
| 706 |
715 |
| 707 purple_debug_info( MXIT_PLUGIN_ID, "mxit_rename_group from '%s' to '%s\n", old_name, group->name ); |
716 purple_debug_info( MXIT_PLUGIN_ID, "mxit_rename_group from '%s' to '%s\n", old_name, purple_group_get_name( group ) ); |
| 708 |
717 |
| 709 // TODO: Might be more efficient to use the "rename group" command (cmd=29). |
718 // TODO: Might be more efficient to use the "rename group" command (cmd=29). |
| 710 |
719 |
| 711 /* loop through all the contacts in the group and send updates */ |
720 /* loop through all the contacts in the group and send updates */ |
| 712 item = moved_buddies; |
721 item = moved_buddies; |
| 713 while ( item ) { |
722 while ( item ) { |
| 714 buddy = item->data; |
723 buddy = item->data; |
| 715 mxit_send_update_contact( session, buddy->name, buddy->alias, group->name ); |
724 mxit_send_update_contact( session, purple_buddy_get_name( buddy ), purple_buddy_get_alias( buddy ), purple_group_get_name( group ) ); |
| 716 item = g_list_next( item ); |
725 item = g_list_next( item ); |
| 717 } |
726 } |
| 718 } |
727 } |
| 719 |
728 |