protected override async Task PingLoop(CancellationToken token) { while (!token.IsCancellationRequested) { if (SeAddress != null) { try { var rtt = GetAddressLastRTT(SeAddress); var error = (WinError)Marshal.GetLastWin32Error(); Errored = error != WinError.NO_ERROR; if (!Errored) { NextRTTCalculation(rtt); } else { PluginLog.LogWarning($"Got Win32 error {error} when executing ping - this may be temporary and acceptable."); } } catch (Exception e) { Errored = true; PluginLog.LogError(e, "Error occurred when executing ping."); } } await Task.Delay(3000, token); } }
protected override async Task PingLoop(CancellationToken token) { while (!token.IsCancellationRequested) { if (SeAddress != null) { try { var pingReply = await this.ping.SendPingAsync(SeAddress); Errored = pingReply.Status != IPStatus.Success; if (!Errored) { NextRTTCalculation((ulong)pingReply.RoundtripTime); } else if (pingReply.Status != IPStatus.TimedOut) { PluginLog.LogWarning( $"Got bad status {pingReply.Status} when executing ping - this may be temporary and acceptable."); } } catch (InvalidOperationException) { // ignored } catch (Exception e) { Errored = true; PluginLog.LogError(e, "Error occurred when executing ping."); } } await Task.Delay(3000, token); } }
private unsafe ContextMenuOpenedArgs?NotifyContextMenuOpened(AddonContextMenu *addonContextMenu, AgentContextInterface *agentContextInterface, string?title, ContextMenus.ContextMenuOpenedDelegate contextMenuOpenedDelegate, IEnumerable <ContextMenuItem> initialContextMenuItems) { var parentAddonName = this.GetParentAddonName(&addonContextMenu->AtkUnitBase); Log.Warning($"AgentContextInterface at: {new IntPtr(agentContextInterface):X}"); InventoryItemContext?inventoryItemContext = null; GameObjectContext? gameObjectContext = null; if (IsInventoryContext(agentContextInterface)) { var agentInventoryContext = (AgentInventoryContext *)agentContextInterface; inventoryItemContext = new InventoryItemContext(agentInventoryContext->InventoryItemId, agentInventoryContext->InventoryItemCount, agentInventoryContext->InventoryItemIsHighQuality); } else { var agentContext = (AgentContext *)agentContextInterface; uint?id = agentContext->GameObjectId; if (id == 0) { id = null; } ulong?contentId = agentContext->GameObjectContentId; if (contentId == 0) { contentId = null; } var name = MemoryHelper.ReadSeStringNullTerminated((IntPtr)agentContext->GameObjectName.StringPtr).TextValue; if (string.IsNullOrEmpty(name)) { name = null; } ushort?worldId = agentContext->GameObjectWorldId; if (worldId == 0) { worldId = null; } if (id != null || contentId != null || name != null || worldId != null) { gameObjectContext = new GameObjectContext(id, contentId, name, worldId); } } // Temporarily remove the < Return item, for UX we should enforce that it is always last in the list. var lastContextMenuItem = initialContextMenuItems.LastOrDefault(); if (lastContextMenuItem is GameContextMenuItem gameContextMenuItem && gameContextMenuItem.SelectedAction == 102) { initialContextMenuItems = initialContextMenuItems.SkipLast(1); } var contextMenuOpenedArgs = new ContextMenuOpenedArgs(addonContextMenu, agentContextInterface, parentAddonName, initialContextMenuItems) { Title = title, InventoryItemContext = inventoryItemContext, GameObjectContext = gameObjectContext, }; try { contextMenuOpenedDelegate.Invoke(contextMenuOpenedArgs); } catch (Exception ex) { PluginLog.LogError(ex, "NotifyContextMenuOpened"); return(null); } // Readd the < Return item if (lastContextMenuItem is GameContextMenuItem gameContextMenuItem1 && gameContextMenuItem1.SelectedAction == 102) { contextMenuOpenedArgs.Items.Add(lastContextMenuItem); } foreach (var contextMenuItem in contextMenuOpenedArgs.Items.ToArray()) { // TODO: Game doesn't support nested sub context menus, but we might be able to. if (contextMenuItem is OpenSubContextMenuItem && contextMenuOpenedArgs.Title != null) { contextMenuOpenedArgs.Items.Remove(contextMenuItem); PluginLog.Warning($"Context menu '{contextMenuOpenedArgs.Title}' item '{contextMenuItem}' has been removed because nested sub context menus are not supported."); } } if (contextMenuOpenedArgs.Items.Count > MaxContextMenuItemsPerContextMenu) { PluginLog.LogWarning($"Context menu requesting {contextMenuOpenedArgs.Items.Count} of max {MaxContextMenuItemsPerContextMenu} items. Resizing list to compensate."); contextMenuOpenedArgs.Items.RemoveRange(MaxContextMenuItemsPerContextMenu, contextMenuOpenedArgs.Items.Count - MaxContextMenuItemsPerContextMenu); } return(contextMenuOpenedArgs); }