feat: add links to chunks

This commit is contained in:
Anna
2021-12-29 14:44:05 -05:00
parent f17a913405
commit 1d9581abca
4 changed files with 34 additions and 11 deletions
+8 -3
View File
@@ -4,6 +4,11 @@ using Dalamud.Game.Text.SeStringHandling;
namespace ChatTwo; namespace ChatTwo;
internal abstract class Chunk { internal abstract class Chunk {
internal Payload? Link;
protected Chunk(Payload? link) {
this.Link = link;
}
} }
internal class TextChunk : Chunk { internal class TextChunk : Chunk {
@@ -13,11 +18,11 @@ internal class TextChunk : Chunk {
internal bool Italic { get; set; } internal bool Italic { get; set; }
internal string Content { get; set; } internal string Content { get; set; }
internal TextChunk(string content) { internal TextChunk(Payload? link, string content) : base(link) {
this.Content = content; this.Content = content;
} }
internal TextChunk(ChatType? fallbackColour, uint? foreground, uint? glow, bool italic, string content) { internal TextChunk(Payload? link, ChatType? fallbackColour, uint? foreground, uint? glow, bool italic, string content) : base(link) {
this.FallbackColour = fallbackColour; this.FallbackColour = fallbackColour;
this.Foreground = foreground; this.Foreground = foreground;
this.Glow = glow; this.Glow = glow;
@@ -29,7 +34,7 @@ internal class TextChunk : Chunk {
internal class IconChunk : Chunk { internal class IconChunk : Chunk {
internal BitmapFontIcon Icon; internal BitmapFontIcon Icon;
public IconChunk(BitmapFontIcon icon) { public IconChunk(Payload? link, BitmapFontIcon icon) : base(link) {
this.Icon = icon; this.Icon = icon;
} }
} }
+2 -2
View File
@@ -86,11 +86,11 @@ internal class Store : IDisposable {
var senderChunks = new List<Chunk>(); var senderChunks = new List<Chunk>();
if (formatting is { IsPresent: true }) { if (formatting is { IsPresent: true }) {
senderChunks.Add(new TextChunk(formatting.Before) { senderChunks.Add(new TextChunk(null, formatting.Before) {
FallbackColour = chatCode.Type, FallbackColour = chatCode.Type,
}); });
senderChunks.AddRange(ChunkUtil.ToChunks(sender, chatCode.Type)); senderChunks.AddRange(ChunkUtil.ToChunks(sender, chatCode.Type));
senderChunks.Add(new TextChunk(formatting.After) { senderChunks.Add(new TextChunk(null, formatting.After) {
FallbackColour = chatCode.Type, FallbackColour = chatCode.Type,
}); });
} }
+1 -1
View File
@@ -87,7 +87,7 @@ internal sealed class ChatLog : IUiComponent {
if (tab.DisplayTimestamp) { if (tab.DisplayTimestamp) {
var timestamp = message.Date.ToLocalTime().ToString("t"); var timestamp = message.Date.ToLocalTime().ToString("t");
this.DrawChunk(new TextChunk($"[{timestamp}]") { this.DrawChunk(new TextChunk(null, $"[{timestamp}]") {
Foreground = 0xFFFFFFFF, Foreground = 0xFFFFFFFF,
}); });
ImGui.SameLine(); ImGui.SameLine();
+23 -5
View File
@@ -1,8 +1,9 @@
using ChatTwo.Code; using ChatTwo.Code;
using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Logging;
namespace ChatTwo.Util; namespace ChatTwo.Util;
internal static class ChunkUtil { internal static class ChunkUtil {
internal static IEnumerable<Chunk> ToChunks(SeString msg, ChatType? defaultColour) { internal static IEnumerable<Chunk> ToChunks(SeString msg, ChatType? defaultColour) {
@@ -11,9 +12,10 @@ internal static class ChunkUtil {
var italic = false; var italic = false;
var foreground = new Stack<uint>(); var foreground = new Stack<uint>();
var glow = new Stack<uint>(); var glow = new Stack<uint>();
Payload? link = null;
void Append(string text) { void Append(string text) {
chunks.Add(new TextChunk(text) { chunks.Add(new TextChunk(link, text) {
FallbackColour = defaultColour, FallbackColour = defaultColour,
Foreground = foreground.Count > 0 ? foreground.Peek() : null, Foreground = foreground.Count > 0 ? foreground.Peek() : null,
Glow = glow.Count > 0 ? glow.Peek() : null, Glow = glow.Count > 0 ? glow.Peek() : null,
@@ -21,7 +23,13 @@ internal static class ChunkUtil {
}); });
} }
PluginLog.Log("");
foreach (var payload in msg.Payloads) { foreach (var payload in msg.Payloads) {
PluginLog.Log(payload.Type.ToString());
if (payload.Type == PayloadType.Unknown) {
PluginLog.Log(payload.Encode().Select(b => b.ToString("x2")).Aggregate(string.Concat));
}
switch (payload.Type) { switch (payload.Type) {
case PayloadType.EmphasisItalic: case PayloadType.EmphasisItalic:
var newStatus = ((EmphasisItalicPayload) payload).IsEnabled; var newStatus = ((EmphasisItalicPayload) payload).IsEnabled;
@@ -46,19 +54,29 @@ internal static class ChunkUtil {
break; break;
case PayloadType.AutoTranslateText: case PayloadType.AutoTranslateText:
chunks.Add(new IconChunk(BitmapFontIcon.AutoTranslateBegin)); chunks.Add(new IconChunk(link, BitmapFontIcon.AutoTranslateBegin));
var autoText = ((AutoTranslatePayload) payload).Text; var autoText = ((AutoTranslatePayload) payload).Text;
Append(autoText.Substring(2, autoText.Length - 4)); Append(autoText.Substring(2, autoText.Length - 4));
chunks.Add(new IconChunk(BitmapFontIcon.AutoTranslateEnd)); chunks.Add(new IconChunk(link, BitmapFontIcon.AutoTranslateEnd));
break; break;
case PayloadType.Icon: case PayloadType.Icon:
chunks.Add(new IconChunk(((IconPayload) payload).Icon)); chunks.Add(new IconChunk(link, ((IconPayload) payload).Icon));
break;
case PayloadType.MapLink:
case PayloadType.Quest:
case PayloadType.DalamudLink:
case PayloadType.Status:
case PayloadType.Item:
case PayloadType.Player:
link = payload;
break; break;
case PayloadType.Unknown: case PayloadType.Unknown:
var rawPayload = (RawPayload) payload; var rawPayload = (RawPayload) payload;
if (rawPayload.Data[1] == 0x13) { if (rawPayload.Data[1] == 0x13) {
foreground.Pop(); foreground.Pop();
glow.Pop(); glow.Pop();
} else if (rawPayload == RawPayload.LinkTerminator) {
link = null;
} }
break; break;