private void DealerSocket_ReceiveReady(object sender, NetMQSocketEventArgs e)
        {
            string command = e.Socket.ReceiveFrameString();

            if (!string.IsNullOrEmpty(command))
            {
                try
                {
                    var     json = JsonConvert.DeserializeObject <XplaneConnect>(command);
                    dynamic data = json.Data;
                    switch (json.Type)
                    {
                    case XplaneConnect.MessageType.PluginHash:
                        string hash = data.Hash;
                        if (!string.IsNullOrEmpty(hash))
                        {
                            mFsdManager.ClientProperties.PluginHash = hash;
                        }
                        break;

                    case XplaneConnect.MessageType.RequestAtis:
                        string callsign = data.Callsign;
                        if (!string.IsNullOrEmpty(callsign))
                        {
                            RequestControllerAtisSent?.Invoke(this, new RequestControllerAtisEventArgs(callsign));
                        }
                        break;

                    case XplaneConnect.MessageType.PluginVersion:
                        mReceivedInitialHandshake = true;
                        int pluginVersion = (int)data.Version;
                        if (pluginVersion != MIN_PLUGIN_VERSION)
                        {
                            EnableConnectButton?.Invoke(this, new ClientEventArgs <bool>(false));
                            if (!mInvalidPluginVersionShown)
                            {
                                NotificationPosted?.Invoke(this, new NotificationPostedEventArgs(NotificationType.Error, "Error: Incorrect xPilot Plugin Version. You are using an out of date xPilot plugin. Please close X-Plane and reinstall xPilot."));
                                PlaySoundRequested?.Invoke(this, new PlaySoundEventArgs(SoundEvent.Error));
                                mInvalidPluginVersionShown = true;
                            }
                        }
                        break;

                    case XplaneConnect.MessageType.SocketMessage:
                    {
                        string msg = data.Message;
                        if (!string.IsNullOrEmpty(msg))
                        {
                            RaiseSocketMessageReceived?.Invoke(this, new ClientEventArgs <string>(msg));
                        }
                    }
                    break;

                    case XplaneConnect.MessageType.PrivateMessageSent:
                    {
                        string msg = data.Message;
                        string to  = data.To;
                        if (mFsdManager.IsConnected)
                        {
                            PrivateMessageSent?.Invoke(this, new PrivateMessageSentEventArgs(mFsdManager.OurCallsign, to, msg));
                        }
                    }
                    break;

                    case XplaneConnect.MessageType.ValidateCslPaths:
                        mValidCsl = (bool)data.Result;
                        if (data.Result == false)
                        {
                            EnableConnectButton?.Invoke(this, new ClientEventArgs <bool>(false));
                            NotificationPosted?.Invoke(this, new NotificationPostedEventArgs(NotificationType.Error, "Error: No valid CSL paths are configured or enabled, or you have no CSL models installed. Please verify the CSL configuration in X-Plane (Plugins > xPilot > Preferences). If you need assistance configuring your CSL paths, see the \"CSL Model Configuration\" section in the xPilot Documentation (http://docs.xpilot-project.org). Restart X-Plane and xPilot after you have properly configured your CSL models."));
                            PlaySoundRequested?.Invoke(this, new PlaySoundEventArgs(SoundEvent.Error));
                        }
                        break;

                    case XplaneConnect.MessageType.ForceDisconnect:
                        string reason = data.Reason;
                        NotificationPosted?.Invoke(this, new NotificationPostedEventArgs(NotificationType.Error, reason));
                        PlaySoundRequested?.Invoke(this, new PlaySoundEventArgs(SoundEvent.Error));
                        mFsdManager.Disconnect(new DisconnectInfo
                        {
                            Type = DisconnectType.Intentional
                        });
                        break;
                    }
                }
                catch (JsonException ex)
                {
                    NotificationPosted?.Invoke(this, new NotificationPostedEventArgs(NotificationType.Error, "Error deserializing JSON object: " + ex.Message));
                }
            }
        }