/* * 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.json.lichess; import java.util.Date; import com.google.gson.annotations.SerializedName; import org.hedgecode.chess.scanner.format.PGNFormat; import org.hedgecode.chess.scanner.format.PGNTag; import org.hedgecode.chess.scanner.format.TypeMovesFormat; import org.hedgecode.chess.scanner.format.lichess.GameData; import org.hedgecode.chess.scanner.format.lichess.GameFormat; import org.hedgecode.chess.scanner.spi.ServiceRegistry; /** * JSONGameFormat * * @author Dmitry Samoshin aka gotty */ public class JSONGameFormat implements GameFormat { private static final String TIME_CONTROL_FORMAT = "%d+%d"; @SerializedName("data") private JSONGameData gameData; JSONGameFormat() { } @Override public String id() { return gameData.game().id(); } @Override public GameData gameData() { return gameData; } @Override public String pgn() { PGNFormat pgnFormat = ServiceRegistry.singleProvider( PGNFormat.class ); Date startDate = new Date(gameData.game().createdAt()); pgnFormat.addTag(PGNTag.EVENT, gameData.event()); pgnFormat.addTag(PGNTag.DATE, pgnFormat.formatDate(startDate)); pgnFormat.addTag(PGNTag.WHITE, gameData.white().user().username()); pgnFormat.addTag(PGNTag.BLACK, gameData.black().user().username()); pgnFormat.addTag(PGNTag.WHITE_ELO, Integer.toString(gameData.white().rating())); pgnFormat.addTag(PGNTag.BLACK_ELO, Integer.toString(gameData.black().rating())); pgnFormat.addTag(PGNTag.TIME, pgnFormat.formatTime(startDate)); pgnFormat.addTag(PGNTag.TIME_CONTROL, String.format( TIME_CONTROL_FORMAT, gameData.clock().initial(), gameData.clock().increment() ) ); pgnFormat.addTag(PGNTag.RESULT, gameData.result()); if (gameData.game().turns() > 0) { pgnFormat.addTag(PGNTag.PLY_COUNT, Integer.toString(gameData.game().turns())); } if (gameData.game().startedAtTurn() > 0) { pgnFormat.addTag(PGNTag.FEN, gameData.game().fen()); } pgnFormat.addMoves( TypeMovesFormat.WRAP.format(gameData.moves()) ); return pgnFormat.format(); } }