public PingPlugin(DalamudPluginInterface pluginInterface, CommandManager commands, DtrBar dtrBar, GameNetwork network) { this.pluginInterface = pluginInterface; this.network = network; this.config = (PingConfiguration)this.pluginInterface.GetPluginConfig() ?? new PingConfiguration(); this.config.Initialize(this.pluginInterface); this.addressDetector = this.pluginInterface.Create <AggregateAddressDetector>(); if (this.addressDetector == null) { throw new InvalidOperationException("Failed to create game address detector. The provided arguments may be incorrect."); } this.pingTracker = RequestNewPingTracker(this.config.TrackingMode); this.pingTracker.Start(); InitIpc(); // Most of these can't be created using service injection because the service container only checks ctors for // exact types. this.ui = new PingUI(this.pingTracker, this.pluginInterface, dtrBar, this.config, RequestNewPingTracker); this.pingTracker.OnPingUpdated += this.ui.UpdateDtrBarPing; this.pluginInterface.UiBuilder.OpenConfigUi += OpenConfigUi; this.pluginInterface.UiBuilder.Draw += this.ui.Draw; this.pluginCommandManager = new PluginCommandManager <PingPlugin>(this, commands); }
protected PingTracker(PingConfiguration config, GameAddressDetector addressDetector, PingTrackerKind kind) { this.tokenSource = new CancellationTokenSource(); this.config = config; this.addressDetector = addressDetector; SeAddress = IPAddress.Loopback; RTTTimes = new ConcurrentQueue <float>(); Kind = kind; }
public AggregatePingTracker(PingConfiguration config, GameAddressDetector addressDetector, GameNetwork network) : base(config, addressDetector, PingTrackerKind.Aggregate) { // Define trackers this.trackerInfos = new Dictionary <string, TrackerInfo>(); RegisterTracker(COMTrackerKey, new ComponentModelPingTracker(config, addressDetector) { Verbose = false }); RegisterTracker(IpHlpApiTrackerKey, new IpHlpApiPingTracker(config, addressDetector) { Verbose = false }); RegisterTracker(PacketTrackerKey, new PacketPingTracker(config, addressDetector, network) { Verbose = false }); // Create decision tree to solve tracker selection problem this.decisionTree = new DecisionTree <string>( // If COM is errored () => TrackerIsErrored(COMTrackerKey), // Just use IpHlpApi pass: new DecisionTree <string>(() => TreeResult.Resolve(IpHlpApiTrackerKey)), fail: new DecisionTree <string>( // If difference between pings is more than 30 () => Math.Abs((long)GetTrackerRTT(COMTrackerKey) - (long)GetTrackerRTT(IpHlpApiTrackerKey)) > 30, pass: new DecisionTree <string>( // Use greater ping value, something's probably subtly broken () => GetTrackerRTT(COMTrackerKey) < GetTrackerRTT(IpHlpApiTrackerKey), pass: new DecisionTree <string>(() => TreeResult.Resolve(IpHlpApiTrackerKey)), fail: new DecisionTree <string>(() => TreeResult.Resolve(COMTrackerKey)) ), fail: new DecisionTree <string>( // If both of these trackers report a ping of 0 () => GetTrackerRTT(COMTrackerKey) == 0 && GetTrackerRTT(IpHlpApiTrackerKey) == 0, // Just use packets (inaccurate) pass: new DecisionTree <string>(() => TreeResult.Resolve(PacketTrackerKey)), fail: new DecisionTree <string>( // Otherwise use the lower ping value, we'll assume it's more accurate () => GetTrackerRTT(COMTrackerKey) < GetTrackerRTT(IpHlpApiTrackerKey), pass: new DecisionTree <string>(() => TreeResult.Resolve(COMTrackerKey)), fail: new DecisionTree <string>(() => TreeResult.Resolve(IpHlpApiTrackerKey)) ) ) ) ); }
public ComponentModelPingTracker(PingConfiguration config, GameAddressDetector addressDetector) : base(config, addressDetector, PingTrackerKind.COM) { this.ping = new Ping(); }
public PacketPingTracker(PingConfiguration config, GameAddressDetector addressDetector, GameNetwork network) : base(config, addressDetector, PingTrackerKind.Packets) { this.network = network; this.network.NetworkMessage += OnNetworkMessage; }
public IpHlpApiPingTracker(PingConfiguration config, GameAddressDetector addressDetector) : base(config, addressDetector, PingTrackerKind.IpHlpApi) { }