示例#1
0
        protected virtual void ProcessGenericLocalization(ClientObject obj, Dictionary<string, List<ValueForUICulture>> localizations)
        {
            var targetProps = localizations.Keys.ToList();
            var isSupportedRuntime = ReflectionUtils.HasProperties(obj, targetProps);

            if (!isSupportedRuntime)
            {
                TraceService.Critical((int)LogEventId.ModelProvisionCoreCall,
                      string.Format("CSOM runtime doesn't have [{0}] methods support. Update CSOM runtime to a new version. Provision is skipped",
                        string.Join(", ", targetProps)));

                return;
            }

            var needsUpdate = false;

            foreach (var key in localizations.Keys)
            {
                var propName = key;
                var localization = localizations[key];

                if (localization.Any())
                {
                    var userResource = GetPropertyValue(obj, propName);

                    foreach (var locValue in localization)
                        LocalizationService.ProcessUserResource(obj, userResource, locValue);

                    needsUpdate = true;
                }
            }

            if (needsUpdate)
            {
                var updateMethod = ReflectionUtils.GetMethod(obj, "Update");

                if (updateMethod != null)
                {
                    if (obj is ContentType)
                    {
                        updateMethod.Invoke(obj, new object[] { true });
                    }
                    else if (obj is Field)
                    {
                        updateMethod = ReflectionUtils.GetMethod(obj, "UpdateAndPushChanges");
                        updateMethod.Invoke(obj, new object[] { true });
                    }
                    else
                    {
                        updateMethod.Invoke(obj, null);
                    }

                    obj.Context.ExecuteQueryWithTrace();
                }
                else
                {
                    throw new SPMeta2Exception(string.Format("Can't find Update() methods on client object of type:[{0}]", obj.GetType()));
                }
            }
        }
示例#2
0
 public static void HandlePingRequest(ClientObject client, byte[] messageData)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.PING_REPLY;
     newMessage.data = messageData;
     ClientHandler.SendToClient(client, newMessage, true);
 }
示例#3
0
 public static void HandleVesselRemoval(ClientObject client, byte[] messageData)
 {
     using (MessageReader mr = new MessageReader(messageData))
     {
         //Don't care about the subspace on the server.
         mr.Read<double>();
         string vesselID = mr.Read<string>();
         bool isDockingUpdate = mr.Read<bool>();
         if (!isDockingUpdate)
         {
             DarkLog.Debug("Removing vessel " + vesselID + " from " + client.playerName);
         }
         else
         {
             DarkLog.Debug("Removing DOCKED vessel " + vesselID + " from " + client.playerName);
         }
         if (File.Exists(Path.Combine(Server.universeDirectory, "Vessels", vesselID + ".txt")))
         {
             lock (Server.universeSizeLock)
             {
                 File.Delete(Path.Combine(Server.universeDirectory, "Vessels", vesselID + ".txt"));
             }
         }
         //Relay the message.
         ServerMessage newMessage = new ServerMessage();
         newMessage.type = ServerMessageType.VESSEL_REMOVE;
         newMessage.data = messageData;
         ClientHandler.SendToAll(client, newMessage, false);
     }
 }
示例#4
0
        public static void Main()
        {
            LogManager.WriteLog("Entering Cash Desk Operator EXE", LogManager.enumLogLevel.Debug);
            BMCRegistryHelper.ActiveInstallationType = BMCCategorizedInstallationTypes.Exchange;
            LogManager.WriteLog("BMCRegistryHelper.InstallationTypes is :" + BMCRegistryHelper.ActiveInstallationType, LogManager.enumLogLevel.Debug);

            string strDefaultServerIP = string.Empty;
            strDefaultServerIP = BMCRegistryHelper.GetRegKeyValue("Cashmaster\\Exchange", "Default_Server_IP");
            clientObj = new ClientObject();
            client = new Client("tcp://" + strDefaultServerIP + ConfigManager.Read("ServerIPCUrl"), "RemotingClient", typeof(IServerObject));
            client.SendToServer(clientObj, null);

            int itmpInterval = Int32.Parse(ConfigManager.Read("IPCInterval")) * 3;
            Int32.TryParse(ConfigManager.Read("RemoteServerConnectionCheck"), out iSiteLicensingCheck);
            if (iSiteLicensingCheck <= 0)
            {
                iSiteLicensingCheck = 600;
            }
            if (itmpInterval > 15)
            {
                iInteraval = itmpInterval;
            }

#if !FLOORVIEW_REFRESH_NEW
            siteLicensingClientObj = new ClientObject();
            siteLicensingClient = new Client("tcp://" + strDefaultServerIP + ConfigManager.Read("SiteLicensingServerIPCUrl"), "SiteLicensingClient", typeof(ISiteLicenseServerObject));
            siteLicensingClient.SendToServer(siteLicensingClientObj, null);
#endif
            BMC.PlayerGateway.GatewaySettings.ConnectionString = DatabaseHelper.GetConnectionString();
            AppStartUp();
        }
示例#5
0
 public static void HandleSplitMessage(ClientObject client, byte[] messageData)
 {
     if (!client.isReceivingSplitMessage)
     {
         //New split message
         using (MessageReader mr = new MessageReader(messageData))
         {
             client.receiveSplitMessage = new ClientMessage();
             client.receiveSplitMessage.type = (ClientMessageType)mr.Read<int>();
             client.receiveSplitMessage.data = new byte[mr.Read<int>()];
             client.receiveSplitMessageBytesLeft = client.receiveSplitMessage.data.Length;
             byte[] firstSplitData = mr.Read<byte[]>();
             firstSplitData.CopyTo(client.receiveSplitMessage.data, 0);
             client.receiveSplitMessageBytesLeft -= firstSplitData.Length;
         }
         client.isReceivingSplitMessage = true;
     }
     else
     {
         //Continued split message
         messageData.CopyTo(client.receiveSplitMessage.data, client.receiveSplitMessage.data.Length - client.receiveSplitMessageBytesLeft);
         client.receiveSplitMessageBytesLeft -= messageData.Length;
     }
     if (client.receiveSplitMessageBytesLeft == 0)
     {
         ClientHandler.HandleMessage(client, client.receiveSplitMessage);
         client.receiveSplitMessage = null;
         client.isReceivingSplitMessage = false;
     }
 }
示例#6
0
 public static void HandleVesselsRequest(ClientObject client, byte[] messageData)
 {
     using (MessageReader mr = new MessageReader(messageData))
     {
         int sendVesselCount = 0;
         int cachedVesselCount = 0;
         List<string> clientRequested = new List<string>(mr.Read<string[]>());
         lock (Server.universeSizeLock)
         {
             foreach (string file in Directory.GetFiles(Path.Combine(Server.universeDirectory, "Vessels")))
             {
                 string vesselID = Path.GetFileNameWithoutExtension(file);
                 byte[] vesselData = File.ReadAllBytes(file);
                 string vesselObject = Common.CalculateSHA256Hash(vesselData);
                 if (clientRequested.Contains(vesselObject))
                 {
                     sendVesselCount++;
                     VesselProto.SendVessel(client, vesselID, vesselData);
                 }
                 else
                 {
                     cachedVesselCount++;
                 }
             }
         }
         DarkLog.Debug("Sending " + client.playerName + " " + sendVesselCount + " vessels, cached: " + cachedVesselCount + "...");
         SendVesselsComplete(client);
     }
 }
示例#7
0
        /// <summary>
        /// Represents low-level networking call that can be used to transmit an event to the browser.
        /// </summary>
        /// <param name="client">The client to transmit the event to.</param>
        /// <param name="propertyName">The name of the event to transmit.</param>
        /// <param name="type">The type of the event to transmit.</param>
        /// <param name="eventValue">The value of the event to transmit.</param>
        internal static void SendEvent(ClientObject client, AppEventType type, BoxedValue target, string eventName, BoxedValue eventValue)
        {
            try
            {
                // Check if the target is an object and retrieve the id.
                var oid = 0;
                if (target.IsObject && target.Object is BaseObject)
                    oid = ((BaseObject)target.Object).Oid;

                // Get the client
                var channel = client.Target;

                // Convert to a string
                var stringValue = TypeConverter.ToNullableString(
                    Native.Serialize(client.Env, eventValue, true)
                    );

                // Dispatch the inform
                channel.TransmitEvent(type, oid, eventName, stringValue);
            }
            catch (Exception ex)
            {
                // Log the exception
                Service.Logger.Log(ex);
            }
        }
