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:
2026-05-10 13:01:00 +02:00
parent cd01fa63a1
commit 699d4ede1d
141 changed files with 8833 additions and 5733 deletions
+120 -36
View File
@@ -1,12 +1,12 @@
using System.Text;
using HellionChat.Code;
using HellionChat.Util;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using System.Text.RegularExpressions;
using Dalamud.Game.Text;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Utility;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using HellionChat.Code;
using HellionChat.Util;
namespace HellionChat;
@@ -33,7 +33,16 @@ public partial class Message
public Dictionary<Guid, float?> Height { get; } = new();
public Dictionary<Guid, bool> IsVisible { get; } = new();
public Message(ulong receiver, ulong contentId, ulong accountId, ChatCode code, List<Chunk> sender, List<Chunk> content, SeString senderSource, SeString contentSource)
public Message(
ulong receiver,
ulong contentId,
ulong accountId,
ChatCode code,
List<Chunk> sender,
List<Chunk> content,
SeString senderSource,
SeString contentSource
)
{
var extraChatChannel = ExtractExtraChatChannel(contentSource);
Receiver = receiver;
@@ -56,7 +65,18 @@ public partial class Message
chunk.Message = this;
}
public Message(Guid id, ulong receiver, ulong contentId, DateTimeOffset date, ChatCode code, List<Chunk> sender, List<Chunk> content, SeString senderSource, SeString contentSource, Guid extraChatChannel)
public Message(
Guid id,
ulong receiver,
ulong contentId,
DateTimeOffset date,
ChatCode code,
List<Chunk> sender,
List<Chunk> content,
SeString senderSource,
SeString contentSource,
Guid extraChatChannel
)
{
Id = id;
Receiver = receiver;
@@ -82,7 +102,11 @@ public partial class Message
return new Message(0, 0, 0, code, [], content, new SeString(), new SeString());
}
public bool Matches(Dictionary<ChatType, (ChatSource Source, ChatSource Target)> channels, bool allExtraChatChannels, HashSet<Guid> extraChatChannels)
public bool Matches(
Dictionary<ChatType, (ChatSource Source, ChatSource Target)> channels,
bool allExtraChatChannels,
HashSet<Guid> extraChatChannels
)
{
if (ExtraChatChannel != Guid.Empty)
return allExtraChatChannels || extraChatChannels.Contains(ExtraChatChannel);
@@ -90,16 +114,21 @@ public partial class Message
var source = (ChatSource)(1 << (int)Code.Source);
var target = (ChatSource)(1 << (int)Code.Target);
return Code.Type.IsGm()
|| channels.TryGetValue(Code.Type, out var sources)
&& (Code.Source is 0 || sources.Source.HasFlag(source) || sources.Target.HasFlag(target));
|| channels.TryGetValue(Code.Type, out var sources)
&& (
Code.Source is 0
|| sources.Source.HasFlag(source)
|| sources.Target.HasFlag(target)
);
}
private int GenerateHash()
{
var hash = SortCodeV2.GetHashCode()
^ ExtraChatChannel.GetHashCode()
^ string.Join("", Sender.Select(c => c.StringValue())).GetHashCode()
^ string.Join("", Content.Select(c => c.StringValue())).GetHashCode();
var hash =
SortCodeV2.GetHashCode()
^ ExtraChatChannel.GetHashCode()
^ string.Join("", Sender.Select(c => c.StringValue())).GetHashCode()
^ string.Join("", Content.Select(c => c.StringValue())).GetHashCode();
if (Plugin.Config.CollapseKeepUniqueLinks)
{
@@ -146,13 +175,15 @@ public partial class Message
}
var nextIsAutoTranslate = false;
var checkForEmotes = (Code.IsPlayerMessage() || extraChatChannel != Guid.Empty) && Plugin.Config.ShowEmotes;
var checkForEmotes =
(Code.IsPlayerMessage() || extraChatChannel != Guid.Empty) && Plugin.Config.ShowEmotes;
foreach (var chunk in oldChunks)
{
// Use as is if it's not a text chunk, it already has a payload, or is auto translate
if (chunk is not TextChunk text || chunk.Link != null || nextIsAutoTranslate)
{
nextIsAutoTranslate = chunk is IconChunk { Icon: BitmapFontIcon.AutoTranslateBegin };
nextIsAutoTranslate =
chunk is IconChunk { Icon: BitmapFontIcon.AutoTranslateBegin };
// No need to call AddChunkWithMessage here since the chunk
// already has the Message field set.
@@ -173,15 +204,23 @@ public partial class Message
var word = wordBuilder.ToString();
wordBuilder.Clear();
var wordUsed = false;
var tokenUsed = false;
if (checkForEmotes && EmoteCache.Exists(word) && !Plugin.Config.BlockedEmotes.Contains(word))
if (
checkForEmotes
&& EmoteCache.Exists(word)
&& !Plugin.Config.BlockedEmotes.Contains(word)
)
{
// Add the previous sentence before adding the emote
AddChunkWithMessage(text.NewWithStyle(chunk, sentenceBuilder.ToString()));
AddChunkWithMessage(new TextChunk(chunk.Source, EmotePayload.ResolveEmote(word), word) { FallbackColour = text.FallbackColour });
AddChunkWithMessage(
new TextChunk(chunk.Source, EmotePayload.ResolveEmote(word), word)
{
FallbackColour = text.FallbackColour,
}
);
wordUsed = true;
sentenceBuilder.Clear();
@@ -190,15 +229,31 @@ public partial class Message
if (token.TokenType == Tokenizer.TokenType.UrlString)
{
// Add the previous sentence before adding the url
AddChunkWithMessage(text.NewWithStyle(chunk.Source, chunk.Link, sentenceBuilder.Append(!wordUsed ? word : "").ToString()));
AddChunkWithMessage(
text.NewWithStyle(
chunk.Source,
chunk.Link,
sentenceBuilder.Append(!wordUsed ? word : "").ToString()
)
);
try
{
AddChunkWithMessage(text.NewWithStyle(chunk.Source, UriPayload.ResolveUri(token.Value), token.Value));
AddChunkWithMessage(
text.NewWithStyle(
chunk.Source,
UriPayload.ResolveUri(token.Value),
token.Value
)
);
}
catch (UriFormatException)
{
AddChunkWithMessage(text.NewWithStyle(chunk.Source, chunk.Link, token.Value));
Plugin.Log.Debug($"Invalid URL accepted by Regex but failed URI parsing: '{token.Value}'");
AddChunkWithMessage(
text.NewWithStyle(chunk.Source, chunk.Link, token.Value)
);
Plugin.Log.Debug(
$"Invalid URL accepted by Regex but failed URI parsing: '{token.Value}'"
);
}
wordUsed = true;
@@ -215,7 +270,12 @@ public partial class Message
}
// End of string reached, we add our leftover
AddChunkWithMessage(text.NewWithStyle(chunk, sentenceBuilder.Append(!wordUsed ? word : "").ToString()));
AddChunkWithMessage(
text.NewWithStyle(
chunk,
sentenceBuilder.Append(!wordUsed ? word : "").ToString()
)
);
}
}
@@ -281,20 +341,30 @@ public partial class Message
< 500_000 => ItemKind.Normal,
< 1_000_000 => ItemKind.Collectible,
< 2_000_000 => ItemKind.Hq,
_ => ItemKind.EventItem
_ => ItemKind.EventItem,
};
var name = kind != ItemKind.EventItem
? Sheets.ItemSheet.GetRow(item.ItemId).Name.ToString()
: Sheets.EventItemSheet.GetRow(item.ItemId).Name.ToString();
var name =
kind != ItemKind.EventItem
? Sheets.ItemSheet.GetRow(item.ItemId).Name.ToString()
: Sheets.EventItemSheet.GetRow(item.ItemId).Name.ToString();
var link = new ItemPayload(item.ItemId, kind, $"{SeIconChar.LinkMarker.ToIconChar()}{name}");
AddChunkWithMessage(text.NewWithStyle(chunk.Source, link, link.DisplayName ?? "Unknown"));
var link = new ItemPayload(
item.ItemId,
kind,
$"{SeIconChar.LinkMarker.ToIconChar()}{name}"
);
AddChunkWithMessage(
text.NewWithStyle(chunk.Source, link, link.DisplayName ?? "Unknown")
);
}
else if (split == "<status>")
{
var statusId = AgentChatLog.Instance()->ContextStatusId;
if (statusId == 0 || !Sheets.StatusSheet.TryGetRow(statusId, out var statusRow))
if (
statusId == 0
|| !Sheets.StatusSheet.TryGetRow(statusId, out var statusRow)
)
{
AddChunkWithMessage(text.NewWithStyle(chunk.Source, chunk.Link, split));
continue;
@@ -305,7 +375,7 @@ public partial class Message
{
1 => $"{SeIconChar.Buff.ToIconString()}{nameValue}",
2 => $"{SeIconChar.Debuff.ToIconString()}{nameValue}",
_ => nameValue
_ => nameValue,
};
var link = new StatusPayload(statusId);
@@ -321,13 +391,27 @@ public partial class Message
}
var mapCoords = agentMap->FlagMapMarkers[0];
var rawX = (int)(MathF.Round(mapCoords.XFloat, 3, MidpointRounding.AwayFromZero) * 1000);
var rawY = (int)(MathF.Round(mapCoords.YFloat, 3, MidpointRounding.AwayFromZero) * 1000);
var rawX = (int)(
MathF.Round(mapCoords.XFloat, 3, MidpointRounding.AwayFromZero) * 1000
);
var rawY = (int)(
MathF.Round(mapCoords.YFloat, 3, MidpointRounding.AwayFromZero) * 1000
);
var link = new MapLinkPayload(mapCoords.TerritoryId, mapCoords.MapId, rawX, rawY);
AddChunkWithMessage(text.NewWithStyle(chunk.Source, link, $"{SeIconChar.LinkMarker.ToIconChar()}{link.PlaceName} {link.CoordinateString}"));
var link = new MapLinkPayload(
mapCoords.TerritoryId,
mapCoords.MapId,
rawX,
rawY
);
AddChunkWithMessage(
text.NewWithStyle(
chunk.Source,
link,
$"{SeIconChar.LinkMarker.ToIconChar()}{link.PlaceName} {link.CoordinateString}"
)
);
}
}
catch (Exception)
{