/* * Copyright (c) 2019-2020. Developed by Hedgecode. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hedgecode.chess.scanner.portal; import java.util.Base64; import org.hedgecode.chess.scanner.ChessHogScannerException; import org.hedgecode.chess.scanner.entity.PGNGame; import org.hedgecode.chess.scanner.entity.PGNTournament; import org.hedgecode.chess.scanner.format.ArenaFormat; import org.hedgecode.chess.scanner.format.Format; import org.hedgecode.chess.scanner.format.GameFormat; import org.hedgecode.chess.scanner.format.TournamentFormat; /** * ChessBombScanner * * @author Dmitry Samoshin aka gotty */ public class ChessBombScanner extends AbstractSettingsScanner { private static final String SETTINGS_FILENAME = "chessbomb.settings"; @Override protected String getResourceName() { return SETTINGS_FILENAME; } @Override public PGNTournament getTournament(String tournamentId) throws ChessHogScannerException { String decodeTournament = decodeUrlByRegex( assignUrl(tournamentId, null), getSettings().getTournamentGamesUrlRegex() ); TournamentFormat tournamentFormat = Format.formatTournament(decodeTournament); PGNTournament tournament = new PGNTournament( tournamentFormat.id(), tournamentFormat.name() ); for (String gameId : tournamentFormat.gameUrls()) { tournament.addGame( getGame(gameId, tournamentId) ); } return tournament; } @Override public PGNTournament findTournament(String tournamentName) throws ChessHogScannerException { String decodeArena = decodeUrlByRegex( assignUrl(tournamentName, false), getSettings().getTournamentQueryUrlRegex() ); ArenaFormat arenaFormat = Format.formatArena(decodeArena); String tournamentId = arenaFormat.findTournament(tournamentName); return tournamentId != null ? getTournament(tournamentId) : null; } @Override public PGNGame getGame(String gameId) throws ChessHogScannerException { throw new ChessHogScannerException( "ChessBomb does not support searching game without a tournament name!" ); } @Override public PGNGame getGame(String gameId, String tournamentId) throws ChessHogScannerException { String decodeGame = decodeUrlByRegex( assignUrl(gameId, tournamentId, true), getSettings().getGameUrlRegex() ); GameFormat gameFormat = Format.formatGame(decodeGame); return new PGNGame( gameFormat.id(), gameFormat.pgn() ); } private String decodeUrlByRegex(String url, String regex) throws ChessHogScannerException { String encodeString = match( url, regex ); return new String( Base64.getDecoder().decode(encodeString) ); } }