示例#8
0
 public static void SendAllPlayerColors(ClientObject client)
 {
     Dictionary<string,float[]> sendColors = new Dictionary<string, float[]>();
     foreach (ClientObject otherClient in ClientHandler.GetClients())
     {
         if (otherClient.authenticated && otherClient.playerColor != null)
         {
             if (otherClient != client)
             {
                 sendColors[otherClient.playerName] = otherClient.playerColor;
             }
         }
     }
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.PLAYER_COLOR;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<int>((int)PlayerColorMessageType.LIST);
         mw.Write<int>(sendColors.Count);
         foreach (KeyValuePair<string, float[]> kvp in sendColors)
         {
             mw.Write<string>(kvp.Key);
             mw.Write<float[]>(kvp.Value);
         }
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
        private static void ClearObjectData(ClientObject clientObject)
        {
            PropertyInfo info_ClientObject = typeof(ClientObject).GetProperty("ObjectData", BindingFlags.NonPublic | BindingFlags.Instance);

            var objectData = (ClientObjectData)info_ClientObject.GetValue(clientObject, new object[0]);
            objectData.MethodReturnObjects.Clear();
        }
示例#10
0
 public static void SendScenarioModules(ClientObject client)
 {
     int numberOfScenarioModules = Directory.GetFiles(Path.Combine(Server.universeDirectory, "Scenarios", client.playerName)).Length;
     int currentScenarioModule = 0;
     string[] scenarioNames = new string[numberOfScenarioModules];
     byte[][] scenarioDataArray = new byte[numberOfScenarioModules][];
     foreach (string file in Directory.GetFiles(Path.Combine(Server.universeDirectory, "Scenarios", client.playerName)))
     {
         //Remove the .txt part for the name
         scenarioNames[currentScenarioModule] = Path.GetFileNameWithoutExtension(file);
         scenarioDataArray[currentScenarioModule] = File.ReadAllBytes(file);
         currentScenarioModule++;
     }
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.SCENARIO_DATA;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<string[]>(scenarioNames);
         foreach (byte[] scenarioData in scenarioDataArray)
         {
             if (client.compressionEnabled)
             {
                 mw.Write<byte[]>(Compression.CompressIfNeeded(scenarioData));
             }
             else
             {
                 mw.Write<byte[]>(Compression.AddCompressionHeader(scenarioData, false));
             }
         }
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
示例#11
0
 public static void HandlePlayerColor(ClientObject client, byte[] messageData)
 {
     using (MessageReader mr = new MessageReader(messageData))
     {
         PlayerColorMessageType messageType = (PlayerColorMessageType)mr.Read<int>();
         switch (messageType)
         {
             case PlayerColorMessageType.SET:
                 {
                     string playerName = mr.Read<string>();
                     if (playerName != client.playerName)
                     {
                         DarkLog.Debug(client.playerName + " tried to send a color update for " + playerName + ", kicking.");
                         Messages.ConnectionEnd.SendConnectionEnd(client, "Kicked for sending a color update for another player");
                         return;
                     }
                     client.playerColor = mr.Read<float[]>();
                     //Relay the message
                     ServerMessage newMessage = new ServerMessage();
                     newMessage.type = ServerMessageType.PLAYER_COLOR;
                     newMessage.data = messageData;
                     ClientHandler.SendToAll(client, newMessage, true);
                 }
                 break;
         }
     }
 }
示例#12
0
 public static void HandleWarpControl(ClientObject client, byte[] messageData)
 {
     using (MessageReader mr = new MessageReader(messageData))
     {
         WarpMessageType warpType = (WarpMessageType)mr.Read<int>();
         switch (warpType)
         {
             case WarpMessageType.REQUEST_CONTROLLER:
                 {
                     HandleRequestController(client);
                 }
                 break;
             case WarpMessageType.RELEASE_CONTROLLER:
                 {
                     HandleReleaseController(client);
                 }
                 break;
             case WarpMessageType.REPLY_VOTE:
                 {
                     bool voteReply = mr.Read<bool>();
                     HandleReplyVote(client, voteReply);
                 }
                 break;
             case WarpMessageType.NEW_SUBSPACE:
                 {
                     long serverTime = mr.Read<long>();
                     double planetTime = mr.Read<double>();
                     float subspaceRate = mr.Read<float>();
                     HandleNewSubspace(client, serverTime, planetTime, subspaceRate);
                 }
                 break;
             case WarpMessageType.CHANGE_SUBSPACE:
                 {
                     int newSubspace = mr.Read<int>();
                     HandleChangeSubspace(client, newSubspace);
                 }
                 break;
             case WarpMessageType.REPORT_RATE:
                 {
                     float newSubspaceRate = mr.Read<float>();
                     HandleReportRate(client, newSubspaceRate);
                 }
                 break;
             case WarpMessageType.CHANGE_WARP:
                 {
                     bool physWarp = mr.Read<bool>();
                     int rateIndex = mr.Read<int>();
                     long serverClock = mr.Read<long>();
                     double planetTime = mr.Read<double>();
                     HandleChangeWarp(client, physWarp, rateIndex, serverClock, planetTime);
                 }
                 break;
                 #if DEBUG
             default:
                 throw new NotImplementedException("Warp type not implemented");
                 #endif
         }
     }
 }
示例#13
0
 private static void SendKerbalsComplete(ClientObject client)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.KERBAL_COMPLETE;
     ClientHandler.SendToClient(client, newMessage, false);
     //Send vessel list needed for sync to the client
     VesselRequest.SendVesselList(client);
 }
示例#14
0
 public static void HandleVesselUpdate(ClientObject client, byte[] messageData)
 {
     //We only relay this message.
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.VESSEL_UPDATE;
     newMessage.data = messageData;
     ClientHandler.SendToAll(client, newMessage, false);
 }
示例#15
0
 /// <summary>
 /// Loads values within a specified SharePoint object from the server.
 /// </summary>
 /// <param name="context">The Client Rutime Context object representing the client connection with the server.</param>
 /// <param name="obj">The object to populate the values of.</param>
 public static void Load(ClientRuntimeContext context, ClientObject obj)
 {
     if (context != null && obj != null)
     {
         context.Load(obj);
         context.ExecuteQuery();
     }
 }
示例#16
0
 public static void HandleConnectionEnd(ClientObject client, byte[] messageData)
 {
     string reason = "Unknown";
     using (MessageReader mr = new MessageReader(messageData))
     {
         reason = mr.Read<string>();
     }
     DarkLog.Debug(client.playerName + " sent connection end message, reason: " + reason);
     ClientHandler.DisconnectClient(client);
 }
示例#17
0
 public static void SendConnectionEnd(ClientObject client, string reason)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.CONNECTION_END;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<string>(reason);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
示例#18
0
        private Expression<Func<ClientObject, Object>> GetClientObjectExpression(ClientObject clientObject, string property)
        {
            var memberExpression = Expression.PropertyOrField(Expression.Constant(clientObject), property);
            var memberName = memberExpression.Member.Name;

            var parameter = Expression.Parameter(typeof(ClientObject), "i");
            var cast = Expression.Convert(parameter, memberExpression.Member.ReflectedType);
            var body = Expression.Property(cast, memberName);
            var exp = Expression.Lambda<Func<ClientObject, Object>>(Expression.Convert(body, typeof(object)), parameter);

            return exp;
        }
示例#19
0
 public static void SendConsoleMessageToClient(ClientObject client, string message)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.CHAT_MESSAGE;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<int>((int)ChatMessageType.CONSOLE_MESSAGE);
         mw.Write<string>(message);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, false);
 }
示例#20
0
 public static void SendAllAdmins(ClientObject client)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.ADMIN_SYSTEM;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write((int)AdminMessageType.LIST);
         mw.Write<string[]>(DarkMultiPlayerServer.AdminSystem.fetch.GetAdmins());
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
示例#21
0
 private static void SendKerbal(ClientObject client, string kerbalName, byte[] kerbalData)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.KERBAL_REPLY;
     using (MessageWriter mw = new MessageWriter())
     {
         //Send the vessel with a send time of 0 so it instantly loads on the client.
         mw.Write<double>(0);
         mw.Write<string>(kerbalName);
         mw.Write<byte[]>(kerbalData);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, false);
 }
示例#22
0
 public static void SendChatMessageToClient(ClientObject client, string messageText)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.CHAT_MESSAGE;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<int>((int)ChatMessageType.PRIVATE_MESSAGE);
         mw.Write<string>(Settings.settingsStore.consoleIdentifier);
         mw.Write<string>(client.playerName);
         mw.Write(messageText);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
