Gestion dans une classe à part des alias de commandes

This commit is contained in:
Marc Baloup 2015-02-19 00:58:31 -05:00
parent d0ef9a0267
commit 2e94f6c703
8 changed files with 157 additions and 114 deletions

View File

@ -4,7 +4,7 @@
<classpathentry kind="src" path="resources"/> <classpathentry kind="src" path="resources"/>
<classpathentry kind="lib" path="lib/bukkit-1.7.2-R0.3.jar"> <classpathentry kind="lib" path="lib/bukkit-1.7.2-R0.3.jar">
<attributes> <attributes>
<attribute name="javadoc_location" value="http://jd.bukkit.org/beta/apidocs/"/> <attribute name="javadoc_location" value="jar:platform:/resource/PandacraftUtils/lib/bukkit-1.7.2-R0.3-javadoc.jar!/"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="lib" path="lib/craftbukkit-1.7.2-R0.3.jar" sourcepath="lib/craftbukkit-1.7.2-R0.3.src.zip"/> <classpathentry kind="lib" path="lib/craftbukkit-1.7.2-R0.3.jar" sourcepath="lib/craftbukkit-1.7.2-R0.3.src.zip"/>

View File

@ -28,15 +28,23 @@ Les lignes vides seront ignorés (ou ne contenant que des caractères non imprim
___________________ ___________________
## automessages ## automessages
Chaque messages automatiques se trouvent dans un fichier se trouvant dans le sous-dossier. L'ordre est défini selon la numérotation des fichiers. Les fichiers sont nommés selon ce format : Chaque messages automatiques se trouve dans un fichier se trouvant dans le sous-dossier. L'ordre est défini selon la numérotation des fichiers. Les fichiers sont nommés selon ce format :
X.txt X.txt
`X` est un nombre entier positif ou nul. Le nombre ne peut pas avoir de 0 initial (par exemple, `0014` n'est pas valide, préférez plutôt `14`) `X` est un nombre entier positif ou nul. Le nombre ne peut pas avoir de 0 initial (par exemple, `0014` n'est pas valide, préférez plutôt `14`)
La première ligne du fichier représente les noeux de permissions correspondant au message automatique, sachant qu'un joueur doit avoir un moins une de ces permissions pour voir le message. Les permissions sont séparés par des `;`. La première ligne du fichier représente les noeux de permissions correspondant au message automatique, sachant qu'un joueur doit avoir un moins une de ces permissions pour voir le message. Les permissions sont séparés par des `;`. Si le message automatique s'applique à tous les joueurs, on peut utiliser `*`.
Le reste du fichier correspond au message automatique, avec les codes couleurs de la forme `&X`. Le reste du fichier correspond au message automatique, avec les codes couleurs de la forme `&X`.
___________________
## commandalias
Chaque alias se trouve dans un fichier se trouvant dans le sous-dossier.
le nom du fichier importe peu.
La structure d'un fichier se présente comme ce qui suit.
En première ligne, on a la commande d'origine (celle tapée par le joueur) avec le `/` devant.
La deuxième ligne est la commande de remplacement, toujours avec le `/` devant.
La troisième ligne correspond aux permissions associés à cet alias, séparé par des `;`. Le joueur doit avoir au moins une de ces permissions pour que l'alias s'applique. Si l'alias s'applique à tous les joueurs, on peut utiliser `*`.

Binary file not shown.

View File

@ -0,0 +1,56 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.config;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.elements.CommandAliasConfigEntry;
public class CommandAliasConfig extends AbstractConfig {
private List<CommandAliasConfigEntry> config = new ArrayList<CommandAliasConfigEntry>();
public CommandAliasConfig() throws IOException {
super("commandalias", FileType.DIR);
List<File> files = getFileList();
for (File f : files) {
String name = f.getName();
try {
List<String> lines = getFileLines(false, false, false, f);
if (lines.size() != 3) throw new Exception("Le fichier "+name+" n'est pas du bon format. Doit avoir 3 lignes");
if (!lines.get(0).startsWith("/") || !lines.get(1).startsWith("/"))
throw new Exception("Le fichier "+name+" n'est pas du bon format. La première et la deuxième ligne doit commencer par un slash.");
config.add(new CommandAliasConfigEntry(lines.get(0), lines.get(1), lines.get(2)));
} catch (Exception e) {
warning("fichier '"+name+"' invalide");
e.printStackTrace();
}
}
}
public List<CommandAliasConfigEntry> getCommandAlias() {
return Collections.unmodifiableList(config);
}
}

View File

@ -2,6 +2,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.config;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -40,6 +41,34 @@ public class ConfigManager {
/**
* Découpe une chaine de caractère contenant une série de noeuds
* de permissions séparés par des point-virgules et la retourne sous forme d'une liste.
* @param perms la chaine de permissions à traiter
* @return <code>null</code> si le paramètre est nulle ou si <code>perms.equals("*")</code>, ou alors la chaine splittée.
*/
public static List<String> splitPermissionsString(String perms) {
if (perms == null || perms.equals("*"))
return null;
else
return Arrays.asList(perms.split(";"));
}
@ -53,6 +82,7 @@ public class ConfigManager {
public final WorldBorderConfig worldBorderConfig; public final WorldBorderConfig worldBorderConfig;
public final ChatBadWordsConfig chatBadWordsConfig; public final ChatBadWordsConfig chatBadWordsConfig;
public final AutoMessagesConfig autoMessagesConfig; public final AutoMessagesConfig autoMessagesConfig;
public final CommandAliasConfig commandAliasConfig;
@ -69,20 +99,16 @@ public class ConfigManager {
worldBorderConfig = new WorldBorderConfig(); worldBorderConfig = new WorldBorderConfig();
chatBadWordsConfig = new ChatBadWordsConfig(); chatBadWordsConfig = new ChatBadWordsConfig();
autoMessagesConfig = new AutoMessagesConfig(); autoMessagesConfig = new AutoMessagesConfig();
commandAliasConfig = new CommandAliasConfig();
// dossier qui doit contenir les alias de commandes
File commandAliasDir = new File(configDir, "commandalias");
commandAliasDir.mkdir();
// dossier qui doit contenir les séries de commandes // dossier qui doit contenir les séries de commandes
File multiCommandsDir = new File(configDir, "multicommands"); File multiCommandsDir = new File(configDir, "multicommands");
multiCommandsDir.mkdir(); multiCommandsDir.mkdir();
initCommandAlias();
initMultiCommand(); initMultiCommand();
} }
@ -94,82 +120,6 @@ public class ConfigManager {
/*
* Alias pour les commandes
*/
public List<Map<String, String>> CommandAlias_alias;
private void initCommandAlias() {
CommandAlias_alias = new ArrayList<Map<String, String>>();
Map<String, String> alias;
alias = new HashMap<String, String>();
alias.put("initialCommand", "/day");
alias.put("replaceWith", "/ptime day");
alias.put("permissions", "pandacraft.grade.users"); // multiple permission separated with semicolumn
CommandAlias_alias.add(alias);
alias = new HashMap<String, String>();
alias.put("initialCommand", "/night");
alias.put("replaceWith", "/ptime night");
alias.put("permissions", "pandacraft.grade.users");
CommandAlias_alias.add(alias);
alias = new HashMap<String, String>();
alias.put("initialCommand", "/time");
alias.put("replaceWith", "/ptime");
alias.put("permissions", "pandacraft.grade.users");
CommandAlias_alias.add(alias);
alias = new HashMap<String, String>();
alias.put("initialCommand", "/shop");
alias.put("replaceWith", "/warp shop");
alias.put("permissions", "*"); // tout le monde
CommandAlias_alias.add(alias);
alias = new HashMap<String, String>();
alias.put("initialCommand", "/lobby");
alias.put("replaceWith", "/spawn");
alias.put("permissions", "*"); // tout le monde
CommandAlias_alias.add(alias);
alias = new HashMap<String, String>();
alias.put("initialCommand", "/hub");
alias.put("replaceWith", "/spawn");
alias.put("permissions", "*"); // tout le monde
CommandAlias_alias.add(alias);
alias = new HashMap<String, String>();
alias.put("initialCommand", "/tete");
alias.put("replaceWith", "/heads nick");
alias.put("permissions", "*");
CommandAlias_alias.add(alias);
alias = new HashMap<String, String>();
alias.put("initialCommand", "/inscription");
alias.put("replaceWith", "/mail send marcbal Inscription");
alias.put("permissions", "pandacraft.grade.users");
CommandAlias_alias.add(alias);
/*
Map<String, String> alias = new HashMap<String, String>();
alias.put("initialCommand", "");
alias.put("replaceWith", "");
alias.put("permissions", "");
CommandAlias_alias.add(alias);
*/
}
/* /*
* Multicommand * Multicommand
*/ */

View File

@ -1,11 +1,11 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.config.elements; package net.mc_pandacraft.java.plugin.pandacraftutils.config.elements;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer;
public class AutoMessagesConfigEntry implements Comparable<AutoMessagesConfigEntry> { public class AutoMessagesConfigEntry implements Comparable<AutoMessagesConfigEntry> {
@ -13,13 +13,10 @@ public class AutoMessagesConfigEntry implements Comparable<AutoMessagesConfigEnt
private final String message; private final String message;
private final List<String> permissions; private final List<String> permissions;
public AutoMessagesConfigEntry(int o, String perm, List<String> m) { public AutoMessagesConfigEntry(int o, String perms, List<String> m) {
if (m == null) throw new IllegalArgumentException("message ne doit pas être null"); if (m == null) throw new IllegalArgumentException("message ne doit pas être null");
message = ChatColor.translateAlternateColorCodes('&', StringUtils.join(m, '\n')); message = ChatColor.translateAlternateColorCodes('&', StringUtils.join(m, '\n'));
if (perm == null || perm.equals("*")) permissions = ConfigManager.splitPermissionsString(perms);
permissions = null;
else
permissions = Arrays.asList(perm.split(";"));
order = o; order = o;
} }

View File

@ -0,0 +1,45 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.config.elements;
import java.util.Collections;
import java.util.List;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer;
public class CommandAliasConfigEntry {
private final String initialCmd;
private final String replacement;
private final List<String> permissions;
public CommandAliasConfigEntry(String init, String repl, String perms) {
permissions = Collections.unmodifiableList(ConfigManager.splitPermissionsString(perms));
if (init == null || init.trim().equals(""))
throw new IllegalArgumentException();
if (repl == null || repl.trim().equals(""))
throw new IllegalArgumentException();
initialCmd = init;
replacement = repl;
}
public String getInitialCommand() { return initialCmd; }
public String getReplacementCommand() { return replacement; }
public boolean hasPlayerPermission(OnlinePlayer op) {
if (op == null) throw new IllegalArgumentException("le joueur ne doit pas être null");
if (permissions == null)
return true;
for (String pe : permissions) {
if (op.hasPermission(pe)) return true;
}
return false;
}
}

View File

@ -1,12 +1,13 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.modules; package net.mc_pandacraft.java.plugin.pandacraftutils.modules;
import java.util.List; import java.util.List;
import java.util.Map;
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager; import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.elements.CommandAliasConfigEntry;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -26,35 +27,21 @@ public class CommandAliasManager implements Listener {
@EventHandler(priority=EventPriority.HIGHEST) @EventHandler(priority=EventPriority.HIGHEST)
public void onPlayerCommandPreprocess (PlayerCommandPreprocessEvent event) public void onPlayerCommandPreprocess (PlayerCommandPreprocessEvent event)
{ {
Player p = event.getPlayer(); OnlinePlayer op = OnlinePlayerManager.get(event.getPlayer());
List<Map<String, String>> aliases = ConfigManager.getInstance().CommandAlias_alias; List<CommandAliasConfigEntry> aliases = ConfigManager.getInstance().commandAliasConfig.getCommandAlias();
for (Map<String, String> alias : aliases) { for (CommandAliasConfigEntry alias : aliases) {
if (alias == null)
continue;
String perms = alias.get("permissions");
String initialCmd = alias.get("initialCommand");
String aliasCmd = alias.get("replaceWith");
if (perms == null || initialCmd == null || aliasCmd == null)
continue;
if (!perms.equals("*")) { if (!alias.hasPlayerPermission(op))
String[] aPerms = perms.split(";"); continue;
boolean found = false;
for (String perm : aPerms) {
if (perm == null || perm.equals("")) continue; // boucle qui parcours les permissions de l'alias
if (p.hasPermission(perm)) found = true;
}
if (!found) continue; // boucle qui parcours les alias de commandes
}
String mess = event.getMessage(); String mess = event.getMessage();
if(mess.toLowerCase().startsWith(initialCmd)) if(!mess.toLowerCase().startsWith(alias.getInitialCommand()))
mess = mess.replaceFirst("(?i)"+initialCmd, aliasCmd);
else
continue; continue;
mess = mess.replaceFirst("(?i)"+alias.getInitialCommand(), alias.getReplacementCommand());
event.setMessage(mess); event.setMessage(mess);
return; return;
} }