From e4fb9eeb52c05cdcc18aed3c5bde029ce335f630 Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 18 Dec 2024 10:00:25 +0800 Subject: [PATCH] refactor: built-in default avatar --- src/Models/AvatarManager.cs | 16 ++++++++++++---- src/Resources/Images/unreal.png | Bin 0 -> 16030 bytes 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 src/Resources/Images/unreal.png diff --git a/src/Models/AvatarManager.cs b/src/Models/AvatarManager.cs index 313553f9..9f0bceaf 100644 --- a/src/Models/AvatarManager.cs +++ b/src/Models/AvatarManager.cs @@ -35,7 +35,7 @@ namespace SourceGit.Models private static AvatarManager _instance = null; - [GeneratedRegex(@"^(?:(\d+)\+)?(.+?)@users\.noreply\.github\.com$")] + [GeneratedRegex(@"^(?:(\d+)\+)?(.+?)@.+\.github\.com$")] private static partial Regex REG_GITHUB_USER_EMAIL(); private object _synclock = new object(); @@ -43,6 +43,7 @@ namespace SourceGit.Models private List _avatars = new List(); private Dictionary _resources = new Dictionary(); private HashSet _requesting = new HashSet(); + private HashSet _defaultAvatars = new HashSet(); public void Start() { @@ -50,8 +51,8 @@ namespace SourceGit.Models if (!Directory.Exists(_storePath)) Directory.CreateDirectory(_storePath); - var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Images/github.png", UriKind.RelativeOrAbsolute)); - _resources.Add("noreply@github.com", new Bitmap(icon)); + LoadDefaultAvatar("noreply@github.com", "github.png"); + LoadDefaultAvatar("unrealbot@epicgames.com", "unreal.png"); Task.Run(() => { @@ -140,7 +141,7 @@ namespace SourceGit.Models { if (forceRefetch) { - if (email.Equals("noreply@github.com", StringComparison.Ordinal)) + if (_defaultAvatars.Contains(email)) return null; if (_resources.ContainsKey(email)) @@ -185,6 +186,13 @@ namespace SourceGit.Models return null; } + private void LoadDefaultAvatar(string key, string img) + { + var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Images/{img}", UriKind.RelativeOrAbsolute)); + _resources.Add(key, new Bitmap(icon)); + _defaultAvatars.Add(key); + } + private string GetEmailHash(string email) { var lowered = email.ToLower(CultureInfo.CurrentCulture).Trim(); diff --git a/src/Resources/Images/unreal.png b/src/Resources/Images/unreal.png new file mode 100644 index 0000000000000000000000000000000000000000..0401cde9a9193c64acb96e2823eb1a863d9e9633 GIT binary patch literal 16030 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