diff options
author | Gary Kramlich <grim@reaperworld.com> | 2023-02-20 09:50:04 -0600 |
---|---|---|
committer | Gary Kramlich <grim@reaperworld.com> | 2023-02-20 09:50:04 -0600 |
commit | 3c025b4738a3a50cd55e4d08c4fcd046cdd38a61 (patch) | |
tree | d7292fad4f2919db0db4868d5f63f11a85da7c22 /libpurple | |
parent | a0955b17df3c051f2d38929b252917345f30c5f2 (diff) | |
download | pidgin-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.c | 11 | ||||
-rw-r--r-- | libpurple/plugins/idle/idle.c | 17 | ||||
-rw-r--r-- | libpurple/protocols.c | 5 | ||||
-rw-r--r-- | libpurple/protocols/demo/purpledemocontacts.c | 19 | ||||
-rw-r--r-- | libpurple/protocols/jabber/jabber.c | 10 | ||||
-rw-r--r-- | libpurple/protocols/jabber/presence.c | 11 | ||||
-rw-r--r-- | libpurple/purpleaccountpresence.c | 21 | ||||
-rw-r--r-- | libpurple/purplebuddypresence.c | 16 | ||||
-rw-r--r-- | libpurple/purplepresence.c | 84 | ||||
-rw-r--r-- | libpurple/purplepresence.h | 15 |
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: |