예제 #1
0
        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);
        }
예제 #2
0
        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;
        }
예제 #3
0
        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))
                            )
                        )
                    )
                );
        }
예제 #4
0
 public ComponentModelPingTracker(PingConfiguration config, GameAddressDetector addressDetector) : base(config, addressDetector, PingTrackerKind.COM)
 {
     this.ping = new Ping();
 }
예제 #5
0
 public PacketPingTracker(PingConfiguration config, GameAddressDetector addressDetector, GameNetwork network) : base(config, addressDetector, PingTrackerKind.Packets)
 {
     this.network = network;
     this.network.NetworkMessage += OnNetworkMessage;
 }
예제 #6
0
 public IpHlpApiPingTracker(PingConfiguration config, GameAddressDetector addressDetector) : base(config, addressDetector, PingTrackerKind.IpHlpApi)
 {
 }