示例#23
0
 public static void SendHandshakeChallange(ClientObject client)
 {
     client.challange = new byte[1024];
     Random rand = new Random();
     rand.NextBytes(client.challange);
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.HANDSHAKE_CHALLANGE;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<byte[]>(client.challange);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
示例#24
0
 public static void HandleModDataMessage(ClientObject client, byte[] messageData)
 {
     using (MessageReader mr = new MessageReader(messageData))
     {
         string modName = mr.Read<string>();
         bool relay = mr.Read<bool>();
         bool highPriority = mr.Read<bool>();
         byte[] modData = mr.Read<byte[]>();
         if (relay)
         {
             DMPModInterface.SendDMPModMessageToAll(client, modName, modData, highPriority);
         }
         DMPModInterface.OnModMessageReceived(client, modName, modData);
     }
 }
示例#25
0
 protected void Page_Load(object sender, EventArgs e)
 {
     if (Request[ParameterNames.Request.ClientId] != null)
     {
         ClientObject client = new ClientObject();
         client.ClientGUID.Value = Request[ParameterNames.Request.ClientId];
         client.Load();
         if(client.IsLoaded)
         {
             HttpCookie cookie = new HttpCookie(ParameterNames.Cookie.ClientId, Request[ParameterNames.Request.ClientId]);
             cookie.Expires = DateTime.Now.AddYears(10);
             Response.SetCookie(cookie);
         }
     }
 }
示例#26
0
        public static void HandleScenarioModuleData(ClientObject client, byte[] messageData)
        {
            using (MessageReader mr = new MessageReader(messageData))
            {
                //Don't care about subspace / send time.
                string[] scenarioName = mr.Read<string[]>();
                DarkLog.Debug("Saving " + scenarioName.Length + " scenario modules from " + client.playerName);

                for (int i = 0; i < scenarioName.Length; i++)
                {
                    byte[] scenarioData = Compression.DecompressIfNeeded(mr.Read<byte[]>());
                    File.WriteAllBytes(Path.Combine(Server.universeDirectory, "Scenarios", client.playerName, scenarioName[i] + ".txt"), scenarioData);
                }
            }
        }
示例#27
0
        private static void SendMotdReply(ClientObject client)
        {
            ServerMessage newMessage = new ServerMessage();
            newMessage.type = ServerMessageType.MOTD_REPLY;

            string newMotd = Settings.settingsStore.serverMotd;
            newMotd = newMotd.Replace("%name%", client.playerName);
            newMotd = newMotd.Replace(@"\n", Environment.NewLine);

            using (MessageWriter mw = new MessageWriter())
            {
                mw.Write<string>(newMotd);
                newMessage.data = mw.GetMessageBytes();
            }
            ClientHandler.SendToClient(client, newMessage, true);
        }
        private static bool AddJsLinkImplementation(ClientObject clientObject, string key, IEnumerable<string> scriptLinks, int sequence)
        {
            var ret = false;
            if (clientObject is Web || clientObject is Site)
            {
                var scriptLinksEnumerable = scriptLinks as string[] ?? scriptLinks.ToArray();
                if (!scriptLinksEnumerable.Any())
                {
                    throw new ArgumentException("Parameter scriptLinks can't be empty");
                }

                var scripts = new StringBuilder(@" var headID = document.getElementsByTagName('head')[0]; 
var scripts = document.getElementsByTagName('script');
var scriptsSrc = [];
for(var i = 0; i < scripts.length; i++) {
    if(scripts[i].type === 'text/javascript'){
        scriptsSrc.push(scripts[i].src);
    }
}
");
                foreach (var link in scriptLinksEnumerable)
                {
                    if (!string.IsNullOrEmpty(link))
                    {
                        scripts.Append(@"
if (scriptsSrc.indexOf('{1}') === -1)  {  
    var newScript = document.createElement('script');
    newScript.id = '{0}';
    newScript.type = 'text/javascript';
    newScript.src = '{1}';
    headID.appendChild(newScript);
    scriptsSrc.push('{1}');
}".Replace("{0}", key).Replace("{1}", link));
                    }

                }

                ret = AddJsBlockImplementation(clientObject, key, scripts.ToString(), sequence);

            }
            else
            {
                throw new ArgumentException("Only Site or Web supported as clientObject");

            }
            return ret;
        }
示例#29
0
 public static void SendVesselList(ClientObject client)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.VESSEL_LIST;
     string[] vesselFiles = Directory.GetFiles(Path.Combine(Server.universeDirectory, "Vessels"));
     string[] vesselObjects = new string[vesselFiles.Length];
     for (int i = 0; i < vesselFiles.Length; i++)
     {
         vesselObjects[i] = Common.CalculateSHA256Hash(vesselFiles[i]);
     }
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<string[]>(vesselObjects);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, false);
 }
示例#30
0
 public static void SendAllLocks(ClientObject client)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.LOCK_SYSTEM;
     //Send the dictionary as 2 string[]'s.
     Dictionary<string,string> lockList = DarkMultiPlayerServer.LockSystem.fetch.GetLockList();
     List<string> lockKeys = new List<string>(lockList.Keys);
     List<string> lockValues = new List<string>(lockList.Values);
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write((int)LockMessageType.LIST);
         mw.Write<string[]>(lockKeys.ToArray());
         mw.Write<string[]>(lockValues.ToArray());
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
示例#31
0
            static void Main(string[] args)
            {
                try
                {
                    Server s = new Server();
                    listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
                    listener.Start();
                    Console.WriteLine("Ожидание подключений...");

                    while (true)
                    {
                        Socket       client       = listener.AcceptSocket();
                        ClientObject clientObject = new ClientObject(client, s);
                        // создаем новый поток для обслуживания нового клиента
                        Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
                        clientThread.Start();
                    }
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.DarkRed;
                    Console.WriteLine(ex.Message);
                }
            }
        /// <summary>
        /// Returns the Packet of data sent by a TcpClient
        /// </summary>
        /// <param name="serverData">Returns the ServerData object if the packet was a ServerDataPacket</param>
        /// <returns>The Packet sent</returns>
        IDataPacket ListenForPackets(ref ClientObject cO)
        {
            var client = cO.Data.TcpClient;

            byte[]      bytes  = new byte[Packet.MAX_BYTE_LENGTH];
            IDataPacket packet = null;

            if (client.GetStream().Read(bytes, 0, bytes.Length) != 0)
            {
                packet = Packet.ToPacket(bytes);
            }

            if (packet is ServerDataPacket)
            {
                var sPacket = (ServerDataPacket)packet;
                cO.Data = new Data(ConnectedClients.Count == 0 ? 0 : ConnectedClients.Last().Data.ID + 1)
                {
                    TcpClient = client, FirstConnect = sPacket.FirstConnect, IPv4 = sPacket.IPv4, Name = sPacket.Name, Port = sPacket.Port
                };
                Logger.Instance.Log($"Server @ {cO.Data.IPv4} added to collection");
            }

            return(packet);
        }
示例#33
0
 public static void SendAllSubspaces(ClientObject client)
 {
     //Send all the locks.
     foreach (KeyValuePair <int, Subspace> subspace in subspaces)
     {
         ServerMessage newMessage = new ServerMessage();
         newMessage.type = ServerMessageType.WARP_CONTROL;
         using (MessageWriter mw = new MessageWriter())
         {
             mw.Write <int>((int)WarpMessageType.NEW_SUBSPACE);
             mw.Write <int>(subspace.Key);
             mw.Write <long>(subspace.Value.serverClock);
             mw.Write <double>(subspace.Value.planetTime);
             mw.Write <float>(subspace.Value.subspaceSpeed);
             newMessage.data = mw.GetMessageBytes();
         }
         ClientHandler.SendToClient(client, newMessage, true);
     }
     //Tell the player "when" everyone is.
     foreach (ClientObject otherClient in ClientHandler.GetClients())
     {
         if (otherClient.authenticated && (otherClient.playerName != client.playerName))
         {
             ServerMessage newMessage = new ServerMessage();
             newMessage.type = ServerMessageType.WARP_CONTROL;
             using (MessageWriter mw = new MessageWriter())
             {
                 mw.Write <int>((int)WarpMessageType.CHANGE_SUBSPACE);
                 mw.Write <string>(otherClient.playerName);
                 mw.Write <int>(otherClient.subspace);
                 newMessage.data = mw.GetMessageBytes();
             }
             ClientHandler.SendToClient(client, newMessage, true);
         }
     }
 }
示例#34
0
 public static void HandleKerbalsRequest(ClientObject client)
 {
     //The time sensitive SYNC_TIME is over by this point.
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write <string>(client.playerName);
         ServerMessage joinMessage = new ServerMessage();
         joinMessage.type = ServerMessageType.PLAYER_JOIN;
         joinMessage.data = mw.GetMessageBytes();
         ClientHandler.SendToAll(client, joinMessage, true);
     }
     Messages.ServerSettings.SendServerSettings(client);
     Messages.WarpControl.SendSetSubspace(client);
     Messages.WarpControl.SendAllSubspaces(client);
     Messages.PlayerColor.SendAllPlayerColors(client);
     Messages.PlayerStatus.SendAllPlayerStatus(client);
     Messages.ScenarioData.SendScenarioModules(client);
     Messages.WarpControl.SendAllReportedSkewRates(client);
     Messages.CraftLibrary.SendCraftList(client);
     Messages.Chat.SendPlayerChatChannels(client);
     Messages.LockSystem.SendAllLocks(client);
     Messages.AdminSystem.SendAllAdmins(client);
     //Send kerbals
     lock (Server.universeSizeLock)
     {
         string[] kerbalFiles = Directory.GetFiles(Path.Combine(Server.universeDirectory, "Kerbals"));
         foreach (string kerbalFile in kerbalFiles)
         {
             string kerbalName = Path.GetFileNameWithoutExtension(kerbalFile);
             byte[] kerbalData = File.ReadAllBytes(kerbalFile);
             SendKerbal(client, kerbalName, kerbalData);
         }
         DarkLog.Debug("Sending " + client.playerName + " " + kerbalFiles.Length + " kerbals...");
     }
     SendKerbalsComplete(client);
 }
