--- a/finch/gntblist.c Mon Feb 20 08:33:48 2023 -0600
+++ b/finch/gntblist.c Mon Feb 20 09:50:04 2023 -0600
@@ -1581,9 +1581,18 @@
if (purple_prefs_get_bool("/finch/blist/idletime")) {
PurplePresence *pre = purple_buddy_get_presence(buddy);
if (purple_presence_is_idle(pre)) {
- time_t idle = purple_presence_get_idle_time(pre);
- char *st = purple_str_seconds_to_string(time(NULL) - idle);
+ GDateTime *idle = purple_presence_get_idle_time(pre); + now = g_date_time_new_now_local(); + since = g_date_time_difference(now, idle); + g_date_time_unref(now); + st = purple_str_seconds_to_string(since / G_TIME_SPAN_SECOND); purple_notify_user_info_add_pair_plaintext(user_info, _("Idle"), st);
--- a/libpurple/idle.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/idle.c Mon Feb 20 09:50:04 2023 -0600
@@ -61,6 +61,8 @@
PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
PurplePresence *presence;
+ GDateTime *idle_since = NULL; presence = purple_account_get_presence(account);
@@ -72,7 +74,14 @@
purple_debug_info("idle", "Setting %s idle %d seconds\n",
purple_contact_info_get_username(info),
- 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);
--- a/libpurple/plugins/idle/idle.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/plugins/idle/idle.c Mon Feb 20 09:50:04 2023 -0600
@@ -60,7 +60,8 @@
PurpleConnection *gc = purple_account_get_connection(acct);
PurpleContactInfo *info = PURPLE_CONTACT_INFO(acct);
PurplePresence *presence = purple_account_get_presence(acct);
+ GDateTime *idle_since = NULL; @@ -68,13 +69,17 @@
purple_debug_info("idle", "setting idle time for %s to %d\n",
purple_contact_info_get_username(info), mins_idle);
- t = time(NULL) - (60 * mins_idle); /* subtract seconds idle from current time */
- t = 0; /* time idle is irrelevant */
+ 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); --- a/libpurple/protocols.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/protocols.c Mon Feb 20 09:50:04 2023 -0600
@@ -47,6 +47,7 @@
PurplePresence *presence;
+ GDateTime *idle_date_time = NULL; g_return_if_fail(account != NULL);
g_return_if_fail(name != NULL);
@@ -55,11 +56,13 @@
if ((list = purple_blist_find_buddies(account, name)) == NULL)
+ idle_date_time = g_date_time_new_from_unix_local(idle_time); 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); --- a/libpurple/protocols/demo/purpledemocontacts.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/protocols/demo/purpledemocontacts.c Mon Feb 20 09:50:04 2023 -0600
@@ -63,15 +63,20 @@
if(json_object_has_member(status_object, "idle")) {
+ PurplePresence *presence = NULL; + GDateTime *idle_since = NULL; - idle_seconds = json_object_get_int_member(status_object, "idle");
+ 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,
+ 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); --- a/libpurple/protocols/jabber/jabber.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/protocols/jabber/jabber.c Mon Feb 20 09:50:04 2023 -0600
@@ -941,8 +941,14 @@
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 = g_date_time_to_unix(idle); --- a/libpurple/protocols/jabber/presence.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/protocols/jabber/presence.c Mon Feb 20 09:50:04 2023 -0600
@@ -117,8 +117,15 @@
jbr = jabber_buddy_track_resource(jb, js->user->resource, priority,
- jbr->idle = purple_presence_is_idle(presence) ?
- purple_presence_get_idle_time(presence) : 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); --- a/libpurple/purpleaccountpresence.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/purpleaccountpresence.c Mon Feb 20 09:50:04 2023 -0600
@@ -62,8 +62,6 @@
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 @@
if(PURPLE_IS_PROTOCOL_SERVER(protocol)) {
- purple_protocol_server_set_idle(PURPLE_PROTOCOL_SERVER(protocol), gc, (idle ? (current_time - idle_time) : 0));
+ 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, --- a/libpurple/purplebuddypresence.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/purplebuddypresence.c Mon Feb 20 09:50:04 2023 -0600
@@ -87,7 +87,8 @@
PurplePresence *presence1 = PURPLE_PRESENCE(buddy_presence1);
PurplePresence *presence2 = PURPLE_PRESENCE(buddy_presence2);
- time_t idle_time_1, idle_time_2;
+ 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 @@
/* 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)
score1 += idle_time_score;
- else if (idle_time_1 < idle_time_2)
+ } else if (idle1 < idle2) { score2 += idle_time_score;
--- a/libpurple/purplepresence.c Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/purplepresence.c Mon Feb 20 09:50:04 2023 -0600
@@ -24,14 +24,13 @@
#include "purplepresence.h"
#include "purpleprivate.h"
GHashTable *status_table;
@@ -86,16 +85,11 @@
- purple_presence_set_idle(presence, g_value_get_boolean(value), 0);
+ purple_presence_set_idle(presence, g_value_get_boolean(value),
- 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));
-#error Unknown size of time_t
+ purple_presence_set_idle(presence, TRUE, g_value_get_boxed(value)); purple_presence_set_login_time(presence, g_value_get_boxed(value));
@@ -121,13 +115,7 @@
g_value_set_boolean(value, purple_presence_is_idle(presence));
- 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));
-#error Unknown size of time_t
+ g_value_set_boxed(value, purple_presence_get_idle_time(presence)); g_value_set_boxed(value, purple_presence_get_login_time(presence));
@@ -166,6 +154,9 @@
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 @@
* The time when the presence went idle.
- properties[PROP_IDLE_TIME] =
-#elif SIZEOF_TIME_T == 8
-#error Unknown size of time_t
- ("idle-time", "Idle time",
+ properties[PROP_IDLE_TIME] = g_param_spec_boxed( + "idle-time", "Idle time", "The idle time of the presence",
-#elif SIZEOF_TIME_T == 8
- G_MININT64, G_MAXINT64, 0,
-#error Unknown size of time_t
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
@@ -306,7 +284,7 @@
purple_presence_set_idle(PurplePresence *presence, gboolean idle,
PurplePresencePrivate *priv = NULL;
PurplePresenceClass *klass = NULL;
@@ -324,7 +302,11 @@
- 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_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_compare(PurplePresence *presence1, PurplePresence *presence2) {
+ GDateTime *idle1 = NULL; + GDateTime *idle2 = NULL; if(presence1 == presence2) {
@@ -547,12 +532,25 @@
- 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(idle_time_1 > idle_time_2) {
+ if(idle1 == NULL && idle2 == NULL) { + } else if(idle1 == NULL && idle2 != NULL) { + } else if(idle1 != NULL && idle2 == NULL) { - } else if (idle_time_1 < idle_time_2) {
+ 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); + } else if (diff1 < diff2) { --- a/libpurple/purplepresence.h Mon Feb 20 08:33:48 2023 -0600
+++ b/libpurple/purplepresence.h Mon Feb 20 09:50:04 2023 -0600
@@ -116,13 +116,13 @@
* purple_presence_set_idle:
* @presence: The #PurplePresence instance.
- * @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 @@
* 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: