Finalisation de la commande /modo
This commit is contained in:
parent
588d914feb
commit
365689e80f
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<jardesc>
|
<jardesc>
|
||||||
<jar path="PandacraftUtils/jar_export/PandacraftUtils-3.14.jar"/>
|
<jar path="PandacraftUtils/jar_export/PandacraftUtils-3.15.jar"/>
|
||||||
<options buildIfNeeded="true" compress="true" descriptionLocation="/PandacraftUtils/make_jar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
|
<options buildIfNeeded="true" compress="true" descriptionLocation="/PandacraftUtils/make_jar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
|
||||||
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
||||||
<selectedProjects/>
|
<selectedProjects/>
|
||||||
|
@ -68,5 +68,17 @@ networkAPI:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
modo:
|
||||||
|
# en seconde
|
||||||
|
durationLimit:
|
||||||
|
low: 43200
|
||||||
|
normal: 1209600
|
||||||
|
jailsPosition:
|
||||||
|
world: Survival
|
||||||
|
x: -1046.5
|
||||||
|
y: 32
|
||||||
|
z: 314.5
|
||||||
|
jailWalls:
|
||||||
|
width: 3
|
||||||
|
height: 3
|
||||||
|
direction: WEST
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
name: PandacraftUtils
|
name: PandacraftUtils
|
||||||
main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils
|
main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils
|
||||||
version: 3.14
|
version: 3.15
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -189,6 +189,21 @@ permissions:
|
|||||||
default: op
|
default: op
|
||||||
|
|
||||||
|
|
||||||
|
#### à ajouter
|
||||||
|
pandacraft.modo:
|
||||||
|
description: Utiliser la commande modo
|
||||||
|
default: op
|
||||||
|
pandacraft.modo.low:
|
||||||
|
description: Utiliser un bas niveau de sanction
|
||||||
|
default: op
|
||||||
|
pandacraft.modo.normal:
|
||||||
|
description: Utiliser un niveau moyen de sanction
|
||||||
|
default: op
|
||||||
|
pandacraft.modo.high:
|
||||||
|
description: Utiliser les plus hauts niveau de sanction
|
||||||
|
default: op
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pandacraft.antispam.exempt:
|
pandacraft.antispam.exempt:
|
||||||
description: Ignoré par le système anti-spam
|
description: Ignoré par le système anti-spam
|
||||||
|
@ -7,6 +7,7 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
|
|||||||
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.AutoMessagesManager;
|
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.AutoMessagesManager;
|
||||||
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.CalculatorManager;
|
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.CalculatorManager;
|
||||||
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.CommandAliasManager;
|
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.CommandAliasManager;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.JailsManager;
|
||||||
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.LoginLogoutMessageManager;
|
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.LoginLogoutMessageManager;
|
||||||
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.PacketOutServerInfoListener;
|
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.PacketOutServerInfoListener;
|
||||||
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.SpawnTimeManager;
|
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.SpawnTimeManager;
|
||||||
@ -78,6 +79,7 @@ public class PandacraftUtils extends JavaPlugin {
|
|||||||
public TamedEntityProtectManager tamedEntityProtectManager;
|
public TamedEntityProtectManager tamedEntityProtectManager;
|
||||||
public WorldBorderManager worldBorderManager;
|
public WorldBorderManager worldBorderManager;
|
||||||
public HeartThrowManager heartThrowManager;
|
public HeartThrowManager heartThrowManager;
|
||||||
|
public JailsManager jailsManager;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -126,6 +128,7 @@ public class PandacraftUtils extends JavaPlugin {
|
|||||||
tamedEntityProtectManager = new TamedEntityProtectManager();
|
tamedEntityProtectManager = new TamedEntityProtectManager();
|
||||||
worldBorderManager = new WorldBorderManager();
|
worldBorderManager = new WorldBorderManager();
|
||||||
heartThrowManager = new HeartThrowManager();
|
heartThrowManager = new HeartThrowManager();
|
||||||
|
jailsManager = new JailsManager();
|
||||||
|
|
||||||
|
|
||||||
NetworkAPI.loadNewInstance();
|
NetworkAPI.loadNewInstance();
|
||||||
@ -170,6 +173,7 @@ public class PandacraftUtils extends JavaPlugin {
|
|||||||
tamedEntityProtectManager = null;
|
tamedEntityProtectManager = null;
|
||||||
worldBorderManager = null;
|
worldBorderManager = null;
|
||||||
heartThrowManager = null;
|
heartThrowManager = null;
|
||||||
|
jailsManager = null;
|
||||||
|
|
||||||
instance = null;
|
instance = null;
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.mc_pandacraft.java.plugin.pandacraftutils.commands;
|
package net.mc_pandacraft.java.plugin.pandacraftutils.commands;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@ -40,6 +41,13 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getLastParam(String[] args, int index) {
|
||||||
|
if (index < 0 || index >= args.length)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
|
||||||
|
return StringUtils.join(args, " ", index, args.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,28 @@
|
|||||||
package net.mc_pandacraft.java.plugin.pandacraftutils.commands;
|
package net.mc_pandacraft.java.plugin.pandacraftutils.commands;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.ModoHistoryElement;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.ModoHistoryElement.ActionType;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface;
|
||||||
|
import net.mc_pandacraft.java.util.TimeUtil;
|
||||||
|
|
||||||
|
import org.bukkit.BanList.Type;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import com.earth2me.essentials.User;
|
||||||
|
import com.earth2me.essentials.utils.DateUtil;
|
||||||
|
|
||||||
public class CommandModo extends AbstractCommandExecutor {
|
public class CommandModo extends AbstractCommandExecutor {
|
||||||
|
|
||||||
@ -17,7 +38,824 @@ public class CommandModo extends AbstractCommandExecutor {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
return false;
|
// affichage de l'aide
|
||||||
}
|
if (args.length <= 1) {
|
||||||
|
|
||||||
|
int page = 1;
|
||||||
|
|
||||||
|
if (args.length == 1)
|
||||||
|
try {
|
||||||
|
page = Integer.parseInt(args[0]);
|
||||||
|
} catch (NumberFormatException e) { }
|
||||||
|
|
||||||
|
showHelp(sender, page);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* report
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (args.length >= 3 && args[0].equalsIgnoreCase("report")) {
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
String message = getLastParam(args, 2);
|
||||||
|
|
||||||
|
onCommandReport(sender, player, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jails
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (args.length >= 1 && args[0].equalsIgnoreCase("report")) {
|
||||||
|
|
||||||
|
if (!(sender instanceof Player))
|
||||||
|
{
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous devez être en ligne pour faire cette sous-commande");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
onCommandJails((Player) sender);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* amende
|
||||||
|
*/
|
||||||
|
if (args.length >= 4 && args[0].equalsIgnoreCase("amende")) {
|
||||||
|
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
long somme = 0;
|
||||||
|
|
||||||
|
try {
|
||||||
|
somme = Long.parseLong(args[2]);
|
||||||
|
} catch(NumberFormatException e) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"La somme d'argent à retirer n'est pas valide");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String message = getLastParam(args, 3);
|
||||||
|
|
||||||
|
onCommandAmende(sender, player, somme, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* kick
|
||||||
|
*/
|
||||||
|
if (args.length >= 3 && args[0].equalsIgnoreCase("kick")) {
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
String message = getLastParam(args, 2);
|
||||||
|
|
||||||
|
onCommandKick(sender, player, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ban
|
||||||
|
*/
|
||||||
|
if (args.length >= 4 && args[0].equalsIgnoreCase("ban")) {
|
||||||
|
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
long duree;
|
||||||
|
|
||||||
|
try {
|
||||||
|
duree = Math.round((DateUtil.parseDateDiff(args[2], true)-System.currentTimeMillis())/1000D);
|
||||||
|
} catch(Exception e) {
|
||||||
|
// l'exception est généré par Essentials, qui rend le message User Friendly
|
||||||
|
sender.sendMessage(ChatColor.RED+e.getMessage());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String message = getLastParam(args, 3);
|
||||||
|
|
||||||
|
onCommandBan(sender, player, duree, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* unban
|
||||||
|
*/
|
||||||
|
if (args.length >= 3 && args[0].equalsIgnoreCase("unban")) {
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
String message = getLastParam(args, 2);
|
||||||
|
|
||||||
|
onCommandUnban(sender, player, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mute
|
||||||
|
*/
|
||||||
|
if (args.length >= 4 && args[0].equalsIgnoreCase("mute")) {
|
||||||
|
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
long duree;
|
||||||
|
|
||||||
|
try {
|
||||||
|
duree = Math.round((DateUtil.parseDateDiff(args[2], true)-System.currentTimeMillis())/1000D);
|
||||||
|
} catch(Exception e) {
|
||||||
|
// l'exception est généré par Essentials, qui rend le message User Friendly
|
||||||
|
sender.sendMessage(ChatColor.RED+e.getMessage());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String message = getLastParam(args, 3);
|
||||||
|
|
||||||
|
onCommandMute(sender, player, duree, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* unmute
|
||||||
|
*/
|
||||||
|
if (args.length >= 3 && args[0].equalsIgnoreCase("unmute")) {
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
String message = getLastParam(args, 2);
|
||||||
|
|
||||||
|
onCommandUnmute(sender, player, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jail
|
||||||
|
*/
|
||||||
|
if (args.length >= 4 && args[0].equalsIgnoreCase("jail")) {
|
||||||
|
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
long duree;
|
||||||
|
|
||||||
|
try {
|
||||||
|
duree = Math.round((DateUtil.parseDateDiff(args[2], true)-System.currentTimeMillis())/1000D);
|
||||||
|
} catch(Exception e) {
|
||||||
|
// l'exception est généré par Essentials, qui rend le message User Friendly
|
||||||
|
sender.sendMessage(ChatColor.RED+e.getMessage());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String message = getLastParam(args, 3);
|
||||||
|
|
||||||
|
onCommandJail(sender, player, duree, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* unjail
|
||||||
|
*/
|
||||||
|
if (args.length >= 3 && args[0].equalsIgnoreCase("unmute")) {
|
||||||
|
String player = args[1];
|
||||||
|
|
||||||
|
String message = getLastParam(args, 2);
|
||||||
|
|
||||||
|
onCommandUnjail(sender, player, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void onCommandReport(CommandSender sender, String player, String message) {
|
||||||
|
|
||||||
|
player = getRealNameIfWasAlreadyOnline(player);
|
||||||
|
|
||||||
|
if (player == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.REPORT, player, message);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
broadcastModoMessage(sender.getName(), " viens de report ", player, " pour ", message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void onCommandJails(Player sender) {
|
||||||
|
|
||||||
|
Vector v = ConfigManager.getInstance().defaultConfig.modo_jailsPosition_coords;
|
||||||
|
World w = plugin.getServer().getWorld(ConfigManager.getInstance().defaultConfig.modo_jailsPosition_world);
|
||||||
|
|
||||||
|
sender.teleport(new Location(w, v.getX(), v.getY(), v.getZ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void onCommandAmende(CommandSender sender, String player, long somme, String message) {
|
||||||
|
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.HIGH)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
player = getRealNameIfWasAlreadyOnline(player);
|
||||||
|
|
||||||
|
if (player == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
User u = EssentialsInterface.getPlugin().getOfflineUser(player);
|
||||||
|
|
||||||
|
if (u.isAuthorized("pandacraft.modo") && !hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.HIGH)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué est protégé contre les sanctions");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (somme < 0) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"La somme indiquée doit être positive");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double actualMoney = u.getMoney().doubleValue();
|
||||||
|
long moneyToRemove = somme;
|
||||||
|
|
||||||
|
if (somme > actualMoney) {
|
||||||
|
moneyToRemove = (long) actualMoney;
|
||||||
|
double newMoney = actualMoney - moneyToRemove;
|
||||||
|
u.setMoney(new BigDecimal(newMoney));
|
||||||
|
|
||||||
|
message = message + " (manque "+(somme - moneyToRemove)+" P à retirer)";
|
||||||
|
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.MONEY, player, message);
|
||||||
|
historyEl.setValue(moneyToRemove);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
double newMoney = actualMoney - moneyToRemove;
|
||||||
|
u.setMoney(new BigDecimal(newMoney));
|
||||||
|
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.MONEY, player, message);
|
||||||
|
historyEl.setValue(somme);
|
||||||
|
historyEl.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
broadcastModoMessage(sender.getName(), " viens d'appliquer une amende de ", String.valueOf(moneyToRemove), "P à ", player, " pour ", message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void onCommandKick(CommandSender sender, String player, String message) {
|
||||||
|
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.LOW)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Player p = plugin.getServer().getPlayer(player);
|
||||||
|
|
||||||
|
if (p == null || !p.isOnline() || (sender instanceof Player && !((Player)sender).canSee(p))) { // la dernière condition protège les joueurs vanish
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'est pas en ligne");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p.hasPermission("pandacraft.modo") && !hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.HIGH)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué est protégé contre les sanctions");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
player = p.getName();
|
||||||
|
|
||||||
|
|
||||||
|
p.kickPlayer(message);
|
||||||
|
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.KICK, player, message);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
broadcastModoMessage(sender.getName(), " viens d'expulser ", player, " pour ", message);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param duration en seconde
|
||||||
|
*/
|
||||||
|
private void onCommandBan(CommandSender sender, String player, long duration, String message) {
|
||||||
|
// vérification des droits d'exécution
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.LOW)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// vérification du joueur indiqué
|
||||||
|
player = getRealNameIfWasAlreadyOnline(player);
|
||||||
|
|
||||||
|
if (player == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
User u = EssentialsInterface.getPlugin().getOfflineUser(player);
|
||||||
|
|
||||||
|
// on vérifie si le joueur est protégé contre les sanctions
|
||||||
|
if (u.isAuthorized("pandacraft.modo") && !hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.HIGH)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué est protégé contre les sanctions");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// on vérifie si le joueur est déjà banni
|
||||||
|
if (plugin.getServer().getBanList(Type.NAME).isBanned(player)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué est déjà banni");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// vérification des droits sur la durée
|
||||||
|
duration = correctPermittedDuration(sender, duration);
|
||||||
|
|
||||||
|
Date expire = new Date(System.currentTimeMillis()+(duration*1000));
|
||||||
|
|
||||||
|
// application de la sanction
|
||||||
|
plugin.getServer().getBanList(Type.NAME).addBan(player, message, expire, sender.getName());
|
||||||
|
|
||||||
|
// enregistrement de l'action
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.BAN, player, message);
|
||||||
|
historyEl.setValue(duration);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
// diffusion
|
||||||
|
broadcastModoMessage(sender.getName(), " viens de bannir ", player, " pendant ", TimeUtil.durationToString(duration*1000), " pour ", message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void onCommandUnban(CommandSender sender, String player, String message) {
|
||||||
|
// vérification des droits d'exécution
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.LOW)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* on a pas besoin de vérifier si le joueur a déjà existé, car c'est
|
||||||
|
* forcément le cas, si le joueur a déjà été banni
|
||||||
|
*/
|
||||||
|
|
||||||
|
// on vérifie si le joueur est déjà banni
|
||||||
|
if (!plugin.getServer().getBanList(Type.NAME).isBanned(player)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'est pas banni");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// application du retrait de sanction
|
||||||
|
plugin.getServer().getBanList(Type.NAME).pardon(player);
|
||||||
|
|
||||||
|
// enregistrement de l'action
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.UNBAN, player, message);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
// diffusion
|
||||||
|
broadcastModoMessage(sender.getName(), " viens de débannir ", player, " pour ", message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param duration en seconde
|
||||||
|
*/
|
||||||
|
private void onCommandMute(CommandSender sender, String player, long duration, String message) {
|
||||||
|
// vérification des droits d'exécution
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.LOW)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// vérification du joueur indiqué
|
||||||
|
player = getRealNameIfWasAlreadyOnline(player);
|
||||||
|
|
||||||
|
if (player == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
User u = EssentialsInterface.getPlugin().getOfflineUser(player);
|
||||||
|
|
||||||
|
// on vérifie si le joueur est protégé contre les sanctions
|
||||||
|
if (u.isAuthorized("pandacraft.modo") && !hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.HIGH)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué est protégé contre les sanctions");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// on vérifie si le joueur est déjà mute
|
||||||
|
if (u.isMuted()) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué est déjà muet");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// vérification des droits sur la durée
|
||||||
|
duration = correctPermittedDuration(sender, duration);
|
||||||
|
|
||||||
|
Date expire = new Date(System.currentTimeMillis()+(duration*1000));
|
||||||
|
|
||||||
|
// application de la sanction
|
||||||
|
u.setMuted(true);
|
||||||
|
u.setMuteTimeout(expire.getTime());
|
||||||
|
|
||||||
|
// enregistrement de l'action
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.MUTE, player, message);
|
||||||
|
historyEl.setValue(duration);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
// diffusion
|
||||||
|
broadcastModoMessage(sender.getName(), " viens de rendre muet ", player, " pendant ", TimeUtil.durationToString(duration*1000), " pour ", message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void onCommandUnmute(CommandSender sender, String player, String message) {
|
||||||
|
// vérification des droits d'exécution
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.LOW)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// vérification du joueur indiqué
|
||||||
|
player = getRealNameIfWasAlreadyOnline(player);
|
||||||
|
|
||||||
|
if (player == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
User u = EssentialsInterface.getPlugin().getOfflineUser(player);
|
||||||
|
|
||||||
|
// on vérifie si le joueur est déjà mute
|
||||||
|
if (!u.isMuted()) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'est pas mute");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// application du retrait de sanction
|
||||||
|
u.setMuted(false);
|
||||||
|
u.setMuteTimeout(0);
|
||||||
|
|
||||||
|
// enregistrement de l'action
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.UNMUTE, player, message);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
// diffusion
|
||||||
|
broadcastModoMessage(sender.getName(), " viens de rendre la parole à ", player, " pour ", message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param duration en seconde
|
||||||
|
*/
|
||||||
|
private void onCommandJail(CommandSender sender, String player, long duration, String message) {
|
||||||
|
// vérification des droits d'exécution
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.LOW)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// vérification du joueur indiqué
|
||||||
|
player = getRealNameIfWasAlreadyOnline(player);
|
||||||
|
|
||||||
|
if (player == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
User u = EssentialsInterface.getPlugin().getOfflineUser(player);
|
||||||
|
|
||||||
|
// on vérifie si le joueur est protégé contre les sanctions
|
||||||
|
if (u.isAuthorized("pandacraft.modo") && !hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.HIGH)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué est protégé contre les sanctions");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// vérification des droits sur la durée
|
||||||
|
duration = correctPermittedDuration(sender, duration);
|
||||||
|
|
||||||
|
// application de la sanction
|
||||||
|
boolean ok = plugin.jailsManager.addJailedPlayer(u, message, duration);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué ne peut pas être emprisonné");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// enregistrement de l'action
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.JAIL, player, message);
|
||||||
|
historyEl.setValue(duration);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
// diffusion
|
||||||
|
broadcastModoMessage(sender.getName(), " viens d'emprisonner ", player, " pendant ", TimeUtil.durationToString(duration*1000), " pour ", message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void onCommandUnjail(CommandSender sender, String player, String message) {
|
||||||
|
// vérification des droits d'exécution
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.LOW)) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour exécuter cette sous-commande");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// vérification du joueur indiqué
|
||||||
|
player = getRealNameIfWasAlreadyOnline(player);
|
||||||
|
|
||||||
|
if (player == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
User u = EssentialsInterface.getPlugin().getOfflineUser(player);
|
||||||
|
|
||||||
|
// application du retrait de sanction
|
||||||
|
boolean ok = plugin.jailsManager.removeJailedPlayer(u);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
sender.sendMessage(ChatColor.RED+"Le joueur indiqué ne peut pas être libéré (il n'est peut-être pas en prison)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// enregistrement de l'action
|
||||||
|
ModoHistoryElement historyEl = new ModoHistoryElement(sender.getName(), ActionType.UNJAIL, player, message);
|
||||||
|
historyEl.save();
|
||||||
|
|
||||||
|
// diffusion
|
||||||
|
broadcastModoMessage(sender.getName(), " viens de libérer ", player, " pour ", message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void showHelp(CommandSender sender, int page) {
|
||||||
|
ArrayList<String> s = new ArrayList<String>();
|
||||||
|
|
||||||
|
s.add(ChatColor.GOLD+"-------- Assistant de modération --------");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (page == 1) {
|
||||||
|
s.add(ChatColor.GOLD+"- Commandes sans sanction :");
|
||||||
|
s.add(ChatColor.GRAY+"/modo report <Pseudo> <Raison>"+ChatColor.WHITE+" faire un rapport d'un joueur, sans appliquer de sanction");
|
||||||
|
s.add(ChatColor.GRAY+"/modo jails"+ChatColor.WHITE+" aller à la prison");
|
||||||
|
s.add(ChatColor.GOLD+"- Aide sur les sanctions :");
|
||||||
|
s.add(ChatColor.GRAY+"/modo 2"+ChatColor.WHITE+" application d'une sanction");
|
||||||
|
s.add(ChatColor.GRAY+"/modo 3"+ChatColor.WHITE+" retrait d'une sanction");
|
||||||
|
s.add(ChatColor.GRAY+"/modo 4"+ChatColor.WHITE+" règles sur les sanctions");
|
||||||
|
}
|
||||||
|
else if (page == 2) {
|
||||||
|
s.add(ChatColor.GOLD+"- Appliquer une sanction :");
|
||||||
|
s.add(ChatColor.GRAY+"/modo jail <Pseudo> <Durée> <Raison>"+ChatColor.WHITE+" emprisonner un <Joueur> pendant une <Durée> en précisant la <Raison>");
|
||||||
|
s.add(ChatColor.GRAY+"/modo mute <Pseudo> <Durée> <Raison>"+ChatColor.WHITE+" rendre muet un <Joueur> pendant une <Durée> en précisant la <Raison>");
|
||||||
|
s.add(ChatColor.GRAY+"/modo ban <Pseudo> <Durée> <Raison>"+ChatColor.WHITE+" bannir un <Joueur> pendant une <Durée> en précisant la <Raison>");
|
||||||
|
s.add(ChatColor.GRAY+"/modo kick <Pseudo> <Raison>"+ChatColor.WHITE+" expulse un <Joueur> en précisant la <Raison>");
|
||||||
|
s.add(ChatColor.GRAY+"/modo amende <Pseudo> <Raison>"+ChatColor.WHITE+" expulse un <Joueur> en précisant la <Raison>");
|
||||||
|
}
|
||||||
|
else if (page == 3) {
|
||||||
|
s.add(ChatColor.GOLD+"- Retirer une sanction :");
|
||||||
|
s.add(ChatColor.GRAY+"/modo unjail <Pseudo> <Raison>"+ChatColor.WHITE+" sortir de prison un <Joueur> en précisant la <Raison>");
|
||||||
|
s.add(ChatColor.GRAY+"/modo unmute <Pseudo> <Raison>"+ChatColor.WHITE+" rendre la parole à un <Joueur> en précisant la <Raison>");
|
||||||
|
s.add(ChatColor.GRAY+"/modo unban <Pseudo> <Raison>"+ChatColor.WHITE+" retirer le banissement d'un <Joueur> en précisant la <Raison>");
|
||||||
|
}
|
||||||
|
else if (page == 4) {
|
||||||
|
s.add(ChatColor.GOLD+"- Règles sur les sanctions :");
|
||||||
|
s.add(ChatColor.WHITE+"- Certains membres du staff on plus ou moins de droits concernant les sanctions (durée de jail, ban et mute)");
|
||||||
|
s.add(ChatColor.WHITE+"- Toutes les sanctions doivent être justifiées. Vous êtes obligé d'indiquer la raison de la sanction dans les commandes");
|
||||||
|
s.add(ChatColor.WHITE+"- Toutes les actions dans la commande "+ChatColor.GRAY+"/modo"+ChatColor.WHITE+" sont enregistrées");
|
||||||
|
s.add(ChatColor.WHITE+"- Rendez vous sur MineAdmin pour les autres règles de Modération");
|
||||||
|
s.add(ChatColor.WHITE+"- Rendez vous sur le site web de Pandacraft pour le règlement du serveur et les sanctions à appliquer");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
s.add(ChatColor.GOLD+"La page "+page+" n'existe pas");
|
||||||
|
}
|
||||||
|
|
||||||
|
s.add(ChatColor.GOLD+"------------------------------------------");
|
||||||
|
|
||||||
|
sender.sendMessage(s.toArray(new String[s.size()]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private long correctPermittedDuration(CommandSender sender, long duration) {
|
||||||
|
|
||||||
|
if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.NORMAL) && duration > ConfigManager.getInstance().defaultConfig.modo_durationLimit_low) {
|
||||||
|
duration = ConfigManager.getInstance().defaultConfig.modo_durationLimit_low;
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour sanctionner sur une durée aussi longue");
|
||||||
|
sender.sendMessage(ChatColor.RED+"La durée a été réduite à" + TimeUtil.durationToString(duration*1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (!hasCommandSenderPermissionLevel(sender, ModoPermissionLevel.HIGH) && duration > ConfigManager.getInstance().defaultConfig.modo_durationLimit_normal) {
|
||||||
|
duration = ConfigManager.getInstance().defaultConfig.modo_durationLimit_normal;
|
||||||
|
sender.sendMessage(ChatColor.RED+"Vous n'avez pas le niveau de permission suffisant pour sanctionner sur une durée aussi longue");
|
||||||
|
sender.sendMessage(ChatColor.RED+"La durée a été réduite à" + TimeUtil.durationToString(duration*1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
return duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retourne le nom du joueur avec la casse corrigée, ou null si le joueur n'est pas dans les données Essentials
|
||||||
|
* @param player
|
||||||
|
* @return le pseudo corrigé ou null
|
||||||
|
*/
|
||||||
|
protected String getRealNameIfWasAlreadyOnline(String player) {
|
||||||
|
|
||||||
|
User u = EssentialsInterface.getPlugin().getOfflineUser(player);
|
||||||
|
|
||||||
|
if (u == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.getName(); // correction du nom (majuscule) si Essentials effectue une correction
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Diffuse un message destiné au staff ayant les droits de modération.<br/>
|
||||||
|
* Ce message est préfixé de [Modération].<br/>
|
||||||
|
* Les 1er, 3ème, 5ème, ... paramètres sont colorés en gris, et 2ème, 4ème, 6ème, ... paramètres
|
||||||
|
* sont colorés en blanc. Ces paramètres sont ensuite concaténé pour former le message final.
|
||||||
|
* @param messages
|
||||||
|
*/
|
||||||
|
protected void broadcastModoMessage(String ... messages) {
|
||||||
|
boolean colorToggle = true;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (String message : messages) {
|
||||||
|
sb.append(colorToggle?ChatColor.GRAY:ChatColor.RESET);
|
||||||
|
|
||||||
|
sb.append(message);
|
||||||
|
|
||||||
|
colorToggle = !colorToggle;
|
||||||
|
}
|
||||||
|
plugin.broadcast("["+ChatColor.GREEN+"Modération"+ChatColor.RESET+"] "+sb.toString(), false, true, "pandacraft.modo");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected ModoPermissionLevel getPermissionLevel(OnlinePlayer op) {
|
||||||
|
if (op == null) return null;
|
||||||
|
|
||||||
|
ModoPermissionLevel highestLevel = null;
|
||||||
|
|
||||||
|
for (ModoPermissionLevel level : ModoPermissionLevel.values()) {
|
||||||
|
if (op.hasPermission("pandacrat.modo."+level.name().toLowerCase()))
|
||||||
|
if (highestLevel == null || level.level >= highestLevel.level)
|
||||||
|
highestLevel = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
return highestLevel;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected boolean hasCommandSenderPermissionLevel(CommandSender sender, ModoPermissionLevel level) {
|
||||||
|
if (sender == null || level == null) return false;
|
||||||
|
if (!(sender instanceof Player)) return true;
|
||||||
|
OnlinePlayer op = OnlinePlayerManager.get((Player)sender);
|
||||||
|
ModoPermissionLevel levelPlayer = getPermissionLevel(op);
|
||||||
|
return (levelPlayer != null && (levelPlayer.level >= level.level));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public enum ModoPermissionLevel{
|
||||||
|
HIGH(2), NORMAL(1), LOW(0);
|
||||||
|
|
||||||
|
private ModoPermissionLevel(int l) {
|
||||||
|
level = l;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int level;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,9 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
|
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
|
||||||
|
|
||||||
@ -46,11 +48,11 @@ public class DefaultConfig {
|
|||||||
* Configuration analyse du chat et des messages privés
|
* Configuration analyse du chat et des messages privés
|
||||||
* (antispam, insultes, publicité)
|
* (antispam, insultes, publicité)
|
||||||
*/
|
*/
|
||||||
/** En milisecondes */
|
/** En millisecondes */
|
||||||
public final long chatAnalysis_timeBeforeResendSameMessage;
|
public final long chatAnalysis_timeBeforeResendSameMessage;
|
||||||
/** En milisecondes */
|
/** En millisecondes */
|
||||||
public final long chatAnalysis_timeBeforeResendSameCommand;
|
public final long chatAnalysis_timeBeforeResendSameCommand;
|
||||||
/** En milisecondes */
|
/** En millisecondes */
|
||||||
public final long chatAnalysis_timePerCaracterForNewMessage;
|
public final long chatAnalysis_timePerCaracterForNewMessage;
|
||||||
public final int chatAnalysis_maxViolationLevel;
|
public final int chatAnalysis_maxViolationLevel;
|
||||||
public final int chatAnalysis_nbSecondForOneVLDown;
|
public final int chatAnalysis_nbSecondForOneVLDown;
|
||||||
@ -95,8 +97,19 @@ public class DefaultConfig {
|
|||||||
*/
|
*/
|
||||||
public final String networkAPI_pass;
|
public final String networkAPI_pass;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Modération
|
||||||
|
*/
|
||||||
|
/** En seconde */
|
||||||
|
public final long modo_durationLimit_low;
|
||||||
|
/** En seconde */
|
||||||
|
public final long modo_durationLimit_normal;
|
||||||
|
public final String modo_jailsPosition_world;
|
||||||
|
public final Vector modo_jailsPosition_coords;
|
||||||
|
|
||||||
|
public final BlockFace modo_jailWalls_direction;
|
||||||
|
public final int modo_jailWalls_width;
|
||||||
|
public final int modo_jailWalls_height;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -139,11 +152,11 @@ public class DefaultConfig {
|
|||||||
autoMessages_defaultInterval = configFile.getInt("autoMessages.defaultInterval");
|
autoMessages_defaultInterval = configFile.getInt("autoMessages.defaultInterval");
|
||||||
|
|
||||||
|
|
||||||
serverMessages_defaultColor = getTransletedColorCode("serverMessages.defaultColor");
|
serverMessages_defaultColor = getTranslatedColorCode("serverMessages.defaultColor");
|
||||||
serverMessages_prefix = getTransletedColorCode("serverMessages.prefix");
|
serverMessages_prefix = getTranslatedColorCode("serverMessages.prefix");
|
||||||
|
|
||||||
|
|
||||||
pingMOTD = getTransletedColorCode("pingMOTD").replace("\\n", "\n");
|
pingMOTD = getTranslatedColorCode("pingMOTD").replace("\\n", "\n");
|
||||||
|
|
||||||
|
|
||||||
entitySpam_worlds = getSplittedString("entitySpam.worlds", ";");
|
entitySpam_worlds = getSplittedString("entitySpam.worlds", ";");
|
||||||
@ -153,6 +166,17 @@ public class DefaultConfig {
|
|||||||
networkAPI_pass = configFile.getString("networkAPI.pass");
|
networkAPI_pass = configFile.getString("networkAPI.pass");
|
||||||
|
|
||||||
|
|
||||||
|
modo_durationLimit_low = configFile.getLong("modo.durationLimit.low");
|
||||||
|
modo_durationLimit_normal = configFile.getLong("modo.durationLimit.normal");
|
||||||
|
modo_jailsPosition_world = configFile.getString("modo.jailsPosition.world");
|
||||||
|
modo_jailsPosition_coords = new Vector(
|
||||||
|
configFile.getDouble("modo.jailsPosition.x"),
|
||||||
|
configFile.getDouble("modo.jailsPosition.y"),
|
||||||
|
configFile.getDouble("modo.jailsPosition.z"));
|
||||||
|
modo_jailWalls_direction = BlockFace.valueOf(configFile.getString("modo.jailWalls.direction"));
|
||||||
|
modo_jailWalls_width = configFile.getInt("modo.jailWalls.width");
|
||||||
|
modo_jailWalls_height = configFile.getInt("modo.jailWalls.height");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -168,7 +192,7 @@ public class DefaultConfig {
|
|||||||
return Collections.unmodifiableList(Arrays.asList(value.split(split)));
|
return Collections.unmodifiableList(Arrays.asList(value.split(split)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getTransletedColorCode(String path) {
|
private String getTranslatedColorCode(String path) {
|
||||||
return ChatColor.translateAlternateColorCodes('&', configFile.getString(path, ""));
|
return ChatColor.translateAlternateColorCodes('&', configFile.getString(path, ""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,26 +6,26 @@ public class ModoHistoryElement extends SQLElement {
|
|||||||
private ActionType actionType;
|
private ActionType actionType;
|
||||||
private long time;
|
private long time;
|
||||||
private String playerName;
|
private String playerName;
|
||||||
private Long duration = null;
|
private Long value = null;
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
|
|
||||||
public ModoHistoryElement(String modo, ActionType type, long time, String player, String message) {
|
public ModoHistoryElement(String modo, ActionType type, String player, String message) {
|
||||||
super("pandacraft_modo_history");
|
super("pandacraft_modo_history");
|
||||||
setModoName(modo);
|
setModoName(modo);
|
||||||
setActionType(type);
|
setActionType(type);
|
||||||
setTime(time);
|
|
||||||
setPlayerName(player);
|
setPlayerName(player);
|
||||||
setMessage(message);
|
setMessage(message);
|
||||||
|
time = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
ModoHistoryElement(int id, String modo, ActionType type, long time, String player, String message) {
|
ModoHistoryElement(int id, String modo, ActionType type, String player, String message) {
|
||||||
super("pandacraft_modo_history", id);
|
super("pandacraft_modo_history", id);
|
||||||
setModoName(modo);
|
setModoName(modo);
|
||||||
setActionType(type);
|
setActionType(type);
|
||||||
setTime(time);
|
|
||||||
setPlayerName(player);
|
setPlayerName(player);
|
||||||
setMessage(message);
|
setMessage(message);
|
||||||
|
time = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -35,7 +35,7 @@ public class ModoHistoryElement extends SQLElement {
|
|||||||
actionType.name(),
|
actionType.name(),
|
||||||
String.valueOf(time),
|
String.valueOf(time),
|
||||||
playerName,
|
playerName,
|
||||||
(duration == null)?null:duration.toString(),
|
(value == null)?null:value.toString(),
|
||||||
message
|
message
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -75,14 +75,21 @@ public class ModoHistoryElement extends SQLElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
public long getDuration() {
|
* Retourne la durée de la sanction appliquée (en secondes), ou la somme d'argent retirée du compte
|
||||||
return duration;
|
* @return
|
||||||
|
*/
|
||||||
|
public long getValue() {
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDuration(Long duration) {
|
/**
|
||||||
if (duration != null && duration.longValue() < 0) duration = null;
|
* Value correspond soit à la durée de la sanction appliquée (en secondes), soit à la valeur de l'amende appliquée
|
||||||
this.duration = duration;
|
* @param value
|
||||||
|
*/
|
||||||
|
public void setValue(Long value) {
|
||||||
|
if (value != null && value.longValue() < 0) value = null;
|
||||||
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -127,7 +134,7 @@ public class ModoHistoryElement extends SQLElement {
|
|||||||
|
|
||||||
|
|
||||||
public enum ActionType{
|
public enum ActionType{
|
||||||
TEMPBAN, MUTE, JAIL, REPORT, KICK, MONEY
|
BAN, UNBAN, MUTE, UNMUTE, JAIL, UNJAIL, REPORT, KICK, MONEY
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,10 @@ public class ModoHistoryTable extends SQLTable<ModoHistoryElement> {
|
|||||||
protected String createTableParameters() {
|
protected String createTableParameters() {
|
||||||
return "id INT AUTO_INCREMENT PRIMARY KEY,"
|
return "id INT AUTO_INCREMENT PRIMARY KEY,"
|
||||||
+ "modoName VARCHAR(16) NOT NULL,"
|
+ "modoName VARCHAR(16) NOT NULL,"
|
||||||
+ "actionType ENUM('TEMPBAN', 'MUTE', 'JAIL', 'REPORT', 'KICK', 'MONEY') NOT NULL,"
|
+ "actionType ENUM('BAN', 'UNBAN', 'MUTE', 'UNMUTE', 'JAIL', 'UNJAIL', 'REPORT', 'KICK', 'MONEY') NOT NULL,"
|
||||||
+ "time BIGINT NOT NULL,"
|
+ "time BIGINT NOT NULL,"
|
||||||
+ "playerName VARCHAR(16) NOT NULL,"
|
+ "playerName VARCHAR(16) NOT NULL,"
|
||||||
+ "duration BIGINT NULL,"
|
+ "value BIGINT NULL,"
|
||||||
+ "message VARCHAR(512) NOT NULL";
|
+ "message VARCHAR(512) NOT NULL";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,10 +30,10 @@ public class ModoHistoryTable extends SQLTable<ModoHistoryElement> {
|
|||||||
sqlResult.getInt("id"),
|
sqlResult.getInt("id"),
|
||||||
sqlResult.getString("modoName"),
|
sqlResult.getString("modoName"),
|
||||||
ActionType.valueOf(sqlResult.getString("actionType")),
|
ActionType.valueOf(sqlResult.getString("actionType")),
|
||||||
sqlResult.getLong("time"),
|
|
||||||
sqlResult.getString("playerName"),
|
sqlResult.getString("playerName"),
|
||||||
sqlResult.getString("message"));
|
sqlResult.getString("message"));
|
||||||
el.setDuration(sqlResult.getLong("duration"));
|
el.setValue(sqlResult.getLong("value"));
|
||||||
|
el.setTime(sqlResult.getLong("time"));
|
||||||
return el;
|
return el;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ public abstract class SQLElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
st.executeUpdate();
|
st.executeUpdate();
|
||||||
|
st.close();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // ajouter dans la base
|
{ // ajouter dans la base
|
||||||
@ -84,6 +85,7 @@ public abstract class SQLElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
id = st.executeUpdate();
|
id = st.executeUpdate();
|
||||||
|
st.close();
|
||||||
saved = true;
|
saved = true;
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
@ -0,0 +1,309 @@
|
|||||||
|
package net.mc_pandacraft.java.plugin.pandacraftutils.modules;
|
||||||
|
|
||||||
|
import java.sql.Date;
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.WordUtils;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
|
||||||
|
import com.earth2me.essentials.User;
|
||||||
|
import com.earth2me.essentials.UserMap;
|
||||||
|
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
|
||||||
|
import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface;
|
||||||
|
|
||||||
|
public class JailsManager {
|
||||||
|
private PandacraftUtils plugin = PandacraftUtils.getInstance();
|
||||||
|
|
||||||
|
private List<String> jails;
|
||||||
|
private Map<String, JailedPlayer> jailedPlayers;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public JailsManager() {
|
||||||
|
|
||||||
|
// initialisation retardée (besoin des données d'un autre plugin)
|
||||||
|
plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
updateDataFromEssentials();
|
||||||
|
}
|
||||||
|
}, 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* En principe, cette méthone ne doit-être appelée qu'une seule fois, après le chargement
|
||||||
|
* du plugin Essentials
|
||||||
|
*/
|
||||||
|
private void updateDataFromEssentials() {
|
||||||
|
plugin.getLogger().info("[JailsManager] chargement des données de la prison depuis Essentials");
|
||||||
|
try {
|
||||||
|
jails = new ArrayList<String>(EssentialsInterface.getPlugin().getJails().getList());
|
||||||
|
|
||||||
|
// retirer les cellules qui n'ont pas la forme "cX" avec X un nombre
|
||||||
|
jails.removeIf(new Predicate<String>() {
|
||||||
|
@Override public boolean test(String t) {
|
||||||
|
return t == null || !t.matches("c[0-9]+");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// on trie les cellules, pour qu'elle se remplissent toujours dans le même ordre
|
||||||
|
Collections.sort(jails, new Comparator<String>() {
|
||||||
|
@Override public int compare(String o1, String o2) {
|
||||||
|
try {
|
||||||
|
int i1 = Integer.parseInt(o1.substring(1));
|
||||||
|
int i2 = Integer.parseInt(o2.substring(1));
|
||||||
|
if (i1 < i2) return -1;
|
||||||
|
if (i1 > i2) return 1;
|
||||||
|
return 0;
|
||||||
|
} catch (NumberFormatException e) { return 0; }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
UserMap um = EssentialsInterface.getPlugin().getUserMap();
|
||||||
|
|
||||||
|
Set<String> users = um.getAllUniqueUsers();
|
||||||
|
|
||||||
|
jailedPlayers = new HashMap<String, JailedPlayer>();
|
||||||
|
|
||||||
|
// on parcours les joueurs et on ajoute ceux qui sont emprisonnés, dans les données
|
||||||
|
for (String user : users) {
|
||||||
|
User u = um.getUser(user);
|
||||||
|
if (u.isJailed() && (u.getJailTimeout() == 0 || u.getJailTimeout() >= System.currentTimeMillis())) {
|
||||||
|
String jail = u.getJail();
|
||||||
|
if (jails.contains(jail)) {
|
||||||
|
jailedPlayers.put(jail, new JailedPlayer(user, jail, null, u.getJailTimeout()));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateJailsSign();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
plugin.getLogger().info("[JailsManager] chargement terminé");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emprisonne le joueur passé en paramètre. Les données Essentials sont mise
|
||||||
|
* à jour à l'appel de cette méthode.
|
||||||
|
* @param duree en seconde
|
||||||
|
*/
|
||||||
|
public boolean addJailedPlayer(User player, String raison, long duree) {
|
||||||
|
if (player.isJailed() && (player.getJailTimeout() == 0 || player.getJailTimeout() >= System.currentTimeMillis()))
|
||||||
|
return false; // le joueur est déjà en prison
|
||||||
|
|
||||||
|
String jail = getFirstAvailableJail();
|
||||||
|
|
||||||
|
if (jail == null)
|
||||||
|
return false; // aucune cellule de libre
|
||||||
|
|
||||||
|
player.setJailed(true);
|
||||||
|
player.setJail(jail);
|
||||||
|
player.setJailTimeout(System.currentTimeMillis()+duree*1000);
|
||||||
|
|
||||||
|
jailedPlayers.put(jail, new JailedPlayer(player.getName(), jail, raison, System.currentTimeMillis()+duree*1000));
|
||||||
|
|
||||||
|
|
||||||
|
updateJailsSign();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public boolean removeJailedPlayer(User player) {
|
||||||
|
if (!player.isJailed() || player.getJailTimeout() == 0 || player.getJailTimeout() < System.currentTimeMillis())
|
||||||
|
return false; // le joueur n'est pas en prison
|
||||||
|
|
||||||
|
String jail = player.getJail();
|
||||||
|
|
||||||
|
JailedPlayer jp = jailedPlayers.get(jail);
|
||||||
|
|
||||||
|
if (jp == null || !jp.playerName.equalsIgnoreCase(player.getName()))
|
||||||
|
return false; // incohérence dans les données
|
||||||
|
|
||||||
|
player.setJailed(false);
|
||||||
|
|
||||||
|
jailedPlayers.remove(jail);
|
||||||
|
|
||||||
|
updateJailsSign();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private String getFirstAvailableJail() {
|
||||||
|
|
||||||
|
// supprime d'abord les joueurs dont leur emprisonnement est expiré
|
||||||
|
for (String jail : jailedPlayers.keySet().toArray(new String[jailedPlayers.size()])) {
|
||||||
|
if (jailedPlayers.get(jail).timeout < System.currentTimeMillis())
|
||||||
|
jailedPlayers.remove(jail);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (String j : jails) {
|
||||||
|
if (jailedPlayers.containsKey(j))
|
||||||
|
continue;
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void updateJailsSign() {
|
||||||
|
/*
|
||||||
|
* Disposition des panneaux :
|
||||||
|
*
|
||||||
|
* <Pseudo> Raison :
|
||||||
|
* libéré(e) le <Raison>
|
||||||
|
* <Date>
|
||||||
|
* <Heure>
|
||||||
|
*
|
||||||
|
* La raison peut prendre plusieurs panneaux
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
int wallWidth = ConfigManager.getInstance().defaultConfig.modo_jailWalls_width;
|
||||||
|
int wallHeight = ConfigManager.getInstance().defaultConfig.modo_jailWalls_height;
|
||||||
|
BlockFace wallDir = ConfigManager.getInstance().defaultConfig.modo_jailWalls_direction;
|
||||||
|
|
||||||
|
|
||||||
|
for (String jail : jails) {
|
||||||
|
|
||||||
|
Location jailLoc = EssentialsInterface.getPlugin().getJails().getJail(jail);
|
||||||
|
|
||||||
|
Block topLeftWallBloc = jailLoc.getBlock()
|
||||||
|
.getRelative(wallDir)
|
||||||
|
.getRelative(BlockFace.UP, wallHeight-1)
|
||||||
|
.getRelative(wallDir.getModZ(), 0, -wallDir.getModX());
|
||||||
|
|
||||||
|
// liste de tout les panneaux de la cellulre
|
||||||
|
Block[] blocks = new Block[wallWidth*wallHeight];
|
||||||
|
int n = 0;
|
||||||
|
for (int i=0; i<wallHeight; i++)
|
||||||
|
for (int j=0; j<wallWidth; j++) {
|
||||||
|
Block b = topLeftWallBloc;
|
||||||
|
if (i != 0)
|
||||||
|
b = b.getRelative(BlockFace.DOWN, i);
|
||||||
|
if (j != 0)
|
||||||
|
b = b.getRelative(-wallDir.getModZ(), 0, wallDir.getModX());
|
||||||
|
|
||||||
|
blocks[n] = b;
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// joueur emprisonné (si il existe)
|
||||||
|
JailedPlayer jp = jailedPlayers.get(jail);
|
||||||
|
if (jp == null || jp.timeout < System.currentTimeMillis()) {
|
||||||
|
// pas de joueur emprisonné
|
||||||
|
|
||||||
|
for (Block b : blocks)
|
||||||
|
b.setType(Material.AIR);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String player = jp.playerName;
|
||||||
|
player = (player.length() > 15) ? player.substring(0, 15) : player;
|
||||||
|
|
||||||
|
String raison = jp.reason;
|
||||||
|
raison = WordUtils.wrap(raison, 15, "\n", true);
|
||||||
|
|
||||||
|
Date d = new Date(jp.timeout);
|
||||||
|
DateFormat date = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.FRANCE);
|
||||||
|
DateFormat hour = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.FRANCE);
|
||||||
|
|
||||||
|
String affDate = date.format(d) + " à " + hour.format(d);
|
||||||
|
affDate = WordUtils.wrap(affDate, 15, "\n", true);
|
||||||
|
|
||||||
|
// TODO doooooooo
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class JailedPlayer {
|
||||||
|
public final String playerName;
|
||||||
|
public final String jail;
|
||||||
|
/**
|
||||||
|
* Si cette valeur est nulle, on ne met pas à jour les panneaux
|
||||||
|
*/
|
||||||
|
public final String reason;
|
||||||
|
public final long timeout;
|
||||||
|
|
||||||
|
public JailedPlayer(String n, String j, String r, long t) {
|
||||||
|
playerName = n;
|
||||||
|
jail = j;
|
||||||
|
reason = r;
|
||||||
|
timeout = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user