public void UnregisterWorldserver(string groupName, ScsTcpEndPoint endpoint)
 {
     try
     {
         if (ServerCommunicationHelper.Instance.WorldserverGroups.Any(g => g.GroupName == groupName) &&
             ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(g => g.GroupName == groupName).Servers.Any(w => w.Endpoint.Equals(endpoint)))
         {
             //servergroup does exist with the given ipaddress
             RemoveWorldFromWorldserver(endpoint, groupName);
         }
         else if (!ServerCommunicationHelper.Instance.WorldserverGroups.Any(g => g.GroupName == groupName) &&
                  !ServerCommunicationHelper.Instance.WorldserverGroups.Any(sgi => sgi.Servers.Any(w => w.Endpoint.Equals(endpoint))))
         {
             //servergroup doesnt exist and world is not in a group named like the given servergroup and in no other
             Logger.Log.InfoFormat($"World with address {endpoint} has already been unregistered before.");
         }
         else if (!ServerCommunicationHelper.Instance.WorldserverGroups.Any(g => g.GroupName == groupName) &&
                  ServerCommunicationHelper.Instance.WorldserverGroups.Any(sgi => sgi.Servers.Any(w => w.Endpoint.Equals(endpoint))))
         {
             //servergroup does not exist but world does run in a different servergroup
             WorldserverGroupDTO worldserverGroupDTO = ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(sgi => sgi.Servers.Any(w => w.Endpoint.Equals(endpoint)));
             RemoveWorldFromWorldserver(endpoint, worldserverGroupDTO.GroupName);
         }
     }
     catch (Exception ex)
     {
         Logger.Log.Error($"Registering world {endpoint} failed.", ex);
     }
 }
        public int?RegisterWorldserver(string groupName, WorldserverDTO worldserver)
        {
            int?newChannelId = null;

            try
            {
                if (!ServerCommunicationHelper.Instance.WorldserverGroups.Any(g => g.GroupName == groupName))
                {
                    //add world server
                    ServerCommunicationHelper.Instance.Worldservers.Add(worldserver);

                    //create new server group
                    worldserver.ChannelId = 1;
                    newChannelId          = 1;
                    ServerCommunicationHelper.Instance.WorldserverGroups.Add(new WorldserverGroupDTO(groupName, worldserver));
                    Logger.Log.InfoFormat($"World {worldserver.Id} with address {worldserver.Endpoint} has been registered to new server group {groupName}.");
                }
                else if (ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(wg => wg.GroupName == groupName)?.Servers.Contains(worldserver) ?? false)
                {
                    //worldserver is already registered
                    Logger.Log.InfoFormat($"World {worldserver.Id} with address {worldserver.Endpoint} is already registered.");
                }
                else
                {
                    //add worldserver to existing group
                    WorldserverGroupDTO worldserverGroup = ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(wg => wg.GroupName == groupName);

                    //add world server
                    worldserver.ChannelId = worldserverGroup.Servers.Count() + 1;
                    newChannelId          = worldserver.ChannelId;
                    ServerCommunicationHelper.Instance.Worldservers.Add(worldserver);
                    worldserverGroup?.Servers.Add(worldserver);
                    Logger.Log.InfoFormat($"World {worldserver.Id} with address {worldserver.Endpoint} has been added to server group {groupName}.");
                }
            }
            catch (Exception ex)
            {
                Logger.Log.Error($"Registering world {worldserver.Id} with endpoint {worldserver.Endpoint} failed.", ex);
            }

            return(newChannelId);
        }
        private void RemoveWorldFromWorldserver(ScsTcpEndPoint endpoint, string groupName)
        {
            WorldserverDTO worldserverToRemove = ServerCommunicationHelper.Instance.WorldserverGroups
                                                 .SingleOrDefault(g => g.GroupName == groupName).Servers.SingleOrDefault(w => w.Endpoint.Equals(endpoint));

            ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(g => g.GroupName == groupName).Servers.Remove(worldserverToRemove);
            ServerCommunicationHelper.Instance.Worldservers.Remove(worldserverToRemove);
            Logger.Log.InfoFormat($"World {worldserverToRemove.Id} with address {endpoint} has been unregistered successfully.");

            if (!ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(g => g.GroupName == groupName)?.Servers.Any() ?? false)
            {
                WorldserverGroupDTO worldserverGroup = ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(g => g.GroupName == groupName);

                if (worldserverGroup != null)
                {
                    ServerCommunicationHelper.Instance.WorldserverGroups.Remove(worldserverGroup);
                    Logger.Log.InfoFormat($"World server group {groupName} has been removed as no world was left.");
                }
            }
        }