public static void IntroduceToServer(long currentEntryId)
        {
            var token       = RandomString(10);
            var ownEndpoint = new IPEndPoint(LunaNetUtils.GetMyAddress(), NetworkMain.Config.Port);

            LunaLog.Log($"[LMP]: Sending NAT introduction to server. Token: {token}");

            var msgData = NetworkMain.CliMsgFactory.CreateNewMessageData <MsIntroductionMsgData>();

            msgData.Id               = currentEntryId;
            msgData.Token            = token;
            msgData.InternalEndpoint = Common.StringFromEndpoint(ownEndpoint);
            var introduceMsg = MstSrvMsgFactory.CreateNew <MainMstSrvMsg>(msgData);

            foreach (var masterServer in MasterServerEndpoints.Values.ToArray())
            {
                try
                {
                    var lidgrenMsg = masterServer.CreateMessage((int)introduceMsg.GetMessageSize());
                    introduceMsg.Serialize(lidgrenMsg);

                    masterServer.SendMessage(lidgrenMsg, introduceMsg.NetDeliveryMethod);
                    masterServer.FlushSendQueue();
                }
                catch (Exception e)
                {
                    LunaLog.LogError($"[LMP]: Error connecting to server: {e}");
                }
            }

            introduceMsg.Recycle();
        }
        public static void RequestServerList(NetClient masterServer)
        {
            var msgData    = NetworkMain.CliMsgFactory.CreateNewMessageData <MsRequestServersMsgData>();
            var requestMsg = MstSrvMsgFactory.CreateNew <MainMstSrvMsg>(msgData);

            var lidgrenMsg = masterServer.CreateMessage(requestMsg.GetMessageSize());

            requestMsg.Serialize(lidgrenMsg);

            masterServer.SendMessage(lidgrenMsg, requestMsg.NetDeliveryMethod);
            masterServer.FlushSendQueue();

            requestMsg.Recycle();
        }
        private static void HandleServersList(NetIncomingMessage msg)
        {
            try
            {
                var msgDeserialized = MstSrvMsgFactory.Deserialize(msg, LunaTime.UtcNow.Ticks);

                //Sometimes we receive other type of unconnected messages.
                //Therefore we assert that the received message data is of MsReplyServersMsgData
                if (msgDeserialized.Data is MsReplyServersMsgData data)
                {
                    NetworkServerList.Servers.Clear();
                    for (var i = 0; i < data.ServersCount; i++)
                    {
                        //Filter servers with diferent version
                        if (data.ServerVersion[i] != LmpVersioning.CurrentVersion)
                        {
                            continue;
                        }

                        PingSystem.QueuePing(data.ExternalEndpoint[i]);
                        NetworkServerList.Servers.TryAdd(data.ExternalEndpoint[i], new ServerInfo
                        {
                            Id = data.Id[i],
                            InternalEndpoint             = data.InternalEndpoint[i],
                            ExternalEndpoint             = data.ExternalEndpoint[i],
                            Description                  = data.Description[i],
                            Cheats                       = data.Cheats[i],
                            ServerName                   = data.ServerName[i],
                            DropControlOnExit            = data.DropControlOnExit[i],
                            MaxPlayers                   = data.MaxPlayers[i],
                            WarpMode                     = data.WarpMode[i],
                            TerrainQuality               = data.TerrainQuality[i],
                            PlayerCount                  = data.PlayerCount[i],
                            GameMode                     = data.GameMode[i],
                            ModControl                   = data.ModControl[i],
                            DropControlOnExitFlight      = data.DropControlOnExitFlight[i],
                            VesselUpdatesSendMsInterval  = data.VesselUpdatesSendMsInterval[i],
                            DropControlOnVesselSwitching = data.DropControlOnVesselSwitching[i],
                            ServerVersion                = data.ServerVersion[i]
                        });
                    }
                }
            }
            catch (Exception e)
            {
                LunaLog.LogError($"[LMP]: Invalid server list reply msg: {e}");
            }
        }