package admincommands; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.math.NumberUtils; import com.aionemu.gameserver.dao.PlayerDAO; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.gameobjects.player.PlayerCommonData; import com.aionemu.gameserver.services.CommandsAccessService; import com.aionemu.gameserver.utils.chathandlers.AdminCommand; /** * @author ViAl, Neon */ public class Access extends AdminCommand { private final Map oldAccessLevels = new HashMap<>(); public Access() { super("access", "Chat command and access level management."); // @formatter:off setSyntaxInfo( " - Grants the player access to the given chat command.", " - Removes the player's access to the given chat command.", " - Removes all granted accesses.", " - Temporarily sets your accesslevel to a given lower value (for test purposes).", " - Resets your accesslevel to the original value." ); // @formatter:on } @Override public void execute(Player admin, String... params) { if (params.length <= 1) { sendInfo(admin); return; } String cmd = params[0].toLowerCase(); switch (cmd) { case "add": case "remove": { if (params.length < 3) { sendInfo(admin); return; } String playerName = params[1]; String commandName = params[2]; PlayerCommonData pcd = PlayerDAO.loadPlayerCommonDataByName(playerName); if (pcd == null) { sendInfo(admin, "Player with name " + playerName + " doesn't exists!"); return; } if (cmd.equals("add")) CommandsAccessService.giveAccess(admin, pcd.getPlayerObjId(), commandName); else CommandsAccessService.removeAccess(admin, pcd.getPlayerObjId(), commandName); break; } case "removeall": { String playerName = params[1]; PlayerCommonData pcd = PlayerDAO.loadPlayerCommonDataByName(playerName); if (pcd == null) { sendInfo(admin, "Player with name " + playerName + " doesn't exists!"); return; } if (CommandsAccessService.removeAllAccesses(pcd.getPlayerObjId())) sendInfo(admin, "Removed all custom chat command accesses from player " + pcd.getName()); else sendInfo(admin, "Nothing to remove from player " + pcd.getName()); break; } case "level": { byte currentLevel = admin.getAccount().getAccessLevel(); byte maxLevel = oldAccessLevels.getOrDefault(admin.getObjectId(), currentLevel); if ("reset".equalsIgnoreCase(params[1])) { if (maxLevel == currentLevel) { sendInfo(admin, "Nothing to reset."); return; } admin.getAccount().setAccessLevel(maxLevel); sendInfo(admin, "Your access level has been reset."); } else { byte level = NumberUtils.toByte(params[1], (byte) -1); if (level == -1 || level > maxLevel) { sendInfo(admin, "Invalid access level."); return; } if (level == currentLevel) { sendInfo(admin, "You already have access level " + level + "."); return; } admin.getAccount().setAccessLevel(level); if (level < getLevel() && !CommandsAccessService.hasAccess(admin.getObjectId(), getAlias())) { CommandsAccessService.giveTemporaryAccess(admin, admin.getObjectId(), getAlias()); } sendInfo(admin, "Your access level has been changed."); } currentLevel = admin.getAccount().getAccessLevel(); if (currentLevel == maxLevel) { oldAccessLevels.remove(admin.getObjectId()); } else { oldAccessLevels.putIfAbsent(admin.getObjectId(), maxLevel); } if (currentLevel > getLevel() && CommandsAccessService.hasAccess(admin.getObjectId(), getAlias())) { CommandsAccessService.removeAccess(admin, admin.getObjectId(), getAlias()); } admin.getController().onChangedPlayerAttributes(); break; } default: sendInfo(admin); } } }