From 78e8f763e0f24d3e140402976dad5dd376498ee1 Mon Sep 17 00:00:00 2001 From: Infi Date: Sun, 14 Apr 2024 21:24:47 +0200 Subject: [PATCH] cleanup --- ChatTwo/PayloadHandler.cs | 355 ++++++++++++++++++-------------------- 1 file changed, 172 insertions(+), 183 deletions(-) diff --git a/ChatTwo/PayloadHandler.cs b/ChatTwo/PayloadHandler.cs index 0722a03..1acc902 100755 --- a/ChatTwo/PayloadHandler.cs +++ b/ChatTwo/PayloadHandler.cs @@ -40,7 +40,8 @@ public sealed class PayloadHandler { private readonly ExcelSheet TerritorySheet; private readonly ExcelSheet EventItemHelpSheet; - internal PayloadHandler(ChatLogWindow logWindow) { + internal PayloadHandler(ChatLogWindow logWindow) + { LogWindow = logWindow; ItemSheet = Plugin.DataManager.GetExcelSheet()!; @@ -49,10 +50,12 @@ public sealed class PayloadHandler { EventItemHelpSheet = Plugin.DataManager.GetExcelSheet()!; } - internal void Draw() { + internal void Draw() + { DrawPopups(); - if (_handleTooltips && ++_hoverCounter - _lastHoverCounter > 1) { + if (_handleTooltips && ++_hoverCounter - _lastHoverCounter > 1) + { GameFunctions.GameFunctions.CloseItemTooltip(); _hoveredItem = 0; _hoverCounter = _lastHoverCounter = 0; @@ -60,14 +63,15 @@ public sealed class PayloadHandler { } } - private void DrawPopups() { - if (Popup == null) { + private void DrawPopups() + { + if (Popup == null) return; - } var (chunk, payload) = Popup.Value; - if (!ImGui.BeginPopup(PopupId)) { + if (!ImGui.BeginPopup(PopupId)) + { Popup = null; return; } @@ -75,22 +79,20 @@ public sealed class PayloadHandler { ImGui.PushID(PopupId); var drawn = false; - switch (payload) { - case PlayerPayload player: { + switch (payload) + { + case PlayerPayload player: DrawPlayerPopup(chunk, player); drawn = true; break; - } - case ItemPayload item: { + case ItemPayload item: DrawItemPopup(item); drawn = true; break; - } - case URIPayload uri: { + case URIPayload uri: DrawUriPopup(uri); drawn = true; break; - } } ContextFooter(drawn, chunk); @@ -100,28 +102,35 @@ public sealed class PayloadHandler { ImGui.EndPopup(); } - private void Integrations(Chunk chunk, Payload? payload) { + private void Integrations(Chunk chunk, Payload? payload) + { var registered = LogWindow.Plugin.Ipc.Registered; - if (registered.Count == 0) { + if (registered.Count == 0) return; - } + ImGui.Separator(); var contentId = chunk.Message?.ContentId ?? 0; var sender = chunk.Message?.Sender.Select(c => c.Link).FirstOrDefault(p => p is PlayerPayload) as PlayerPayload; - if (ImGui.BeginMenu(Language.Context_Integrations)) { + if (ImGui.BeginMenu(Language.Context_Integrations)) + { var cursor = ImGui.GetCursorPos(); - foreach (var id in registered) { - try { + foreach (var id in registered) + { + try + { LogWindow.Plugin.Ipc.Invoke(id, sender, contentId, payload, chunk.Message?.SenderSource, chunk.Message?.ContentSource); - } catch (Exception ex) { + } + catch (Exception ex) + { Plugin.Log.Error(ex, "Error executing integration"); } } - if (cursor == ImGui.GetCursorPos()) { + if (cursor == ImGui.GetCursorPos()) + { ImGui.PushStyleColor(ImGuiCol.Text, ImGui.GetStyle().Colors[(int) ImGuiCol.TextDisabled]); ImGui.Text("No integrations available"); ImGui.PopStyleColor(); @@ -131,8 +140,10 @@ public sealed class PayloadHandler { } } - private void ContextFooter(bool didCustomContext, Chunk chunk) { - if (didCustomContext) { + private void ContextFooter(bool didCustomContext, Chunk chunk) + { + if (didCustomContext) + { ImGui.Separator(); // Only place these menu items in a submenu if we've already drawn @@ -140,27 +151,28 @@ public sealed class PayloadHandler { // // It makes it much more convenient in the majority of cases to // copy the message content without having to open a submenu. - if (!ImGui.BeginMenu(Plugin.PluginName)) { + if (!ImGui.BeginMenu(Plugin.PluginName)) return; - } } ImGui.Checkbox(Language.Context_ScreenshotMode, ref LogWindow.ScreenshotMode); - if (ImGui.Selectable(Language.Context_HideChat)) { + if (ImGui.Selectable(Language.Context_HideChat)) LogWindow.UserHide(); - } - if (chunk.Message is { } message) { - if (ImGui.Selectable(Language.Context_Copy)) { + if (chunk.Message is { } message) + { + if (ImGui.Selectable(Language.Context_Copy)) + { ImGui.SetClipboardText(StringifyMessage(message, true)); WrapperUtil.AddNotification(Language.Context_CopySuccess, NotificationType.Info); } // Only show a separate "Copy content" option if the message has - // Sender chunks so it doesn't show for system messages. - if (message.Sender.Count > 0 && ImGui.Selectable(Language.Context_CopyContent)) { - ImGui.SetClipboardText(StringifyMessage(message, false)); + // Sender chunks, so it doesn't show for system messages. + if (message.Sender.Count > 0 && ImGui.Selectable(Language.Context_CopyContent)) + { + ImGui.SetClipboardText(StringifyMessage(message)); WrapperUtil.AddNotification(Language.Context_CopyContentSuccess, NotificationType.Info); } @@ -179,7 +191,7 @@ public sealed class PayloadHandler { if (didCustomContext) ImGui.EndMenu(); } - internal static string StringifyMessage(Message message, bool withSender = false) + private static string StringifyMessage(Message? message, bool withSender = false) { if (message == null) return string.Empty; @@ -192,8 +204,10 @@ public sealed class PayloadHandler { .Aggregate(string.Concat); } - internal void Click(Chunk chunk, Payload? payload, ImGuiMouseButton button) { - switch (button) { + internal void Click(Chunk chunk, Payload? payload, ImGuiMouseButton button) + { + switch (button) + { case ImGuiMouseButton.Left: LeftClickPayload(chunk, payload); break; @@ -206,13 +220,14 @@ public sealed class PayloadHandler { internal void Hover(Payload payload) { var hoverSize = 250f * ImGuiHelpers.GlobalScale; - switch (payload) { - case StatusPayload status: { + switch (payload) + { + case StatusPayload status: DoHover(() => HoverStatus(status), hoverSize); break; - } - case ItemPayload item: { - if (LogWindow.Plugin.Config.NativeItemTooltips) { + case ItemPayload item: + if (LogWindow.Plugin.Config.NativeItemTooltips) + { GameFunctions.GameFunctions.OpenItemTooltip(item.RawItemId); _handleTooltips = true; @@ -231,16 +246,14 @@ public sealed class PayloadHandler { DoHover(() => HoverItem(item), hoverSize); break; - } case URIPayload uri: - { DoHover(() => HoverURI(uri), hoverSize); break; - } } } - private void DoHover(Action inside, float width) { + private void DoHover(Action inside, float width) + { ImGui.SetNextWindowSize(new Vector2(width, -1f)); ImGui.BeginTooltip(); @@ -290,7 +303,8 @@ public sealed class PayloadHandler { atk->SetPosition((short) x, (short) y); } - private static void InlineIcon(IDalamudTextureWrap icon) { + private static void InlineIcon(IDalamudTextureWrap icon) + { var lineHeight = ImGui.CalcTextSize("A").Y; var cursor = ImGui.GetCursorPos(); @@ -300,10 +314,10 @@ public sealed class PayloadHandler { ImGui.SetCursorPos(cursor + new Vector2(size.X + 4, size.Y / 2 - lineHeight / 2)); } - private void HoverStatus(StatusPayload status) { - if (LogWindow.Plugin.TextureCache.GetStatus(status.Status) is { } icon) { + private void HoverStatus(StatusPayload status) + { + if (LogWindow.Plugin.TextureCache.GetStatus(status.Status) is { } icon) InlineIcon(icon); - } var name = ChunkUtil.ToChunks(status.Status.Name.ToDalamudString(), ChunkSource.None, null); LogWindow.DrawChunks(name.ToList()); @@ -313,19 +327,19 @@ public sealed class PayloadHandler { LogWindow.DrawChunks(desc.ToList()); } - private void HoverItem(ItemPayload item) { - if (item.Kind == ItemPayload.ItemKind.EventItem) { + private void HoverItem(ItemPayload item) + { + if (item.Kind == ItemPayload.ItemKind.EventItem) + { HoverEventItem(item); return; } - if (item.Item == null) { + if (item.Item == null) return; - } - if (LogWindow.Plugin.TextureCache.GetItem(item.Item, item.IsHQ) is { } icon) { + if (LogWindow.Plugin.TextureCache.GetItem(item.Item, item.IsHQ) is { } icon) InlineIcon(icon); - } var name = ChunkUtil.ToChunks(item.Item.Name.ToDalamudString(), ChunkSource.None, null); LogWindow.DrawChunks(name.ToList()); @@ -335,87 +349,77 @@ public sealed class PayloadHandler { LogWindow.DrawChunks(desc.ToList()); } - private void HoverEventItem(ItemPayload payload) { + private void HoverEventItem(ItemPayload payload) + { var item = EventItemSheet.GetRow(payload.RawItemId); - if (item == null) { + if (item == null) return; - } - if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon) { + if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon) InlineIcon(icon); - } var name = ChunkUtil.ToChunks(item.Name.ToDalamudString(), ChunkSource.None, null); LogWindow.DrawChunks(name.ToList()); ImGui.Separator(); var help = EventItemHelpSheet.GetRow(payload.RawItemId); - if (help != null) { + if (help != null) + { var desc = ChunkUtil.ToChunks(help.Description.ToDalamudString(), ChunkSource.None, null); LogWindow.DrawChunks(desc.ToList()); } } - private void HoverURI(URIPayload uri) { + private void HoverURI(URIPayload uri) + { ImGui.TextUnformatted(string.Format(Language.Context_URLDomain, uri.Uri.Authority)); ImGuiUtil.WarningText(Language.Context_URLWarning); } - private void LeftClickPayload(Chunk chunk, Payload? payload) { - switch (payload) { - case MapLinkPayload map: { + private void LeftClickPayload(Chunk chunk, Payload? payload) + { + switch (payload) + { + case MapLinkPayload map: Plugin.GameGui.OpenMapWithMapLink(map); break; - } - case QuestPayload quest: { + case QuestPayload quest: LogWindow.Plugin.Common.Functions.Journal.OpenQuest(quest.Quest); break; - } - case DalamudLinkPayload link: { + case DalamudLinkPayload link: ClickLinkPayload(chunk, payload, link); break; - } - case DalamudPartyFinderPayload pf: { - if (pf.LinkType == DalamudPartyFinderPayload.PartyFinderLinkType.PartyFinderNotification) { + case DalamudPartyFinderPayload pf: + if (pf.LinkType == DalamudPartyFinderPayload.PartyFinderLinkType.PartyFinderNotification) GameFunctions.GameFunctions.OpenPartyFinder(); - } else { + else LogWindow.Plugin.Functions.OpenPartyFinder(pf.ListingId); - } - break; - } - case ChatTwoPartyFinderPayload pf: { + case ChatTwoPartyFinderPayload pf: LogWindow.Plugin.Functions.OpenPartyFinder(pf.Id); break; - } - case AchievementPayload achievement: { + case AchievementPayload achievement: LogWindow.Plugin.Functions.OpenAchievement(achievement.Id); break; - } - case RawPayload raw: { - if (Equals(raw, ChunkUtil.PeriodicRecruitmentLink)) { + case RawPayload raw: + if (Equals(raw, ChunkUtil.PeriodicRecruitmentLink)) GameFunctions.GameFunctions.OpenPartyFinder(); - } - break; - } - case URIPayload uri: { + case URIPayload uri: TryOpenURI(uri.Uri); break; - } } } - private void ClickLinkPayload(Chunk chunk, Payload payload, DalamudLinkPayload link) { - if (chunk.GetSeString() is not { } source) { + private void ClickLinkPayload(Chunk chunk, Payload payload, DalamudLinkPayload link) + { + if (chunk.GetSeString() is not { } source) return; - } var start = source.Payloads.IndexOf(payload); var end = source.Payloads.IndexOf(RawPayload.LinkTerminator, start == -1 ? 0 : start); - if (start == -1 || end == -1) { + if (start == -1 || end == -1) return; - } var payloads = source.Payloads.Skip(start).Take(end - start + 1).ToList(); if (!Plugin.ChatGui.RegisteredLinkHandlers.TryGetValue((link.Plugin, link.CommandId), out var value)) @@ -426,102 +430,93 @@ public sealed class PayloadHandler { try { - // Running XivCommon SendChat instantly leads to a game freeze, for whatever reason + // Running XivCommon SendChat instantly, without RunOnTick, leads to a game freeze, for whatever reason Plugin.Framework.RunOnTick(() => value.Invoke(link.CommandId, new SeString(payloads))); - } catch (Exception ex) { + } + catch (Exception ex) + { Plugin.Log.Error(ex, "Error executing DalamudLinkPayload handler"); } } - private void RightClickPayload(Chunk chunk, Payload? payload) { + private void RightClickPayload(Chunk chunk, Payload? payload) + { Popup = (chunk, payload); ImGui.OpenPopup(PopupId); } - private void DrawItemPopup(ItemPayload payload) { - if (payload.Kind == ItemPayload.ItemKind.EventItem) { + private void DrawItemPopup(ItemPayload payload) + { + if (payload.Kind == ItemPayload.ItemKind.EventItem) + { DrawEventItemPopup(payload); return; } var item = ItemSheet.GetRow(payload.ItemId); - if (item == null) { + if (item == null) return; - } var hq = payload.Kind == ItemPayload.ItemKind.Hq; - - if (LogWindow.Plugin.TextureCache.GetItem(item, hq) is { } icon) { + if (LogWindow.Plugin.TextureCache.GetItem(item, hq) is { } icon) InlineIcon(icon); - } var name = item.Name.ToDalamudString(); - if (hq) { - // hq symbol + // hq symbol + if (hq) name.Payloads.Add(new TextPayload(" ")); - } else if (payload.Kind == ItemPayload.ItemKind.Collectible) { + else if (payload.Kind == ItemPayload.ItemKind.Collectible) name.Payloads.Add(new TextPayload(" ")); - } LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false); ImGui.Separator(); var realItemId = payload.RawItemId; - if (item.EquipSlotCategory.Row != 0) { - if (ImGui.Selectable(Language.Context_TryOn)) { + if (item.EquipSlotCategory.Row != 0) + { + if (ImGui.Selectable(Language.Context_TryOn)) LogWindow.Plugin.Functions.Context.TryOn(realItemId, 0); - } - if (ImGui.Selectable(Language.Context_ItemComparison)) { + if (ImGui.Selectable(Language.Context_ItemComparison)) LogWindow.Plugin.Functions.Context.OpenItemComparison(realItemId); - } } - if (item.ItemSearchCategory.Value?.Category == 3) { - if (ImGui.Selectable(Language.Context_SearchRecipes)) { + if (item.ItemSearchCategory.Value?.Category == 3) + if (ImGui.Selectable(Language.Context_SearchRecipes)) LogWindow.Plugin.Functions.Context.SearchForRecipesUsingItem(payload.ItemId); - } - } - if (ImGui.Selectable(Language.Context_SearchForItem)) { + if (ImGui.Selectable(Language.Context_SearchForItem)) LogWindow.Plugin.Functions.Context.SearchForItem(realItemId); - } - if (ImGui.Selectable(Language.Context_Link)) { + if (ImGui.Selectable(Language.Context_Link)) LogWindow.Plugin.Functions.Context.LinkItem(realItemId); - } - if (ImGui.Selectable(Language.Context_CopyItemName)) { + if (ImGui.Selectable(Language.Context_CopyItemName)) ImGui.SetClipboardText(name.TextValue); - } } - private void DrawEventItemPopup(ItemPayload payload) { - if (payload.Kind != ItemPayload.ItemKind.EventItem) { + private void DrawEventItemPopup(ItemPayload payload) + { + if (payload.Kind != ItemPayload.ItemKind.EventItem) return; - } var item = EventItemSheet.GetRow(payload.ItemId); - if (item == null) { + if (item == null) return; - } - if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon) { + if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon) InlineIcon(icon); - } var name = item.Name.ToDalamudString(); LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false); ImGui.Separator(); var realItemId = payload.RawItemId; - if (ImGui.Selectable(Language.Context_Link)) { + if (ImGui.Selectable(Language.Context_Link)) LogWindow.Plugin.Functions.Context.LinkItem(realItemId); - } - if (ImGui.Selectable(Language.Context_CopyItemName)) { + if (ImGui.Selectable(Language.Context_CopyItemName)) ImGui.SetClipboardText(name.TextValue); - } } private void DrawPlayerPopup(Chunk chunk, PlayerPayload player) @@ -531,15 +526,15 @@ public sealed class PayloadHandler { return; var world = player.World; - if (chunk.Message?.Code.Type == ChatType.FreeCompanyLoginLogout) { - if (Plugin.ClientState.LocalPlayer?.HomeWorld.GameData is { } homeWorld) { + if (chunk.Message?.Code.Type == ChatType.FreeCompanyLoginLogout) + if (Plugin.ClientState.LocalPlayer?.HomeWorld.GameData is { } homeWorld) world = homeWorld; - } - } var name = new List { new TextChunk(ChunkSource.None, null, player.PlayerName) }; - if (world.IsPublic) { - name.AddRange(new Chunk[] { + if (world.IsPublic) + { + name.AddRange(new Chunk[] + { new IconChunk(ChunkSource.None, null, BitmapFontIcon.CrossWorld), new TextChunk(ChunkSource.None, null, world.Name), }); @@ -555,9 +550,8 @@ public sealed class PayloadHandler { if (TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse != 41) { LogWindow.Chat = $"/tell {player.PlayerName}"; - if (world.IsPublic) { + if (world.IsPublic) LogWindow.Chat += $"@{world.Name}"; - } LogWindow.Chat += " "; } @@ -569,7 +563,8 @@ public sealed class PayloadHandler { LogWindow.Activate = true; } - if (world.IsPublic) { + if (world.IsPublic) + { var party = Plugin.PartyList; var leader = (ulong?) party[(int) party.PartyLeaderIndex]?.ContentId; var isLeader = party.Length == 0 || Plugin.ClientState.LocalContentId == leader; @@ -577,71 +572,69 @@ public sealed class PayloadHandler { var isInParty = member != default; var inInstance = LogWindow.Plugin.Functions.IsInInstance(); var inPartyInstance = TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse is (41 or 47 or 48 or 52 or 53); - if (isLeader) { - if (!isInParty) { - if (inInstance && inPartyInstance) { - if (validContentId && ImGui.Selectable(Language.Context_InviteToParty)) { + if (isLeader) + { + if (!isInParty) + { + if (inInstance && inPartyInstance) + { + if (validContentId && ImGui.Selectable(Language.Context_InviteToParty)) LogWindow.Plugin.Functions.Party.InviteInInstance(chunk.Message!.ContentId); - } - } else if (!inInstance && ImGui.BeginMenu(Language.Context_InviteToParty)) { - if (ImGui.Selectable(Language.Context_InviteToParty_SameWorld)) { + } + else if (!inInstance && ImGui.BeginMenu(Language.Context_InviteToParty)) + { + if (ImGui.Selectable(Language.Context_InviteToParty_SameWorld)) LogWindow.Plugin.Functions.Party.InviteSameWorld(player.PlayerName, (ushort) world.RowId, chunk.Message?.ContentId ?? 0); - } - if (validContentId && ImGui.Selectable(Language.Context_InviteToParty_DifferentWorld)) { + if (validContentId && ImGui.Selectable(Language.Context_InviteToParty_DifferentWorld)) LogWindow.Plugin.Functions.Party.InviteOtherWorld(chunk.Message!.ContentId); - } ImGui.EndMenu(); } } - if (isInParty && member != null && (!inInstance || (inInstance && inPartyInstance))) { - if (ImGui.Selectable(Language.Context_Promote)) { + if (isInParty && member != null && (!inInstance || (inInstance && inPartyInstance))) + { + if (ImGui.Selectable(Language.Context_Promote)) LogWindow.Plugin.Functions.Party.Promote(player.PlayerName, (ulong) member.ContentId); - } - if (ImGui.Selectable(Language.Context_KickFromParty)) { + if (ImGui.Selectable(Language.Context_KickFromParty)) LogWindow.Plugin.Functions.Party.Kick(player.PlayerName, (ulong) member.ContentId); - } } } var isFriend = LogWindow.Plugin.Common.Functions.FriendList.List.Any(friend => friend.Name.TextValue == player.PlayerName && friend.HomeWorld == world.RowId); - if (!isFriend && ImGui.Selectable(Language.Context_SendFriendRequest)) { + if (!isFriend && ImGui.Selectable(Language.Context_SendFriendRequest)) LogWindow.Plugin.Functions.SendFriendRequest(player.PlayerName, (ushort) world.RowId); - } - if (ImGui.Selectable(Language.Context_AddToBlacklist)) { + if (ImGui.Selectable(Language.Context_AddToBlacklist)) LogWindow.Plugin.Functions.AddToBlacklist(player.PlayerName, (ushort) world.RowId); - } - if (LogWindow.Plugin.Functions.IsMentor() && ImGui.Selectable(Language.Context_InviteToNoviceNetwork)) { + if (LogWindow.Plugin.Functions.IsMentor() && ImGui.Selectable(Language.Context_InviteToNoviceNetwork)) LogWindow.Plugin.Functions.Context.InviteToNoviceNetwork(player.PlayerName, (ushort) world.RowId); - } } var inputChannel = chunk.Message?.Code.Type.ToInputChannel(); - if (inputChannel != null && ImGui.Selectable(Language.Context_ReplyInSelectedChatMode)) { + if (inputChannel != null && ImGui.Selectable(Language.Context_ReplyInSelectedChatMode)) + { LogWindow.SetChannel(inputChannel.Value); LogWindow.Activate = true; } - if (ImGui.Selectable(Language.Context_Target) && FindCharacterForPayload(player) is { } obj) { + if (ImGui.Selectable(Language.Context_Target) && FindCharacterForPayload(player) is { } obj) Plugin.TargetManager.Target = obj; - } if (validContentId && ImGui.Selectable(Language.Context_AdventurerPlate)) - { if (!LogWindow.Plugin.Functions.TryOpenAdventurerPlate(chunk.Message!.ContentId)) WrapperUtil.AddNotification(Language.Context_AdventurerPlateError, NotificationType.Warning); - } // View Party Finder 0x2E } - private PlayerCharacter? FindCharacterForPayload(PlayerPayload payload) { - foreach (var obj in Plugin.ObjectTable) { + private PlayerCharacter? FindCharacterForPayload(PlayerPayload payload) + { + foreach (var obj in Plugin.ObjectTable) + { if (obj is not PlayerCharacter character) continue; @@ -664,9 +657,7 @@ public sealed class PayloadHandler { ImGui.Separator(); if (ImGui.Selectable(Language.Context_OpenInBrowser)) - { TryOpenURI(uri.Uri); - } if (ImGui.Selectable(Language.Context_CopyLink)) { @@ -677,17 +668,15 @@ public sealed class PayloadHandler { private void TryOpenURI(Uri uri) { - new Thread(() => { - try - { - Plugin.Log.Debug($"Opening URI {uri} in default browser"); - Dalamud.Utility.Util.OpenLink(uri.ToString()); - } - catch (Exception ex) - { - Plugin.Log.Error($"Error opening URI: {ex}"); - WrapperUtil.AddNotification(Language.Context_OpenInBrowserError, NotificationType.Error); - } - }).Start(); + try + { + Plugin.Log.Debug($"Opening URI {uri} in default browser"); + Dalamud.Utility.Util.OpenLink(uri.ToString()); + } + catch (Exception ex) + { + Plugin.Log.Error($"Error opening URI: {ex}"); + WrapperUtil.AddNotification(Language.Context_OpenInBrowserError, NotificationType.Error); + } } }