[smuxi] Engine: make last seen message and highlight persistent (closes: #1040)



commit bbf751d4142dc9e42c010b60c0c8ea90f0aa1c6d
Author: Mirco Bauer <meebey meebey net>
Date:   Thu May 14 07:26:02 2015 +0200

    Engine: make last seen message and highlight persistent (closes: #1040)
    
    Since Smuxi supports persistent messages it should also remember which messages
    and highlights were already seen, else it always had to show them as new/unseen.

 src/Engine/Chats/ChatModel.cs                    |   24 +++++--
 src/Engine/MessageBuffers/IMessageBuffer.cs      |    4 +-
 src/Engine/MessageBuffers/ListMessageBuffer.cs   |    5 +-
 src/Engine/MessageBuffers/MessageBufferBase.cs   |    4 +-
 src/Engine/MessageBuffers/SqliteMessageBuffer.cs |   75 ++++++++++++++++++++++
 5 files changed, 103 insertions(+), 9 deletions(-)
---
diff --git a/src/Engine/Chats/ChatModel.cs b/src/Engine/Chats/ChatModel.cs
index e5afbcf..75dab53 100644
--- a/src/Engine/Chats/ChatModel.cs
+++ b/src/Engine/Chats/ChatModel.cs
@@ -1,7 +1,7 @@
 /*
  * Smuxi - Smart MUltipleXed Irc
  *
- * Copyright (c) 2005-2008, 2010-2011 Mirco Bauer <meebey meebey net>
+ * Copyright (c) 2005-2008, 2010-2015 Mirco Bauer <meebey meebey net>
  *
  * Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
  *
@@ -40,14 +40,11 @@ namespace Smuxi.Engine
         private IProtocolManager     _ProtocolManager;
         //private List<MessageModel>   _Messages = new List<MessageModel>();
         private bool                 _IsEnabled = true;
-        // TODO: make persistent
-        private DateTime             _LastSeenHighlight;
         private string               _LogFile;
         // TODO: make persistent
         public  int                  Position { get; set; }
         public  IMessageBuffer       MessageBuffer { get; private set; }
         public  int                  MessagesSyncCount { get; set; }
-        public  DateTime             LastSeenMessage { get; set; }
 
         public string ID {
             get {
@@ -130,10 +127,25 @@ namespace Smuxi.Engine
 
         public DateTime LastSeenHighlight {
             get {
-                return _LastSeenHighlight;
+                if (MessageBuffer == null) {
+                    return DateTime.MinValue;
+                }
+                return MessageBuffer.LastSeenHighlight;
+            }
+            set {
+                MessageBuffer.LastSeenHighlight = value;
+            }
+        }
+
+        public DateTime LastSeenMessage {
+            get {
+                if (MessageBuffer == null) {
+                    return DateTime.MinValue;
+                }
+                return MessageBuffer.LastSeenMessage;
             }
             set {
-                _LastSeenHighlight = value;
+                MessageBuffer.LastSeenMessage = value;
             }
         }
 
diff --git a/src/Engine/MessageBuffers/IMessageBuffer.cs b/src/Engine/MessageBuffers/IMessageBuffer.cs
index fcd1cc9..6147188 100644
--- a/src/Engine/MessageBuffers/IMessageBuffer.cs
+++ b/src/Engine/MessageBuffers/IMessageBuffer.cs
@@ -1,6 +1,6 @@
 // Smuxi - Smart MUltipleXed Irc
 //
-// Copyright (c) 2010-2011 Mirco Bauer <meebey meebey net>
+// Copyright (c) 2010-2012, 2015 Mirco Bauer <meebey meebey net>
 //
 // Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
 //
@@ -28,5 +28,7 @@ namespace Smuxi.Engine
         IList<MessageModel> GetRange(int offset, int limit);
         void                Flush();
         int                 MaxCapacity { get; set; }
+        DateTime LastSeenMessage { get; set; }
+        DateTime LastSeenHighlight { get; set; }
     }
 }
diff --git a/src/Engine/MessageBuffers/ListMessageBuffer.cs b/src/Engine/MessageBuffers/ListMessageBuffer.cs
index 511019c..d6958c4 100644
--- a/src/Engine/MessageBuffers/ListMessageBuffer.cs
+++ b/src/Engine/MessageBuffers/ListMessageBuffer.cs
@@ -1,6 +1,6 @@
 // Smuxi - Smart MUltipleXed Irc
 //
-// Copyright (c) 2010-2011 Mirco Bauer <meebey meebey net>
+// Copyright (c) 2010-2011, 2015 Mirco Bauer <meebey meebey net>
 //
 // Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
 //
@@ -28,6 +28,9 @@ namespace Smuxi.Engine
     {
         int f_MaxCapacity;
 
+        public DateTime LastSeenMessage { get; set; }
+        public DateTime LastSeenHighlight { get; set; }
+
         public int MaxCapacity {
             get {
                 return f_MaxCapacity;
diff --git a/src/Engine/MessageBuffers/MessageBufferBase.cs b/src/Engine/MessageBuffers/MessageBufferBase.cs
index ed718b8..d2c5e18 100644
--- a/src/Engine/MessageBuffers/MessageBufferBase.cs
+++ b/src/Engine/MessageBuffers/MessageBufferBase.cs
@@ -1,6 +1,6 @@
 // Smuxi - Smart MUltipleXed Irc
 //
-// Copyright (c) 2011 Mirco Bauer <meebey meebey net>
+// Copyright (c) 2011, 2012, 2014-2015 Mirco Bauer <meebey meebey net>
 //
 // Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
 //
@@ -34,6 +34,8 @@ namespace Smuxi.Engine
         protected string ChatID { get; set; }
         protected string SessionUsername { get; set; }
         public    int    MaxCapacity { get; set; }
+        public virtual DateTime LastSeenMessage { get; set; }
+        public virtual DateTime LastSeenHighlight { get; set; }
 
         public bool IsReadOnly {
             get {
diff --git a/src/Engine/MessageBuffers/SqliteMessageBuffer.cs 
b/src/Engine/MessageBuffers/SqliteMessageBuffer.cs
index cdca285..f86db94 100644
--- a/src/Engine/MessageBuffers/SqliteMessageBuffer.cs
+++ b/src/Engine/MessageBuffers/SqliteMessageBuffer.cs
@@ -50,6 +50,72 @@ namespace Smuxi.Engine
             }
         }
 
+        public override DateTime LastSeenMessage {
+            get {
+                var connection = Connection;
+                if (connection == null) {
+                    return DateTime.MinValue;
+                }
+                using (var cmd = connection.CreateCommand()) {
+                    cmd.CommandText = "SELECT Value FROM Properties WHERE Key = 'LastSeenMessage'";
+                    var value = cmd.ExecuteScalar();
+                    if (value == null) {
+                        return DateTime.MinValue;
+                    }
+                    return DateTime.Parse((string) value).ToUniversalTime();
+                }
+            }
+            set {
+                var connection = Connection;
+                if (connection == null) {
+                    return;
+                }
+                using (var cmd = connection.CreateCommand()) {
+                    var sql = "INSERT OR REPLACE INTO Properties (Key, Value) " +
+                              "VALUES('LastSeenMessage', @timestamp)";
+                    cmd.CommandText = sql;
+                    var param = cmd.CreateParameter();
+                    param.ParameterName = "timestamp";
+                    param.Value = value.ToString("u").Replace(" ", "T");
+                    cmd.Parameters.Add(param);
+                    cmd.ExecuteNonQuery();
+                }
+            }
+        }
+
+        public override DateTime LastSeenHighlight {
+            get {
+                var connection = Connection;
+                if (connection == null) {
+                    return DateTime.MinValue;
+                }
+                using (var cmd = connection.CreateCommand()) {
+                    cmd.CommandText = "SELECT Value FROM Properties WHERE Key = 'LastSeenHighlight'";
+                    var value = cmd.ExecuteScalar();
+                    if (value == null) {
+                        return DateTime.MinValue;
+                    }
+                    return DateTime.Parse((string) value).ToUniversalTime();
+                }
+            }
+            set {
+                var connection = Connection;
+                if (connection == null) {
+                    return;
+                }
+                using (var cmd = connection.CreateCommand()) {
+                    var sql = "INSERT OR REPLACE INTO Properties (Key, Value) " +
+                              "VALUES('LastSeenHighlight', @timestamp)";
+                    cmd.CommandText = sql;
+                    var param = cmd.CreateParameter();
+                    param.ParameterName = "timestamp";
+                    param.Value = value.ToString("u").Replace(" ", "T");
+                    cmd.Parameters.Add(param);
+                    cmd.ExecuteNonQuery();
+                }
+            }
+        }
+
         public override MessageModel this[int offset] {
             get {
                 return GetRange(offset, 1).First();
@@ -96,6 +162,15 @@ namespace Smuxi.Engine
                 cmd.ExecuteNonQuery();
             }
 
+            using (var cmd = Connection.CreateCommand()) {
+                var sql = "CREATE TABLE IF NOT EXISTS Properties (" +
+                              "Key TEXT PRIMARY KEY," +
+                              "Value TEXT" +
+                          ")";
+                cmd.CommandText = sql;
+                cmd.ExecuteNonQuery();
+            }
+
             MessageCount = Count;
         }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]