protected override void HandleBroadcastServerStatusRequest(BroadcastServerStatusRequest packet, MessageOrigin origin)
        {
            //I'm assuming this only happens on server creation, and that this packet doesn't
            //also get sent on updating any sort of server status. Under that assumption, this should be fine.
            var code = RandomString(5);

            serverList[code] = new ServerStatus
            {
                Username = packet.userName,
                UserId   = packet.userId,

                ServerName         = packet.serverName,
                Secret             = packet.secret,
                PublicKey          = packet.publicKey,
                Random             = packet.random,
                CurrentPlayerCount = packet.currentPlayerCount,
                MaxPlayerCount     = packet.maxPlayerCount,
                DiscoveryPolicy    = packet.discoveryPolicy,
                InvitePolicy       = packet.invitePolicy,
                Configuration      = packet.configuration,
                Password           = packet.password,
                EndPoint           = origin.endPoint
            };

            SendReliableResponse(1u, origin.endPoint, packet, BroadcastServerStatusResponse.pool.Obtain().InitForSuccess(origin.endPoint, code));

            packet.Release();
        }
Exemplo n.º 2
0
        public async Task <BroadcastServerStatusResponse> BroadcastServerStatus(ISession session, BroadcastServerStatusRequest request)
        {
            _logger.Verbose(
                $"Handling {nameof(BroadcastServerStatusRequest)} " +
                $"(ServerName='{request.ServerName}', " +
                $"UserId='{request.UserId}', " +
                $"UserName='******', " +
                $"Secret='{request.Secret}', " +
                $"CurrentPlayerCount={request.CurrentPlayerCount}, " +
                $"MaximumPlayerCount={request.MaximumPlayerCount}, " +
                $"DiscoveryPolicy={request.DiscoveryPolicy}, " +
                $"InvitePolicy={request.InvitePolicy}, " +
                $"BeatmapDifficultyMask={request.Configuration.BeatmapDifficultyMask}, " +
                $"GameplayModifiersMask={request.Configuration.GameplayModifiersMask}, " +
                $"Random={BitConverter.ToString(request.Random)}, " +
                $"PublicKey={BitConverter.ToString(request.PublicKey)})."
                );
            var server = await _serverRepository.GetServer(request.Secret);

            if (server != null)
            {
                return new BroadcastServerStatusResponse()
                       {
                           Result = BroadcastServerStatusResponse.ResultCode.SecretNotUnique
                       }
            }
            ;

            // TODO: We should probably retry in the event that a duplicate
            // code is ever generated (pretty unlikely to happen though)
            session.Secret = request.Secret;
            server         = new Server()
            {
                Host = new Player()
                {
                    UserId   = request.UserId,
                    UserName = request.UserName
                },
                RemoteEndPoint            = (IPEndPoint)session.EndPoint,
                Secret                    = request.Secret,
                Code                      = _serverCodeProvider.Generate(),
                IsPublic                  = request.DiscoveryPolicy == DiscoveryPolicy.Public,
                DiscoveryPolicy           = (Data.Enums.DiscoveryPolicy)request.DiscoveryPolicy,
                InvitePolicy              = (Data.Enums.InvitePolicy)request.InvitePolicy,
                BeatmapDifficultyMask     = (Data.Enums.BeatmapDifficultyMask)request.Configuration.BeatmapDifficultyMask,
                GameplayModifiersMask     = (Data.Enums.GameplayModifiersMask)request.Configuration.GameplayModifiersMask,
                SongPackBloomFilterTop    = request.Configuration.SongPackBloomFilterTop,
                SongPackBloomFilterBottom = request.Configuration.SongPackBloomFilterBottom,
                CurrentPlayerCount        = request.CurrentPlayerCount,
                MaximumPlayerCount        = request.MaximumPlayerCount,
                Random                    = request.Random,
                PublicKey                 = request.PublicKey
            };
            if (!await _serverRepository.AddServer(server))
            {
                _logger.Information(
                    "Failed to create server " +
                    $"(ServerName='{request.ServerName}', " +
                    $"UserId='{request.UserId}', " +
                    $"UserName='******', " +
                    $"Secret='{request.Secret}', " +
                    $"CurrentPlayerCount={request.CurrentPlayerCount}, " +
                    $"MaximumPlayerCount={request.MaximumPlayerCount}, " +
                    $"DiscoveryPolicy={request.DiscoveryPolicy}, " +
                    $"InvitePolicy={request.InvitePolicy}, " +
                    $"BeatmapDifficultyMask={request.Configuration.BeatmapDifficultyMask}, " +
                    $"GameplayModifiersMask={request.Configuration.GameplayModifiersMask}, " +
                    $"Random={BitConverter.ToString(request.Random)}, " +
                    $"PublicKey={BitConverter.ToString(request.PublicKey)})."
                    );

                return(new BroadcastServerStatusResponse()
                {
                    Result = BroadcastServerStatusResponse.ResultCode.UnknownError
                });
            }

            _logger.Information(
                "Successfully created server " +
                $"(ServerName='{request.ServerName}', " +
                $"UserId='{request.UserId}', " +
                $"UserName='******', " +
                $"Secret='{request.Secret}', " +
                $"CurrentPlayerCount={request.CurrentPlayerCount}, " +
                $"MaximumPlayerCount={request.MaximumPlayerCount}, " +
                $"DiscoveryPolicy={request.DiscoveryPolicy}, " +
                $"InvitePolicy={request.InvitePolicy}, " +
                $"BeatmapDifficultyMask={request.Configuration.BeatmapDifficultyMask}, " +
                $"GameplayModifiersMask={request.Configuration.GameplayModifiersMask}, " +
                $"Random={BitConverter.ToString(request.Random)}, " +
                $"PublicKey={BitConverter.ToString(request.PublicKey)})."
                );
            return(new BroadcastServerStatusResponse()
            {
                Result = BroadcastServerStatusResponse.ResultCode.Success,
                Code = server.Code,
                RemoteEndPoint = server.RemoteEndPoint
            });
        }