Search in sources :

Example 46 with Player

use of com.faforever.server.entity.Player in project faf-java-server by FAForever.

the class MatchMakerService method createMatch.

/**
 * <p>Creates a new match with the specified options and participants. All participants must be online and available
 * for matchmaking. A player can be unavailable for matchmaking if, for instance, he's currently playing a game or
 * offline. In this case, a {@link ErrorCode#PLAYER_NOT_AVAILABLE_FOR_MATCHMAKING} is thrown.</p>
 *
 * @throws RequestException if a player is not available for matchmaking or the map to be played is unknown by the
 * server.
 */
public void createMatch(ConnectionAware requester, UUID requestId, String title, String featuredMod, List<MatchParticipant> participants, int mapVersionId) {
    log.debug("Creating match '{}' with '{}' participants on map '{}'", title, participants.size(), mapVersionId);
    Requests.verify(participants.size() > 1, ErrorCode.INSUFFICIENT_MATCH_PARTICIPANTS, participants.size(), 2);
    List<Player> players = participants.stream().map(matchParticipant -> playerService.getOnlinePlayer(matchParticipant.getId()).orElseThrow(() -> new RequestException(requestId, ErrorCode.PLAYER_NOT_AVAILABLE_FOR_MATCHMAKING, matchParticipant.getId()))).peek(player -> Requests.verify(player.getCurrentGame() == null, requestId, ErrorCode.PLAYER_NOT_AVAILABLE_FOR_MATCHMAKING, player)).peek(this::removePlayer).collect(Collectors.toList());
    String mapFileName = mapService.findMap(mapVersionId).map(MapVersion::getFilename).orElseThrow(() -> new RequestException(requestId, ErrorCode.UNKNOWN_MAP, mapVersionId));
    Player host = players.get(0);
    List<Player> guests = players.subList(1, players.size());
    gameService.createGame(title, featuredMod, mapFileName, null, GameVisibility.PRIVATE, null, null, host).handle((game, throwable) -> {
        if (throwable != null) {
            log.debug("The host of match '{}' failed to start his game", title, throwable);
            throw new RequestException(requestId, ErrorCode.HOST_FAILED_TO_START_GAME, title, host);
        }
        AtomicInteger counter = new AtomicInteger();
        Integer hostId = host.getId();
        setPlayerOptionsForMatchParticipant(participants, host, counter, hostId);
        log.trace("Host '{}' for match '{}' is ready", host, title);
        clientService.sendMatchCreatedNotification(requestId, game.getId(), requester);
        List<CompletableFuture<Game>> guestGameFutures = guests.stream().peek(player -> log.trace("Telling player '{}' to start the game process for match '{}'", player, title)).map(player -> gameService.joinGame(game.getId(), null, player).thenApply(gameStartedFuture -> {
            setPlayerOptionsForMatchParticipant(participants, host, counter, player.getId());
            return gameStartedFuture;
        })).collect(Collectors.toList());
        return CompletableFuture.allOf(guestGameFutures.toArray(new CompletableFuture[guests.size()])).thenAccept(aVoid -> log.debug("All players launched their game for match '{}'", title)).exceptionally(throwable1 -> {
            log.debug("At least one player failed to launch their game for match '{}'", title, throwable1);
            return null;
        });
    });
}
Also used : ModService(com.faforever.server.mod.ModService) PlayerService(com.faforever.server.player.PlayerService) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) GameVisibility(com.faforever.server.game.GameVisibility) Scheduled(org.springframework.scheduling.annotation.Scheduled) FeaturedMod(com.faforever.server.entity.FeaturedMod) Value(lombok.Value) Player(com.faforever.server.entity.Player) HashSet(java.util.HashSet) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Service(org.springframework.stereotype.Service) Duration(java.time.Duration) Map(java.util.Map) ServerProperties(com.faforever.server.config.ServerProperties) ClientService(com.faforever.server.client.ClientService) ConnectionAware(com.faforever.server.client.ConnectionAware) RatingService(com.faforever.server.rating.RatingService) Set(java.util.Set) ErrorCode(com.faforever.server.error.ErrorCode) Faction(com.faforever.server.game.Faction) GameService(com.faforever.server.game.GameService) UUID(java.util.UUID) EqualsAndHashCode(lombok.EqualsAndHashCode) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) MapService(com.faforever.server.map.MapService) Ladder1v1Rating(com.faforever.server.entity.Ladder1v1Rating) Slf4j(lombok.extern.slf4j.Slf4j) List(java.util.List) Requests(com.faforever.server.error.Requests) Game(com.faforever.server.entity.Game) MapVersion(com.faforever.server.entity.MapVersion) Optional(java.util.Optional) RequestException(com.faforever.server.error.RequestException) VisibleForTesting(com.google.common.annotations.VisibleForTesting) AllArgsConstructor(lombok.AllArgsConstructor) NotNull(org.jetbrains.annotations.NotNull) Comparator(java.util.Comparator) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Player(com.faforever.server.entity.Player) CompletableFuture(java.util.concurrent.CompletableFuture) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) RequestException(com.faforever.server.error.RequestException)

