comparison src/protocols/irc/msgs.c @ 9554:8b2451878e26

[gaim-migrate @ 10387] " This patch adds chat user status icons (voice / halfop / op / founder) to chats There's a screenshot here, showing ops, voices and ignored ops and voices http://nosnilmot.com/gaim/chatusers.png This required some changes in how the core stores the list of users in chats to be able to store the status too, which are detailed below. I also fixed up some memory leaks as I came across them (string values returned by gtk_tree_model_get() not being g_free()'d) and a minor bug in signals-test.c Conversation API: Changed: gaim_conv_chat_add_user() (added flags parameter) gaim_conv_chat_add_users() now (added GList of flags parameter) gaim_conv_chat_get_users() now returns a GList of GaimChatBuddy's gaim_conv_chat_set_users() now expects a GList of GaimChatBuddy's Added: gaim_conv_chat_set_user_flags() gaim_conv_chat_get_user_flags() gaim_conv_chat_find_user() gaim_conv_chat_cb_new() gaim_conv_chat_cb_find() gaim_conv_chat_cb_destroy() gaim_conv_chat_cb_get_name() Conversation UI ops: added: chat_update_user() Signals: Changed: chat-buddy-joining & chat-buddy-joined now include the user's flags Added: chat-buddy-flags for when user's flags change Added: gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT (required for the new chat-buddy-flags signal) Protocol Plugins: All updated to work with above changes (obviously) User flags support added to IRC, Jabber and SILC New Files: pixmaps/status/default/ voice.svg halfop.svg op.svg founder.svg " --Stu Tomlinson committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Sat, 17 Jul 2004 18:11:12 +0000
parents 6c24a6f07256
children f1137cf462d8
comparison
equal deleted inserted replaced
9553:8a64666476e6 9554:8b2451878e26
54 return g_strdup(strchr(mask, '!') + 1); 54 return g_strdup(strchr(mask, '!') + 1);
55 } 55 }
56 56
57 static void irc_chat_remove_buddy(GaimConversation *convo, char *data[2]) 57 static void irc_chat_remove_buddy(GaimConversation *convo, char *data[2])
58 { 58 {
59 GList *users = gaim_conv_chat_get_users(GAIM_CONV_CHAT(convo));
60 char *message = g_strdup_printf("quit: %s", data[1]); 59 char *message = g_strdup_printf("quit: %s", data[1]);
61 60
62 if (g_list_find_custom(users, data[0], (GCompareFunc)(strcmp))) 61 if (gaim_conv_chat_find_user(GAIM_CONV_CHAT(convo), data[0]))
63 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), data[0], message); 62 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), data[0], message);
64 63
65 g_free(message); 64 g_free(message);
66 } 65 }
67 66
330 g_free(msg); 329 g_free(msg);
331 g_free(irc->nameconv); 330 g_free(irc->nameconv);
332 irc->nameconv = NULL; 331 irc->nameconv = NULL;
333 } else { 332 } else {
334 GList *users = NULL; 333 GList *users = NULL;
334 GList *flags = NULL;
335 335
336 while (*cur) { 336 while (*cur) {
337 GaimConvChatBuddyFlags f = GAIM_CBFLAGS_NONE;
337 end = strchr(cur, ' '); 338 end = strchr(cur, ' ');
338 if (!end) 339 if (!end)
339 end = cur + strlen(cur); 340 end = cur + strlen(cur);
340 if (*cur == '@' || *cur == '%' || *cur == '+') 341 if (*cur == '@') {
342 f = GAIM_CBFLAGS_OP;
341 cur++; 343 cur++;
344 } else if (*cur == '%') {
345 f = GAIM_CBFLAGS_HALFOP;
346 cur++;
347 } else if(*cur == '+') {
348 f = GAIM_CBFLAGS_VOICE;
349 cur++;
350 }
342 tmp = g_strndup(cur, end - cur); 351 tmp = g_strndup(cur, end - cur);
343 users = g_list_append(users, tmp); 352 users = g_list_append(users, tmp);
353 flags = g_list_append(flags, GINT_TO_POINTER(f));
344 cur = end; 354 cur = end;
345 if (*cur) 355 if (*cur)
346 cur++; 356 cur++;
347 } 357 }
348 358
349 if (users != NULL) { 359 if (users != NULL) {
350 GList *l; 360 GList *l;
351 361
352 gaim_conv_chat_add_users(GAIM_CONV_CHAT(convo), users); 362 gaim_conv_chat_add_users(GAIM_CONV_CHAT(convo), users, flags);
353 363
354 for (l = users; l != NULL; l = l->next) 364 for (l = users; l != NULL; l = l->next)
355 g_free(l->data); 365 g_free(l->data);
356 366
357 g_list_free(users); 367 g_list_free(users);
368 g_list_free(flags);
358 } 369 }
359 } 370 }
360 g_free(names); 371 g_free(names);
361 } else { 372 } else {
362 if (!irc->names) 373 if (!irc->names)
572 g_free(nick); 583 g_free(nick);
573 return; 584 return;
574 } 585 }
575 586
576 userhost = irc_mask_userhost(from); 587 userhost = irc_mask_userhost(from);
577 gaim_conv_chat_add_user(GAIM_CONV_CHAT(convo), nick, userhost); 588 gaim_conv_chat_add_user(GAIM_CONV_CHAT(convo), nick, userhost, GAIM_CBFLAGS_NONE);
578 589
579 if ((ib = g_hash_table_lookup(irc->buddies, nick)) != NULL) { 590 if ((ib = g_hash_table_lookup(irc->buddies, nick)) != NULL) {
580 ib->flag = TRUE; 591 ib->flag = TRUE;
581 irc_buddy_status(nick, ib, irc); 592 irc_buddy_status(nick, ib, irc);
582 } 593 }
630 return; 641 return;
631 } 642 }
632 buf = g_strdup_printf(_("mode (%s %s) by %s"), args[1], args[2] ? args[2] : "", nick); 643 buf = g_strdup_printf(_("mode (%s %s) by %s"), args[1], args[2] ? args[2] : "", nick);
633 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); 644 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));
634 g_free(buf); 645 g_free(buf);
646 if(args[2]) {
647 GaimConvChatBuddyFlags newflag, flags;
648 char *mcur, *cur, *end, *user;
649 gboolean add = FALSE;
650 mcur = args[1];
651 cur = args[2];
652 while (*cur && *mcur) {
653 if ((*mcur == '+') || (*mcur == '-')) {
654 add = (*mcur == '+') ? TRUE : FALSE;
655 mcur++;
656 continue;
657 }
658 end = strchr(cur, ' ');
659 if (!end)
660 end = cur + strlen(cur);
661 user = g_strndup(cur, end - cur);
662 flags = gaim_conv_chat_user_get_flags(GAIM_CONV_CHAT(convo), user);
663 newflag = GAIM_CBFLAGS_NONE;
664 if (*mcur == 'o')
665 newflag = GAIM_CBFLAGS_OP;
666 else if (*mcur =='h')
667 newflag = GAIM_CBFLAGS_HALFOP;
668 else if (*mcur == 'v')
669 newflag = GAIM_CBFLAGS_VOICE;
670 if (newflag) {
671 if (add)
672 flags |= newflag;
673 else
674 flags &= ~newflag;
675 gaim_conv_chat_user_set_flags(GAIM_CONV_CHAT(convo), user, flags);
676 }
677 g_free(user);
678 cur = end;
679 if (*cur)
680 cur++;
681 if (*mcur)
682 mcur++;
683 }
684 }
635 } else { /* User */ 685 } else { /* User */
636 } 686 }
637 g_free(nick); 687 g_free(nick);
638 } 688 }
639 689
653 gaim_connection_set_display_name(gc, args[0]); 703 gaim_connection_set_display_name(gc, args[0]);
654 } 704 }
655 705
656 while (chats) { 706 while (chats) {
657 GaimConvChat *chat = GAIM_CONV_CHAT(chats->data); 707 GaimConvChat *chat = GAIM_CONV_CHAT(chats->data);
658 GList *users = gaim_conv_chat_get_users(chat); 708 gaim_conv_chat_rename_user(chat, nick, args[0]);
659
660 while (users) {
661 char *user = users->data;
662
663 if (!strcmp(nick, user)) {
664 gaim_conv_chat_rename_user(chat, user, args[0]);
665 users = gaim_conv_chat_get_users(chat);
666 break;
667 }
668 users = users->next;
669 }
670 chats = chats->next; 709 chats = chats->next;
671 } 710 }
672 g_free(nick); 711 g_free(nick);
673 } 712 }
674 713