Avatar update fixes for the contributions form.

This commit is contained in:
EternalModz
2026-01-26 01:22:52 -08:00
parent 9a1846f285
commit 9e247c403c
3 changed files with 65 additions and 38 deletions

View File

@@ -121,15 +121,6 @@
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 48</value>
</data>
<data name="&gt;&gt;contextMenuStrip1.Name" xml:space="preserve">
<value>contextMenuStrip1</value>
</data>
<data name="&gt;&gt;contextMenuStrip1.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="addDisplayIDToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>162, 22</value>
</data>
@@ -142,18 +133,18 @@
<data name="deleteDisplayIDToolStripMenuItem.Text" xml:space="preserve">
<value>Delete Display ID</value>
</data>
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 48</value>
</data>
<data name="&gt;&gt;contextMenuStrip1.Name" xml:space="preserve">
<value>contextMenuStrip1</value>
</data>
<data name="&gt;&gt;contextMenuStrip1.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<metadata name="GridContextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>172, 17</value>
</metadata>
<data name="GridContextMenu.Size" type="System.Drawing.Size, System.Drawing">
<value>173, 48</value>
</data>
<data name="&gt;&gt;GridContextMenu.Name" xml:space="preserve">
<value>GridContextMenu</value>
</data>
<data name="&gt;&gt;GridContextMenu.Type" xml:space="preserve">
<value>MetroFramework.Controls.MetroContextMenu, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a</value>
</data>
<data name="addLanguageToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>172, 22</value>
</data>
@@ -166,6 +157,15 @@
<data name="removeLanguageToolStripMenuItem.Text" xml:space="preserve">
<value>Remove Language</value>
</data>
<data name="GridContextMenu.Size" type="System.Drawing.Size, System.Drawing">
<value>173, 48</value>
</data>
<data name="&gt;&gt;GridContextMenu.Name" xml:space="preserve">
<value>GridContextMenu</value>
</data>
<data name="&gt;&gt;GridContextMenu.Type" xml:space="preserve">
<value>MetroFramework.Controls.MetroContextMenu, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a</value>
</data>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>321, 17</value>
</metadata>
@@ -333,6 +333,12 @@
<data name="locSort.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="buttonReplaceAll" Row="1" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;Control Name="dataGridViewLocEntryData" Row="2" RowSpan="1" Column="1" ColumnSpan="2" /&gt;&lt;Control Name="menuStrip" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="textBoxReplaceAll" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="treeViewLocKeys" Row="1" RowSpan="2" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Absolute,350,Percent,100,AutoSize,0" /&gt;&lt;Rows Styles="Absolute,23,AutoSize,0,Percent,100,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="saveToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>98, 22</value>
</data>
<data name="saveToolStripMenuItem.Text" xml:space="preserve">
<value>Save</value>
</data>
<data name="fileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>37, 19</value>
</data>
@@ -360,12 +366,6 @@
<data name="&gt;&gt;menuStrip.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="saveToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>180, 22</value>
</data>
<data name="saveToolStripMenuItem.Text" xml:space="preserve">
<value>Save</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>

View File

@@ -1318,7 +1318,7 @@
<value>False</value>
</data>
<data name="fullBoxSupportToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>180, 22</value>
<value>160, 22</value>
</data>
<data name="fullBoxSupportToolStripMenuItem.Text" xml:space="preserve">
<value>Full Box Support</value>
@@ -1571,7 +1571,7 @@
</value>
</data>
<data name="openPckManagerToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>180, 22</value>
<value>161, 22</value>
</data>
<data name="openPckManagerToolStripMenuItem.Text" xml:space="preserve">
<value>Pck Manager</value>
@@ -1589,7 +1589,7 @@
<value>Binka -&gt; Wav</value>
</data>
<data name="convertMusicFilesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>180, 22</value>
<value>161, 22</value>
</data>
<data name="convertMusicFilesToolStripMenuItem.Text" xml:space="preserve">
<value>Audio Converter</value>
@@ -4025,7 +4025,7 @@
<value>True</value>
</data>
<data name="LittleEndianCheckBox.Location" type="System.Drawing.Point, System.Drawing">
<value>1014, 14</value>
<value>1014, 13</value>
</data>
<data name="LittleEndianCheckBox.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>

View File

@@ -42,23 +42,50 @@ namespace PckStudio.ToolboxItems
private void LoadAuthor()
{
// TODO: find a better way to check if the avatar has changed since last cache.
string cacheKey = Convert.ToBase64String(Encoding.Default.GetBytes(_contributor.AvatarUrl));
// This should fix avatars not updating when changed on GitHub :3
// Cache by stable user id, not by URL
string cacheKey = $"gh-avatar-{_contributor.Id}";
string cachedPath = ApplicationScope.DataCacher.GetCachedFilepath(cacheKey);
if (!ApplicationScope.DataCacher.HasFileCached(cacheKey))
// Refresh avatars periodically
bool needsRefresh = true;
if (ApplicationScope.DataCacher.HasFileCached(cacheKey))
{
try
{
var age = DateTime.UtcNow - File.GetLastWriteTimeUtc(cachedPath);
needsRefresh = age > TimeSpan.FromDays(1); // refresh daily
}
catch
{
needsRefresh = true;
}
}
if (needsRefresh)
{
using (WebClient webClient = new WebClient())
{
Stream avatarImgStream = webClient.OpenRead(_contributor.AvatarUrl);
MemoryStream ms = new MemoryStream();
new Bitmap(avatarImgStream).Save(ms, ImageFormat.Png);
avatarImgStream.Flush();
avatarImgStream.Dispose();
ApplicationScope.DataCacher.Cache(ms.ToArray(), cacheKey);
webClient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
webClient.Headers.Add(HttpRequestHeader.Pragma, "no-cache");
webClient.Headers.Add(HttpRequestHeader.UserAgent, "PckStudio");
string url = _contributor.AvatarUrl;
string sep = url.Contains("?") ? "&" : "?";
string fetchUrl = url + sep + "cb=" + DateTimeOffset.UtcNow.ToUnixTimeSeconds();
byte[] bytes = webClient.DownloadData(fetchUrl);
ApplicationScope.DataCacher.Cache(bytes, cacheKey);
cachedPath = ApplicationScope.DataCacher.GetCachedFilepath(cacheKey);
}
}
Image avatarUserImg = Image.FromFile(ApplicationScope.DataCacher.GetCachedFilepath(cacheKey));
// Load without locking the file on disk
Image avatarUserImg;
using (var fs = new FileStream(cachedPath, System.IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var temp = Image.FromStream(fs))
{
avatarUserImg = (Image)temp.Clone();
}
Action setUiElements = () =>
{