Example 47 with Player

use of com.faforever.server.entity.Player in project faf-java-server by FAForever.

the class LegacyServicesActivators method loginRequest.

@ServiceActivator(inputChannel = ChannelNames.LEGACY_LOGIN_REQUEST)
@Transactional
public void loginRequest(LegacyLoginRequest loginRequest, @Header(CLIENT_CONNECTION) ClientConnection clientConnection) {
    // TODO this method shouldn't do anything but call a service
    Requests.verify(!playerService.isPlayerOnline(loginRequest.getLogin()), ErrorCode.USER_ALREADY_CONNECTED, loginRequest.getLogin());
    log.debug("Processing login request from user: {}", loginRequest.getLogin());
    try {
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(loginRequest.getLogin(), loginRequest.getPassword());
        Authentication authentication = authenticationManager.authenticate(token);
        FafUserDetails userDetails = (FafUserDetails) authentication.getPrincipal();
        clientConnection.setAuthentication(authentication);
        Player player = userDetails.getPlayer();
        player.setClientConnection(clientConnection);
        geoIpService.lookupCountryCode(clientConnection.getClientAddress()).ifPresent(player::setCountry);
        uniqueIdService.verify(player, loginRequest.getUniqueId());
        chatService.updateIrcPassword(userDetails.getUsername(), loginRequest.getPassword());
        playerService.setPlayerOnline(player);
    } catch (BadCredentialsException e) {
        throw new RequestException(e, ErrorCode.INVALID_LOGIN);
    }
}
Also used : Player(com.faforever.server.entity.Player) Authentication(org.springframework.security.core.Authentication) UsernamePasswordAuthenticationToken(org.springframework.security.authentication.UsernamePasswordAuthenticationToken) FafUserDetails(com.faforever.server.security.FafUserDetails) BadCredentialsException(org.springframework.security.authentication.BadCredentialsException) RequestException(com.faforever.server.error.RequestException) ServiceActivator(org.springframework.integration.annotation.ServiceActivator) Transactional(org.springframework.transaction.annotation.Transactional)

Example 48 with Player

use of com.faforever.server.entity.Player in project faf-java-server by FAForever.

the class MatchMakerServiceTest method createMatch.

@Test
public void createMatch() throws Exception {
    MatchParticipant participant1 = new MatchParticipant().setId(1).setFaction(Faction.UEF).setTeam(1).setSlot(1).setStartSpot(1);
    MatchParticipant participant2 = new MatchParticipant().setId(2).setFaction(Faction.AEON).setTeam(2).setSlot(2).setStartSpot(2);
    ConnectionAware requester = mock(ConnectionAware.class);
    UUID requestId = UUID.randomUUID();
    List<MatchParticipant> participants = Arrays.asList(participant1, participant2);
    int mapVersionId = 1;
    Player player1 = (Player) new Player().setId(1);
    Player player2 = (Player) new Player().setId(2);
    when(playerService.getOnlinePlayer(participant1.getId())).thenReturn(Optional.of(player1));
    when(playerService.getOnlinePlayer(participant2.getId())).thenReturn(Optional.of(player2));
    when(mapService.findMap(mapVersionId)).thenReturn(Optional.of(new MapVersion().setFilename("maps/foo.zip")));
    Game game = new Game();
    when(gameService.createGame("Test match", "faf", "null", null, GameVisibility.PRIVATE, null, null, player1)).thenReturn(CompletableFuture.completedFuture(game));
    when(gameService.joinGame(1, null, player2)).thenReturn(CompletableFuture.completedFuture(game));
    instance.createMatch(requester, requestId, "Test match", "faf", participants, mapVersionId);
    verify(clientService, timeout(5000)).sendMatchCreatedNotification(requestId, 1, requester);
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player1.getId(), GameService.OPTION_TEAM, participant1.getTeam());
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player1.getId(), GameService.OPTION_FACTION, participant1.getFaction().toFaValue());
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player1.getId(), GameService.OPTION_START_SPOT, participant1.getStartSpot());
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player1.getId(), GameService.OPTION_COLOR, 1);
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player1.getId(), GameService.OPTION_ARMY, 1);
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player2.getId(), GameService.OPTION_TEAM, participant2.getTeam());
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player2.getId(), GameService.OPTION_FACTION, participant2.getFaction().toFaValue());
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player2.getId(), GameService.OPTION_START_SPOT, participant2.getStartSpot());
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player2.getId(), GameService.OPTION_COLOR, 2);
    verify(gameService, timeout(1000)).updatePlayerOption(player1, player2.getId(), GameService.OPTION_ARMY, 2);
}
Also used : Player(com.faforever.server.entity.Player) Game(com.faforever.server.entity.Game) MapVersion(com.faforever.server.entity.MapVersion) ConnectionAware(com.faforever.server.client.ConnectionAware) UUID(java.util.UUID) Test(org.junit.Test)

