Gestion dans une classe à part des messages automatiques

This commit is contained in:
Marc Baloup 2015-02-18 02:27:31 -05:00
parent dbae5bea01
commit 9abe06afe1
8 changed files with 179 additions and 111 deletions

View File

@ -25,3 +25,18 @@ Ce fichier est au format texte. Chaque ligne est une expression régulière corr
Les lignes vides seront ignorés (ou ne contenant que des caractères non imprimable). Lescaractères non imprimables en début et fin de ligne sont conservés
___________________
## 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 :
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`)
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 `;`.
Le reste du fichier correspond au message automatique, avec les codes couleurs de la forme `&X`.

View File

@ -2,7 +2,8 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands;
import java.util.List;
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.AutoMessagesManager.AutoMessage;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.elements.AutoMessagesConfigEntry;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
import org.bukkit.ChatColor;
@ -20,7 +21,7 @@ public class CommandAutomessager extends AbstractCommandExecutor {
public boolean onCommand(CommandSender sender, Command cmd, String alias,
String[] args) {
List<AutoMessage> messages = plugin.autoMessagesManager.getMessagesFromConfig();
List<AutoMessagesConfigEntry> messages = ConfigManager.getInstance().autoMessagesConfig.getAutoMessages();
if (args.length == 0 || !(sender instanceof Player)) {
sender.sendMessage(ChatColor.GOLD+"Il y a "+messages.size()+" messages (de 0 à "+(messages.size()-1)+")");

View File

@ -5,6 +5,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
@ -41,18 +42,19 @@ public abstract class AbstractConfig {
}
/**
* Retourne toutes les lignes du fichier de configuration
* Retourne toutes les lignes d'un fichier donné
* @param ignoreEmpty <code>true</code> si on doit ignorer les lignes vides
* @param ignoreHashtagComment <code>true</code> si on doit ignorer les lignes commentés (commençant par un #)
* @param trimOutput <code>true</code> si on doit appeller la méthode String.trim() sur chaque ligne retournée
* @param f le fichier à lire
* @return la liste des lignes utiles
* @throws IOException
*/
protected List<String> getFileLines(boolean ignoreEmpty, boolean ignoreHashtagComment, boolean trimOutput) throws IOException {
if (!configFile.isFile())
protected List<String> getFileLines(boolean ignoreEmpty, boolean ignoreHashtagComment, boolean trimOutput, File f) throws IOException {
if (!f.isFile())
return null;
BufferedReader reader = new BufferedReader(new FileReader(configFile));
BufferedReader reader = new BufferedReader(new FileReader(f));
List<String> lines = new ArrayList<String>();
@ -79,9 +81,25 @@ public abstract class AbstractConfig {
}
/**
* Retourne toutes les lignes du fichier de configuration
* @param ignoreEmpty <code>true</code> si on doit ignorer les lignes vides
* @param ignoreHashtagComment <code>true</code> si on doit ignorer les lignes commentés (commençant par un #)
* @param trimOutput <code>true</code> si on doit appeller la méthode String.trim() sur chaque ligne retournée
* @return la liste des lignes utiles
* @throws IOException
*/
protected List<String> getFileLines(boolean ignoreEmpty, boolean ignoreHashtagComment, boolean trimOutput) throws IOException {
return getFileLines(ignoreEmpty, ignoreHashtagComment, trimOutput, configFile);
}
protected void warning(String message) {
plugin.getLogger().warning("Error while loading configuration in '"+configFile.getName()+"' : "+message);
protected List<File> getFileList() {
if (!configFile.isDirectory())
return null;
return Arrays.asList(configFile.listFiles());
}
@ -93,6 +111,13 @@ public abstract class AbstractConfig {
protected void warning(String message) {
plugin.getLogger().warning("Error while loading configuration in '"+configFile.getName()+"' : "+message);
}
protected enum FileType {
FILE, DIR
}

View File

@ -0,0 +1,55 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.config;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import net.mc_pandacraft.java.plugin.pandacraftutils.config.elements.AutoMessagesConfigEntry;
public class AutoMessagesConfig extends AbstractConfig {
private List<AutoMessagesConfigEntry> config;
public AutoMessagesConfig() throws IOException {
super("automessages", FileType.DIR);
List<File> fileList = getFileList();
for (File f : fileList) {
String name = f.getName();
try {
if (!name.matches("[0-9]+\\.txt")) continue;
int i = Integer.valueOf(name.split("\\.")[0]);
List<String> lines = getFileLines(false, false, false, f);
if (lines.size() < 2) throw new Exception("Le fichier "+name+" n'est pas du bon format. Doit faire au moins 2 lignes");
String perm = lines.remove(0);
config.add(new AutoMessagesConfigEntry(i, perm, lines));
} catch (Exception e) {
warning("fichier '"+name+"' invalide");
e.printStackTrace();
}
}
// tri des messages automatiques selon le numéro du fichier
config.sort(null);
}
public List<AutoMessagesConfigEntry> getAutoMessages() {
return Collections.unmodifiableList(config);
}
}

View File

@ -8,8 +8,6 @@ import java.util.Map;
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
import org.bukkit.ChatColor;
/*
* Configuration du plugin
*/
@ -54,6 +52,7 @@ public class ConfigManager {
public final DefaultConfig defaultConfig;
public final WorldBorderConfig worldBorderConfig;
public final ChatBadWordsConfig chatBadWordsConfig;
public final AutoMessagesConfig autoMessagesConfig;
@ -69,6 +68,8 @@ public class ConfigManager {
defaultConfig = new DefaultConfig();
worldBorderConfig = new WorldBorderConfig();
chatBadWordsConfig = new ChatBadWordsConfig();
autoMessagesConfig = new AutoMessagesConfig();
// dossier qui doit contenir les messages automatiques
@ -86,7 +87,6 @@ public class ConfigManager {
initCommandAlias();
initAutomessages();
initMultiCommand();
}
@ -95,51 +95,6 @@ public class ConfigManager {
/*
* Automessages
*/
public List<Map<String, String>> Automessages_messages;
private void initAutomessages() {
Automessages_messages = new ArrayList<Map<String,String>>();
String defColor = defaultConfig.serverMessages_defaultColor;
Map<String, String> message;
message = new HashMap<String, String>();
message.put("message", ChatColor.BLUE+"Bienvenue sur Pandacraft ! :) Pour pouvoir jouer, n'oubliez pas de vous inscrire en cliquant sur le lien en dessous%n &ahttps://www.mc-pandacraft.net/?p=inscription");
message.put("permissions", "pandacraft.grade.default");
Automessages_messages.add(message);
message = new HashMap<String, String>();
message.put("message", "Utilisez la commande &7/cubo"+defColor+" en Survie pour protéger vos construction ! :)%n&a https://www.mc-pandacraft.net/?p=antigrief#tuto_cubo");
message.put("permissions", "*");
Automessages_messages.add(message);
message = new HashMap<String, String>();
message.put("message", "WorldEdit disponible en &bCréatif"+defColor+" avec le grade %n&f[&eUltimate&f]"+defColor+". Profitez en vite :D%n &a https://www.mc-pandacraft.net/?p=ultimate");
message.put("permissions", "*");
Automessages_messages.add(message);
message = new HashMap<String, String>();
message.put("message", "Launcher disponible pour Pandacraft : Optifine intégré et mise à jour automatique avec le serveur.%n &ahttps://www.mc-pandacraft.net/?p=launcher");
message.put("permissions", "*");
Automessages_messages.add(message);
/*
* Fonctionnement :
* Chaque joueur a une variable indiquand la date/heure du dernier message affiché
* Cette valeur est initialisé à la valeur courante, lors de chaque connexion du joueur
* Selon le grade, l'intervalle entre les messages est défini : 2min30 pour les visiteurs, 10 minutes pour les autres
* Chaque joueur a une variable qui correspond à l'ID du dernier message (dans l'ArrayList) pour ne pas répéter deux fois le même
*/
}

View File

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

View File

@ -1,17 +1,14 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.modules;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
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.elements.AutoMessagesConfigEntry;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
import org.bukkit.ChatColor;
import org.bukkit.scheduler.BukkitRunnable;
public class AutoMessagesManager extends BukkitRunnable {
@ -30,7 +27,7 @@ public class AutoMessagesManager extends BukkitRunnable {
@Override
public void run() {
List<AutoMessage> messages = getMessagesFromConfig();
List<AutoMessagesConfigEntry> messages = ConfigManager.getInstance().autoMessagesConfig.getAutoMessages();
int interval_default = ConfigManager.getInstance().defaultConfig.autoMessages_defaultInterval,
interval_players = ConfigManager.getInstance().defaultConfig.autoMessages_playerInterval;
// message
@ -68,61 +65,16 @@ public class AutoMessagesManager extends BukkitRunnable {
// affichage du message
if (atLeastOnePermitted) {
op.setAutomessage_last_message_id(id);
op.updateAutomessage_last_message_time();
op.sendMessageFromServer(messages.get(id).getMessage());
}
op.updateAutomessage_last_message_time();
}
}
public List<AutoMessage> getMessagesFromConfig() {
ArrayList<AutoMessage> ret = new ArrayList<AutoMessage>();
for (Map<String, String> message : ConfigManager.getInstance().Automessages_messages)
ret.add(new AutoMessage(ChatColor.translateAlternateColorCodes('&', message.get("message").replace("%n", "\n")), message.get("permissions")));
return ret;
}
public class AutoMessage {
private String message;
private List<String> permissions;
public AutoMessage(String m, String perm) {
setMessage(m);
if (perm == null || perm.equals("*"))
permissions = null;
else
permissions = Arrays.asList(perm.split(";"));
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
if (message == null) throw new IllegalArgumentException("message ne doit pas être null");
this.message = message;
}
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

@ -0,0 +1,10 @@
package net.mc_pandacraft.java.util.bukkit;
import org.apache.commons.lang.WordUtils;
public class SignUtil {
public static String[] textIntoSign(String text) {
return WordUtils.wrap(text, 15).split("\n");
}
}