--- a/libpurple/purpleaccountpresence.c Thu Dec 03 20:15:31 2020 -0600
+++ b/libpurple/purpleaccountpresence.c Thu Dec 03 22:28:40 2020 -0600
@@ -27,6 +27,7 @@
@@ -102,7 +103,16 @@
purple_account_presence_get_statuses(PurplePresence *presence) {
PurpleAccountPresence *account_presence = PURPLE_ACCOUNT_PRESENCE(presence);
- return purple_protocol_get_statuses(account_presence->account, presence);
+ /* We cache purple_protocol_get_statuses because it creates all new + * statuses which loses at least the active attribute, which breaks all + if(account_presence->statuses == NULL) { + account_presence->statuses = + purple_protocol_get_statuses(account_presence->account, presence); + return account_presence->statuses; /******************************************************************************
@@ -150,6 +160,7 @@
PurpleAccountPresence *presence = PURPLE_ACCOUNT_PRESENCE(obj);
g_clear_object(&presence->account);
+ g_list_free_full(presence->statuses, g_object_unref); G_OBJECT_CLASS(purple_account_presence_parent_class)->finalize(obj);
--- a/libpurple/purplebuddypresence.c Thu Dec 03 20:15:31 2020 -0600
+++ b/libpurple/purplebuddypresence.c Thu Dec 03 22:28:40 2020 -0600
@@ -29,6 +29,8 @@
@@ -197,13 +199,24 @@
purple_buddy_presence_get_statuses(PurplePresence *presence) {
- PurpleAccount *account = NULL;
PurpleBuddyPresence *buddy_presence = NULL;
buddy_presence = PURPLE_BUDDY_PRESENCE(presence);
- account = purple_buddy_get_account(buddy_presence->buddy);
+ /* We cache purple_protocol_get_statuses because it creates all new + * statuses which loses at least the active attribute, which breaks all + if(buddy_presence->statuses == NULL) { + PurpleAccount *account = NULL; - return purple_protocol_get_statuses(account, presence);
+ account = purple_buddy_get_account(buddy_presence->buddy); + buddy_presence->statuses = purple_protocol_get_statuses(account, + return buddy_presence->statuses; /******************************************************************************
@@ -250,6 +263,7 @@
PurpleBuddyPresence *presence = PURPLE_BUDDY_PRESENCE(obj);
g_clear_object(&presence->buddy);
+ g_list_free_full(presence->statuses, g_object_unref); G_OBJECT_CLASS(purple_buddy_presence_parent_class)->finalize(obj);