--- a/libpurple/purpleconversation.c Tue Aug 29 02:09:55 2023 -0500 +++ b/libpurple/purpleconversation.c Tue Aug 29 02:11:27 2023 -0500 @@ -53,6 +53,8 @@ PurpleContactInfo *creator; PurpleTags *tags; GListStore *members; + + GListStore *messages; } PurpleConversationPrivate; enum { @@ -73,6 +75,7 @@ PROP_CREATOR, PROP_TAGS, PROP_MEMBERS, + PROP_MESSAGES, N_PROPERTIES }; static GParamSpec *properties[N_PROPERTIES] = { NULL, }; @@ -383,6 +386,9 @@ case PROP_MEMBERS: g_value_set_object(value, purple_conversation_get_members(conv)); break; + case PROP_MESSAGES: + g_value_set_object(value, purple_conversation_get_messages(conv)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); break; @@ -397,6 +403,7 @@ priv->tags = purple_tags_new(); priv->members = g_list_store_new(PURPLE_TYPE_CONVERSATION_MEMBER); + priv->messages = g_list_store_new(PURPLE_TYPE_MESSAGE); } static void @@ -484,6 +491,7 @@ g_clear_object(&priv->creator); g_clear_object(&priv->tags); g_clear_object(&priv->members); + g_clear_object(&priv->messages); G_OBJECT_CLASS(purple_conversation_parent_class)->finalize(object); } @@ -704,6 +712,19 @@ G_TYPE_LIST_MODEL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + /** + * PurpleConversation:messages: + * + * A [iface.Gio.ListModel] of all the messages in this conversation. + * + * Since: 3.0.0 + */ + properties[PROP_MESSAGES] = g_param_spec_object( + "messages", "messages", + "All of the messages in this conversation's history.", + G_TYPE_LIST_MODEL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); /** @@ -975,6 +996,7 @@ { PurpleProtocol *protocol = NULL; PurpleConnection *gc = NULL; + PurpleConversationPrivate *priv = NULL; PurpleAccount *account; PurpleConversationUiOps *ops; PurpleBuddy *b; @@ -984,6 +1006,8 @@ g_return_if_fail(PURPLE_IS_CONVERSATION(conv)); g_return_if_fail(pmsg != NULL); + priv = purple_conversation_get_instance_private(conv); + ops = purple_conversation_get_ui_ops(conv); account = purple_conversation_get_account(conv); @@ -1022,7 +1046,7 @@ protocol = purple_account_get_protocol(account); if(PURPLE_IS_IM_CONVERSATION(conv) || - !(purple_protocol_get_options(protocol) & OPT_PROTO_UNIQUE_CHATNAME)) + !(protocol != NULL && purple_protocol_get_options(protocol) & OPT_PROTO_UNIQUE_CHATNAME)) { if(purple_message_get_flags(pmsg) & PURPLE_MESSAGE_SEND) { PurpleContactInfo *info = PURPLE_CONTACT_INFO(account); @@ -1060,6 +1084,8 @@ } } + g_list_store_append(priv->messages, pmsg); + if(ops) { if (PURPLE_IS_CHAT_CONVERSATION(conv) && ops->write_chat) { ops->write_chat(PURPLE_CHAT_CONVERSATION(conv), pmsg); @@ -1612,3 +1638,18 @@ return TRUE; } + +GListModel * +purple_conversation_get_messages(PurpleConversation *conversation) { + PurpleConversationPrivate *priv = NULL; + + g_return_val_if_fail(PURPLE_IS_CONVERSATION(conversation), NULL); + + priv = purple_conversation_get_instance_private(conversation); + + if(G_IS_LIST_MODEL(priv->messages)) { + return G_LIST_MODEL(priv->messages); + } + + return NULL; +}