--- /dev/null
+/*
+ * 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)
+ );
+ }
+
+}