123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- /*
- * 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 <http://www.gnu.org/licenses/>.
- */
- 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("<tr><td><font color=\"LEVEL\">" + type + "</font></td><td>" + expire + "</td><td><a action=\"bypass -h admin_punishment_remove " + name + " " + affect + " " + type + "\">Remove</a></td></tr>");
- }
- }
-
- 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", "<br1>");
- 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;
- }
- }
|