From a89b6668ab4f0a0854dc4751b0a8d124320bb691 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Tue, 15 May 2018 14:16:19 +0200
Subject: [PATCH] Includes missing files from previous commits

---
 .../libquassel/quassel/QuasselFeatures.kt     |  2 +-
 .../libquassel/quassel/syncables/IrcUser.kt   | 22 ++++++++++++++-----
 .../quassel/syncables/interfaces/IIrcUser.kt  |  5 ++++-
 .../kuschku/libquassel/session/SignalProxy.kt |  6 +++++
 4 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt
index 3ce719b39..9a646b45c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt
@@ -36,7 +36,7 @@ class QuasselFeatures(
 
   fun toStringList() = enabledFeatures.map(ExtendedFeature::name)
 
-  fun hasFeature(feature: ExtendedFeature) = enabledFeatures.contains(feature)
+  infix fun hasFeature(feature: ExtendedFeature) = enabledFeatures.contains(feature)
 
   companion object {
     fun empty() = QuasselFeatures(emptySet(), emptySet())
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
index d3b5cc552..4ece8907d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
@@ -23,6 +23,7 @@ import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.valueOr
+import de.kuschku.libquassel.quassel.ExtendedFeature
 import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcUser
 import de.kuschku.libquassel.session.SignalProxy
 import de.kuschku.libquassel.util.irc.HostmaskHelper
@@ -58,6 +59,7 @@ class IrcUser(
     "server" to QVariant.of(server(), Type.QString),
     "ircOperator" to QVariant.of(ircOperator(), Type.QString),
     "lastAwayMessage" to QVariant.of(lastAwayMessage(), Type.Long),
+    "lastAwayMessageTime" to QVariant.of(lastAwayMessageTime(), Type.Long),
     "whoisServiceReply" to QVariant.of(whoisServiceReply(), Type.QString),
     "suserHost" to QVariant.of(suserHost(), Type.QString),
     "encrypted" to QVariant.of(encrypted(), Type.Bool),
@@ -78,7 +80,9 @@ class IrcUser(
     setLoginTime(properties["loginTime"].valueOr(this::loginTime))
     setServer(properties["server"].valueOr(this::server))
     setIrcOperator(properties["ircOperator"].valueOr(this::ircOperator))
-    setLastAwayMessage(properties["lastAwayMessage"].valueOr(this::lastAwayMessage))
+    setLastAwayMessageTime(properties["lastAwayMessageTime"].valueOr {
+      Instant.ofEpochSecond(properties["lastAwayMessage"].valueOr(this::lastAwayMessage).toLong())
+    })
     setWhoisServiceReply(properties["whoisServiceReply"].valueOr(this::whoisServiceReply))
     setSuserHost(properties["suserHost"].valueOr(this::suserHost))
     setEncrypted(properties["encrypted"].valueOr(this::encrypted))
@@ -104,7 +108,8 @@ class IrcUser(
 
   fun loginTime() = _loginTime
   fun ircOperator() = _ircOperator
-  fun lastAwayMessage() = _lastAwayMessage
+  fun lastAwayMessage() = _lastAwayMessageTime.epochSecond.toInt()
+  fun lastAwayMessageTime() = _lastAwayMessageTime
   fun whoisServiceReply() = _whoisServiceReply
   fun suserHost() = _suserHost
   fun encrypted() = _encrypted
@@ -183,12 +188,17 @@ class IrcUser(
     }
   }
 
-  override fun setLastAwayMessage(lastAwayMessage: Long) {
-    if (lastAwayMessage > _lastAwayMessage) {
-      _lastAwayMessage = lastAwayMessage
+  override fun setLastAwayMessage(lastAwayMessage: Int) {
+    if (lastAwayMessage > lastAwayMessage() &&
+        !(proxy.features.negotiated hasFeature ExtendedFeature.LongTime)) {
+      _lastAwayMessageTime = Instant.ofEpochSecond(lastAwayMessage.toLong())
     }
   }
 
+  override fun setLastAwayMessageTime(lastAwayMessageTime: Instant) {
+    _lastAwayMessageTime = lastAwayMessageTime
+  }
+
   override fun setWhoisServiceReply(whoisServiceReply: String) {
     if (_whoisServiceReply != whoisServiceReply) {
       _whoisServiceReply = whoisServiceReply
@@ -331,7 +341,7 @@ class IrcUser(
       field = value
       hasChangedNotification.onNext(Unit)
     }
-  private var _lastAwayMessage: Long = 0L
+  private var _lastAwayMessageTime: Instant = Instant.EPOCH
     set(value) {
       field = value
       hasChangedNotification.onNext(Unit)
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
index 12c91cf25..88b41f507 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
@@ -68,7 +68,10 @@ interface IIrcUser : ISyncableObject {
   fun setIrcOperator(ircOperator: String)
 
   @Slot
-  fun setLastAwayMessage(lastAwayMessage: Long)
+  fun setLastAwayMessage(lastAwayMessage: Int)
+
+  @Slot
+  fun setLastAwayMessageTime(lastAwayMessageTime: Instant)
 
   @Slot
   fun setLoginTime(loginTime: Instant)
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
index 12a7481bb..0e90f6805 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
@@ -19,11 +19,13 @@
 
 package de.kuschku.libquassel.session
 
+import de.kuschku.libquassel.connection.Features
 import de.kuschku.libquassel.protocol.IdentityId
 import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.libquassel.protocol.QVariantList
 import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
+import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.Identity
 import de.kuschku.libquassel.quassel.syncables.Network
 import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
@@ -63,6 +65,8 @@ interface SignalProxy {
   fun synchronize(syncableObject: ISyncableObject?) = synchronize(syncableObject, false)
   fun stopSynchronize(syncableObject: ISyncableObject?)
 
+  val features: Features
+
   companion object {
     val NULL = object : SignalProxy {
       override fun dispatch(message: SignalProxyMessage) = Unit
@@ -81,6 +85,8 @@ interface SignalProxy {
       override fun renameObject(className: String, newName: String, oldName: String) = Unit
       override fun synchronize(syncableObject: ISyncableObject?, baseInit: Boolean) = Unit
       override fun stopSynchronize(syncableObject: ISyncableObject?) = Unit
+
+      override val features get() = Features(QuasselFeatures.empty(), QuasselFeatures.empty())
     }
   }
 }
-- 
GitLab