chore: housekeeping — linter & formatter setup
Add .prettierrc.json, .markdownlint.json, .yamllint.yaml, .gitattributes Run CSharpier, Prettier and markdownlint across the entire codebase. No logic changes — formatting, using order and line endings only.
This commit is contained in:
+67
-23
@@ -2,10 +2,10 @@
|
||||
using System.Numerics;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using Dalamud.Bindings.ImGui;
|
||||
using Dalamud.Interface.Textures;
|
||||
using Dalamud.Interface.Textures.TextureWraps;
|
||||
using Dalamud.Utility;
|
||||
using Dalamud.Bindings.ImGui;
|
||||
using SixLabors.ImageSharp;
|
||||
using SixLabors.ImageSharp.PixelFormats;
|
||||
|
||||
@@ -15,11 +15,31 @@ public static class EmoteCache
|
||||
{
|
||||
private static readonly string[] NotWorking =
|
||||
[
|
||||
":tf:", "(ditto)", "c!", "h!", "l!", "M&Mjc", "LUL3D", "p!",
|
||||
"POLICE2", "r!", "Pussy", "s!", "v!", "w!", "x0r6ztGiggle",
|
||||
"z!", "xar2EDM", "iron95Pls", "Clap2", "AlienPls3", "Life",
|
||||
"peepoPogClimbingTreeHard4House", "monkaGIGAftRobertDowneyJr",
|
||||
"DogLookingSussyAndCold", "DICKS"
|
||||
":tf:",
|
||||
"(ditto)",
|
||||
"c!",
|
||||
"h!",
|
||||
"l!",
|
||||
"M&Mjc",
|
||||
"LUL3D",
|
||||
"p!",
|
||||
"POLICE2",
|
||||
"r!",
|
||||
"Pussy",
|
||||
"s!",
|
||||
"v!",
|
||||
"w!",
|
||||
"x0r6ztGiggle",
|
||||
"z!",
|
||||
"xar2EDM",
|
||||
"iron95Pls",
|
||||
"Clap2",
|
||||
"AlienPls3",
|
||||
"Life",
|
||||
"peepoPogClimbingTreeHard4House",
|
||||
"monkaGIGAftRobertDowneyJr",
|
||||
"DogLookingSussyAndCold",
|
||||
"DICKS",
|
||||
];
|
||||
|
||||
private static readonly HttpClient Client = new();
|
||||
@@ -56,7 +76,7 @@ public static class EmoteCache
|
||||
{
|
||||
Unloaded,
|
||||
Loading,
|
||||
Done
|
||||
Done,
|
||||
}
|
||||
|
||||
// All of this data is uninitalized while State is not `LoadingState.Done`
|
||||
@@ -80,11 +100,16 @@ public static class EmoteCache
|
||||
|
||||
internal static void TrackLoad(Task loadTask, string emoteCode)
|
||||
{
|
||||
PendingLoads.Add(loadTask.ContinueWith(t =>
|
||||
{
|
||||
if (t.IsFaulted)
|
||||
Plugin.Log.Error(t.Exception!, $"EmoteCache load failed for {emoteCode}");
|
||||
}, TaskScheduler.Default));
|
||||
PendingLoads.Add(
|
||||
loadTask.ContinueWith(
|
||||
t =>
|
||||
{
|
||||
if (t.IsFaulted)
|
||||
Plugin.Log.Error(t.Exception!, $"EmoteCache load failed for {emoteCode}");
|
||||
},
|
||||
TaskScheduler.Default
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public static async Task LoadData()
|
||||
@@ -121,7 +146,10 @@ public static class EmoteCache
|
||||
// load. Skip them defensively so a single bad row no longer
|
||||
// breaks the cache for everyone else.
|
||||
foreach (var emote in jsonList)
|
||||
if (!string.IsNullOrEmpty(emote.Emote.Code) && !NotWorking.Contains(emote.Emote.Code))
|
||||
if (
|
||||
!string.IsNullOrEmpty(emote.Emote.Code)
|
||||
&& !NotWorking.Contains(emote.Emote.Code)
|
||||
)
|
||||
Cache.TryAdd(emote.Emote.Code, emote.Emote);
|
||||
|
||||
lastId = jsonList.Last().Id;
|
||||
@@ -225,13 +253,19 @@ public static class EmoteCache
|
||||
// upstream could still hand us "../foo" and write into the
|
||||
// pluginConfigs root (or worse). Resolve the candidate path and
|
||||
// refuse anything that escapes the cache directory.
|
||||
var dir = Path.GetFullPath(Path.Join(Plugin.Interface.ConfigDirectory.FullName, "EmoteCacheV1"));
|
||||
var dir = Path.GetFullPath(
|
||||
Path.Join(Plugin.Interface.ConfigDirectory.FullName, "EmoteCacheV1")
|
||||
);
|
||||
Directory.CreateDirectory(dir);
|
||||
|
||||
var dirPrefix = dir.EndsWith(Path.DirectorySeparatorChar) ? dir : dir + Path.DirectorySeparatorChar;
|
||||
var dirPrefix = dir.EndsWith(Path.DirectorySeparatorChar)
|
||||
? dir
|
||||
: dir + Path.DirectorySeparatorChar;
|
||||
var filePath = Path.GetFullPath(Path.Join(dir, $"{emote.Id}.{emote.ImageType}"));
|
||||
if (!filePath.StartsWith(dirPrefix, StringComparison.Ordinal))
|
||||
throw new InvalidOperationException($"Emote path escapes cache directory: id={emote.Id}, type={emote.ImageType}");
|
||||
throw new InvalidOperationException(
|
||||
$"Emote path escapes cache directory: id={emote.Id}, type={emote.ImageType}"
|
||||
);
|
||||
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
@@ -242,7 +276,12 @@ public static class EmoteCache
|
||||
var content = await Client.GetAsync(EmotePath.Format(emote.Id), ct);
|
||||
RawData = await content.Content.ReadAsByteArrayAsync(ct);
|
||||
|
||||
await using var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Read);
|
||||
await using var stream = new FileStream(
|
||||
filePath,
|
||||
FileMode.Create,
|
||||
FileAccess.Write,
|
||||
FileShare.Read
|
||||
);
|
||||
await stream.WriteAsync(RawData, ct);
|
||||
}
|
||||
|
||||
@@ -271,12 +310,13 @@ public static class EmoteCache
|
||||
return;
|
||||
|
||||
ct.ThrowIfCancellationRequested();
|
||||
Texture = await Plugin.TextureProvider.CreateFromImageAsync(image, cancellationToken: ct);
|
||||
Texture = await Plugin.TextureProvider.CreateFromImageAsync(
|
||||
image,
|
||||
cancellationToken: ct
|
||||
);
|
||||
IsLoaded = true;
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
}
|
||||
catch (OperationCanceledException) { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
Failed = true;
|
||||
@@ -363,7 +403,11 @@ public static class EmoteCache
|
||||
|
||||
var buffer = new byte[4 * frame.Width * frame.Height];
|
||||
frame.CopyPixelDataTo(buffer);
|
||||
var tex = await Plugin.TextureProvider.CreateFromRawAsync(RawImageSpecification.Rgba32(frame.Width, frame.Height), buffer, cancellationToken: ct);
|
||||
var tex = await Plugin.TextureProvider.CreateFromRawAsync(
|
||||
RawImageSpecification.Rgba32(frame.Width, frame.Height),
|
||||
buffer,
|
||||
cancellationToken: ct
|
||||
);
|
||||
frames.Add((tex, delay));
|
||||
}
|
||||
|
||||
@@ -385,4 +429,4 @@ public static class EmoteCache
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user