package de.tud.kom.socom.components.achievements; import java.sql.SQLException; import org.json.JSONException; import de.tud.kom.socom.SocomComponent; import de.tud.kom.socom.database.achievements.AchievementDatabase; import de.tud.kom.socom.database.achievements.HSQLAchievementDatabase; import de.tud.kom.socom.database.game.GameDatabase; import de.tud.kom.socom.database.game.HSQLGameDatabase; import de.tud.kom.socom.util.SocomRequest; import de.tud.kom.socom.util.JSONUtils; import de.tud.kom.socom.util.exceptions.SocomException; public class AchievementsManager extends SocomComponent { private static final String URL_PATTERN = "achievements"; private static AchievementsManager instance = new AchievementsManager(); private static AchievementDatabase achievementDB; private static GameDatabase gameDB; private AchievementsManager() { achievementDB = HSQLAchievementDatabase.getInstance(); gameDB = HSQLGameDatabase.getInstance(); } public static AchievementsManager getInstance() { return instance; } @Override public String getUrlPattern() { return URL_PATTERN; } /** * Add an achievement. * * Answeres with json: success=true * * @param req * Request with URL-Params: - achievementname (string) - * description (string) - image (string) - countermax (long) - * rewardpoints (int) - categoryname (string) - gamename (string) * - gamepassword (string) * @return error code * @throws SQLException * @throws JSONException */ public int addAchievement(SocomRequest req) throws SQLException, JSONException, SocomException { String name = req.getParam("achievementname"); String description = req.getParam("description"); String categoryname = req.getParam("categoryname"); String image = req.getParam("image"); String gamename = req.getParam("gamename"); String gamepw = req.getParam("gamepassword"); long counterMax = Long.parseLong(req.getParam("countermax")); int rewardPoints = Integer.parseInt(req.getParam("rewardpoints")); long gameID = gameDB.authenticateGame(gamename, gamepw); Achievement achievement = new Achievement(-1L, gameID, counterMax, name, description, image, categoryname, rewardPoints); achievementDB.addAchievement(achievement); req.addOutput(JSONUtils.getSuccessJsonString()); return 0; } /** * Get an achievement with all its rewards. * * Answers with json: instance = * 'components.achievements.achievement.toJSONString' * * @param req * Request with URL-Params: - achievementname (string) - gamename * (string) - gamepassword (string) * @return error code * @throws SQLException * @throws JSONException */ public int getAchievement(SocomRequest req) throws SQLException, JSONException, SocomException { String achievementname = req.getParam("achievementname"); String gamepassword = req.getParam("gamepassword"); String gamename = req.getParam("gamename"); long gameID = gameDB.authenticateGame(gamename, gamepassword); Achievement achievement = achievementDB.getAchievement(achievementname, gameID); req.addOutput(achievement.toJSONString()); return 0; } /** * Delete achievement and all its relations. * * Answeres with json: success=true * * @param req * Request with URL-Params: - achievementname (string) - gamename * (string) - gamepassword (string) * @return error code * @throws SQLException * @throws JSONException */ public int removeAchievement(SocomRequest req) throws SQLException, JSONException, SocomException { String achievementname = req.getParam("achievementname"); String gamepassword = req.getParam("gamepassword"); String gamename = req.getParam("gamename"); long gameID = gameDB.authenticateGame(gamename, gamepassword); achievementDB.removeAchievement(achievementname, gameID); req.addOutput(JSONUtils.getSuccessJsonString()); return 0; } /** * Add an achievement level. * * param: countermax has to be higher than from the last level * * Answeres with json: success=true * * @param req * Request with URL-Params: - achievementname (string) - gamename * (string) - gamepassword (string) - - countermax (long) - * rewardpoints (int) * @return error code * @throws SQLException * @throws JSONException */ public int addAchievementLevel(SocomRequest req) throws SQLException, JSONException, SocomException { String achievementname = req.getParam("achievementname"); String gamename = req.getParam("gamename"); String gamepw = req.getParam("gamepassword"); long counterMax = Long.parseLong(req.getParam("countermax")); int rewardPoints = Integer.parseInt(req.getParam("rewardpoints")); long gameID = gameDB.authenticateGame(gamename, gamepw); Achievement achievement = new Achievement(-1L, gameID, counterMax, achievementname, "", "", "", rewardPoints); achievementDB.addAchievementLevel(achievement); req.addOutput(JSONUtils.getSuccessJsonString()); return 0; } /** * Update the achievement progress. * * Expects user id in session. * * Counter will be summed up if non-zero (can be negative). No action if * counter is zero. * * Answers with json: instance = * 'components.achievements.achievementprogressmessage.toJSONString' * * @param req * Request with URL-Params: - achievementname (string) - gamename * (string) - gamepassword (string) - counter (long) * * @return error code * @throws SQLException * @throws JSONException */ public int updateAchievementProgress(SocomRequest req) throws SQLException, JSONException, SocomException { String achievementname = req.getParam("achievementname"); String gamename = req.getParam("gamename"); String gamepw = req.getParam("gamepassword"); long counter = Long.parseLong(req.getParam("counter")); long gameID = gameDB.authenticateGame(gamename, gamepw); long userID = req.getUid(); AchievementProgressMessage progressMessage = achievementDB.updateAchievementProgress(achievementname, gameID, counter, userID); req.addOutput(progressMessage.toJSONString()); return 0; } /** * Reset the achievement progress of the current achievement level if not * completed yet. * * Expects user id in session. * * Answeres with json: success=true * * @param req * Request with URL-Params: - achievementname (string) - gamename * (string) - gamepassword (string) * @return error code * @throws SQLException * @throws JSONException */ public int resetAchievementProgress(SocomRequest req) throws SQLException, JSONException, SocomException { String achievementname = req.getParam("achievementname"); String gamename = req.getParam("gamename"); String gamepw = req.getParam("gamepassword"); long gameID = gameDB.authenticateGame(gamename, gamepw); long userID = req.getUid(); achievementDB.resetAchievementProgress(achievementname, gameID, userID); req.addOutput(JSONUtils.getSuccessJsonString()); return 0; } /** * Get the achievement progress. * * Expects user id in session. * * Answers with json: instance = * 'components.achievements.achievementprogress.toJSONString' * * @param req * Request with URL-Params: - achievementname (string) - gamename * (string) - gamepassword (string) * @return error code * @throws SQLException * @throws JSONException */ public int getAchievementProgress(SocomRequest req) throws SQLException, JSONException, SocomException { String achievementname = req.getParam("achievementname"); String gamepassword = req.getParam("gamepassword"); String gamename = req.getParam("gamename"); long gameID = gameDB.authenticateGame(gamename, gamepassword); long userID = req.getUid(); AchievementProgress progress = achievementDB.getAchievementProgress(achievementname, gameID, userID); req.addOutput(progress.toJSONString()); return 0; } /** * Add an achievement reward. * * Afterwards, setAchievementReward() should be called to associate the * reward with achievement(s). * * Answeres with json: success=true * * @param req * Request with URL-Params: - name (string) - description * (string) - value (long) * @return error code * @throws SQLException * @throws JSONException */ public int addAchievementReward(SocomRequest req) throws SQLException, JSONException, SocomException { String name = req.getParam("name"); String description = req.getParam("description"); long value = Long.parseLong(req.getParam("value")); AchievementReward reward = new AchievementReward(-1L, value, name, description); achievementDB.addReward(reward); req.addOutput(JSONUtils.getSuccessJsonString()); return 0; } /** * Relates a reward with an achievement. * * Answeres with json: success=true * * @param req * Request with URL-Params: - achievementname (string) - gamename * (string) - gamepassword (string) - achievementlevel (integer) * - rewardname (string) * @return error code * @throws SQLException * @throws JSONException */ public int setAchievementReward(SocomRequest req) throws SQLException, JSONException, SocomException { String achievementname = req.getParam("achievementname"); String gamename = req.getParam("gamename"); String gamepw = req.getParam("gamepassword"); String rewardname = req.getParam("rewardname"); int achievementlevel = Integer.valueOf(req.getParam("achievementlevel")); long gameID = gameDB.authenticateGame(gamename, gamepw); Achievement achievement = new Achievement(-1L, gameID, -1, achievementname, "", "", "", -1); AchievementReward reward = new AchievementReward(-1L, -1, rewardname, ""); achievementDB.setAchievementReward(achievement, reward, achievementlevel); req.addOutput(JSONUtils.getSuccessJsonString()); return 0; } }