| 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); |