示例#35
0
        private static void HandleChangeWarp(ClientObject client, bool physWarp, int rateIndex, long serverClock, double planetTime)
        {
            ServerMessage newMessage = new ServerMessage();

            newMessage.type = ServerMessageType.WARP_CONTROL;
            using (MessageWriter mw = new MessageWriter())
            {
                mw.Write <int>((int)WarpMessageType.CHANGE_WARP);
                mw.Write <string>(client.playerName);
                mw.Write <bool>(physWarp);
                mw.Write <int>(rateIndex);
                mw.Write <long>(serverClock);
                mw.Write <double>(planetTime);
                newMessage.data = mw.GetMessageBytes();
            }
            if (Settings.settingsStore.warpMode == WarpMode.MCW_LOWEST)
            {
                PlayerWarpRate clientWarpRate = null;

                if (!warpList.ContainsKey(client.playerName))
                {
                    clientWarpRate = new PlayerWarpRate();
                    warpList.Add(client.playerName, clientWarpRate);
                }
                else
                {
                    clientWarpRate = warpList[client.playerName];
                }
                clientWarpRate.isPhysWarp  = physWarp;
                clientWarpRate.rateIndex   = rateIndex;
                clientWarpRate.serverClock = serverClock;
                clientWarpRate.planetTime  = planetTime;
                HandleLowestRateChange(client);
            }
            ClientHandler.SendToAll(client, newMessage, true);
        }
示例#36
0
 public AdminGroups(ClientObject cl)
 {
     InitializeComponent();
     client = cl;
     AddItemsToComboBox();
 }
