Mercurial > pidgin
comparison src/protocols/irc/irc.c @ 4621:69f028a6f357
[gaim-migrate @ 4912]
Added half-op support, used on some IRC networks. Also fixed the bug
where trying to IM a person in a chat with a @, %, or + prefix was keeping
that prefix for the username in the IM window.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Thu, 27 Feb 2003 09:42:18 +0000 |
parents | 5fcb44d771d2 |
children | d19872836812 |
comparison
equal
deleted
inserted
replaced
4620:fb520992d5a1 | 4621:69f028a6f357 |
---|---|
757 irc_user_mode(struct gaim_connection *gc, char *room, char sign, char mode, char *nick) | 757 irc_user_mode(struct gaim_connection *gc, char *room, char sign, char mode, char *nick) |
758 { | 758 { |
759 struct gaim_conversation *c = irc_find_chat(gc, room); | 759 struct gaim_conversation *c = irc_find_chat(gc, room); |
760 GList *r; | 760 GList *r; |
761 | 761 |
762 if (mode != 'o' && mode != 'v') | 762 if (mode != 'o' && mode != 'v' && mode != 'h') |
763 return; | 763 return; |
764 | 764 |
765 if (!c) | 765 if (!c) |
766 return; | 766 return; |
767 | 767 |
768 r = gaim_chat_get_users(GAIM_CHAT(c)); | 768 r = gaim_chat_get_users(GAIM_CHAT(c)); |
769 while (r) { | 769 while (r) { |
770 gboolean op = FALSE, voice = FALSE; | 770 gboolean op = FALSE, halfop = FALSE, voice = FALSE; |
771 char *who = r->data; | 771 char *who = r->data; |
772 | |
772 if (*who == '@') { | 773 if (*who == '@') { |
773 op = TRUE; | 774 op = TRUE; |
774 who++; | 775 who++; |
775 } | 776 } |
777 | |
778 if (*who == '%') { | |
779 halfop = TRUE; | |
780 who++; | |
781 } | |
782 | |
776 if (*who == '+') { | 783 if (*who == '+') { |
777 voice = TRUE; | 784 voice = TRUE; |
778 who++; | 785 who++; |
779 } | 786 } |
787 | |
780 if (!strcmp(who, nick)) { | 788 if (!strcmp(who, nick)) { |
781 char *tmp, buf[IRC_BUF_LEN]; | 789 char *tmp, buf[IRC_BUF_LEN]; |
790 | |
782 if (mode == 'o') { | 791 if (mode == 'o') { |
783 if (sign == '-') | 792 if (sign == '-') |
784 op = FALSE; | 793 op = FALSE; |
785 else | 794 else |
786 op = TRUE; | 795 op = TRUE; |
787 } | 796 } |
797 | |
798 if (mode == 'h') { | |
799 if (sign == '-') | |
800 halfop = FALSE; | |
801 else | |
802 halfop = TRUE; | |
803 } | |
804 | |
788 if (mode == 'v') { | 805 if (mode == 'v') { |
789 if (sign == '-') | 806 if (sign == '-') |
790 voice = FALSE; | 807 voice = FALSE; |
791 else | 808 else |
792 voice = TRUE; | 809 voice = TRUE; |
793 } | 810 } |
811 | |
794 tmp = g_strdup(r->data); | 812 tmp = g_strdup(r->data); |
795 g_snprintf(buf, sizeof(buf), "%s%s%s", op ? "@" : "", | 813 g_snprintf(buf, sizeof(buf), "%s%s%s", |
796 voice ? "+" : "", nick); | 814 (op ? "@" : (halfop ? "%" : "")), |
815 voice ? "+" : "", nick); | |
797 gaim_chat_rename_user(GAIM_CHAT(c), tmp, buf); | 816 gaim_chat_rename_user(GAIM_CHAT(c), tmp, buf); |
798 g_free(tmp); | 817 g_free(tmp); |
799 return; | 818 return; |
800 } | 819 } |
801 r = r->next; | 820 r = r->next; |
1112 | 1131 |
1113 while (r) { | 1132 while (r) { |
1114 char *who = r->data; | 1133 char *who = r->data; |
1115 if (*who == '@') | 1134 if (*who == '@') |
1116 who++; | 1135 who++; |
1136 if (*who == '%') | |
1137 who++; | |
1117 if (*who == '+') | 1138 if (*who == '+') |
1118 who++; | 1139 who++; |
1119 if (!g_strcasecmp(who, nick)) { | 1140 if (!g_strcasecmp(who, nick)) { |
1120 char *tmp = g_strdup(r->data); | 1141 char *tmp = g_strdup(r->data); |
1121 gaim_chat_remove_user(chat, tmp, reason); | 1142 gaim_chat_remove_user(chat, tmp, reason); |
1151 | 1172 |
1152 while (r) { | 1173 while (r) { |
1153 char *who = r->data; | 1174 char *who = r->data; |
1154 int n = 0; | 1175 int n = 0; |
1155 if (*who == '@') | 1176 if (*who == '@') |
1177 buf[n++] = *who++; | |
1178 if (*who == '%') | |
1156 buf[n++] = *who++; | 1179 buf[n++] = *who++; |
1157 if (*who == '+') | 1180 if (*who == '+') |
1158 buf[n++] = *who++; | 1181 buf[n++] = *who++; |
1159 g_snprintf(buf + n, sizeof(buf) - n, "%s", new); | 1182 g_snprintf(buf + n, sizeof(buf) - n, "%s", new); |
1160 if (!strcmp(who, old)) { | 1183 if (!strcmp(who, old)) { |
1630 r = gaim_chat_get_users(GAIM_CHAT(c)); | 1653 r = gaim_chat_get_users(GAIM_CHAT(c)); |
1631 | 1654 |
1632 while (r) { | 1655 while (r) { |
1633 char *who = r->data; | 1656 char *who = r->data; |
1634 if (*who == '@') | 1657 if (*who == '@') |
1658 who++; | |
1659 if (*who == '%') | |
1635 who++; | 1660 who++; |
1636 if (*who == '+') | 1661 if (*who == '+') |
1637 who++; | 1662 who++; |
1638 if (!g_strcasecmp(who, nick)) { | 1663 if (!g_strcasecmp(who, nick)) { |
1639 char *tmp = g_strdup(r->data); | 1664 char *tmp = g_strdup(r->data); |
2289 } | 2314 } |
2290 | 2315 |
2291 static int | 2316 static int |
2292 irc_send_im(struct gaim_connection *gc, char *who, char *what, int len, int flags) | 2317 irc_send_im(struct gaim_connection *gc, char *who, char *what, int len, int flags) |
2293 { | 2318 { |
2294 if (*who == '@' || *who == '+') | 2319 if (*who == '@' || *who == '%' || *who == '+') |
2295 return send_msg(gc, who + 1, what); | 2320 return send_msg(gc, who + 1, what); |
2296 return send_msg(gc, who, what); | 2321 return send_msg(gc, who, what); |
2297 } | 2322 } |
2298 | 2323 |
2299 /* IRC doesn't have a buddy list, but we can still figure out who's online with ISON */ | 2324 /* IRC doesn't have a buddy list, but we can still figure out who's online with ISON */ |
2707 { | 2732 { |
2708 struct irc_data *idata = gc->proto_data; | 2733 struct irc_data *idata = gc->proto_data; |
2709 char buf[IRC_BUF_LEN]; | 2734 char buf[IRC_BUF_LEN]; |
2710 | 2735 |
2711 if (*who == '@') | 2736 if (*who == '@') |
2737 who++; | |
2738 if (*who == '%') | |
2712 who++; | 2739 who++; |
2713 if (*who == '+') | 2740 if (*who == '+') |
2714 who++; | 2741 who++; |
2715 | 2742 |
2716 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who); | 2743 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who); |