public async Task <object> ClaimWorldPort()
        {
            var response = new ClaimPortResponse();

            if (MasterServer.IsSubsidiary)
            {
                response.FailedReason = "is subsidiary";

                return(response);
            }

            response.Success = true;
            response.Port    = await MasterServer.ClaimWorldPortAsync();

            return(response);
        }
        public async Task <object> CommissionInstance(string zoneId)
        {
            var response = new CommissionInstanceResponse();

            if (!int.TryParse(zoneId, out var zone))
            {
                response.FailedReason = "invalid type";

                return(response);
            }

            Guid id;

            try
            {
                var port = await MasterServer.ClaimWorldPortAsync();

                id = await MasterServer.StartInstanceAsync(ServerType.World, port);
            }
            catch (Exception e)
            {
                Logger.Error(e);

                response.FailedReason = "error";

                return(response);
            }

            var instance = MasterServer.Instances.First(i => i.Id == id);

            instance.Zones.Add((ZoneId)zone);

            response.Success = true;

            response.Id = id;

            response.ApiPort = instance.ApiPort;

            var timeout = 1000;

            while (true)
            {
                try
                {
                    var verify = await MasterServer.Api.RunCommandAsync <ReadyCallbackResponse>(
                        instance.ApiPort, "server/verify"
                        ).ConfigureAwait(false);

                    if (!verify.Success)
                    {
                        Logger.Error(verify.FailedReason);

                        throw new Exception(verify.FailedReason);
                    }

                    instance.Ready = true;

                    break;
                }
                catch
                {
                    if (timeout <= 0)
                    {
                        throw new TimeoutException("commission timed out");
                    }

                    await Task.Delay(50);

                    timeout--;
                }
            }

            return(response);
        }