Example 49 with Player

use of com.faforever.server.entity.Player in project faf-java-server by FAForever.

the class MatchMakerServiceTest method startSearchModNotAvailable.

@Test
public void startSearchModNotAvailable() throws Exception {
    when(modService.getLadder1v1()).thenReturn(Optional.empty());
    expectedException.expect(requestExceptionWithCode(ErrorCode.MATCH_MAKER_POOL_DOESNT_EXIST));
    instance.submitSearch(new Player(), Faction.CYBRAN, QUEUE_NAME);
}
Also used : Player(com.faforever.server.entity.Player) Test(org.junit.Test)

Example 50 with Player

use of com.faforever.server.entity.Player in project faf-java-server by FAForever.

the class MatchMakerServiceTest method submitSearchTwoFreshPlayersMatch.

/**
 * Tests whether two players who never played a game (and thus have no rating associated) will be matched.
 */
@Test
public void submitSearchTwoFreshPlayersMatch() throws Exception {
    Player player1 = (Player) new Player().setLogin(LOGIN_PLAYER_1).setId(1);
    Player player2 = (Player) new Player().setLogin(LOGIN_PLAYER_2).setId(2);
    when(gameService.createGame(any(), any(), any(), any(), any(), any(), any(), any())).thenReturn(CompletableFuture.completedFuture(new Game(1)));
    when(gameService.joinGame(1, null, player2)).thenReturn(CompletableFuture.completedFuture(new Game(1)));
    properties.getMatchMaker().setAcceptableQualityWaitTime(0);
    instance.submitSearch(player1, Faction.CYBRAN, QUEUE_NAME);
    instance.submitSearch(player2, Faction.AEON, QUEUE_NAME);
    instance.processPools();
    verify(gameService).createGame(LOGIN_PLAYER_1 + " vs. " + LOGIN_PLAYER_2, "faf", "maps/SCMP_001.zip", null, GameVisibility.PRIVATE, null, null, player1);
    verify(gameService).joinGame(1, null, player2);
    // Verify only the last player option being set, to verify it went through until the end.
    verify(gameService).updatePlayerOption(player1, player2.getId(), GameService.OPTION_ARMY, 3);
}
Also used : Player(com.faforever.server.entity.Player) Game(com.faforever.server.entity.Game) Test(org.junit.Test)

Aggregations

Player (com.faforever.server.entity.Player)73 Test (org.junit.Test)38 Game (com.faforever.server.entity.Game)25 Before (org.junit.Before)13 ServerProperties (com.faforever.server.config.ServerProperties)11 GamePlayerStats (com.faforever.server.entity.GamePlayerStats)11 PlayerOnlineEvent (com.faforever.server.player.PlayerOnlineEvent)11 List (java.util.List)11 Slf4j (lombok.extern.slf4j.Slf4j)11 Service (org.springframework.stereotype.Service)11 ClientService (com.faforever.server.client.ClientService)10 ConnectionAware (com.faforever.server.client.ConnectionAware)10 FeaturedMod (com.faforever.server.entity.FeaturedMod)10 Ladder1v1Rating (com.faforever.server.entity.Ladder1v1Rating)10 Optional (java.util.Optional)10 GlobalRating (com.faforever.server.entity.GlobalRating)9 ModService (com.faforever.server.mod.ModService)9 VisibleForTesting (com.google.common.annotations.VisibleForTesting)9 Duration (java.time.Duration)9 Map (java.util.Map)9