public override async Task Rematch(RematchRequest request, IServerStreamWriter <RematchResponse> responseStream, ServerCallContext context) { var username = GetUsername(request.Username, request.TwitterLogged); var dto = await _repository.GetMatch(request.MatchId); if (dto.Result.Value == (int)Result.Pending) { await _repository.SaveMatchChallenger(request.MatchId, username); await responseStream.WriteAsync(new RematchResponse { HasStarted = true }); return; } await _repository.CreateMatch(request.MatchId, username, UnknownUser); await responseStream.WriteAsync(new RematchResponse()); dto = await _repository.GetMatch(request.MatchId); while (!context.CancellationToken.IsCancellationRequested && dto.Challenger.Name == UnknownUser) { await Task.Delay(_multiplayerSettings.GameStatusUpdateDelay); dto = await _repository.GetMatch(request.MatchId); if (dto == null) { _logger.LogDebug($"{username} -> dto is null"); return; } var matchExpired = DateTime.UtcNow.AddSeconds(-_multiplayerSettings.GameStatusMaxWait) > dto.WhenUtc; if (matchExpired) { _logger.LogDebug($"{username} -> rematch expired"); await _repository.DeleteMatch(request.MatchId); return; } await responseStream.WriteAsync(new RematchResponse()); } await responseStream.WriteAsync(new RematchResponse { HasStarted = true }); }
public override async Task Rematch(RematchRequest request, IServerStreamWriter <RematchResponse> responseStream, ServerCallContext context) { var apiRequest = new GameApi.Proto.RematchRequest() { MatchId = request.MatchId, Username = request.Username, TwitterLogged = request.TwitterLogged }; using var stream = _multiplayerGameManagerClient.Rematch(apiRequest); while (await stream.ResponseStream.MoveNext(context.CancellationToken)) { var response = stream.ResponseStream.Current; await responseStream.WriteAsync(new RematchResponse { HasStarted = response.HasStarted, IsCancelled = response.IsCancelled }); } }
public async Task <bool> Rematch(string matchId, string username, bool isTwitterUser) { var request = new RematchRequest() { MatchId = matchId, Username = username, TwitterLogged = isTwitterUser }; using var stream = _multiplayerGameManagerClient.Rematch(request); while (await stream.ResponseStream.MoveNext(CancellationToken.None)) { var response = stream.ResponseStream.Current; if (response.HasStarted) { return(true); } } return(false); }