qulogic/pidgin

Convert presence idle time into a GDateTime.
draft
2017-08-11, Elliott Sales de Andrade
65b06eeaffd5
Parents 51b578fe492e
Children
Convert presence idle time into a GDateTime.
--- a/libpurple/idle.c Thu Aug 10 20:49:07 2017 -0500
+++ b/libpurple/idle.c Fri Aug 11 03:40:44 2017 -0400
@@ -59,6 +59,8 @@
set_account_idle(PurpleAccount *account, int time_idle)
{
PurplePresence *presence;
+ GDateTime *now_dt;
+ GDateTime *idle_dt;
presence = purple_account_get_presence(account);
@@ -68,8 +70,15 @@
purple_debug_info("idle", "Setting %s idle %d seconds\n",
purple_account_get_username(account), time_idle);
- purple_presence_set_idle(presence, TRUE, time(NULL) - time_idle);
+
+ now_dt = g_date_time_new_now_utc();
+ idle_dt = g_date_time_add_seconds(now_dt, -time_idle);
+ g_date_time_unref(now_dt);
+
+ purple_presence_set_idle(presence, TRUE, idle_dt);
idled_accts = g_list_prepend(idled_accts, account);
+
+ g_date_time_unref(idle_dt);
}
static void
@@ -87,7 +96,7 @@
purple_debug_info("idle", "Setting %s unidle\n",
purple_account_get_username(account));
- purple_presence_set_idle(presence, FALSE, 0);
+ purple_presence_set_idle(presence, FALSE, NULL);
}
--- a/libpurple/plugins/idle.c Thu Aug 10 20:49:07 2017 -0500
+++ b/libpurple/plugins/idle.c Fri Aug 11 03:40:44 2017 -0400
@@ -62,9 +62,9 @@
static void
set_idle_time(PurpleAccount *acct, int mins_idle)
{
- time_t t;
PurpleConnection *gc = purple_account_get_connection(acct);
PurplePresence *presence = purple_account_get_presence(acct);
+ GDateTime *t;
if (!gc)
return;
@@ -73,10 +73,14 @@
"setting idle time for %s to %d\n",
purple_account_get_username(acct), mins_idle);
- if (mins_idle)
- t = time(NULL) - (60 * mins_idle); /* subtract seconds idle from current time */
- else
- t = 0; /* time idle is irrelevant */
+ if (mins_idle) {
+ GDateTime *now = g_date_time_new_now_utc();
+ t = g_date_time_add_minutes(now, -mins_idle);
+ g_date_time_unref(now);
+ } else {
+ /* time idle is irrelevant */
+ t = NULL;
+ }
purple_presence_set_idle(presence, mins_idle ? TRUE : FALSE, t);
}
--- a/libpurple/presence.c Thu Aug 10 20:49:07 2017 -0500
+++ b/libpurple/presence.c Fri Aug 11 03:40:44 2017 -0400
@@ -46,7 +46,7 @@
struct _PurplePresencePrivate
{
gboolean idle;
- time_t idle_time;
+ GDateTime *idle_time;
time_t login_time;
GList *statuses;
@@ -144,7 +144,7 @@
}
void
-purple_presence_set_idle(PurplePresence *presence, gboolean idle, time_t idle_time)
+purple_presence_set_idle(PurplePresence *presence, gboolean idle, GDateTime *idle_time)
{
gboolean old_idle;
PurplePresencePrivate *priv = PURPLE_PRESENCE_GET_PRIVATE(presence);
@@ -153,12 +153,25 @@
g_return_if_fail(priv != NULL);
- if (priv->idle == idle && priv->idle_time == idle_time)
+ if (priv->idle == idle &&
+ priv->idle_time != NULL && idle_time != NULL &&
+ g_date_time_equal(priv->idle_time, idle_time)) {
return;
+ }
old_idle = priv->idle;
priv->idle = idle;
- priv->idle_time = (idle ? idle_time : 0);
+ if (priv->idle_time)
+ g_date_time_unref(priv->idle_time);
+ if (idle) {
+ if (idle_time) {
+ priv->idle_time = g_date_time_ref(idle_time);
+ } else {
+ priv->idle_time = g_date_time_new_from_unix_utc(0);
+ }
+ } else {
+ priv->idle_time = NULL;
+ }
obj = G_OBJECT(presence);
g_object_freeze_notify(obj);
@@ -310,12 +323,12 @@
return purple_presence_is_online(presence) && priv->idle;
}
-time_t
+GDateTime *
purple_presence_get_idle_time(const PurplePresence *presence)
{
PurplePresencePrivate *priv = PURPLE_PRESENCE_GET_PRIVATE(presence);
- g_return_val_if_fail(priv != NULL, 0);
+ g_return_val_if_fail(priv != NULL, NULL);
return priv->idle_time;
}
@@ -347,13 +360,7 @@
purple_presence_set_idle(presence, g_value_get_boolean(value), 0);
break;
case PRES_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_pointer(value));
break;
case PRES_PROP_LOGIN_TIME:
#if SIZEOF_TIME_T == 4
@@ -385,13 +392,7 @@
g_value_set_boolean(value, purple_presence_is_idle(presence));
break;
case PRES_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_pointer(value, purple_presence_get_idle_time(presence));
break;
case PRES_PROP_LOGIN_TIME:
#if SIZEOF_TIME_T == 4
@@ -473,23 +474,8 @@
"Whether the presence is in idle state.", FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
- properties[PRES_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[PRES_PROP_IDLE_TIME] = g_param_spec_pointer("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_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
properties[PRES_PROP_LOGIN_TIME] =
@@ -560,8 +546,8 @@
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);
+ GDateTime *idle_time = purple_presence_get_idle_time(presence);
+ GDateTime *current_time = g_date_time_new_now_utc();
account = purple_account_presence_get_account(PURPLE_ACCOUNT_PRESENCE(presence));
@@ -576,10 +562,10 @@
if (idle) {
tmp = g_strdup_printf(_("+++ %s became idle"), purple_account_get_username(account));
- dt = g_date_time_new_from_unix_local(idle_time);
+ dt = idle_time;
} else {
tmp = g_strdup_printf(_("+++ %s became unidle"), purple_account_get_username(account));
- dt = g_date_time_new_now_utc();
+ dt = current_time;
}
msg = g_markup_escape_text(tmp, -1);
@@ -587,7 +573,6 @@
purple_log_write(log, PURPLE_MESSAGE_SYSTEM,
purple_account_get_username(account),
dt, msg);
- g_date_time_unref(dt);
g_free(msg);
}
}
@@ -597,8 +582,13 @@
if(PURPLE_CONNECTION_IS_CONNECTED(gc))
protocol = purple_connection_get_protocol(gc);
- if (protocol)
- purple_protocol_server_iface_set_idle(protocol, gc, (idle ? (current_time - idle_time) : 0));
+ if (protocol) {
+ purple_protocol_server_iface_set_idle(protocol, gc,
+ (idle ? g_date_time_difference(current_time, idle_time) / G_TIME_SPAN_SECOND: 0));
+ }
+
+ g_date_time_unref(current_time);
+ g_date_time_unref(idle_time);
}
PurpleAccount *
@@ -646,7 +636,9 @@
{
PurplePresence *presence1 = PURPLE_PRESENCE(buddy_presence1);
PurplePresence *presence2 = PURPLE_PRESENCE(buddy_presence2);
- time_t idle_time_1, idle_time_2;
+ GDateTime *current_time;
+ GTimeSpan idle_time_1;
+ GTimeSpan idle_time_2;
int score1 = 0, score2 = 0;
int idle_time_score = purple_prefs_get_int("/purple/status/scores/idle_time");
@@ -670,8 +662,10 @@
/* 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);
+ current_time = g_date_time_new_now_utc();
+ idle_time_1 = g_date_time_difference(current_time, purple_presence_get_idle_time(presence1));
+ idle_time_2 = g_date_time_difference(current_time, purple_presence_get_idle_time(presence2));
+ g_date_time_unref(current_time);
if (idle_time_1 > idle_time_2)
score1 += idle_time_score;
--- a/libpurple/presence.h Thu Aug 10 20:49:07 2017 -0500
+++ b/libpurple/presence.h Fri Aug 11 03:40:44 2017 -0400
@@ -277,15 +277,14 @@
* purple_presence_set_idle:
* @presence: The presence.
* @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 full): 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 on a presence.
*/
void purple_presence_set_idle(PurplePresence *presence, gboolean idle,
- time_t idle_time);
+ GDateTime *idle_time);
/**
* purple_presence_set_login_time:
@@ -397,9 +396,9 @@
*
* Returns the presence's idle time.
*
- * Returns: The presence's idle time.
+ * Returns: (transfer none): The presence's idle time.
*/
-time_t purple_presence_get_idle_time(const PurplePresence *presence);
+GDateTime *purple_presence_get_idle_time(const PurplePresence *presence);
/**
* purple_presence_get_login_time:
--- a/libpurple/protocols.c Thu Aug 10 20:49:07 2017 -0500
+++ b/libpurple/protocols.c Fri Aug 11 03:40:44 2017 -0400
@@ -213,11 +213,14 @@
purple_protocol_got_account_idle(PurpleAccount *account, gboolean idle,
time_t idle_time)
{
+ GDateTime *dt;
g_return_if_fail(account != NULL);
g_return_if_fail(purple_account_is_connected(account));
+ dt = g_date_time_new_from_unix_local(idle_time);
purple_presence_set_idle(purple_account_get_presence(account),
- idle, idle_time);
+ idle, dt);
+ g_date_time_unref(dt);
}
void
@@ -273,6 +276,7 @@
gboolean idle, time_t idle_time)
{
PurplePresence *presence;
+ GDateTime *dt;
GSList *list;
g_return_if_fail(account != NULL);
@@ -282,11 +286,13 @@
if ((list = purple_blist_find_buddies(account, name)) == NULL)
return;
+ dt = 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, dt);
}
+ g_date_time_unref(dt);
}
void
--- a/libpurple/protocols/oscar/oscar.c Thu Aug 10 20:49:07 2017 -0500
+++ b/libpurple/protocols/oscar/oscar.c Fri Aug 11 03:40:44 2017 -0400
@@ -2766,7 +2766,13 @@
g_free(tmp);
presence = purple_status_get_presence(status);
- aim_srv_setidle(od, !purple_presence_is_idle(presence) ? 0 : time(NULL) - purple_presence_get_idle_time(presence));
+ if (!purple_presence_is_idle(presence)) {
+ aim_srv_setidle(od, 0);
+ } else {
+ GDateTime *now = g_date_time_new_now_utc();
+ aim_srv_setidle(od, g_date_time_difference(now, purple_presence_get_idle_time(presence)) / G_TIME_SPAN_SECOND);
+ g_date_time_unref(now);
+ }
if (od->icq) {
oscar_set_extended_status(gc);