diff -r 085f4a5b74fe -r bdddb2c34d88 protocols/ircv3/purpleircv3messagehandlers.c --- a/protocols/ircv3/purpleircv3messagehandlers.c Fri Dec 06 15:14:18 2024 -0600 +++ b/protocols/ircv3/purpleircv3messagehandlers.c Fri Dec 06 15:15:46 2024 -0600 @@ -60,6 +60,82 @@ return member; } +static void +purple_ircv3_add_badges_to_member(PurpleConversationMember *member, + IbisClient *client, const char *nick) +{ + PurpleBadgeManager *manager = NULL; + PurpleBadges *badges = NULL; + char *prefixes = NULL; + char *iter = NULL; + + g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member)); + g_return_if_fail(IBIS_IS_CLIENT(client)); + + badges = purple_conversation_member_get_badges(member); + manager = purple_badge_manager_get_default(); + prefixes = ibis_client_get_source_prefix(client, nick); + iter = prefixes; + + while(iter != NULL) { + PurpleBadge *badge = NULL; + const char *id = NULL; + const char *mnemonic = NULL; + int priority = 0; + + switch(g_utf8_get_char(iter)) { + case '~': + id = "ircv3-badge-founder"; + priority = 500; + mnemonic = "~"; + break; + case '&': + id = "ircv3-badge-protected"; + priority = 400; + mnemonic = "&"; + break; + case '@': + id = "ircv3-badge-operator"; + priority = 300; + mnemonic = "@"; + break; + case '%': + id = "ircv3-badge-halfop"; + priority = 200; + mnemonic = "%%"; + break; + case '+': + id = "ircv3-badge-voice"; + priority = 100; + mnemonic = "+"; + break; + } + + if(id == NULL) { + break; + } + + badge = purple_badge_manager_find(manager, id); + if(!PURPLE_IS_BADGE(badge)) { + badge = purple_badge_new(id, priority, id, mnemonic); + purple_badge_manager_add(manager, badge); + + /* The manager holds a reference but we need to ditch our reference + * so we unref the instance and use the manager's reference. + */ + g_object_unref(badge); + } + + purple_badges_add_badge(badges, badge); + + g_clear_object(&badge); + + iter = g_utf8_next_char(iter); + } + + g_free(prefixes); +} + /****************************************************************************** * General Commands *****************************************************************************/ @@ -227,6 +303,7 @@ for(guint i = 0; i < g_strv_length(nicks); i++) { PurpleContact *contact = NULL; + PurpleConversationMember *member = NULL; const char *nick = nicks[i]; char *stripped = NULL; @@ -241,9 +318,12 @@ purple_contact_manager_add(manager, contact); } - purple_conversation_members_add_member(members, - PURPLE_CONTACT_INFO(contact), - FALSE, NULL); + member = purple_conversation_members_add_member(members, + PURPLE_CONTACT_INFO(contact), + FALSE, NULL); + + purple_ircv3_add_badges_to_member(member, client, nick); + g_free(stripped); } }