示例#37
0
        private static bool AddJsLinkImplementation(ClientObject clientObject, string key, IEnumerable <string> scriptLinks, int sequence)
        {
            bool ret;

            if (clientObject is Web || clientObject is Site)
            {
                var scriptLinksEnumerable = scriptLinks as string[] ?? scriptLinks.ToArray();
                if (!scriptLinksEnumerable.Any())
                {
                    throw new ArgumentException(nameof(scriptLinks));
                }

                if (scriptLinksEnumerable.Length == 1)
                {
                    var scriptSrc = scriptLinksEnumerable[0];
                    if (!scriptSrc.StartsWith("http", StringComparison.InvariantCultureIgnoreCase))
                    {
                        var serverUri = new Uri(clientObject.Context.Url);
                        if (scriptSrc.StartsWith("/"))
                        {
                            scriptSrc = $"{serverUri.Scheme}://{serverUri.Authority}{scriptSrc}";
                        }
                        else
                        {
                            var serverRelativeUrl = string.Empty;
                            if (clientObject is Web)
                            {
                                serverRelativeUrl = ((Web)clientObject).EnsureProperty(w => w.ServerRelativeUrl);
                            }
                            else
                            {
                                serverRelativeUrl = ((Site)clientObject).RootWeb.EnsureProperty(w => w.ServerRelativeUrl);
                            }
                            scriptSrc = $"{serverUri.Scheme}://{serverUri.Authority}{serverRelativeUrl}/{scriptSrc}";
                        }
                    }

                    var customAction = new CustomActionEntity
                    {
                        Name      = key,
                        ScriptSrc = scriptSrc,
                        Location  = SCRIPT_LOCATION,
                        Sequence  = sequence
                    };
                    if (clientObject is Web)
                    {
                        ret = ((Web)clientObject).AddCustomAction(customAction);
                    }
                    else
                    {
                        ret = ((Site)clientObject).AddCustomAction(customAction);
                    }
                }
                else
                {
                    var scripts = new StringBuilder(@" var headID = document.getElementsByTagName('head')[0]; 
var scripts = document.getElementsByTagName('script');
var scriptsSrc = [];
for(var i = 0; i < scripts.length; i++) {
    if(scripts[i].type === 'text/javascript'){
        scriptsSrc.push(scripts[i].src);
    }
}
");
                    foreach (var link in scriptLinksEnumerable)
                    {
                        if (!string.IsNullOrEmpty(link))
                        {
                            scripts.Append(@"
if (scriptsSrc.indexOf('{1}') === -1)  {  
    var newScript = document.createElement('script');
    newScript.id = '{0}';
    newScript.type = 'text/javascript';
    newScript.src = '{1}';
    headID.appendChild(newScript);
    scriptsSrc.push('{1}');
}".Replace("{0}", key).Replace("{1}", link));
                        }
                    }

                    ret = AddJsBlockImplementation(clientObject, key, scripts.ToString(), sequence);
                }
            }
            else
            {
                throw new ArgumentException("Only Site or Web supported as clientObject");
            }
            return(ret);
        }
示例#38
0
        public StudentPassTest(ClientObject cl, int testId, Window _mw, Frame _mn, StudentTests previousPage)
        {
            InitializeComponent();
            client        = cl;
            mw            = _mw;
            main          = _mn;
            _previousPage = previousPage;
            _userAnswers  = new List <DTOAnswer>();
            dtoTest       = client.GetTest(testId);
            questions     = client.GetQuestions(testId);
            questionType  = client.GetQuestionTypes();
            _testSession  = new DTOTestSession()
            {
                Status = "Continues", StartTime = DateTime.Now, TestId = testId, StudentId = cl.GetClientId()
            };

            Thread.Sleep(500);
            _testSession.TestSessionId = client.AddTestSession(_testSession);

            //IGNORE comments.
            //1. add grid with one column
            //2. add two  containers vertically
            //3. add question text to uppersection
            //4. add container horisontal
            //5. add two containers in both container from step 4.
            //6. paiste horisontal container
            //7. add answer option with certain type.
            var mainStack = new StackPanel();

            mainStack.HorizontalAlignment = HorizontalAlignment.Left;
            var listOfStackPanels = new List <StackPanel>();

            var testNameStacPanel = new StackPanel();
            var testName          = new TextBlock();

            testName.FontSize   = 15;
            testName.FontFamily = new FontFamily("Century Gothic");
            testName.Text       = dtoTest.TestName;
            testNameStacPanel.Children.Add(testName);
            listOfStackPanels.Add(testNameStacPanel);

            int i = 0;

            foreach (var question in questions)
            {
                // Answers logic
                answerDictionary.Add(i, "");

                //
                //questionLogic
                var stackQuestion = new StackPanel();
                stackQuestion.Margin = new Thickness()
                {
                    Bottom = 20, Left = 10, Right = 0, Top = 0
                };
                var stackQuestionText = new StackPanel();
                var stackOptions      = new StackPanel();
                var textElement       = new TextBlock();
                textElement.Text = (i + 1).ToString() + ". " + question.QuestionText;
                stackQuestionText.Children.Add(textElement);
                var options = question.AnswerOption?.Split(';');
                if (options != null && options.Length != 0)
                {
                    if (question.QuestionTypeId == 1)
                    {
                        for (int k = 0; k < options.Length; k++)
                        {
                            RadioButton rb = new RadioButton()
                            {
                                Content = " " + options[k], IsChecked = i != 0
                            };
                            rb.Checked += (sender, args) =>
                            {
                                answerDictionary[(int)((System.Windows.FrameworkElement)sender).Tag] = ((System.Windows.Controls.ContentControl)args.Source).Content.ToString();
                            };
                            rb.Unchecked += (sender, args) => { /* Do nothing */ };
                            rb.Tag        = i;
                            rb.IsChecked  = false;
                            mainStackPanel.HorizontalAlignment = HorizontalAlignment;
                            stackOptions.Children.Add(rb);
                        }
                    }
                    else
                    {
                        if (question.QuestionTypeId == 2)
                        {
                            for (int k = 0; k < options.Length; k++)
                            {
                                CheckBox rb = new CheckBox()
                                {
                                    Content = " " + options[k], IsChecked = i != 0
                                };
                                rb.Checked += (sender, args) =>
                                {
                                    if (string.IsNullOrEmpty(answerDictionary[(int)((System.Windows.FrameworkElement)sender).Tag]))
                                    {
                                        answerDictionary[(int)((System.Windows.FrameworkElement)sender).Tag] = ((System.Windows.Controls.ContentControl)args.Source).Content.ToString();
                                    }
                                    else
                                    {
                                        answerDictionary[(int)((System.Windows.FrameworkElement)sender).Tag] += " ; " + ((System.Windows.Controls.ContentControl)args.Source).Content.ToString();
                                    }
                                };
                                rb.Unchecked += (sender, args) => {
                                    /* Do stuff */
                                    var      multipleAnswers   = answerDictionary[(int)((System.Windows.FrameworkElement)sender).Tag];
                                    string   elementToRemove   = ((System.Windows.Controls.ContentControl)args.Source).Content.ToString();
                                    string[] separatingStrings = { " ; " };
                                    var      newAnswers        = multipleAnswers.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries).Where(val => val != elementToRemove).ToArray();
                                    answerDictionary[(int)((System.Windows.FrameworkElement)sender).Tag] = string.Join(" ; ", newAnswers);
                                };

                                rb.Tag = i;
                                mainStackPanel.HorizontalAlignment = HorizontalAlignment;
                                rb.IsChecked = false;
                                stackOptions.Children.Add(rb);
                            }
                        }
                        else
                        {
                            if (question.QuestionTypeId == 3)
                            {
                                for (int k = 0; k < 2; k++)
                                {
                                    string[]    optionsTrueFalse = { "правда", "неправда" };
                                    RadioButton rb = new RadioButton()
                                    {
                                        Content = " " + optionsTrueFalse[k], IsChecked = i != 0
                                    };
                                    rb.Checked += (sender, args) =>
                                    {
                                        answerDictionary[(int)((System.Windows.FrameworkElement)sender).Tag] = ((System.Windows.Controls.ContentControl)args.Source).Content.ToString();
                                    };
                                    rb.Unchecked += (sender, args) => { /* Do nothing */ };
                                    rb.Tag        = i;
                                    rb.IsChecked  = false;
                                    mainStackPanel.HorizontalAlignment = HorizontalAlignment;
                                    stackOptions.Children.Add(rb);
                                }
                            }
                            else
                            {
                                throw new NotImplementedException();
                            }
                        }
                    }
                }
                else
                {
                    var textElementBox = new TextBlock();
                    textElementBox.Text = "Варіанти відповідей відсутні. ((";
                    stackOptions.Children.Add(textElementBox);
                    stackOptions.Tag = i;
                }
                stackQuestion.Children.Add(stackQuestionText);
                stackQuestion.Children.Add(stackOptions);
                listOfStackPanels.Add(stackQuestion);

                ++i;
            }

            // adding questions to stack.
            foreach (var listOfStackPanel in listOfStackPanels)
            {
                mainStack.Children.Add(listOfStackPanel);
            }

            mainStackPanel.Children.Add(mainStack);


            //add button SUBMIT
            Button buttonSubmit = new Button()
            {
                Content = "Завершити"
            };

            //< Button Content = "Button" HorizontalAlignment = "Left" Margin = "20,10,0,0" VerticalAlignment = "Top" Width = "75" Click = "Button_Click" />
            buttonSubmit.HorizontalAlignment = HorizontalAlignment.Left;
            buttonSubmit.Margin = new Thickness()
            {
                Bottom = 20, Left = 10, Right = 0, Top = 0
            };
            buttonSubmit.VerticalAlignment = VerticalAlignment.Top;
            buttonSubmit.Width             = 75;
            buttonSubmit.Click            += new RoutedEventHandler(Button_Click);

            mainStackPanel.Children.Add(buttonSubmit);
        }
示例#39
0
 //Validate helpers
 private bool IsPropertyAvailable(ClientObject clientObject, string propertyName)
 {
     return(clientObject.IsObjectPropertyInstantiated(propertyName) || clientObject.IsPropertyAvailable(propertyName));
 }
示例#40
0
 public static void createNewChat(ClientObject client, string usernameFrom, string usernameTo)
 {
     MySQLUtils.createNewChatServer(client, usernameFrom, usernameTo);
 }
示例#41
0
 public override void OnClientDisconnect(ClientObject client)
 {
     connectedPlayers.Remove(client.playerName);
     ReportData();
 }
示例#42
0
 public override void OnClientAuthenticated(ClientObject client)
 {
     connectedPlayers.Add(client.playerName);
     ReportData();
 }
示例#43
0
        public void CheckClientEmail()
        {
            ClientObject client = GetUnparsedData(SampleParsedData).Clients.First();

            Assert.AreEqual("*****@*****.**", client.Email);
        }
示例#44
0
        private static bool AddCustomActionImplementation(ClientObject clientObject, CustomActionEntity customAction)
        {
            UserCustomAction           targetAction    = null;
            UserCustomActionCollection existingActions = null;

            if (clientObject is Web)
            {
                var web = (Web)clientObject;

                existingActions = web.UserCustomActions;
                web.Context.Load(existingActions);
                web.Context.ExecuteQueryRetry();

                targetAction = web.UserCustomActions.FirstOrDefault(uca => uca.Name == customAction.Name);
            }
            else
            {
                var site = (Site)clientObject;

                existingActions = site.UserCustomActions;
                site.Context.Load(existingActions);
                site.Context.ExecuteQueryRetry();

                targetAction = site.UserCustomActions.FirstOrDefault(uca => uca.Name == customAction.Name);
            }

            if (targetAction == null)
            {
                // If we're removing the custom action then we need to leave when not found...else we're creating the custom action
                if (customAction.Remove)
                {
                    return(true);
                }
                else
                {
                    targetAction = existingActions.Add();
                }
            }
            else if (customAction.Remove)
            {
                targetAction.DeleteObject();
                clientObject.Context.ExecuteQueryRetry();
                return(true);
            }

            targetAction.Name        = customAction.Name;
            targetAction.Description = customAction.Description;
            targetAction.Location    = customAction.Location;

            if (customAction.Location == JavaScriptExtensions.SCRIPT_LOCATION)
            {
                targetAction.ScriptBlock = customAction.ScriptBlock;
                targetAction.ScriptSrc   = customAction.ScriptSrc;
            }
            else
            {
                targetAction.Sequence = customAction.Sequence;
                targetAction.Url      = customAction.Url;
                targetAction.Group    = customAction.Group;
                targetAction.Title    = customAction.Title;
                targetAction.ImageUrl = customAction.ImageUrl;

                if (customAction.RegistrationId != null)
                {
                    targetAction.RegistrationId = customAction.RegistrationId;
                }

                if (customAction.CommandUIExtension != null)
                {
                    targetAction.CommandUIExtension = customAction.CommandUIExtension;
                }

                if (customAction.Rights != null)
                {
                    targetAction.Rights = customAction.Rights;
                }

                if (customAction.RegistrationType.HasValue)
                {
                    targetAction.RegistrationType = customAction.RegistrationType.Value;
                }
            }

            targetAction.Update();
            if (clientObject is Web)
            {
                var web = (Web)clientObject;
                web.Context.Load(web, w => w.UserCustomActions);
                web.Context.ExecuteQueryRetry();
            }
            else
            {
                var site = (Site)clientObject;
                site.Context.Load(site, s => s.UserCustomActions);
                site.Context.ExecuteQueryRetry();
            }

            return(true);
        }
示例#45
0
        public static void HandleWarpControl(ClientObject client, byte[] messageData)
        {
            ServerMessage newMessage = new ServerMessage();

            newMessage.type = ServerMessageType.WARP_CONTROL;
            newMessage.data = messageData;
            using (MessageReader mr = new MessageReader(messageData))
            {
                WarpMessageType warpType   = (WarpMessageType)mr.Read <int>();
                string          fromPlayer = mr.Read <string>();
                if (fromPlayer == client.playerName)
                {
                    if (warpType == WarpMessageType.NEW_SUBSPACE)
                    {
                        int newSubspaceID = mr.Read <int>();
                        if (subspaces.ContainsKey(newSubspaceID))
                        {
                            DarkLog.Debug("Kicked for trying to create an existing subspace");
                            Messages.ConnectionEnd.SendConnectionEnd(client, "Kicked for trying to create an existing subspace");
                            return;
                        }
                        else
                        {
                            Subspace newSubspace = new Subspace();
                            newSubspace.serverClock   = mr.Read <long>();
                            newSubspace.planetTime    = mr.Read <double>();
                            newSubspace.subspaceSpeed = mr.Read <float>();
                            subspaces.Add(newSubspaceID, newSubspace);
                            client.subspace = newSubspaceID;
                            SaveLatestSubspace();
                        }
                    }
                    if (warpType == WarpMessageType.CHANGE_SUBSPACE)
                    {
                        client.subspace = mr.Read <int>();
                    }
                    if (warpType == WarpMessageType.REPORT_RATE)
                    {
                        int reportedSubspace = mr.Read <int>();
                        if (client.subspace != reportedSubspace)
                        {
                            DarkLog.Debug("Warning, setting client " + client.playerName + " to subspace " + client.subspace);
                            client.subspace = reportedSubspace;
                        }
                        float newSubspaceRate = mr.Read <float>();
                        client.subspaceRate = newSubspaceRate;
                        foreach (ClientObject otherClient in ClientHandler.GetClients())
                        {
                            if (otherClient.authenticated && otherClient.subspace == reportedSubspace)
                            {
                                if (newSubspaceRate > otherClient.subspaceRate)
                                {
                                    newSubspaceRate = otherClient.subspaceRate;
                                }
                            }
                        }
                        if (newSubspaceRate < 0.3f)
                        {
                            newSubspaceRate = 0.3f;
                        }
                        if (newSubspaceRate > 1f)
                        {
                            newSubspaceRate = 1f;
                        }
                        //Relock the subspace if the rate is more than 3% out of the average
                        if (Math.Abs(subspaces[reportedSubspace].subspaceSpeed - newSubspaceRate) > 0.03f)
                        {
                            UpdateSubspace(reportedSubspace);
                            subspaces[reportedSubspace].subspaceSpeed = newSubspaceRate;
                            ServerMessage relockMessage = new ServerMessage();
                            relockMessage.type = ServerMessageType.WARP_CONTROL;
                            using (MessageWriter mw = new MessageWriter())
                            {
                                mw.Write <int>((int)WarpMessageType.RELOCK_SUBSPACE);
                                mw.Write <string>(Settings.settingsStore.consoleIdentifier);
                                mw.Write <int>(reportedSubspace);
                                mw.Write <long>(subspaces[reportedSubspace].serverClock);
                                mw.Write <double>(subspaces[reportedSubspace].planetTime);
                                mw.Write <float>(subspaces[reportedSubspace].subspaceSpeed);
                                relockMessage.data = mw.GetMessageBytes();
                            }
                            SaveLatestSubspace();
                            //DarkLog.Debug("Subspace " + client.subspace + " locked to " + newSubspaceRate + "x speed.");
                            ClientHandler.SendToClient(client, relockMessage, true);
                            ClientHandler.SendToAll(client, relockMessage, true);
                        }
                    }
                }
                else
                {
                    DarkLog.Debug(client.playerName + " tried to send an update for " + fromPlayer + ", kicking.");
                    Messages.ConnectionEnd.SendConnectionEnd(client, "Kicked for sending an update for another player");
                    return;
                }
            }
            ClientHandler.SendToAll(client, newMessage, true);
        }
示例#46
0
 public static void loadChatsHandler(ClientObject client)
 {
     MySQLUtils.getChats(client);
 }
示例#47
0
 private static ClientObjectData GetClientObjectData(ClientObject clientObject)
 {
     return((ClientObjectData)CsomHelpers.info_ClientObject_ObjectData.GetValue(clientObject, new object[0]));
 }
示例#48
0
        /// <summary>
        /// Certain CSOM methods cache their return values for the lifetime of the ClientContext.
        /// (In the server OM, these methods are marked with ClientCallableMethod.CacheReturnValue=true.)
        /// This can produce incorrect results if the value was changed e.g. by the same session
        /// that is now trying to read the new value.  FlushCachedProperties() can be called in
        /// this situation to flush the internal cache.  It should be called after ExecuteQuery()
        /// and before the next query expression is loaded.
        /// </summary>
        public static void FlushCachedProperties(ClientObject clientObject)
        {
            ClientObjectData objectData = CsomHelpers.GetClientObjectData(clientObject);

            objectData.MethodReturnObjects.Clear();
        }
示例#49
0
 public void AddConnection(ClientObject obj)
 {
     clients.Add(obj);
 }
        public static void HandleScreenshotLibrary(ClientObject client, byte[] messageData)
        {
            string screenshotDirectory = Path.Combine(Server.universeDirectory, "Screenshots");

            if (Settings.settingsStore.screenshotDirectory != "")
            {
                if (Directory.Exists(Settings.settingsStore.screenshotDirectory))
                {
                    screenshotDirectory = Settings.settingsStore.screenshotDirectory;
                }
            }
            if (!Directory.Exists(screenshotDirectory))
            {
                Directory.CreateDirectory(screenshotDirectory);
            }
            ServerMessage newMessage = new ServerMessage();

            newMessage.type = ServerMessageType.SCREENSHOT_LIBRARY;
            using (MessageReader mr = new MessageReader(messageData))
            {
                ScreenshotMessageType messageType = (ScreenshotMessageType)mr.Read <int>();
                string fromPlayer = mr.Read <string>();
                switch (messageType)
                {
                case ScreenshotMessageType.SCREENSHOT:
                {
                    if (Settings.settingsStore.screenshotsPerPlayer > -1)
                    {
                        string playerScreenshotDirectory = Path.Combine(screenshotDirectory, fromPlayer);
                        if (!Directory.Exists(playerScreenshotDirectory))
                        {
                            Directory.CreateDirectory(playerScreenshotDirectory);
                        }
                        string screenshotFile = Path.Combine(playerScreenshotDirectory, DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".png");
                        DarkLog.Debug("Saving screenshot from " + fromPlayer);

                        byte[] screenshotData = mr.Read <byte[]>();

                        File.WriteAllBytes(screenshotFile, screenshotData);
                        if (Settings.settingsStore.screenshotsPerPlayer != 0)
                        {
                            while (Directory.GetFiles(playerScreenshotDirectory).Length > Settings.settingsStore.screenshotsPerPlayer)
                            {
                                string[] currentFiles = Directory.GetFiles(playerScreenshotDirectory);
                                string   deleteFile   = currentFiles[0];
                                //Find oldest file
                                foreach (string testFile in currentFiles)
                                {
                                    if (File.GetCreationTime(testFile) < File.GetCreationTime(deleteFile))
                                    {
                                        deleteFile = testFile;
                                    }
                                }
                                File.Delete(deleteFile);
                                DarkLog.Debug("Removing old screenshot " + Path.GetFileName(deleteFile));
                            }
                        }

                        //Notify players that aren't watching that there's a new screenshot availabe. This only works if there's a file available on the server.
                        //The server does not keep the screenshots in memory.
                        ServerMessage notifyMessage = new ServerMessage();
                        notifyMessage.type = ServerMessageType.SCREENSHOT_LIBRARY;
                        using (MessageWriter mw = new MessageWriter())
                        {
                            mw.Write <int>((int)ScreenshotMessageType.NOTIFY);
                            mw.Write(fromPlayer);
                            notifyMessage.data = mw.GetMessageBytes();
                            ClientHandler.SendToAll(client, notifyMessage, false);
                        }
                    }
                    if (!playerUploadedScreenshotIndex.ContainsKey(fromPlayer))
                    {
                        playerUploadedScreenshotIndex.Add(fromPlayer, 0);
                    }
                    else
                    {
                        playerUploadedScreenshotIndex[fromPlayer]++;
                    }
                    if (!playerDownloadedScreenshotIndex.ContainsKey(fromPlayer))
                    {
                        playerDownloadedScreenshotIndex.Add(fromPlayer, new Dictionary <string, int>());
                    }
                    if (!playerDownloadedScreenshotIndex[fromPlayer].ContainsKey(fromPlayer))
                    {
                        playerDownloadedScreenshotIndex[fromPlayer].Add(fromPlayer, playerUploadedScreenshotIndex[fromPlayer]);
                    }
                    else
                    {
                        playerDownloadedScreenshotIndex[fromPlayer][fromPlayer] = playerUploadedScreenshotIndex[fromPlayer];
                    }
                    newMessage.data = messageData;
                    foreach (KeyValuePair <string, string> entry in playerWatchScreenshot)
                    {
                        if (entry.Key != fromPlayer)
                        {
                            if (entry.Value == fromPlayer && entry.Key != client.playerName)
                            {
                                ClientObject toClient = ClientHandler.GetClientByName(entry.Key);
                                if (toClient != null && toClient != client)
                                {
                                    if (!playerDownloadedScreenshotIndex.ContainsKey(entry.Key))
                                    {
                                        playerDownloadedScreenshotIndex.Add(entry.Key, new Dictionary <string, int>());
                                    }
                                    if (!playerDownloadedScreenshotIndex[entry.Key].ContainsKey(fromPlayer))
                                    {
                                        playerDownloadedScreenshotIndex[entry.Key].Add(fromPlayer, 0);
                                    }
                                    playerDownloadedScreenshotIndex[entry.Key][fromPlayer] = playerUploadedScreenshotIndex[fromPlayer];
                                    DarkLog.Debug("Sending screenshot from " + fromPlayer + " to " + entry.Key);
                                    using (MessageWriter mw = new MessageWriter())
                                    {
                                        ServerMessage sendStartMessage = new ServerMessage();
                                        sendStartMessage.type = ServerMessageType.SCREENSHOT_LIBRARY;
                                        mw.Write <int>((int)ScreenshotMessageType.SEND_START_NOTIFY);
                                        mw.Write <string>(fromPlayer);
                                        sendStartMessage.data = mw.GetMessageBytes();
                                        ClientHandler.SendToClient(toClient, sendStartMessage, true);
                                    }
                                    ClientHandler.SendToClient(toClient, newMessage, false);
                                }
                            }
                        }
                    }
                }
                break;

                case ScreenshotMessageType.WATCH:
                {
                    newMessage.data = messageData;
                    string watchPlayer = mr.Read <string>();
                    if (watchPlayer == "")
                    {
                        if (playerWatchScreenshot.ContainsKey(fromPlayer))
                        {
                            DarkLog.Debug(fromPlayer + " is no longer watching screenshots from " + playerWatchScreenshot[fromPlayer]);
                            playerWatchScreenshot.Remove(fromPlayer);
                        }
                    }
                    else
                    {
                        DarkLog.Debug(fromPlayer + " is watching screenshots from " + watchPlayer);
                        playerWatchScreenshot[fromPlayer] = watchPlayer;
                        if (!playerDownloadedScreenshotIndex.ContainsKey(fromPlayer))
                        {
                            playerDownloadedScreenshotIndex.Add(fromPlayer, new Dictionary <string, int>());
                        }
                        string watchPlayerScreenshotDirectory = Path.Combine(screenshotDirectory, watchPlayer);
                        //Find latest screenshot
                        string sendFile = null;
                        if (Directory.Exists(watchPlayerScreenshotDirectory))
                        {
                            string[] playerScreenshots = Directory.GetFiles(watchPlayerScreenshotDirectory);
                            if (playerScreenshots.Length > 0)
                            {
                                sendFile = playerScreenshots[0];
                                foreach (string testFile in playerScreenshots)
                                {
                                    if (File.GetCreationTime(testFile) > File.GetCreationTime(sendFile))
                                    {
                                        sendFile = testFile;
                                    }
                                }
                                if (!playerUploadedScreenshotIndex.ContainsKey(watchPlayer))
                                {
                                    playerUploadedScreenshotIndex.Add(watchPlayer, 0);
                                }
                            }
                        }
                        //Send screenshot if needed
                        if (sendFile != null)
                        {
                            bool sendScreenshot = false;
                            if (!playerDownloadedScreenshotIndex[fromPlayer].ContainsKey(watchPlayer))
                            {
                                playerDownloadedScreenshotIndex[fromPlayer].Add(watchPlayer, playerUploadedScreenshotIndex[watchPlayer]);
                                sendScreenshot = true;
                            }
                            else
                            {
                                if (playerDownloadedScreenshotIndex[fromPlayer][watchPlayer] != playerUploadedScreenshotIndex[watchPlayer])
                                {
                                    sendScreenshot = true;
                                    playerDownloadedScreenshotIndex[fromPlayer][watchPlayer] = playerUploadedScreenshotIndex[watchPlayer];
                                }
                            }
                            if (sendScreenshot)
                            {
                                ServerMessage sendStartMessage = new ServerMessage();
                                sendStartMessage.type = ServerMessageType.SCREENSHOT_LIBRARY;
                                using (MessageWriter mw = new MessageWriter())
                                {
                                    mw.Write <int>((int)ScreenshotMessageType.SEND_START_NOTIFY);
                                    mw.Write <string>(fromPlayer);
                                    sendStartMessage.data = mw.GetMessageBytes();
                                }
                                ServerMessage screenshotMessage = new ServerMessage();
                                screenshotMessage.type = ServerMessageType.SCREENSHOT_LIBRARY;
                                using (MessageWriter mw = new MessageWriter())
                                {
                                    mw.Write <int>((int)ScreenshotMessageType.SCREENSHOT);
                                    mw.Write <string>(watchPlayer);
                                    mw.Write <byte[]>(File.ReadAllBytes(sendFile));
                                    screenshotMessage.data = mw.GetMessageBytes();
                                }
                                ClientObject toClient = ClientHandler.GetClientByName(fromPlayer);
                                if (toClient != null)
                                {
                                    DarkLog.Debug("Sending saved screenshot from " + watchPlayer + " to " + fromPlayer);
                                    ClientHandler.SendToClient(toClient, sendStartMessage, false);
                                    ClientHandler.SendToClient(toClient, screenshotMessage, false);
                                }
                            }
                        }
                    }
                    //Relay the message
                    ClientHandler.SendToAll(client, newMessage, false);
                }
                break;
                }
            }
        }
示例#51
0
        public void CheckClientID()
        {
            ClientObject client = GetUnparsedData(SampleParsedData).Clients.First();

            Assert.AreEqual(1, client.ClientID);
        }
示例#52
0
        public void CheckClientPreferredName()
        {
            ClientObject client = GetUnparsedData(SampleParsedData).Clients.First();

            Assert.AreEqual("Australian Native Landscapes Pty Ltd", client.PreferredName);
        }
示例#53
0
 protected override void HandlePacket(ClientObject client, PacketInStream packet)
 {
     client.Announce(ServerCreatePacket.response_scene(SceneManager.GetActiveScene().name));
 }
示例#54
0
 public static void HandleMotdRequest(ClientObject client)
 {
     SendMotdReply(client);
 }
示例#55
0
        private static Expression <Func <ClientObject, object> > GetClientObjectExpression(ClientObject clientObject, string property)
        {
            var memberExpression = Expression.PropertyOrField(Expression.Constant(clientObject), property);
            var memberName       = memberExpression.Member.Name;

            var parameter = Expression.Parameter(typeof(ClientObject), "i");
            var cast      = Expression.Convert(parameter, memberExpression.Member.ReflectedType);
            var body      = Expression.Property(cast, memberName);
            var exp       = Expression.Lambda <Func <ClientObject, Object> >(Expression.Convert(body, typeof(object)),
                                                                             parameter);

            return(exp);
        }
示例#56
0
        public static void HandleChatMessage(ClientObject client, byte[] messageData)
        {
            ServerMessage newMessage = new ServerMessage();

            newMessage.type = ServerMessageType.CHAT_MESSAGE;
            newMessage.data = messageData;
            using (MessageReader mr = new MessageReader(messageData))
            {
                ChatMessageType messageType = (ChatMessageType)mr.Read <int>();
                string          fromPlayer  = mr.Read <string>();
                if (fromPlayer != client.playerName)
                {
                    Messages.ConnectionEnd.SendConnectionEnd(client, "Kicked for sending a chat message for another player");
                    return;
                }
                switch (messageType)
                {
                case ChatMessageType.JOIN:
                {
                    string joinChannel = mr.Read <string>();
                    if (!playerChatChannels.ContainsKey(fromPlayer))
                    {
                        playerChatChannels.Add(fromPlayer, new List <string>());
                    }
                    if (!playerChatChannels[fromPlayer].Contains(joinChannel))
                    {
                        playerChatChannels[fromPlayer].Add(joinChannel);
                    }
                    DarkLog.Debug(fromPlayer + " joined channel: " + joinChannel);
                }
                    ClientHandler.SendToAll(client, newMessage, true);
                    break;

                case ChatMessageType.LEAVE:
                {
                    string leaveChannel = mr.Read <string>();
                    if (playerChatChannels.ContainsKey(fromPlayer))
                    {
                        if (playerChatChannels[fromPlayer].Contains(leaveChannel))
                        {
                            playerChatChannels[fromPlayer].Remove(leaveChannel);
                        }
                        if (playerChatChannels[fromPlayer].Count == 0)
                        {
                            playerChatChannels.Remove(fromPlayer);
                        }
                    }
                    DarkLog.Debug(fromPlayer + " left channel: " + leaveChannel);
                }
                    ClientHandler.SendToAll(client, newMessage, true);
                    break;

                case ChatMessageType.CHANNEL_MESSAGE:
                {
                    string channel = mr.Read <string>();
                    string message = mr.Read <string>();
                    if (channel != "")
                    {
                        foreach (KeyValuePair <string, List <string> > playerEntry in playerChatChannels)
                        {
                            if (playerEntry.Value.Contains(channel))
                            {
                                ClientObject findClient = ClientHandler.GetClientByName(playerEntry.Key);
                                if (findClient != null)
                                {
                                    ClientHandler.SendToClient(findClient, newMessage, true);
                                }
                            }
                        }
                        DarkLog.ChatMessage(fromPlayer + " -> #" + channel + ": " + message);
                    }
                    else
                    {
                        ClientHandler.SendToClient(client, newMessage, true);
                        ClientHandler.SendToAll(client, newMessage, true);
                        DarkLog.ChatMessage(fromPlayer + " -> #Global: " + message);
                    }
                }
                break;

                case ChatMessageType.PRIVATE_MESSAGE:
                {
                    string toPlayer = mr.Read <string>();
                    string message  = mr.Read <string>();
                    if (toPlayer != Settings.settingsStore.consoleIdentifier)
                    {
                        ClientObject findClient = ClientHandler.GetClientByName(toPlayer);
                        if (findClient != null)
                        {
                            ClientHandler.SendToClient(client, newMessage, true);
                            ClientHandler.SendToClient(findClient, newMessage, true);
                            DarkLog.ChatMessage(fromPlayer + " -> @" + toPlayer + ": " + message);
                        }
                        {
                            DarkLog.ChatMessage(fromPlayer + " -X-> @" + toPlayer + ": " + message);
                        }
                    }
                    else
                    {
                        ClientHandler.SendToClient(client, newMessage, true);
                        DarkLog.ChatMessage(fromPlayer + " -> @" + toPlayer + ": " + message);
                    }
                }
                break;

                case ChatMessageType.CONSOLE_MESSAGE:
                {
                    string message = mr.Read <string>();
                    if (client.authenticated && DarkMultiPlayerServer.AdminSystem.fetch.IsAdmin(client.playerName))
                    {
                        CommandHandler.HandleServerInput(message);
                    }
                    else
                    {
                        Messages.ConnectionEnd.SendConnectionEnd(client, "Kicked for sending a console command as a non-admin player.");
                    }
                }
                break;
                }
            }
        }
示例#57
0
        protected virtual void ProcessGenericLocalization(ClientObject obj, Dictionary <string, List <ValueForUICulture> > localizations)
        {
            var targetProps        = localizations.Keys.ToList();
            var isSupportedRuntime = ReflectionUtils.HasProperties(obj, targetProps);

            if (!isSupportedRuntime)
            {
                TraceService.Critical((int)LogEventId.ModelProvisionCoreCall,
                                      string.Format("CSOM runtime doesn't have [{0}] methods support. Update CSOM runtime to a new version. Provision is skipped",
                                                    string.Join(", ", targetProps.ToArray())));

                return;
            }

            var needsUpdate = false;

            foreach (var key in localizations.Keys)
            {
                var propName     = key;
                var localization = localizations[key];

                if (localization.Any())
                {
                    var userResource = GetPropertyValue(obj, propName);

                    foreach (var locValue in localization)
                    {
                        LocalizationService.ProcessUserResource(obj, userResource, locValue);
                    }

                    needsUpdate = true;
                }
            }

            if (needsUpdate)
            {
                var updateMethod = ReflectionUtils.GetMethod(obj, "Update");

                if (updateMethod != null)
                {
                    if (obj is ContentType)
                    {
                        updateMethod.Invoke(obj, new object[] { true });
                    }
                    else if (obj is Field)
                    {
                        updateMethod = ReflectionUtils.GetMethod(obj, "UpdateAndPushChanges");
                        updateMethod.Invoke(obj, new object[] { true });
                    }
                    else
                    {
                        updateMethod.Invoke(obj, null);
                    }

                    obj.Context.ExecuteQueryWithTrace();
                }
                else
                {
                    throw new SPMeta2Exception(String.Format("Can't find Update() methods on client object of type:[{0}]", obj.GetType()));
                }
            }
        }
示例#58
0
        public static void HandleFlagSync(ClientObject client, byte[] messageData)
        {
            string flagPath = Path.Combine(Server.universeDirectory, "Flags");

            using (MessageReader mr = new MessageReader(messageData))
            {
                FlagMessageType messageType = (FlagMessageType)mr.Read <int>();
                string          playerName  = mr.Read <string>();
                if (playerName != client.playerName)
                {
                    Messages.ConnectionEnd.SendConnectionEnd(client, "Kicked for sending a flag for another player");
                    return;
                }
                switch (messageType)
                {
                case FlagMessageType.LIST:
                {
                    //Send the list back
                    List <string> serverFlagFileNames = new List <string>();
                    List <string> serverFlagOwners    = new List <string>();
                    List <string> serverFlagShaSums   = new List <string>();

                    string[] clientFlags    = mr.Read <string[]>();
                    string[] clientFlagShas = mr.Read <string[]>();
                    string[] serverFlags    = Directory.GetFiles(flagPath, "*", SearchOption.AllDirectories);
                    foreach (string serverFlag in serverFlags)
                    {
                        string trimmedName   = Path.GetFileName(serverFlag);
                        string flagOwnerPath = Path.GetDirectoryName(serverFlag);
                        string flagOwner     = flagOwnerPath.Substring(Path.GetDirectoryName(flagOwnerPath).Length + 1);
                        bool   isMatched     = false;
                        bool   shaDifferent  = false;
                        for (int i = 0; i < clientFlags.Length; i++)
                        {
                            if (clientFlags[i].ToLower() == trimmedName.ToLower())
                            {
                                isMatched    = true;
                                shaDifferent = (Common.CalculateSHA256Hash(serverFlag) != clientFlagShas[i]);
                            }
                        }
                        if (!isMatched || shaDifferent)
                        {
                            if (flagOwner == client.playerName)
                            {
                                DarkLog.Debug("Deleting flag " + trimmedName);
                                File.Delete(serverFlag);
                                ServerMessage newMessage = new ServerMessage();
                                newMessage.type = ServerMessageType.FLAG_SYNC;
                                using (MessageWriter mw = new MessageWriter())
                                {
                                    mw.Write <int>((int)FlagMessageType.DELETE_FILE);
                                    mw.Write <string>(trimmedName);
                                    newMessage.data = mw.GetMessageBytes();
                                    ClientHandler.SendToAll(client, newMessage, false);
                                }
                                if (Directory.GetFiles(flagOwnerPath).Length == 0)
                                {
                                    Directory.Delete(flagOwnerPath);
                                }
                            }
                            else
                            {
                                DarkLog.Debug("Sending flag " + serverFlag + " from " + flagOwner + " to " + client.playerName);
                                ServerMessage newMessage = new ServerMessage();
                                newMessage.type = ServerMessageType.FLAG_SYNC;
                                using (MessageWriter mw = new MessageWriter())
                                {
                                    mw.Write <int>((int)FlagMessageType.FLAG_DATA);
                                    mw.Write <string>(flagOwner);
                                    mw.Write <string>(trimmedName);
                                    mw.Write <byte[]>(File.ReadAllBytes(serverFlag));
                                    newMessage.data = mw.GetMessageBytes();
                                    ClientHandler.SendToClient(client, newMessage, false);
                                }
                            }
                        }
                        //Don't tell the client we have a different copy of the flag so it is reuploaded
                        if (File.Exists(serverFlag))
                        {
                            serverFlagFileNames.Add(trimmedName);
                            serverFlagOwners.Add(flagOwner);
                            serverFlagShaSums.Add(Common.CalculateSHA256Hash(serverFlag));
                        }
                    }
                    ServerMessage listMessage = new ServerMessage();
                    listMessage.type = ServerMessageType.FLAG_SYNC;
                    using (MessageWriter mw2 = new MessageWriter())
                    {
                        mw2.Write <int>((int)FlagMessageType.LIST);
                        mw2.Write <string[]>(serverFlagFileNames.ToArray());
                        mw2.Write <string[]>(serverFlagOwners.ToArray());
                        mw2.Write <string[]>(serverFlagShaSums.ToArray());
                        listMessage.data = mw2.GetMessageBytes();
                    }
                    ClientHandler.SendToClient(client, listMessage, false);
                }
                break;

                case FlagMessageType.DELETE_FILE:
                {
                    string flagName       = mr.Read <string>();
                    string playerFlagPath = Path.Combine(flagPath, client.playerName);
                    if (Directory.Exists(playerFlagPath))
                    {
                        string flagFile = Path.Combine(playerFlagPath, flagName);
                        if (File.Exists(flagFile))
                        {
                            File.Delete(flagFile);
                        }
                        if (Directory.GetFiles(playerFlagPath).Length == 0)
                        {
                            Directory.Delete(playerFlagPath);
                        }
                    }
                    ServerMessage newMessage = new ServerMessage();
                    newMessage.type = ServerMessageType.FLAG_SYNC;
                    using (MessageWriter mw = new MessageWriter())
                    {
                        mw.Write <int>((int)FlagMessageType.DELETE_FILE);
                        mw.Write <string>(flagName);
                        newMessage.data = mw.GetMessageBytes();
                    }
                    ClientHandler.SendToAll(client, newMessage, false);
                }
                break;

                case FlagMessageType.UPLOAD_FILE:
                {
                    string flagName       = mr.Read <string>();
                    byte[] flagData       = mr.Read <byte[]>();
                    string playerFlagPath = Path.Combine(flagPath, client.playerName);
                    if (!Directory.Exists(playerFlagPath))
                    {
                        Directory.CreateDirectory(playerFlagPath);
                    }
                    DarkLog.Debug("Saving flag " + flagName + " from " + client.playerName);
                    File.WriteAllBytes(Path.Combine(playerFlagPath, flagName), flagData);
                    ServerMessage newMessage = new ServerMessage();
                    newMessage.type = ServerMessageType.FLAG_SYNC;
                    using (MessageWriter mw = new MessageWriter())
                    {
                        mw.Write <int>((int)FlagMessageType.FLAG_DATA);
                        mw.Write <string>(client.playerName);
                        mw.Write <string>(flagName);
                        mw.Write <byte[]>(flagData);
                    }
                    ClientHandler.SendToAll(client, newMessage, false);
                }
                break;
                }
            }
        }
示例#59
0
        List <ClientObject> clients = new List <ClientObject>(); // все подключения

        protected internal void AddConnection(ClientObject clientObject)
        {
            clients.Add(clientObject);
        }
示例#60
0
        public static void HandleMessage(ClientObject client, byte[] data)
        {
            using (MessageReader mr = new MessageReader(data))
            {
                int type = mr.Read <int>();
                switch ((GroupMessageType)type)
                {
                case GroupMessageType.ADD_ADMIN:
                {
                    string playerName = mr.Read <string>();
                    string groupName  = mr.Read <string>();
                    if (Groups.fetch.PlayerIsAdmin(client.playerName, groupName))
                    {
                        Groups.fetch.AddPlayerAdmin(playerName, groupName);
                    }
                }
                break;

                case GroupMessageType.ADD_PLAYER:
                {
                    string playerName = mr.Read <string>();
                    string groupName  = mr.Read <string>();
                    if (Groups.fetch.GroupExists(groupName))
                    {
                        if (Groups.fetch.PlayerIsAdmin(client.playerName, groupName))
                        {
                            Groups.fetch.AddPlayerToGroup(playerName, groupName);
                        }
                    }
                    else
                    {
                        //We can only add ourselves to new groups.
                        if (playerName == client.playerName)
                        {
                            Groups.fetch.AddPlayerToGroup(playerName, groupName);
                        }
                    }
                }
                break;

                case GroupMessageType.REMOVE_ADMIN:
                {
                    string playerName = mr.Read <string>();
                    string groupName  = mr.Read <string>();
                    if (Groups.fetch.PlayerIsAdmin(client.playerName, groupName))
                    {
                        Groups.fetch.RemovePlayerAdmin(playerName, groupName);
                    }
                }
                break;

                case GroupMessageType.REMOVE_PLAYER:
                {
                    string playerName = mr.Read <string>();
                    string groupName  = mr.Read <string>();
                    if (playerName == client.playerName || Groups.fetch.PlayerIsAdmin(client.playerName, groupName))
                    {
                        Groups.fetch.RemovePlayerFromGroup(playerName, groupName);
                    }
                }
                break;

                case GroupMessageType.REMOVE_GROUP:
                {
                    string groupName = mr.Read <string>();
                    if (Groups.fetch.PlayerIsAdmin(client.playerName, groupName))
                    {
                        Groups.fetch.RemoveGroup(groupName);
                    }
                }
                break;

                case GroupMessageType.GROUP_REQUEST:
                    Messages.GroupMessage.SendGroupsToClient(client);
                    break;
                }
            }
        }