summaryrefslogtreecommitdiff
path: root/libpurple
diff options
context:
space:
mode:
authorGary Kramlich <grim@reaperworld.com>2023-02-20 09:50:04 -0600
committerGary Kramlich <grim@reaperworld.com>2023-02-20 09:50:04 -0600
commit3c025b4738a3a50cd55e4d08c4fcd046cdd38a61 (patch)
treed7292fad4f2919db0db4868d5f63f11a85da7c22 /libpurple
parenta0955b17df3c051f2d38929b252917345f30c5f2 (diff)
downloadpidgin-3c025b4738a3a50cd55e4d08c4fcd046cdd38a61.tar.gz
Convert idle_time in PurplePresence to GDateTime
Testing Done: Ran the unit tests and checked a few things in the UI. Noticed that the status time in the buddy list has been broken for some time as well. Bugs closed: PIDGIN-17759 Reviewed at https://reviews.imfreedom.org/r/2235/
Diffstat (limited to 'libpurple')
-rw-r--r--libpurple/idle.c11
-rw-r--r--libpurple/plugins/idle/idle.c17
-rw-r--r--libpurple/protocols.c5
-rw-r--r--libpurple/protocols/demo/purpledemocontacts.c19
-rw-r--r--libpurple/protocols/jabber/jabber.c10
-rw-r--r--libpurple/protocols/jabber/presence.c11
-rw-r--r--libpurple/purpleaccountpresence.c21
-rw-r--r--libpurple/purplebuddypresence.c16
-rw-r--r--libpurple/purplepresence.c84
-rw-r--r--libpurple/purplepresence.h15
10 files changed, 132 insertions, 77 deletions
diff --git a/libpurple/idle.c b/libpurple/idle.c
index a9beeecb1a..b999f2cdba 100644
--- a/libpurple/idle.c
+++ b/libpurple/idle.c
@@ -61,6 +61,8 @@ set_account_idle(PurpleAccount *account, int time_idle)
{
PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
PurplePresence *presence;
+ GDateTime *idle_since = NULL;
+ GDateTime *now = NULL;
presence = purple_account_get_presence(account);
@@ -72,7 +74,14 @@ set_account_idle(PurpleAccount *account, int time_idle)
purple_debug_info("idle", "Setting %s idle %d seconds\n",
purple_contact_info_get_username(info),
time_idle);
- purple_presence_set_idle(presence, TRUE, time(NULL) - time_idle);
+
+ now = g_date_time_new_now_local();
+ idle_since = g_date_time_add_seconds(now, -1 * time_idle);
+ g_date_time_unref(now);
+
+ purple_presence_set_idle(presence, TRUE, idle_since);
+ g_date_time_unref(idle_since);
+
idled_accts = g_list_prepend(idled_accts, account);
}
diff --git a/libpurple/plugins/idle/idle.c b/libpurple/plugins/idle/idle.c
index 5d056ec391..d756fff04a 100644
--- a/libpurple/plugins/idle/idle.c
+++ b/libpurple/plugins/idle/idle.c
@@ -60,7 +60,8 @@ set_idle_time(PurpleAccount *acct, int mins_idle)
PurpleConnection *gc = purple_account_get_connection(acct);
PurpleContactInfo *info = PURPLE_CONTACT_INFO(acct);
PurplePresence *presence = purple_account_get_presence(acct);
- time_t t;
+ GDateTime *idle_since = NULL;
+ gboolean idle = FALSE;
if (!gc)
return;
@@ -68,13 +69,17 @@ set_idle_time(PurpleAccount *acct, int mins_idle)
purple_debug_info("idle", "setting idle time for %s to %d\n",
purple_contact_info_get_username(info), mins_idle);
- if (mins_idle) {
- t = time(NULL) - (60 * mins_idle); /* subtract seconds idle from current time */
- } else {
- t = 0; /* time idle is irrelevant */
+ idle = mins_idle > 0;
+
+ if(idle) {
+ GDateTime *now = g_date_time_new_now_local();
+ idle_since = g_date_time_add_minutes(now, -1 * mins_idle);
+ g_date_time_unref(now);
}
- purple_presence_set_idle(presence, mins_idle ? TRUE : FALSE, t);
+ purple_presence_set_idle(presence, idle, idle_since);
+
+ g_clear_pointer(&idle_since, g_date_time_unref);
}
static void
diff --git a/libpurple/protocols.c b/libpurple/protocols.c
index 8193ecc372..781a312e20 100644
--- a/libpurple/protocols.c
+++ b/libpurple/protocols.c
@@ -47,6 +47,7 @@ purple_protocol_got_user_idle(PurpleAccount *account, const char *name,
{
PurplePresence *presence;
GSList *list;
+ GDateTime *idle_date_time = NULL;
g_return_if_fail(account != NULL);
g_return_if_fail(name != NULL);
@@ -55,11 +56,13 @@ purple_protocol_got_user_idle(PurpleAccount *account, const char *name,
if ((list = purple_blist_find_buddies(account, name)) == NULL)
return;
+ idle_date_time = g_date_time_new_from_unix_local(idle_time);
while (list) {
presence = purple_buddy_get_presence(list->data);
list = g_slist_delete_link(list, list);
- purple_presence_set_idle(presence, idle, idle_time);
+ purple_presence_set_idle(presence, idle, idle_date_time);
}
+ g_date_time_unref(idle_date_time);
}
void
diff --git a/libpurple/protocols/demo/purpledemocontacts.c b/libpurple/protocols/demo/purpledemocontacts.c
index a788951854..0f247955d2 100644
--- a/libpurple/protocols/demo/purpledemocontacts.c
+++ b/libpurple/protocols/demo/purpledemocontacts.c
@@ -63,15 +63,20 @@ purple_demo_protocol_load_status(PurpleAccount *account,
}
if(json_object_has_member(status_object, "idle")) {
- gint idle_seconds = 0;
- time_t now;
+ PurplePresence *presence = NULL;
+ GDateTime *now = NULL;
+ GDateTime *idle_since = NULL;
+ gint idle_minutes = 0;
- idle_seconds = json_object_get_int_member(status_object, "idle");
- now = time(NULL);
+ idle_minutes = json_object_get_int_member(status_object, "idle");
+ now = g_date_time_new_now_local();
+ idle_since = g_date_time_add_minutes(now, -1 * idle_minutes);
- purple_protocol_got_user_idle(account,
- purple_buddy_get_name(buddy), TRUE,
- now - idle_seconds);
+ presence = purple_buddy_get_presence(buddy);
+ purple_presence_set_idle(presence, TRUE, idle_since);
+
+ g_date_time_unref(idle_since);
+ g_date_time_unref(now);
}
}
}
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
index 22621c4a0e..63979a1347 100644
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -941,8 +941,14 @@ jabber_stream_new(PurpleAccount *account)
disconnected and the reconnects while being idle. I don't think it makes
sense to do this when registering a new account... */
presence = purple_account_get_presence(account);
- if (purple_presence_is_idle(presence))
- js->idle = purple_presence_get_idle_time(presence);
+ if (purple_presence_is_idle(presence)) {
+ GDateTime *idle = purple_presence_get_idle_time(presence);
+
+ js->idle = 0;
+ if(idle != NULL) {
+ js->idle = g_date_time_to_unix(idle);
+ }
+ }
return js;
}
diff --git a/libpurple/protocols/jabber/presence.c b/libpurple/protocols/jabber/presence.c
index 878cc0e373..cc75ac5ef1 100644
--- a/libpurple/protocols/jabber/presence.c
+++ b/libpurple/protocols/jabber/presence.c
@@ -117,8 +117,15 @@ void jabber_presence_fake_to_self(JabberStream *js, PurpleStatus *status)
} else {
jbr = jabber_buddy_track_resource(jb, js->user->resource, priority,
state, msg);
- jbr->idle = purple_presence_is_idle(presence) ?
- purple_presence_get_idle_time(presence) : 0;
+
+ jbr->idle = 0;
+ if(purple_presence_is_idle(presence)) {
+ GDateTime *idle_since = purple_presence_get_idle_time(presence);
+
+ if(idle_since != NULL) {
+ jbr->idle = g_date_time_to_unix(idle_since);
+ }
+ }
}
/*
diff --git a/libpurple/purpleaccountpresence.c b/libpurple/purpleaccountpresence.c
index 2f5cfd813f..7e2c232090 100644
--- a/libpurple/purpleaccountpresence.c
+++ b/libpurple/purpleaccountpresence.c
@@ -62,8 +62,6 @@ purple_account_presence_update_idle(PurplePresence *presence,
PurpleConnection *gc = NULL;
PurpleProtocol *protocol = NULL;
gboolean idle = purple_presence_is_idle(presence);
- time_t idle_time = purple_presence_get_idle_time(presence);
- time_t current_time = time(NULL);
gc = purple_account_get_connection(account_presence->account);
@@ -72,7 +70,24 @@ purple_account_presence_update_idle(PurplePresence *presence,
}
if(PURPLE_IS_PROTOCOL_SERVER(protocol)) {
- purple_protocol_server_set_idle(PURPLE_PROTOCOL_SERVER(protocol), gc, (idle ? (current_time - idle_time) : 0));
+ gint idle_time = 0;
+
+ if(idle) {
+ GDateTime *idle_since = purple_presence_get_idle_time(presence);
+
+ if(idle_since != NULL) {
+ GDateTime *now = g_date_time_new_now_local();
+
+ idle_time = g_date_time_difference(now, idle_since);
+ idle_time = idle_time / G_TIME_SPAN_SECOND;
+
+ g_date_time_unref(now);
+ g_date_time_unref(idle_since);
+ }
+ }
+
+ purple_protocol_server_set_idle(PURPLE_PROTOCOL_SERVER(protocol), gc,
+ idle_time);
}
}
diff --git a/libpurple/purplebuddypresence.c b/libpurple/purplebuddypresence.c
index b1e995e25b..d950f8879f 100644
--- a/libpurple/purplebuddypresence.c
+++ b/libpurple/purplebuddypresence.c
@@ -87,7 +87,8 @@ purple_buddy_presence_compare(PurpleBuddyPresence *buddy_presence1,
{
PurplePresence *presence1 = PURPLE_PRESENCE(buddy_presence1);
PurplePresence *presence2 = PURPLE_PRESENCE(buddy_presence2);
- time_t idle_time_1, idle_time_2;
+ GDateTime *now = NULL;
+ GTimeSpan idle1, idle2;
int score1 = 0, score2 = 0;
int idle_time_score = purple_prefs_get_int("/purple/status/scores/idle_time");
@@ -111,13 +112,18 @@ purple_buddy_presence_compare(PurpleBuddyPresence *buddy_presence1,
/* Compute the score of the second set of statuses. */
score2 = purple_buddy_presence_compute_score(buddy_presence2);
- idle_time_1 = time(NULL) - purple_presence_get_idle_time(presence1);
- idle_time_2 = time(NULL) - purple_presence_get_idle_time(presence2);
+ now = g_date_time_new_now_local();
+ idle1 = g_date_time_difference(now,
+ purple_presence_get_idle_time(presence1));
+ idle2 = g_date_time_difference(now,
+ purple_presence_get_idle_time(presence2));
+ g_date_time_unref(now);
- if (idle_time_1 > idle_time_2)
+ if (idle1 > idle2) {
score1 += idle_time_score;
- else if (idle_time_1 < idle_time_2)
+ } else if (idle1 < idle2) {
score2 += idle_time_score;
+ }
if (score1 < score2)
return 1;
diff --git a/libpurple/purplepresence.c b/libpurple/purplepresence.c
index 0ffd5c938c..fbb7d23d77 100644
--- a/libpurple/purplepresence.c
+++ b/libpurple/purplepresence.c
@@ -24,14 +24,13 @@
#include "purplepresence.h"
-#include "internal.h"
#include "debug.h"
#include "purpleenums.h"
#include "purpleprivate.h"
typedef struct {
gboolean idle;
- time_t idle_time;
+ GDateTime *idle_time;
GDateTime *login_time;
GHashTable *status_table;
@@ -86,16 +85,11 @@ purple_presence_set_property(GObject *obj, guint param_id, const GValue *value,
switch (param_id) {
case PROP_IDLE:
- purple_presence_set_idle(presence, g_value_get_boolean(value), 0);
+ purple_presence_set_idle(presence, g_value_get_boolean(value),
+ NULL);
break;
case PROP_IDLE_TIME:
-#if SIZEOF_TIME_T == 4
- purple_presence_set_idle(presence, TRUE, g_value_get_int(value));
-#elif SIZEOF_TIME_T == 8
- purple_presence_set_idle(presence, TRUE, g_value_get_int64(value));
-#else
-#error Unknown size of time_t
-#endif
+ purple_presence_set_idle(presence, TRUE, g_value_get_boxed(value));
break;
case PROP_LOGIN_TIME:
purple_presence_set_login_time(presence, g_value_get_boxed(value));
@@ -121,13 +115,7 @@ purple_presence_get_property(GObject *obj, guint param_id, GValue *value,
g_value_set_boolean(value, purple_presence_is_idle(presence));
break;
case PROP_IDLE_TIME:
-#if SIZEOF_TIME_T == 4
- g_value_set_int(value, purple_presence_get_idle_time(presence));
-#elif SIZEOF_TIME_T == 8
- g_value_set_int64(value, purple_presence_get_idle_time(presence));
-#else
-#error Unknown size of time_t
-#endif
+ g_value_set_boxed(value, purple_presence_get_idle_time(presence));
break;
case PROP_LOGIN_TIME:
g_value_set_boxed(value, purple_presence_get_login_time(presence));
@@ -166,6 +154,9 @@ purple_presence_finalize(GObject *obj) {
g_hash_table_destroy(priv->status_table);
g_clear_object(&priv->active_status);
+ g_clear_pointer(&priv->idle_time, g_date_time_unref);
+ g_clear_pointer(&priv->login_time, g_date_time_unref);
+
G_OBJECT_CLASS(purple_presence_parent_class)->finalize(obj);
}
@@ -191,23 +182,10 @@ purple_presence_class_init(PurplePresenceClass *klass) {
*
* The time when the presence went idle.
*/
- properties[PROP_IDLE_TIME] =
-#if SIZEOF_TIME_T == 4
- g_param_spec_int
-#elif SIZEOF_TIME_T == 8
- g_param_spec_int64
-#else
-#error Unknown size of time_t
-#endif
- ("idle-time", "Idle time",
+ properties[PROP_IDLE_TIME] = g_param_spec_boxed(
+ "idle-time", "Idle time",
"The idle time of the presence",
-#if SIZEOF_TIME_T == 4
- G_MININT, G_MAXINT, 0,
-#elif SIZEOF_TIME_T == 8
- G_MININT64, G_MAXINT64, 0,
-#else
-#error Unknown size of time_t
-#endif
+ G_TYPE_DATE_TIME,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/**
@@ -306,7 +284,7 @@ purple_presence_switch_status(PurplePresence *presence, const gchar *status_id)
void
purple_presence_set_idle(PurplePresence *presence, gboolean idle,
- time_t idle_time)
+ GDateTime *idle_time)
{
PurplePresencePrivate *priv = NULL;
PurplePresenceClass *klass = NULL;
@@ -324,7 +302,11 @@ purple_presence_set_idle(PurplePresence *presence, gboolean idle,
old_idle = priv->idle;
priv->idle = idle;
- priv->idle_time = (idle ? idle_time : 0);
+
+ g_clear_pointer(&priv->idle_time, g_date_time_unref);
+ if(idle && idle_time != NULL) {
+ priv->idle_time = g_date_time_ref(idle_time);
+ }
obj = G_OBJECT(presence);
g_object_freeze_notify(obj);
@@ -502,11 +484,11 @@ purple_presence_is_idle(PurplePresence *presence) {
return priv->idle;
}
-time_t
+GDateTime *
purple_presence_get_idle_time(PurplePresence *presence) {
PurplePresencePrivate *priv = NULL;
- g_return_val_if_fail(PURPLE_IS_PRESENCE(presence), 0);
+ g_return_val_if_fail(PURPLE_IS_PRESENCE(presence), NULL);
priv = purple_presence_get_instance_private(presence);
@@ -526,8 +508,11 @@ purple_presence_get_login_time(PurplePresence *presence) {
gint
purple_presence_compare(PurplePresence *presence1, PurplePresence *presence2) {
- time_t idle_time_1;
- time_t idle_time_2;
+ GDateTime *idle1 = NULL;
+ GDateTime *idle2 = NULL;
+ GDateTime *now = NULL;
+ GTimeSpan diff1 = 0;
+ GTimeSpan diff2 = 0;
if(presence1 == presence2) {
return 0;
@@ -547,12 +532,25 @@ purple_presence_compare(PurplePresence *presence1, PurplePresence *presence2) {
return 1;
}
- idle_time_1 = time(NULL) - purple_presence_get_idle_time(presence1);
- idle_time_2 = time(NULL) - purple_presence_get_idle_time(presence2);
+ idle1 = purple_presence_get_idle_time(presence1);
+ idle2 = purple_presence_get_idle_time(presence2);
+
+ if(idle1 == NULL && idle2 == NULL) {
+ return 0;
+ } else if(idle1 == NULL && idle2 != NULL) {
+ return -1;
+ } else if(idle1 != NULL && idle2 == NULL) {
+ return 1;
+ }
+
+ now = g_date_time_new_now_local();
+ diff1 = g_date_time_difference(now, idle1);
+ diff2 = g_date_time_difference(now, idle2);
+ g_date_time_unref(now);
- if(idle_time_1 > idle_time_2) {
+ if(diff1 > diff2) {
return 1;
- } else if (idle_time_1 < idle_time_2) {
+ } else if (diff1 < diff2) {
return -1;
}
diff --git a/libpurple/purplepresence.h b/libpurple/purplepresence.h
index 97b7cd4c30..38b8bf0e2d 100644
--- a/libpurple/purplepresence.h
+++ b/libpurple/purplepresence.h
@@ -116,13 +116,13 @@ void purple_presence_switch_status(PurplePresence *presence, const gchar *status
* purple_presence_set_idle:
* @presence: The #PurplePresence instance.
* @idle: The idle state.
- * @idle_time: The idle time, if @idle is %TRUE. This is the time at which the
- * user became idle, in seconds since the epoch. If this value is
- * unknown then 0 should be used.
+ * @idle_time: (transfer none): The idle time, if @idle is %TRUE. This is the
+ * time at which the user became idle. If this value is unknown
+ * then %NULL should be used.
*
* Sets the idle state and time of @presence.
*/
-void purple_presence_set_idle(PurplePresence *presence, gboolean idle, time_t idle_time);
+void purple_presence_set_idle(PurplePresence *presence, gboolean idle, GDateTime *idle_time);
/**
* purple_presence_set_login_time:
@@ -229,11 +229,12 @@ gboolean purple_presence_is_idle(PurplePresence *presence);
* purple_presence_get_idle_time:
* @presence: The #PurplePresence instance.
*
- * Gets the idle time of @presence.
+ * Gets the idle time of @presence. This can be %NULL if the protocol doesn't
+ * support idle times or if the presence isn't in an idle state.
*
- * Returns: The idle time of @presence.
+ * Returns: (nullable): The idle time of @presence or %NULL.
*/
-time_t purple_presence_get_idle_time(PurplePresence *presence);
+GDateTime *purple_presence_get_idle_time(PurplePresence *presence);
/**
* purple_presence_get_login_time: