protocols/ircv3/purpleircv3messagehandlers.c

changeset 43102
bdddb2c34d88
parent 43100
e6df74d36862
child 43149
7e425e201771
equal deleted inserted replaced
43101:085f4a5b74fe 43102:bdddb2c34d88
58 } 58 }
59 59
60 return member; 60 return member;
61 } 61 }
62 62
63 static void
64 purple_ircv3_add_badges_to_member(PurpleConversationMember *member,
65 IbisClient *client, const char *nick)
66 {
67 PurpleBadgeManager *manager = NULL;
68 PurpleBadges *badges = NULL;
69 char *prefixes = NULL;
70 char *iter = NULL;
71
72 g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member));
73 g_return_if_fail(IBIS_IS_CLIENT(client));
74
75 badges = purple_conversation_member_get_badges(member);
76 manager = purple_badge_manager_get_default();
77 prefixes = ibis_client_get_source_prefix(client, nick);
78 iter = prefixes;
79
80 while(iter != NULL) {
81 PurpleBadge *badge = NULL;
82 const char *id = NULL;
83 const char *mnemonic = NULL;
84 int priority = 0;
85
86 switch(g_utf8_get_char(iter)) {
87 case '~':
88 id = "ircv3-badge-founder";
89 priority = 500;
90 mnemonic = "~";
91 break;
92 case '&':
93 id = "ircv3-badge-protected";
94 priority = 400;
95 mnemonic = "&";
96 break;
97 case '@':
98 id = "ircv3-badge-operator";
99 priority = 300;
100 mnemonic = "@";
101 break;
102 case '%':
103 id = "ircv3-badge-halfop";
104 priority = 200;
105 mnemonic = "%%";
106 break;
107 case '+':
108 id = "ircv3-badge-voice";
109 priority = 100;
110 mnemonic = "+";
111 break;
112 }
113
114 if(id == NULL) {
115 break;
116 }
117
118 badge = purple_badge_manager_find(manager, id);
119 if(!PURPLE_IS_BADGE(badge)) {
120 badge = purple_badge_new(id, priority, id, mnemonic);
121 purple_badge_manager_add(manager, badge);
122
123 /* The manager holds a reference but we need to ditch our reference
124 * so we unref the instance and use the manager's reference.
125 */
126 g_object_unref(badge);
127 }
128
129 purple_badges_add_badge(badges, badge);
130
131 g_clear_object(&badge);
132
133 iter = g_utf8_next_char(iter);
134 }
135
136 g_free(prefixes);
137 }
138
63 /****************************************************************************** 139 /******************************************************************************
64 * General Commands 140 * General Commands
65 *****************************************************************************/ 141 *****************************************************************************/
66 gboolean 142 gboolean
67 purple_ircv3_message_handler_join(G_GNUC_UNUSED IbisClient *client, 143 purple_ircv3_message_handler_join(G_GNUC_UNUSED IbisClient *client,
225 301
226 members = purple_conversation_get_members(conversation); 302 members = purple_conversation_get_members(conversation);
227 303
228 for(guint i = 0; i < g_strv_length(nicks); i++) { 304 for(guint i = 0; i < g_strv_length(nicks); i++) {
229 PurpleContact *contact = NULL; 305 PurpleContact *contact = NULL;
306 PurpleConversationMember *member = NULL;
230 const char *nick = nicks[i]; 307 const char *nick = nicks[i];
231 char *stripped = NULL; 308 char *stripped = NULL;
232 309
233 stripped = ibis_client_strip_source_prefix(client, nick); 310 stripped = ibis_client_strip_source_prefix(client, nick);
234 311
239 purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact), 316 purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact),
240 stripped); 317 stripped);
241 purple_contact_manager_add(manager, contact); 318 purple_contact_manager_add(manager, contact);
242 } 319 }
243 320
244 purple_conversation_members_add_member(members, 321 member = purple_conversation_members_add_member(members,
245 PURPLE_CONTACT_INFO(contact), 322 PURPLE_CONTACT_INFO(contact),
246 FALSE, NULL); 323 FALSE, NULL);
324
325 purple_ircv3_add_badges_to_member(member, client, nick);
326
247 g_free(stripped); 327 g_free(stripped);
248 } 328 }
249 } 329 }
250 330
251 g_strfreev(nicks); 331 g_strfreev(nicks);

mercurial