package com.planet_ink.coffee_mud.WebMacros; import com.planet_ink.coffee_web.interfaces.*; import com.planet_ink.coffee_mud.core.interfaces.*; import com.planet_ink.coffee_mud.core.*; import com.planet_ink.coffee_mud.core.collections.*; import com.planet_ink.coffee_mud.Abilities.interfaces.*; import com.planet_ink.coffee_mud.Areas.interfaces.*; import com.planet_ink.coffee_mud.Behaviors.interfaces.*; import com.planet_ink.coffee_mud.CharClasses.interfaces.*; import com.planet_ink.coffee_mud.Libraries.interfaces.*; import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Achievement; import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Award; import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.AwardType; import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Event; import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.TitleAward; import com.planet_ink.coffee_mud.Common.interfaces.*; import com.planet_ink.coffee_mud.Exits.interfaces.*; import com.planet_ink.coffee_mud.Items.interfaces.*; import com.planet_ink.coffee_mud.Locales.interfaces.*; import com.planet_ink.coffee_mud.MOBS.interfaces.*; import com.planet_ink.coffee_mud.Races.interfaces.*; import java.util.*; /* Copyright 2015-2019 Bo Zimmerman 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. */ public class AchievementData extends StdWebMacro { @Override public String name() { return "AchievementData"; } public void rebuildTrackers(final String tattoo) { for(final Enumeration<MOB> m = CMLib.players().players();m.hasMoreElements();) { final MOB M=m.nextElement(); if(M.playerStats()!=null) { M.playerStats().rebuildAchievementTracker(M, M, tattoo); } } } public String deleteAchievement(final String tattoo) { final Achievement A=CMLib.achievements().deleteAchievement(tattoo); if(A!=null) { rebuildTrackers(A.getTattoo()); CMLib.achievements().resaveAchievements(A.getTattoo()); } return ""; } @Override public String runMacro(final HTTPRequest httpReq, final String parm, final HTTPResponse httpResp) { if(!CMProps.getBoolVar(CMProps.Bool.MUDSTARTED)) return CMProps.getVar(CMProps.Str.MUDSTATUS); final java.util.Map<String,String> parms=parseParms(parm); final String last=httpReq.getUrlParameter("ACHIEVEMENT"); if((last==null)&&(!parms.containsKey("EDIT"))) return " @break@"; String agentStr = parms.get("AGENT"); if(agentStr == null) agentStr=httpReq.getUrlParameter("AGENT"); AccountStats.Agent agent = (AccountStats.Agent)CMath.s_valueOf(AccountStats.Agent.class, agentStr.toUpperCase().trim()); if(agent == null) agent = AccountStats.Agent.PLAYER; if((agent == AccountStats.Agent.ACCOUNT)&&(!CMProps.isUsingAccountSystem())) agent = AccountStats.Agent.PLAYER; if(parms.containsKey("EDIT")) { final MOB M = Authenticate.getAuthenticatedMob(httpReq); if(M==null) return "[authentication error]"; if(!CMSecurity.isAllowed(M,M.location(),CMSecurity.SecFlag.ACHIEVEMENTS)) return "[authentication error]"; String row = ""; final String newTattoo=httpReq.getUrlParameter("TATTOO"); if(newTattoo==null) return "[missing TATTOO error]"; row=newTattoo.toUpperCase().trim()+"="; if((last!=null)&&((last.length()==0)&&(CMLib.achievements().getAchievement(newTattoo)!=null))) { return "[new achievement tattoo already exists!]"; } final String newEvent=httpReq.getUrlParameter("EVENT"); if((newEvent==null)||(!CMStrings.contains(Event.getEventChoices(), newEvent))) return "[missing EVENT error]"; final Event E=(Event)CMath.s_valueOf(Event.class, newEvent); row+="EVENT=\""+newEvent+"\" "; final String newDisplay=httpReq.getUrlParameter("DISPLAY"); if(newDisplay==null) return "[missing DISPLAY error]"; row+="DISPLAY=\""+CMStrings.escape(newDisplay)+"\" "; final String newTitle=httpReq.getUrlParameter("TITLE"); if((newTitle != null)&&(newTitle.length()>0)) row+="TITLE=\""+CMStrings.escape(newTitle)+"\" "; final String newRewards=httpReq.getUrlParameter("REWARDS"); if((newRewards != null)&&(newRewards.length()>0)) row+="REWARDS=\""+CMStrings.escape(newRewards)+"\" "; for(final String s : E.getParameters()) { if(!CMStrings.contains(AchievementLibrary.BASE_ACHIEVEMENT_PARAMETERS, s)) { final String newValue=httpReq.getUrlParameter(s); if((newValue != null)&&(newValue.length()>0)) { row+=s+"=\""+CMStrings.escape(newValue)+"\" "; } } } String error=CMLib.achievements().evaluateAchievement(agent,row,false); if(error!=null) return "[error: "+error+"]"; if(!parms.containsKey("CHECKONLY")) { if((last!=null)&&(CMLib.achievements().getAchievement(last)!=null)) { final String err=deleteAchievement(last); if((err!=null)&&(err.length()>0)) { return err; } } } error=CMLib.achievements().evaluateAchievement(agent,row,true); if((error!=null)&&(error.length()>0)) return "[error: "+error+"]"; if(!parms.containsKey("CHECKONLY")) { CMLib.achievements().resaveAchievements(last); } } else if(parms.containsKey("DELETE")) { final MOB M = Authenticate.getAuthenticatedMob(httpReq); if(M==null) return "[authentication error]"; if(!CMSecurity.isAllowed(M,M.location(),CMSecurity.SecFlag.ACHIEVEMENTS)) return "[authentication error]"; if(last==null) return " @break@"; if(CMLib.achievements().getAchievement(last)==null) return "Unknown title!"; final String err=deleteAchievement(last); if((err==null)||(err.length()==0)) return "Achievement deleted."; return err; } else if(last==null) return " @break@"; final StringBuffer str=new StringBuffer(""); final Achievement A=CMLib.achievements().getAchievement(last); Event E; String eventName=httpReq.getUrlParameter("EVENT"); if(eventName==null) eventName=(A!=null)?A.getEvent().name():"KILLS"; E=(Event)CMath.s_valueOf(Event.class, eventName); if(E==null) E=Event.KILLS; if(parms.containsKey("TATTOO")) { String value=httpReq.getUrlParameter("TATTOO"); if((value==null)&&(A!=null)) value=A.getTattoo(); if(value!=null) str.append(CMStrings.replaceAll(value,"\"",""")+", "); } if(parms.containsKey("EVENT")) { if(eventName!=null) str.append(CMStrings.replaceAll(eventName,"\"",""")+", "); } if(parms.containsKey("HELP") && parms.containsKey("FIELD")) { final String field=parms.get("FIELD"); @SuppressWarnings("unchecked") Map<String,Map<String,String>> map=(Map<String,Map<String,String>>)httpReq.getRequestObjects().get("SYSTEM_ACHIEVEMENT_HELP_MAP"); if(map == null) { map = CMLib.achievements().getAchievementsHelpMap(); httpReq.getRequestObjects().put("SYSTEM_ACHIEVEMENT_HELP_MAP",map); } final String help = CMLib.achievements().getAchievementsHelpFromMap(map, E, field); if(help != null) { str.append("<PRE>"); str.append(CMStrings.deEscape(help).replaceAll("\n\r","\n")); str.append("</PRE>"); str.append(", "); } } if(parms.containsKey("EVENTOPTIONS")) { final StringBuilder s=new StringBuilder(""); for(final Event E2 : Event.values()) { s.append("<OPTION VALUE="+E2.name()+" "); if(E2==E) s.append("SELECTED "); s.append(">"+E2.name()); } str.append(s.toString()+", "); } if(parms.containsKey("DISPLAY")) { String value=httpReq.getUrlParameter("DISPLAY"); if((value==null)&&(A!=null)) value=A.getDisplayStr(); if(value!=null) str.append(CMStrings.replaceAll(value,"\"",""")+", "); } if(parms.containsKey("TITLE")) { String value=httpReq.getUrlParameter("TITLE"); final boolean friendly=parms.containsKey("FRIENDLY"); if((value==null)&&(A!=null)) { for(final Award award: A.getRewards()) { if(award.getType()==AwardType.TITLE) { if(friendly) value=CMLib.achievements().fixAwardDescription(A, award, null, null); else if(award instanceof TitleAward) value=((TitleAward)award).getTitle(); } } } if(value!=null) str.append(CMStrings.replaceAll(value,"\"",""")+", "); } if(parms.containsKey("REWARDS")) { String value=httpReq.getUrlParameter("REWARDS"); if((value==null)&&(A!=null)) value=CMLib.achievements().getAwardString(A.getRewards()); if(value!=null) str.append(CMStrings.replaceAll(value,"\"",""")+", "); } if(parms.containsKey("COUNT")) { String value=httpReq.getUrlParameter("COUNT"); if((value==null)&&(A!=null)) value=""+A.getTargetCount(); if(value!=null) str.append(CMStrings.replaceAll(value,"\"",""")+", "); } if(parms.containsKey("MISC")) { String value=httpReq.getUrlParameter("MISC"); if((value==null)&&(A!=null)) { value=""; for(final String otherParmName : E.getParameters()) { if(!CMStrings.contains(AchievementLibrary.BASE_ACHIEVEMENT_PARAMETERS, otherParmName)) { value += CMStrings.deEscape(A.getRawParmVal(otherParmName))+" "; } } } if(value!=null) str.append(CMStrings.replaceAll(CMStrings.addCommaSpacing(value),"\"",""")+", "); } if(parms.containsKey("OTHERPARMNEXT")) { final String lastOtherParm=httpReq.getUrlParameter("OTHERPARM"); if(parms.containsKey("RESET")) { if(lastOtherParm!=null) httpReq.removeUrlParameter("OTHERPARM"); return ""; } String lastOtherParmID=""; for(final String otherParmName : E.getParameters()) { if(!CMStrings.contains(AchievementLibrary.BASE_ACHIEVEMENT_PARAMETERS, otherParmName)) { if((lastOtherParm==null)||((lastOtherParm.length()>0)&&(lastOtherParm.equals(lastOtherParmID))&&(!otherParmName.equals(lastOtherParmID)))) { httpReq.addFakeUrlParameter("OTHERPARM",otherParmName); httpReq.addFakeUrlParameter("OTHERPARMFIELD",CMStrings.capitalizeAndLower(otherParmName)); return ""; } lastOtherParmID=otherParmName; } } httpReq.addFakeUrlParameter("OTHERPARM",""); if(parms.containsKey("EMPTYOK")) return "<!--EMPTY-->"; return " @break@"; } if(parms.containsKey("PLAYERPROGRESS")) { if(A == null) return "[no achievement error]"; final String playerID=httpReq.getUrlParameter("PLAYER"); if((playerID!=null)&&(playerID.length()>0)) { final MOB M=CMLib.players().getLoadPlayer(playerID); if(M!=null) { final PlayerStats pStats = M.playerStats(); if(pStats!=null) { final AchievementLibrary.Tracker T = pStats.getAchievementTracker(A, M, M); str.append(""+T.getCount(M)).append(", "); } else return "[bad player error]"; } else return "[unknown player error]"; } else return "[player reference error]"; } if(parms.containsKey("ISPLAYERACHIEVED") || parms.containsKey("ISPLAYERPROGRESS")) { if(A == null) return "[no achievement error]"; final String playerID=httpReq.getUrlParameter("PLAYER"); if((playerID!=null)&&(playerID.length()>0)) { final MOB M=CMLib.players().getLoadPlayer(playerID); if(M!=null) { final PlayerStats pStats = M.playerStats(); if(pStats!=null) { final AchievementLibrary.Tracker T = pStats.getAchievementTracker(A, M, M); if(parms.containsKey("ISPLAYERACHIEVED")) { final boolean achieved = M.findTattoo(A.getTattoo()) != null; if(parms.containsKey("ISPLAYERPROGRESS")) str.append((achieved || (T.getCount(M) != 0)) ? "true" : "false").append(", "); else str.append(achieved ? "true" : "false").append(", "); } else str.append(T.getCount(M) != 0 ? "true" : "false").append(", "); } else return "[bad player error]"; } else return "[unknown player error]"; } else return "[player reference error]"; } for(final String otherParmName : E.getParameters()) { if(!CMStrings.contains(AchievementLibrary.BASE_ACHIEVEMENT_PARAMETERS, otherParmName)) { if(parms.containsKey(otherParmName)) { String newValue=httpReq.getUrlParameter(otherParmName); if((newValue==null)&&(A!=null)) newValue=CMStrings.deEscape(A.getRawParmVal(otherParmName)); if(newValue!=null) str.append(CMStrings.replaceAll(newValue,"\"",""")+", "); } } } String strstr=str.toString(); if(strstr.endsWith(", ")) strstr=strstr.substring(0,strstr.length()-2); return clearWebMacros(strstr); } }