ChatTwo/ChatTwo/Util/ChunkUtil.cs

125 lines
4.9 KiB
C#
Raw Normal View History

2022-02-15 18:02:46 +00:00
using ChatTwo.Code;
2021-12-29 19:31:45 +00:00
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
2021-12-29 19:44:05 +00:00
namespace ChatTwo.Util;
2021-12-29 19:31:45 +00:00
internal static class ChunkUtil {
2022-02-13 09:36:08 +00:00
internal static IEnumerable<Chunk> ToChunks(SeString msg, ChunkSource source, ChatType? defaultColour) {
2021-12-29 19:31:45 +00:00
var chunks = new List<Chunk>();
var italic = false;
var foreground = new Stack<uint>();
var glow = new Stack<uint>();
2021-12-29 19:44:05 +00:00
Payload? link = null;
2021-12-29 19:31:45 +00:00
void Append(string text) {
2022-02-13 09:36:08 +00:00
chunks.Add(new TextChunk(source, link, text) {
2021-12-29 19:31:45 +00:00
FallbackColour = defaultColour,
Foreground = foreground.Count > 0 ? foreground.Peek() : null,
Glow = glow.Count > 0 ? glow.Peek() : null,
Italic = italic,
});
}
foreach (var payload in msg.Payloads) {
switch (payload.Type) {
case PayloadType.EmphasisItalic:
var newStatus = ((EmphasisItalicPayload) payload).IsEnabled;
italic = newStatus;
break;
case PayloadType.UIForeground:
var foregroundPayload = (UIForegroundPayload) payload;
if (foregroundPayload.IsEnabled) {
foreground.Push(foregroundPayload.UIColor.UIForeground);
} else if (foreground.Count > 0) {
foreground.Pop();
}
break;
case PayloadType.UIGlow:
var glowPayload = (UIGlowPayload) payload;
if (glowPayload.IsEnabled) {
glow.Push(glowPayload.UIColor.UIGlow);
} else if (glow.Count > 0) {
glow.Pop();
}
break;
case PayloadType.AutoTranslateText:
2022-02-13 09:36:08 +00:00
chunks.Add(new IconChunk(source, link, BitmapFontIcon.AutoTranslateBegin));
2021-12-29 19:31:45 +00:00
var autoText = ((AutoTranslatePayload) payload).Text;
Append(autoText.Substring(2, autoText.Length - 4));
2022-02-13 09:36:08 +00:00
chunks.Add(new IconChunk(source, link, BitmapFontIcon.AutoTranslateEnd));
2021-12-29 19:31:45 +00:00
break;
case PayloadType.Icon:
2022-02-13 09:36:08 +00:00
chunks.Add(new IconChunk(source, link, ((IconPayload) payload).Icon));
2021-12-29 19:44:05 +00:00
break;
case PayloadType.MapLink:
case PayloadType.Quest:
case PayloadType.DalamudLink:
case PayloadType.Status:
case PayloadType.Item:
case PayloadType.Player:
link = payload;
2021-12-29 19:31:45 +00:00
break;
2023-02-28 01:23:15 +00:00
case PayloadType.PartyFinder:
link = payload;
break;
2021-12-29 19:31:45 +00:00
case PayloadType.Unknown:
var rawPayload = (RawPayload) payload;
2022-01-16 06:29:44 +00:00
if (rawPayload.Data.Length > 1 && rawPayload.Data[1] == 0x13) {
2023-05-25 17:49:58 +00:00
if (foreground.Count > 0) {
foreground.Pop();
}
if (glow.Count > 0) {
glow.Pop();
}
} else if (rawPayload.Data.Length > 7 && rawPayload.Data[1] == 0x27 && rawPayload.Data[3] == 0x0A) {
// pf payload
var reader = new BinaryReader(new MemoryStream(rawPayload.Data[4..]));
var id = GetInteger(reader);
link = new PartyFinderPayload(id);
2022-02-04 00:19:27 +00:00
} else if (rawPayload.Data.Length > 5 && rawPayload.Data[1] == 0x27 && rawPayload.Data[3] == 0x06) {
// achievement payload
var reader = new BinaryReader(new MemoryStream(rawPayload.Data[4..]));
var id = GetInteger(reader);
link = new AchievementPayload(id);
2021-12-30 02:53:44 +00:00
} else if (Equals(rawPayload, RawPayload.LinkTerminator)) {
2021-12-29 19:44:05 +00:00
link = null;
2021-12-29 19:31:45 +00:00
}
break;
default:
if (payload is ITextProvider textProvider) {
Append(textProvider.Text);
}
break;
}
}
return chunks;
}
2022-01-11 06:58:32 +00:00
internal static readonly RawPayload PeriodicRecruitmentLink = new(new byte[] {
0x02, 0x27, 0x07, 0x08, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x03,
});
2022-01-31 01:31:04 +00:00
private static uint GetInteger(BinaryReader input) {
var num1 = (uint) input.ReadByte();
if (num1 < 208U) {
return num1 - 1U;
}
var num2 = (uint) ((int) num1 + 1 & 15);
var numArray = new byte[4];
for (var index = 3; index >= 0; --index) {
numArray[index] = (num2 & 1 << index) == 0L ? (byte) 0 : input.ReadByte();
}
return BitConverter.ToUInt32(numArray, 0);
}
2021-12-29 19:31:45 +00:00
}