Changes in protocols/nogaim.c [764b163d:ef5c185]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/nogaim.c
r764b163d ref5c185 99 99 } 100 100 101 102 101 struct prpl *find_protocol(const char *name) 103 102 { … … 289 288 { 290 289 irc_t *irc = ic->irc; 291 user_t *t, *u = irc->users;290 user_t *t, *u; 292 291 account_t *a; 293 292 … … 306 305 b_event_remove( ic->inpa ); 307 306 307 u = irc->users; 308 308 while( u ) 309 309 { … … 428 428 { 429 429 user_t *u = user_findhandle( ic, handle ); 430 char *s, newnick[MAX_NICK_LENGTH+1];431 430 432 431 if( !u || !realname ) return; … … 440 439 if( ( ic->flags & OPT_LOGGED_IN ) && set_getbool( &ic->irc->set, "display_namechanges" ) ) 441 440 imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname ); 442 443 if( !u->online && !nick_saved( ic->acc, handle ) ) 444 { 445 /* Detect numeric handles: */ 446 for( s = u->user; isdigit( *s ); s++ ); 441 } 442 } 443 444 void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group ) 445 { 446 user_t *u; 447 448 if( ( u = user_findhandle( ic, handle ) ) ) 449 user_del( ic->irc, u->nick ); 450 } 451 452 /* Mainly meant for ICQ (and now also for Jabber conferences) to allow IM 453 modules to suggest a nickname for a handle. */ 454 void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick ) 455 { 456 user_t *u = user_findhandle( ic, handle ); 457 char newnick[MAX_NICK_LENGTH+1], *orig_nick; 458 459 if( u && !u->online && !nick_saved( ic->acc, handle ) ) 460 { 461 /* Only do this if the person isn't online yet (which should 462 be the case if we just added it) and if the user hasn't 463 assigned a nickname to this buddy already. */ 464 465 strncpy( newnick, nick, MAX_NICK_LENGTH ); 466 newnick[MAX_NICK_LENGTH] = 0; 467 468 /* Some processing to make sure this string is a valid IRC nickname. */ 469 nick_strip( newnick ); 470 if( set_getbool( &ic->irc->set, "lcnicks" ) ) 471 nick_lc( newnick ); 472 473 if( strcmp( u->nick, newnick ) != 0 ) 474 { 475 /* Only do this if newnick is different from the current one. 476 If rejoining a channel, maybe we got this nick already 477 (and dedupe would only add an underscore. */ 478 nick_dedupe( ic->acc, handle, newnick ); 447 479 448 if( *s == 0 ) 449 { 450 /* If we reached the end of the string, it only contained numbers. 451 Seems to be an ICQ# then, so hopefully realname contains 452 something more useful. */ 453 strcpy( newnick, realname ); 454 455 /* Some processing to make sure this string is a valid IRC nickname. */ 456 nick_strip( newnick ); 457 if( set_getbool( &ic->irc->set, "lcnicks" ) ) 458 nick_lc( newnick ); 459 460 u->nick = g_strdup( newnick ); 461 } 462 } 463 } 464 } 465 480 /* u->nick will be freed halfway the process, so it can't be 481 passed as an argument. */ 482 orig_nick = g_strdup( u->nick ); 483 user_rename( ic->irc, orig_nick, newnick ); 484 g_free( orig_nick ); 485 } 486 } 487 } 466 488 467 489 /* prpl.c */ … … 554 576 u->online = 0; 555 577 556 /* Remove him/her from the conversations to prevent PART messages after he/she QUIT already */557 for( c = ic-> conversations; c; c = c->next )578 /* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */ 579 for( c = ic->groupchats; c; c = c->next ) 558 580 remove_chat_buddy_silent( c, handle ); 559 581 } … … 670 692 } 671 693 672 void imcb_chat_ removed( struct groupchat *c )694 void imcb_chat_free( struct groupchat *c ) 673 695 { 674 696 struct im_connection *ic = c->ic; 675 struct groupchat *l = NULL;697 struct groupchat *l; 676 698 GList *ir; 677 699 … … 693 715 } 694 716 717 /* Find the previous chat in the linked list. */ 718 for( l = ic->groupchats; l && l->next != c; l = l->next ); 719 695 720 if( l ) 696 721 l->next = c->next; 697 722 else 698 ic-> conversations = c->next;723 ic->groupchats = c->next; 699 724 700 725 for( ir = c->in_room; ir; ir = ir->next ) … … 735 760 } 736 761 762 void imcb_chat_topic( struct groupchat *c, char *who, char *topic, time_t set_at ) 763 { 764 struct im_connection *ic = c->ic; 765 user_t *u = NULL; 766 767 if( who == NULL) 768 u = user_find( ic->irc, ic->irc->mynick ); 769 else if( g_strcasecmp( who, ic->acc->user ) == 0 ) 770 u = user_find( ic->irc, ic->irc->nick ); 771 else 772 u = user_findhandle( ic, who ); 773 774 if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) || 775 ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) ) 776 strip_html( topic ); 777 778 g_free( c->topic ); 779 c->topic = g_strdup( topic ); 780 781 if( c->joined && u ) 782 irc_write( ic->irc, ":%s!%s@%s TOPIC %s :%s", u->nick, u->user, u->host, c->channel, topic ); 783 } 784 737 785 struct groupchat *imcb_chat_new( struct im_connection *ic, char *handle ) 738 786 { … … 741 789 /* This one just creates the conversation structure, user won't see anything yet */ 742 790 743 if( ic-> conversations )744 { 745 for( c = ic-> conversations; c->next; c = c->next );791 if( ic->groupchats ) 792 { 793 for( c = ic->groupchats; c->next; c = c->next ); 746 794 c = c->next = g_new0( struct groupchat, 1 ); 747 795 } 748 796 else 749 ic-> conversations = c = g_new0( struct groupchat, 1 );797 ic->groupchats = c = g_new0( struct groupchat, 1 ); 750 798 751 799 c->ic = ic; 752 800 c->title = g_strdup( handle ); 753 801 c->channel = g_strdup_printf( "&chat_%03d", ic->irc->c_id++ ); 802 c->topic = g_strdup_printf( "%s :BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", c->channel, c->title ); 754 803 755 804 if( set_getbool( &ic->irc->set, "debug" ) ) … … 796 845 } 797 846 847 /* This function is one BIG hack... :-( EREWRITE */ 798 848 void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason ) 799 849 { … … 807 857 if( g_strcasecmp( handle, b->ic->acc->user ) == 0 ) 808 858 { 859 if( b->joined == 0 ) 860 return; 861 809 862 u = user_find( b->ic->irc, b->ic->irc->nick ); 810 863 b->joined = 0; … … 816 869 } 817 870 818 if( remove_chat_buddy_silent( b, handle ) ) 819 if( ( b->joined || me ) && u ) 820 irc_part( b->ic->irc, u, b->channel ); 871 if( me || ( remove_chat_buddy_silent( b, handle ) && b->joined && u ) ) 872 irc_part( b->ic->irc, u, b->channel ); 821 873 } 822 874 … … 844 896 845 897 /* Misc. BitlBee stuff which shouldn't really be here */ 846 847 struct groupchat *chat_by_channel( char *channel )848 {849 struct im_connection *ic;850 struct groupchat *c;851 GSList *l;852 853 /* This finds the connection which has a conversation which belongs to this channel */854 for( l = connections; l; l = l->next )855 {856 ic = l->data;857 for( c = ic->conversations; c && g_strcasecmp( c->channel, channel ) != 0; c = c->next );858 if( c )859 return c;860 }861 862 return NULL;863 }864 898 865 899 char *set_eval_away_devoice( set_t *set, char *value ) … … 1095 1129 ic->acc->prpl->rem_deny( ic, handle ); 1096 1130 } 1131 1132 void imcb_clean_handle( struct im_connection *ic, char *handle ) 1133 { 1134 /* Accepts a handle and does whatever is necessary to make it 1135 BitlBee-friendly. Currently this means removing everything 1136 outside 33-127 (ASCII printable excl spaces), @ (only one 1137 is allowed) and ! and : */ 1138 char out[strlen(handle)+1]; 1139 int s, d; 1140 1141 s = d = 0; 1142 while( handle[s] ) 1143 { 1144 if( handle[s] > ' ' && handle[s] != '!' && handle[s] != ':' && 1145 ( handle[s] & 0x80 ) == 0 ) 1146 { 1147 if( handle[s] == '@' ) 1148 { 1149 /* See if we got an @ already? */ 1150 out[d] = 0; 1151 if( strchr( out, '@' ) ) 1152 continue; 1153 } 1154 1155 out[d++] = handle[s]; 1156 } 1157 s ++; 1158 } 1159 out[d] = handle[s]; 1160 1161 strcpy( handle, out ); 1162 }
Note: See TracChangeset
for help on using the changeset viewer.