package gamification; import java.util.List; import persistency.entities.LoggedUser; import persistency.entities.gamification.PointsCategory; import persistency.entities.gamification.PointsInstance; import persistency.exposed.LoggedUserExposed; import persistency.exposed.PointsCategoryExposed; import persistency.exposed.PointsExposed; import utils.Status; import utils.Status.STATE; public class ExecuteAction { public static ExecuteAction getInstance(){ return new ExecuteAction(); } public Status execute(String actionName, LoggedUser user, String code){ Status result = null; if(user != null) { if(actionName != null){ result = addNonCodePoints(actionName, user); } else if(code != null){ result = addCodePoints(user, code); } addRankPoints(user); } return result; } private Status addCodePoints(LoggedUser user, String code) { Status result; PointsExposed pe = new PointsExposed(); PointsInstance pointsInstance = pe.getCode(code); if(pointsInstance == null){ return new Status(STATE.ERROR, "Wrong code"); } PointsCategory pointsCategory = pointsInstance.getCategory(); PointsCategoryExposed pce = new PointsCategoryExposed(); PointsCategory categoryByName = pce.findCategoryByShortName("charity"); if(pointsCategory.getShortid().equals("tshirt")){ if (user.getPointsInstancesOfCategory(categoryByName).size()<1){ return new Status(STATE.ERROR, "You need to unlock the challenge before entering code from T-Shirt, go to charity booth and find the public code."); } } result = addPoints(pointsCategory, user, pointsInstance); return result; } private Status addNonCodePoints(String actionName, LoggedUser user) { Status result; PointsCategoryExposed pce = new PointsCategoryExposed(); PointsCategory pointsCategory = pce.findCategoryByShortName(actionName); result = addPoints(pointsCategory, user, null); return result; } private Status addPoints(PointsCategory pointsCategory, LoggedUser user, PointsInstance code) { List<PointsInstance> pointsInstances = user.getPointsInstancesOfCategory(pointsCategory); if(pointsCategory.getMaxInstacesPerPerson() <0 || pointsCategory.getMaxInstacesPerPerson() > pointsInstances.size()){ PointsInstance pi = null; if(pointsCategory.isSelfGeneratingInstances()){ pi = pointsCategory.createPointsInstance(user); } else{ PointsExposed pe = new PointsExposed(); pi = code; if(pi == null){ return new Status(STATE.ERROR, "Incorrect code"); } if(pi.isUsed()){ return new Status(STATE.ERROR, "This code has been used."); } if(pi.getEnteredBy() != null && !user.getName().equals(pi.getEnteredBy().getName())) { return new Status(STATE.ERROR, "This code has been used by "+pi.getEnteredBy().getName()); } pi.setCategory(pointsCategory); pi.setEnteredBy(user); pi.setUsed(true); pe.updateEntity(pi); } persistData(user, pi); return new Status(Status.STATE.OK, pointsCategory.getPoints()); } return new Status(STATE.ERROR, "You have reached the limit ("+pointsCategory.getMaxInstacesPerPerson()+") for this type of code - "+pointsCategory.getName()); } private void addRankPoints(LoggedUser user) { Player playerAfter = user.getPlayer(); int rankInt = playerAfter.getRankInt(); while(rankInt>0) { addNonCodePoints("rank"+rankInt, user); rankInt--; } } private void persistData(LoggedUser user, PointsInstance pi) { user.addCode(pi); LoggedUserExposed lue = new LoggedUserExposed(); lue.updateEntity(user); } }