From 2dcca0772592d1ca9af4b30e167d369bae075e70 Mon Sep 17 00:00:00 2001 From: Lyndon Jetten Date: Wed, 4 Aug 2021 17:04:18 +0200 Subject: [PATCH] Cache optimiert. Maximale Breite von Chatnachrichtlistitem auf 500 gesetzt. --- ChatController/ChatController.csproj | 3 +++ ChatController/ChatKlassen/ChatMessage.cs | 3 +++ ChatController/ChatMainControl.xaml | 2 +- ChatController/Core/OwnChatCache.cs | 25 ++++++++++++++++------ ChatController/HauptKlassen/Chat.cs | 10 +++++++++ ChatController/Utilities/Utils.cs | 4 ++-- PrototypChat/.vs/PrototypChat/v16/.suo | Bin 257536 -> 229888 bytes 7 files changed, 37 insertions(+), 10 deletions(-) diff --git a/ChatController/ChatController.csproj b/ChatController/ChatController.csproj index adde9fb..2e5e772 100644 --- a/ChatController/ChatController.csproj +++ b/ChatController/ChatController.csproj @@ -37,6 +37,9 @@ + + False + ..\libs\Newtonsoft.Json.dll diff --git a/ChatController/ChatKlassen/ChatMessage.cs b/ChatController/ChatKlassen/ChatMessage.cs index bbeb2db..a2c9432 100644 --- a/ChatController/ChatKlassen/ChatMessage.cs +++ b/ChatController/ChatKlassen/ChatMessage.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.Diagnostics; using System.Text.RegularExpressions; using System.Windows; using System.Windows.Media; @@ -275,6 +276,8 @@ namespace ChatController.ChatKlassen { if(IsHyperlink(UserMessage)) { + Debug.WriteLine($"Link: {UserMessage}"); + if(!UserMessage.Contains("http")) { return new Uri("http://" + UserMessage); diff --git a/ChatController/ChatMainControl.xaml b/ChatController/ChatMainControl.xaml index 0774e61..3c687ba 100644 --- a/ChatController/ChatMainControl.xaml +++ b/ChatController/ChatMainControl.xaml @@ -299,7 +299,7 @@ - + diff --git a/ChatController/Core/OwnChatCache.cs b/ChatController/Core/OwnChatCache.cs index 92e6335..cec0077 100644 --- a/ChatController/Core/OwnChatCache.cs +++ b/ChatController/Core/OwnChatCache.cs @@ -66,7 +66,7 @@ namespace ChatController.Core } } - public void AddProfilePictureToCache(string key, ImageSource imageSource) + public void AddProfilePictureToCache(string key, ImageSource imageSource, string profilePicturePath) { lock(_Lock) { @@ -75,17 +75,25 @@ namespace ChatController.Core _ImageSourceCache.Add(key, new ImageSourceCacheStorage()); } - _ImageSourceCache[key].SetCachedProfilePicture(imageSource); + _ImageSourceCache[key].SetCachedProfilePicture(imageSource, profilePicturePath); } } - public ImageSource GetCachedProfilePicture(string key) + public ImageSource GetCachedProfilePicture(string key, string uri) { lock(_Lock) { + foreach (var kvp in _ImageSourceCache) + { + if(!string.IsNullOrWhiteSpace(uri) && uri.ToLower().Contains("ownchat") && kvp.Value.ProfilePicturePath == uri) + { + return kvp.Value.GetCachedProfilePicture(); + } + } + return _ImageSourceCache.ContainsKey(key) ? - _ImageSourceCache[key].GetCachedProfilePicture() : - null; + _ImageSourceCache[key].GetCachedProfilePicture() : + null; } } } @@ -94,15 +102,18 @@ namespace ChatController.Core { private ImageSourceCacheObject _ProfilePicture; + public string ProfilePicturePath { get; set; } + public ImageSource GetCachedProfilePicture() { return _ProfilePicture?.ExpirationDate > DateTime.Now ? _ProfilePicture.Image : null; } - public void SetCachedProfilePicture(ImageSource avatarImageSource) + public void SetCachedProfilePicture(ImageSource avatarImageSource, string profilePicturePath) { - if(avatarImageSource != null) + if(avatarImageSource != null && !string.IsNullOrWhiteSpace(profilePicturePath)) { + ProfilePicturePath = profilePicturePath; _ProfilePicture = new ImageSourceCacheObject(avatarImageSource, CacheCategory.ProfilePicture); } } diff --git a/ChatController/HauptKlassen/Chat.cs b/ChatController/HauptKlassen/Chat.cs index 2f873cd..888e8e7 100644 --- a/ChatController/HauptKlassen/Chat.cs +++ b/ChatController/HauptKlassen/Chat.cs @@ -4,6 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; @@ -145,6 +146,9 @@ namespace ChatController.HauptKlassen client.ExecuteAsync(request, response => { + // TODO: Entfernen + Debug.WriteLine(response.Content); + _UserMessages = JsonConvert.DeserializeObject(response.Content); if (_UserMessages.Response.HasMorePages) @@ -196,6 +200,9 @@ namespace ChatController.HauptKlassen client.ExecuteAsync(request, response => { + // TODO: Entfernen + Debug.WriteLine(response.Content); + _AdditionalUserMessages = null; _AdditionalUserMessages = JsonConvert.DeserializeObject(response.Content); @@ -290,6 +297,9 @@ namespace ChatController.HauptKlassen client.ExecuteAsync(request, response => { + // TODO: Entfernen + Debug.WriteLine(response.Content); + var messageCounter = JsonConvert.DeserializeObject(response.Content); callback?.Invoke(messageCounter.MessageCount); diff --git a/ChatController/Utilities/Utils.cs b/ChatController/Utilities/Utils.cs index de8909f..4519508 100644 --- a/ChatController/Utilities/Utils.cs +++ b/ChatController/Utilities/Utils.cs @@ -30,7 +30,7 @@ namespace ChatController.Utilities { var cache = OwnChatCache.GetInstance(); - var cachedProfileImage = cache.GetCachedProfilePicture(key); + var cachedProfileImage = cache.GetCachedProfilePicture(key, pathToProfilePicture); if(cachedProfileImage != null) { @@ -58,7 +58,7 @@ namespace ChatController.Utilities bitmap.EndInit(); bitmap.Freeze(); - cache.AddProfilePictureToCache(key, bitmap); + cache.AddProfilePictureToCache(key, bitmap, pathToProfilePicture); callback?.Invoke(bitmap); } diff --git a/PrototypChat/.vs/PrototypChat/v16/.suo b/PrototypChat/.vs/PrototypChat/v16/.suo index f1e1a229949b9d215f373017f6c2153ca9535196..06aa56a3815e09d2f3d0464b9d523df4ccdafcfc 100644 GIT binary patch delta 18370 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 ps*fGXD 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 V9