/* * Copyright (C) 2004-2015 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J DataPack is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package handlers.admincommandhandlers; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.PunishmentManager; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.punishment.PunishmentAffect; import com.l2jserver.gameserver.model.punishment.PunishmentTask; import com.l2jserver.gameserver.model.punishment.PunishmentType; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.util.GMAudit; import com.l2jserver.gameserver.util.Util; /** * @author UnAfraid */ public class AdminPunishment implements IAdminCommandHandler { private static final Logger _log = Logger.getLogger(AdminPunishment.class.getName()); private static final String[] ADMIN_COMMANDS = { "admin_punishment", "admin_punishment_add", "admin_punishment_remove", "admin_ban_acc", "admin_unban_acc", "admin_ban_chat", "admin_unban_chat", "admin_ban_char", "admin_unban_char", "admin_jail", "admin_unjail" }; private static SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); @Override public boolean useAdminCommand(String command, L2PcInstance activeChar) { final StringTokenizer st = new StringTokenizer(command, " "); if (!st.hasMoreTokens()) { return false; } final String cmd = st.nextToken(); switch (cmd) { case "admin_punishment": { if (!st.hasMoreTokens()) { String content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/admin/punishment.htm"); if (content != null) { content = content.replaceAll("%punishments%", Util.implode(PunishmentType.values(), ";")); content = content.replaceAll("%affects%", Util.implode(PunishmentAffect.values(), ";")); activeChar.sendPacket(new NpcHtmlMessage(0, 1, content)); } else { _log.log(Level.WARNING, getClass().getSimpleName() + ": data/html/admin/punishment.htm is missing"); } } else { final String subcmd = st.nextToken(); switch (subcmd) { case "info": { String key = st.hasMoreTokens() ? st.nextToken() : null; String af = st.hasMoreTokens() ? st.nextToken() : null; String name = key; if ((key == null) || (af == null)) { activeChar.sendMessage("Not enough data specified!"); break; } final PunishmentAffect affect = PunishmentAffect.getByName(af); if (affect == null) { activeChar.sendMessage("Incorrect value specified for affect type!"); break; } // Swap the name of the character with it's id. if (affect == PunishmentAffect.CHARACTER) { key = findCharId(key); } String content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/admin/punishment-info.htm"); if (content != null) { StringBuilder sb = new StringBuilder(); for (PunishmentType type : PunishmentType.values()) { if (PunishmentManager.getInstance().hasPunishment(key, affect, type)) { long expiration = PunishmentManager.getInstance().getPunishmentExpiration(key, affect, type); String expire = "never"; if (expiration > 0) { // Synchronize date formatter since its not thread safe. synchronized (DATE_FORMATTER) { expire = DATE_FORMATTER.format(new Date(expiration)); } } sb.append("" + type + "" + expire + "Remove"); } } content = content.replaceAll("%player_name%", name); content = content.replaceAll("%punishments%", sb.toString()); content = content.replaceAll("%affects%", Util.implode(PunishmentAffect.values(), ";")); content = content.replaceAll("%affect_type%", affect.name()); activeChar.sendPacket(new NpcHtmlMessage(0, 1, content)); } else { _log.log(Level.WARNING, getClass().getSimpleName() + ": data/html/admin/punishment-info.htm is missing"); } break; } case "player": { L2PcInstance target = null; if (st.hasMoreTokens()) { final String playerName = st.nextToken(); if (playerName.isEmpty() && ((activeChar.getTarget() == null) || !activeChar.getTarget().isPlayer())) { return useAdminCommand("admin_punishment", activeChar); } target = L2World.getInstance().getPlayer(playerName); } if ((target == null) && ((activeChar.getTarget() == null) || !activeChar.getTarget().isPlayer())) { activeChar.sendMessage("You must target player!"); break; } if (target == null) { target = activeChar.getTarget().getActingPlayer(); } String content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/admin/punishment-player.htm"); if (content != null) { content = content.replaceAll("%player_name%", target.getName()); content = content.replaceAll("%punishments%", Util.implode(PunishmentType.values(), ";")); content = content.replaceAll("%acc%", target.getAccountName()); content = content.replaceAll("%char%", target.getName()); content = content.replaceAll("%ip%", target.getIPAddress()); activeChar.sendPacket(new NpcHtmlMessage(0, 1, content)); } else { _log.log(Level.WARNING, getClass().getSimpleName() + ": data/html/admin/punishment-player.htm is missing"); } break; } } } break; } case "admin_punishment_add": { // Add new punishment String key = st.hasMoreTokens() ? st.nextToken() : null; String af = st.hasMoreTokens() ? st.nextToken() : null; String t = st.hasMoreTokens() ? st.nextToken() : null; String exp = st.hasMoreTokens() ? st.nextToken() : null; String reason = st.hasMoreTokens() ? st.nextToken() : null; // Let's grab the other part of the reason if there is.. if (reason != null) { while (st.hasMoreTokens()) { reason += " " + st.nextToken(); } if (!reason.isEmpty()) { reason = reason.replaceAll("\\$", "\\\\\\$"); reason = reason.replaceAll("\r\n", ""); reason = reason.replace("<", "<"); reason = reason.replace(">", ">"); } } String name = key; if ((key == null) || (af == null) || (t == null) || (exp == null) || (reason == null)) { activeChar.sendMessage("Please fill all the fields!"); break; } if (!Util.isDigit(exp) && !exp.equals("-1")) { activeChar.sendMessage("Incorrect value specified for expiration time!"); break; } long expirationTime = Integer.parseInt(exp); if (expirationTime > 0) { expirationTime = System.currentTimeMillis() + (expirationTime * 60 * 1000); } final PunishmentAffect affect = PunishmentAffect.getByName(af); final PunishmentType type = PunishmentType.getByName(t); if ((affect == null) || (type == null)) { activeChar.sendMessage("Incorrect value specified for affect/punishment type!"); break; } // Swap the name of the character with it's id. if (affect == PunishmentAffect.CHARACTER) { key = findCharId(key); } else if (affect == PunishmentAffect.IP) { try { InetAddress addr = InetAddress.getByName(key); if (addr.isLoopbackAddress()) { throw new UnknownHostException("You cannot ban any local address!"); } else if (Config.GAME_SERVER_HOSTS.contains(addr.getHostAddress())) { throw new UnknownHostException("You cannot ban your gameserver's address!"); } } catch (UnknownHostException e) { activeChar.sendMessage("You've entered an incorrect IP address!"); activeChar.sendMessage(e.getMessage()); break; } } // Check if we already put the same punishment on that guy ^^ if (PunishmentManager.getInstance().hasPunishment(key, affect, type)) { activeChar.sendMessage("Target is already affected by that punishment."); break; } // Punish him! PunishmentManager.getInstance().startPunishment(new PunishmentTask(key, affect, type, expirationTime, reason, activeChar.getName())); activeChar.sendMessage("Punishment " + type.name() + " have been applied to: " + affect + " " + name + "!"); GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", cmd, affect.name(), name); return useAdminCommand("admin_punishment info " + name + " " + affect.name(), activeChar); } case "admin_punishment_remove": { // Remove punishment. String key = st.hasMoreTokens() ? st.nextToken() : null; String af = st.hasMoreTokens() ? st.nextToken() : null; String t = st.hasMoreTokens() ? st.nextToken() : null; String name = key; if ((key == null) || (af == null) || (t == null)) { activeChar.sendMessage("Not enough data specified!"); break; } final PunishmentAffect affect = PunishmentAffect.getByName(af); final PunishmentType type = PunishmentType.getByName(t); if ((affect == null) || (type == null)) { activeChar.sendMessage("Incorrect value specified for affect/punishment type!"); break; } // Swap the name of the character with it's id. if (affect == PunishmentAffect.CHARACTER) { key = findCharId(key); } if (!PunishmentManager.getInstance().hasPunishment(key, affect, type)) { activeChar.sendMessage("Target is not affected by that punishment!"); break; } PunishmentManager.getInstance().stopPunishment(key, affect, type); activeChar.sendMessage("Punishment " + type.name() + " have been stopped to: " + affect + " " + name + "!"); GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", cmd, affect.name(), name); return useAdminCommand("admin_punishment info " + name + " " + affect.name(), activeChar); } case "admin_ban_char": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_add %s %s %s %s %s", st.nextToken(), PunishmentAffect.CHARACTER, PunishmentType.BAN, 0, "Banned by admin"), activeChar); } } case "admin_unban_char": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_remove %s %s %s", st.nextToken(), PunishmentAffect.CHARACTER, PunishmentType.BAN), activeChar); } } case "admin_ban_acc": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_add %s %s %s %s %s", st.nextToken(), PunishmentAffect.ACCOUNT, PunishmentType.BAN, 0, "Banned by admin"), activeChar); } } case "admin_unban_acc": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_remove %s %s %s", st.nextToken(), PunishmentAffect.ACCOUNT, PunishmentType.BAN), activeChar); } } case "admin_ban_chat": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_add %s %s %s %s %s", st.nextToken(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN, 0, "Chat banned by admin"), activeChar); } } case "admin_unban_chat": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_remove %s %s %s", st.nextToken(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN), activeChar); } } case "admin_jail": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_add %s %s %s %s %s", st.nextToken(), PunishmentAffect.CHARACTER, PunishmentType.JAIL, 0, "Jailed by admin"), activeChar); } } case "admin_unjail": { if (st.hasMoreTokens()) { return useAdminCommand(String.format("admin_punishment_remove %s %s %s", st.nextToken(), PunishmentAffect.CHARACTER, PunishmentType.JAIL), activeChar); } } } return true; } private static final String findCharId(String key) { int charId = CharNameTable.getInstance().getIdByName(key); if (charId > 0) // Yeah its a char name! { return Integer.toString(charId); } return key; } @Override public String[] getAdminCommandList() { return ADMIN_COMMANDS; } }