Add MatrixPresenceEvent type
It is an abstraction layer for presence events.
This commit is contained in:
		| @@ -177,6 +177,23 @@ matrix_state_event_get_content | ||||
| matrix_state_event_get_json_node | ||||
| matrix_state_event_get_json_data | ||||
|  | ||||
| <SUBSECTION> | ||||
| MatrixPresenceEvent | ||||
| matrix_presence_event_new | ||||
| matrix_presence_event_new_from_json | ||||
| matrix_presence_event_ref | ||||
| matrix_presence_event_unref | ||||
| matrix_presence_event_set_user_id | ||||
| matrix_presence_event_get_user_id | ||||
| matrix_presence_event_set_display_name | ||||
| matrix_presence_event_get_display_name | ||||
| matrix_presence_event_set_avatar_url | ||||
| matrix_presence_event_get_avatar_url | ||||
| matrix_presence_event_set_presence | ||||
| matrix_presence_event_get_presence | ||||
| matrix_presence_event_set_last_active_ago | ||||
| matrix_presence_event_get_last_active_ago | ||||
|  | ||||
| <SUBSECTION Standard> | ||||
| MATRIX_TYPE_EVENT_FORMAT | ||||
| matrix_event_format_get_type | ||||
| @@ -210,6 +227,8 @@ MATRIX_TYPE_PUSHER | ||||
| matrix_pusher_get_type | ||||
| MATRIX_TYPE_STATE_EVENT | ||||
| matrix_state_event_get_type | ||||
| MATRIX_TYPE_PRESENCE_EVENT | ||||
| matrix_presence_event_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
|   | ||||
| @@ -2584,3 +2584,286 @@ matrix_state_event_get_json_data(MatrixStateEvent *event, gsize *datalen) | ||||
|  | ||||
|     return data; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * MatrixPresenceEvent: | ||||
|  * | ||||
|  * An opaque structure to hold a presence event. | ||||
|  */ | ||||
| struct _MatrixPresenceEvent { | ||||
|     gchar *user_id; | ||||
|     gchar *display_name; | ||||
|     gchar *avatar_url; | ||||
|     gulong last_active_ago; | ||||
|     MatrixPresence presence; | ||||
|     guint refcount; | ||||
| }; | ||||
|  | ||||
| G_DEFINE_BOXED_TYPE(MatrixPresenceEvent, matrix_presence_event, | ||||
|                     (GBoxedCopyFunc)matrix_presence_event_ref, | ||||
|                     (GBoxedFreeFunc)matrix_presence_event_unref); | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_new: | ||||
|  * | ||||
|  * Create a new #MatrixPresenceEvent object with reference count of 1. | ||||
|  * | ||||
|  * Returns: (transfer full): a new #MatrixPresenceEvent | ||||
|  */ | ||||
| MatrixPresenceEvent * | ||||
| matrix_presence_event_new(void) | ||||
| { | ||||
|     MatrixPresenceEvent *event; | ||||
|  | ||||
|     event = g_new0(MatrixPresenceEvent, 1); | ||||
|     event->refcount = 1; | ||||
|  | ||||
|     return event; | ||||
| } | ||||
|  | ||||
| #define try_get_string_member(evt, nd, obj, m_n, s_m)           \ | ||||
|     if ((nd = json_object_get_member(obj, (m_n))) != NULL) {    \ | ||||
|         g_free(evt->s_m);                                       \ | ||||
|         evt->s_m = g_strdup(json_node_get_string (nd));         \ | ||||
|         json_object_remove_member(obj, m_n);                    \ | ||||
|     } | ||||
|  | ||||
| #define try_get_member(evt, nd, obj, m_n, typ, s_m)             \ | ||||
|     if ((nd = json_object_get_member(obj, (m_n))) != NULL) {    \ | ||||
|         evt->s_m = json_node_get_##typ (nd);                    \ | ||||
|         json_object_remove_member(obj, m_n);                    \ | ||||
|     } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_new_from_json: (constructor) | ||||
|  * @json_data: a #JsonNode to convert to #MatrixPresenceEvent | ||||
|  * | ||||
|  * Converts a #JsonNode (usually from the response from a homeserver) | ||||
|  * to a #MatrixPresenceEvent. | ||||
|  * | ||||
|  * Returns: (transfer full): a new #MatrixPresenceEvent with all | ||||
|  *          values from #JsonNode | ||||
|  */ | ||||
| MatrixPresenceEvent * | ||||
| matrix_presence_event_new_from_json(JsonNode *json_data) | ||||
| { | ||||
|     JsonNode *node, *copied_data; | ||||
|     JsonObject *root; | ||||
|     MatrixPresenceEvent *event; | ||||
|     GError *err = NULL; | ||||
|  | ||||
|     g_return_val_if_fail(JSON_NODE_HOLDS_OBJECT(json_data), NULL); | ||||
|  | ||||
|     copied_data = _json_node_deep_copy(json_data); | ||||
|  | ||||
|     event = matrix_presence_event_new(); | ||||
|     root = json_node_get_object(copied_data); | ||||
|  | ||||
|     try_get_string_member(event, node, root, "user_id", user_id); | ||||
|     try_get_string_member(event, node, root, "displayname", display_name); | ||||
|     try_get_string_member(event, node, root, "avatar_url", avatar_url); | ||||
|     try_get_member(event, node, root, "last_active_ago", int, last_active_ago); | ||||
|  | ||||
|     if ((node = json_object_get_member(root, "presence")) != NULL) { | ||||
|         int val; | ||||
|         const gchar *value = json_node_get_string(node); | ||||
|  | ||||
|         val = _g_enum_nick_to_value(MATRIX_TYPE_PRESENCE, value, &err); | ||||
|  | ||||
|         if (!err) { | ||||
|             event->presence = val; | ||||
|         } else { | ||||
|             g_warning("Unknown presence value '%s'. Please report it to the Matrix.org GLib SDK project.", value); | ||||
|         } | ||||
|  | ||||
|         json_object_remove_member(root, "presence"); | ||||
|     } | ||||
|  | ||||
|     // By now, root_object should be empty. | ||||
|     if (json_object_get_size(root) > 0) { | ||||
|         g_warning("Some members remained in the received presence event. This may be a bug in Matrix GLib"); | ||||
|     } | ||||
|  | ||||
|     return event; | ||||
| } | ||||
|  | ||||
| static void | ||||
| matrix_presence_event_free(MatrixPresenceEvent *event) | ||||
| { | ||||
|     g_free(event); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_ref: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * | ||||
|  * Increase reference count of @event by one. | ||||
|  * | ||||
|  * Returns: (transfer none): the same #MatrixPresenceEvent | ||||
|  */ | ||||
| MatrixPresenceEvent * | ||||
| matrix_presence_event_ref(MatrixPresenceEvent *event) | ||||
| { | ||||
|     event->refcount++; | ||||
|  | ||||
|     return event; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_unref: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * | ||||
|  * Decrease reference count of @event by one. If reference count drops | ||||
|  * to zero, @event is freed. | ||||
|  */ | ||||
| void | ||||
| matrix_presence_event_unref(MatrixPresenceEvent *event) | ||||
| { | ||||
|     if (--event->refcount == 0) { | ||||
|         matrix_presence_event_free(event); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_set_user_id: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * @user_id: (transfer none): a Matrix.org user ID | ||||
|  * | ||||
|  * Set the user ID in the presence event. | ||||
|  */ | ||||
| void | ||||
| matrix_presence_event_set_user_id(MatrixPresenceEvent *event, | ||||
|                                   const gchar *user_id) | ||||
| { | ||||
|     g_free(event->user_id); | ||||
|     event->user_id = g_strdup(user_id); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_get_user_id: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * | ||||
|  * Get the user ID from the presence event. | ||||
|  * | ||||
|  * Returns: (transfer none): a user ID | ||||
|  */ | ||||
| const gchar * | ||||
| matrix_presence_event_get_user_id(MatrixPresenceEvent *event) | ||||
| { | ||||
|     return event->user_id; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_set_display_name: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * @display_name: a display name to set | ||||
|  * | ||||
|  * Set the display name in the presence event. | ||||
|  */ | ||||
| void | ||||
| matrix_presence_event_set_display_name(MatrixPresenceEvent *event, | ||||
|                                        const gchar *display_name) | ||||
| { | ||||
|     g_free(event->display_name); | ||||
|     event->display_name = g_strdup(display_name); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_get_display_name: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * | ||||
|  * Get the display name from the presence event. | ||||
|  * | ||||
|  * Returns: (transfer none) (allow-none): the display name | ||||
|  */ | ||||
| const gchar * | ||||
| matrix_presence_event_get_display_name(MatrixPresenceEvent *event) | ||||
| { | ||||
|     return event->display_name; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_set_avatar_url: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * @avatar_url: (allow-none): the avatar URL to set | ||||
|  * | ||||
|  * Set the avatar URL in the presence event. | ||||
|  */ | ||||
| void | ||||
| matrix_presence_event_set_avatar_url(MatrixPresenceEvent *event, | ||||
|                                      const gchar *avatar_url) | ||||
| { | ||||
|     g_free(event->avatar_url); | ||||
|     event->avatar_url = g_strdup(avatar_url); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_get_avatar_url: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * | ||||
|  * Gets the avatar URL from the presence event. | ||||
|  * | ||||
|  * Returns: (transfer none) (allow-none): the avatar URL | ||||
|  */ | ||||
| const gchar * | ||||
| matrix_presence_event_get_avatar_url(MatrixPresenceEvent *event) | ||||
| { | ||||
|     return event->avatar_url; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_set_last_active_ago: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * @last_active_ago: the amount of time, in seconds | ||||
|  * | ||||
|  * Set the amount of time when the user in the presence event was last | ||||
|  * active. | ||||
|  */ | ||||
| void | ||||
| matrix_presence_event_set_last_active_ago(MatrixPresenceEvent *event, | ||||
|                                           gulong last_active_ago) | ||||
| { | ||||
|     event->last_active_ago = last_active_ago; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_get_last_active_ago: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * | ||||
|  * Get the amount of time since the user was last active, in seconds. | ||||
|  * | ||||
|  * Returns: count of seconds | ||||
|  */ | ||||
| gulong | ||||
| matrix_presence_event_get_last_active_ago(MatrixPresenceEvent *event) | ||||
| { | ||||
|     return event->last_active_ago; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_set_presence: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * @presence: the new presence | ||||
|  * | ||||
|  * Set the new presence state of the user in the presence event. | ||||
|  */ | ||||
| void | ||||
| matrix_presence_event_set_presence(MatrixPresenceEvent *event, | ||||
|                                    MatrixPresence presence) | ||||
| { | ||||
|     event->presence = presence; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * matrix_presence_event_get_presence: | ||||
|  * @event: a #MatrixPresenceEvent | ||||
|  * | ||||
|  * Get the new presence of the user from the presence event. | ||||
|  * | ||||
|  * Returns: the new presence state of the user | ||||
|  */ | ||||
| MatrixPresence | ||||
| matrix_presence_event_get_presence(MatrixPresenceEvent *event) | ||||
| { | ||||
|     return event->presence; | ||||
| } | ||||
|   | ||||
| @@ -295,6 +295,31 @@ JsonNode *matrix_state_event_get_json_node(MatrixStateEvent *event); | ||||
| gchar *matrix_state_event_get_json_data(MatrixStateEvent *event, | ||||
|                                         gsize *datalen); | ||||
|  | ||||
| typedef struct _MatrixPresenceEvent MatrixPresenceEvent; | ||||
|  | ||||
| GType matrix_presence_event_get_type(void); | ||||
| #define MATRIX_TYPE_PRESENCE_EVENT (matrix_presence_event_get_type()) | ||||
|  | ||||
| MatrixPresenceEvent *matrix_presence_event_new(void); | ||||
| MatrixPresenceEvent *matrix_presence_event_new_from_json(JsonNode *json_data); | ||||
| MatrixPresenceEvent *matrix_presence_event_ref(MatrixPresenceEvent *event); | ||||
| void matrix_presence_event_unref(MatrixPresenceEvent *event); | ||||
| void matrix_presence_event_set_user_id(MatrixPresenceEvent *event, | ||||
|                                        const gchar *user_id); | ||||
| const gchar *matrix_presence_event_get_user_id(MatrixPresenceEvent *event); | ||||
| void matrix_presence_event_set_display_name(MatrixPresenceEvent *event, | ||||
|                                             const gchar *display_name); | ||||
| const gchar *matrix_presence_event_get_display_name(MatrixPresenceEvent *event); | ||||
| void matrix_presence_event_set_avatar_url(MatrixPresenceEvent *event, | ||||
|                                           const gchar *avatar_url); | ||||
| const gchar *matrix_presence_event_get_avatar_url(MatrixPresenceEvent *event); | ||||
| void matrix_presence_event_set_last_active_ago(MatrixPresenceEvent *event, | ||||
|                                                gulong last_active_ago); | ||||
| gulong matrix_presence_event_get_last_active_ago(MatrixPresenceEvent *event); | ||||
| void matrix_presence_event_set_presence(MatrixPresenceEvent *event, | ||||
|                                         MatrixPresence presence); | ||||
| MatrixPresence matrix_presence_event_get_presence(MatrixPresenceEvent *event); | ||||
|  | ||||
| G_END_DECLS | ||||
|  | ||||
| #endif /* __MATRIX_TYPES_H__ */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user