From d6214bc893fa52eba726e483ed2d1d10404cdbcc Mon Sep 17 00:00:00 2001 From: Anna Date: Sat, 3 Sep 2022 22:52:18 -0400 Subject: [PATCH] hmm? --- client/Messages.cs | 29 ++++++--- client/PluginUi.cs | 143 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 161 insertions(+), 11 deletions(-) diff --git a/client/Messages.cs b/client/Messages.cs index a3788d8..40b769d 100644 --- a/client/Messages.cs +++ b/client/Messages.cs @@ -10,9 +10,8 @@ internal class Messages : IDisposable { private Plugin Plugin { get; } private SemaphoreSlim CurrentMutex { get; } = new(1, 1); - private Message[] Current { get; set; } = Array.Empty(); + private Dictionary Current { get; } = new(); private Queue SpawnQueue { get; } = new(); - private Queue RemoveQueue { get; } = new(); internal Messages(Plugin plugin) { this.Plugin = plugin; @@ -39,7 +38,9 @@ internal class Messages : IDisposable { return; } - this.Plugin.Vfx.SpawnStatic(VfxPath, message.Position); + if (this.Plugin.Vfx.SpawnStatic(VfxPath, message.Position) == null) { + this.SpawnQueue.Enqueue(message); + } } private void SpawnVfx(object? sender, EventArgs e) { @@ -64,12 +65,14 @@ internal class Messages : IDisposable { var messages = JsonConvert.DeserializeObject(json)!; await this.CurrentMutex.WaitAsync(); - this.Current = messages; - this.CurrentMutex.Release(); + this.Current.Clear(); foreach (var message in messages) { + this.Current[message.Id] = message; this.SpawnQueue.Enqueue(message); } + + this.CurrentMutex.Release(); }); } @@ -77,16 +80,26 @@ internal class Messages : IDisposable { this.Plugin.Vfx.RemoveAll(); } - internal Message[] Nearby() { + internal IEnumerable Nearby() { if (this.Plugin.ClientState.LocalPlayer is not { } player) { return Array.Empty(); } var position = player.Position; - return this.Current + this.CurrentMutex.Wait(); + var nearby = this.Current + .Values .Where(msg => Math.Abs(msg.Position.Y - position.Y) < 1f) .Where(msg => Vector3.Distance(msg.Position, position) < 5f) - .ToArray(); + .ToList(); + this.CurrentMutex.Release(); + + return nearby; + } + + internal void Add(Message message) { + this.Current[message.Id] = message; + this.SpawnQueue.Enqueue(message); } } diff --git a/client/PluginUi.cs b/client/PluginUi.cs index 9e7e672..77a836b 100644 --- a/client/PluginUi.cs +++ b/client/PluginUi.cs @@ -1,6 +1,7 @@ using System.Net.Http.Headers; using System.Numerics; using System.Text; +using Dalamud.Interface; using Dalamud.Logging; using ImGuiNET; using Newtonsoft.Json; @@ -10,6 +11,9 @@ namespace OrangeGuidanceTomestone; public class PluginUi : IDisposable { private Plugin Plugin { get; } + internal bool WriterVisible; + internal bool ViewerVisible; + private int _pack; private int _part1 = -1; @@ -31,7 +35,17 @@ public class PluginUi : IDisposable { } private void Draw() { - if (!ImGui.Begin("Orange Guidance Tomestone")) { + this.DrawWriter(); + this.DrawViewerButton(); + this.DrawViewer(); + } + + private void DrawWriter() { + if (!this.WriterVisible) { + return; + } + + if (!ImGui.Begin(this.Plugin.Name, ref this.WriterVisible)) { ImGui.End(); return; } @@ -104,6 +118,7 @@ public class PluginUi : IDisposable { var pack = Pack.All.Value[this._pack]; + var actualText = string.Empty; if (this._part1 == -1) { ImGui.TextUnformatted(placeholder); } else { @@ -129,7 +144,8 @@ public class PluginUi : IDisposable { } } - ImGui.TextUnformatted(preview.ToString()); + actualText = preview.ToString(); + ImGui.TextUnformatted(actualText); } ImGui.Separator(); @@ -181,7 +197,21 @@ public class PluginUi : IDisposable { content.Headers.Add("X-Api-Key", this.Plugin.Config.ApiKey); - await new HttpClient().PostAsync("https://tryfingerbuthole.anna.lgbt/messages", content); + var resp = await new HttpClient().PostAsync("https://tryfingerbuthole.anna.lgbt/messages", content); + var id = await resp.Content.ReadAsStringAsync(); + if (resp.IsSuccessStatusCode) { + var newMsg = new Message { + Id = Guid.Parse(id), + X = player.Position.X, + Y = player.Position.Y, + Z = player.Position.Z, + Text = actualText, + NegativeVotes = 0, + PositiveVotes = 0, + }; + + this.Plugin.Messages.Add(newMsg); + } }); } @@ -254,4 +284,111 @@ public class PluginUi : IDisposable { return true; } + + private void DrawViewerButton() { + if (this.ViewerVisible) { + return; + } + + var nearby = this.Plugin.Messages.Nearby().ToList(); + if (nearby.Count == 0) { + return; + } + + ImGui.SetNextWindowBgAlpha(0.5f); + if (!ImGui.Begin("##ogt-viewer-button", ImGuiWindowFlags.NoTitleBar)) { + ImGui.End(); + return; + } + + var label = "View message"; + if (nearby.Count > 1) { + label += "s"; + } + + if (ImGui.Button(label)) { + this.ViewerVisible = true; + } + + ImGui.End(); + } + + private int _viewerIdx; + + private void DrawViewer() { + if (!this.ViewerVisible) { + return; + } + + if (!ImGui.Begin("Messages", ref this.ViewerVisible)) { + ImGui.End(); + return; + } + + if (ImGui.IsWindowAppearing()) { + this._viewerIdx = 0; + } + + var nearby = this.Plugin.Messages.Nearby() + .OrderBy(msg => msg.Id) + .ToList(); + if (nearby.Count == 0) { + ImGui.TextUnformatted("No nearby messages"); + goto End; + } + + if (!ImGui.BeginTable("##viewer-table", 3)) { + goto End; + } + + ImGui.TableSetupColumn("##prev-arrow", ImGuiTableColumnFlags.WidthFixed); + ImGui.TableSetupColumn("##content", ImGuiTableColumnFlags.WidthStretch); + ImGui.TableSetupColumn("##next-arrow", ImGuiTableColumnFlags.WidthFixed); + ImGui.TableNextRow(); + + if (ImGui.TableSetColumnIndex(0)) { + var height = ImGui.GetContentRegionAvail().Y; + var buttonHeight = ImGuiHelpers.GetButtonSize("<").Y; + ImGui.Dummy(new Vector2(1, height / 2 - buttonHeight / 2)); + if (this._viewerIdx == 0) { + ImGui.BeginDisabled(); + } + + if (ImGui.Button("<")) { + this._viewerIdx -= 1; + } + + if (this._viewerIdx == 0) { + ImGui.EndDisabled(); + } + } + + if (ImGui.TableSetColumnIndex(1) && this._viewerIdx > 0 && this._viewerIdx < nearby.Count) { + var message = nearby[this._viewerIdx]; + ImGui.TextUnformatted(message.Text); + } + + if (ImGui.TableSetColumnIndex(2)) { + var height = ImGui.GetContentRegionAvail().Y; + var buttonHeight = ImGuiHelpers.GetButtonSize(">").Y; + ImGui.Dummy(new Vector2(1, height / 2 - buttonHeight / 2)); + + if (this._viewerIdx == nearby.Count - 1) { + ImGui.BeginDisabled(); + } + + if (ImGui.Button(">")) { + this._viewerIdx += 1; + } + + if (this._viewerIdx == nearby.Count - 1) { + ImGui.EndDisabled(); + } + } + + ImGui.EndTable(); + + End: + ImGui.End(); + } }