Add MatrixPresenceEvent type
It is an abstraction layer for presence events.
This commit is contained in:
parent
cfb13f6d06
commit
c95f093ace
@ -177,6 +177,23 @@ matrix_state_event_get_content
|
|||||||
matrix_state_event_get_json_node
|
matrix_state_event_get_json_node
|
||||||
matrix_state_event_get_json_data
|
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>
|
<SUBSECTION Standard>
|
||||||
MATRIX_TYPE_EVENT_FORMAT
|
MATRIX_TYPE_EVENT_FORMAT
|
||||||
matrix_event_format_get_type
|
matrix_event_format_get_type
|
||||||
@ -210,6 +227,8 @@ MATRIX_TYPE_PUSHER
|
|||||||
matrix_pusher_get_type
|
matrix_pusher_get_type
|
||||||
MATRIX_TYPE_STATE_EVENT
|
MATRIX_TYPE_STATE_EVENT
|
||||||
matrix_state_event_get_type
|
matrix_state_event_get_type
|
||||||
|
MATRIX_TYPE_PRESENCE_EVENT
|
||||||
|
matrix_presence_event_get_type
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
|
@ -2584,3 +2584,286 @@ matrix_state_event_get_json_data(MatrixStateEvent *event, gsize *datalen)
|
|||||||
|
|
||||||
return data;
|
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,
|
gchar *matrix_state_event_get_json_data(MatrixStateEvent *event,
|
||||||
gsize *datalen);
|
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
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __MATRIX_TYPES_H__ */
|
#endif /* __MATRIX_TYPES_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user