Résolu [JAVA] Problème de reset des fichiers custom du yml

Kenda

Massacreur de zombies
16 Juillet 2016
242
1
2
125
29
www.youtube.com
Bonjour/Bonsoir,

Je viens vers vous (surtout @Detobel36 et @ShE3py car c'est vous qui m'aidez h24 xD), afin de vous expliqué mon problème.
Actuellement en train de faire des fichiers de config pour un plugin, je cehrche à sépéré un peu toute les config étant donné qu'il y a des messages, de la base de données et des localisation de spawn etc... Ducoup, crée des fichiers custom.
Donc actuellement j'ai mon fichier config.yml qui stock tout les messages et les config du plugin (des valeurs booleen, des messages etc.), et ducoup je cherche à séparé la config de la base de données.
J'ai donc fait mes petites recherches et trouvé cette vidéo qui explique comment faire des fichiers cutsom. J'ai donc suivi à la lettre comment faire (bon, j'ai modif 2-3 trucs quand même), et actuellement, quand je recharge le plugin, tout les paramètres revienne à 0 (donc ce que j'ai mis dans le code.). J'ai trouvé aussi le "addDefaut", mais cette fois, plus rien ne se met dans la config au chargement du fichier.
J'aimerais donc savoir comment je pourrais bloqué "la création" de la config.


Java:
FileConfiguration mysql = YamlConfiguration.loadConfiguration(getFile(mysqlFile));
            mysql.addDefault("database.host", "127.0.0.1");
            mysql.addDefault("database.port", 3306);
            mysql.addDefault("database.database", "database");
            mysql.addDefault("database.user", "root");
            mysql.addDefault("database.password", "root");
            mysql.addDefault("database.table_created", "EMPYSHOT");
            try {
                mysql.save(fileName);
            } catch (IOException e) {
                e.printStackTrace();
            }
Une petite aide svp ? :)
 

ShE3py

Développeur en autodidacte
Support
26 Septembre 2015
2 200
46
328
217
19
Mìlhüsa
Bonsoir,

Le addDefault(...) rajoute plutôt un « si la valeur n'existe pas prendre ça », les valeurs par défaut ne sont pas sauvegardées ensuite si elles manquent.

Et pour moi ce serait mieux d'ajouter un fichier « database.yml » à la racine du .jar de ton plugin qui lui contiendrait les valeurs par défaut, et de ne pas les mettre du tout dans ton code, parce qu'en soit c'est plus esthétique.

Java:
//assert this instanceof JavaPlugin;

// Copie le fichier embarqué dans le .jar dans `plugins/MyPlugin/` avec le même nom de fichier, sans le remplacer (`false`)
this.saveResource("database.yml", false);

// On charge le fichier de configuration utilisateur
YamlConfiguration userConfig = YamlConfiguration.loadConfiguration(new File(this.getDataFolder(), "database.yml"));

// On charge le fichier de configuration par défaut (celui dans le .jar)
YamlConfiguration defaultConfig = YamlConfiguration.loadConfiguration(this.getTextResource("database.yml"));

// On définit les valeurs utilisateurs par défaut sur celles embarquées dans le .jar
userConfig.setDefaults(defaultConfig);

// Lecture
// si `database.host` n'existe pas, il prendra dans les defaults, c.-à-d. `defaultConfig.getString("database.host")`
String host = userConfig.getString("database.host");

Pour forcer les valeurs absentes à être “defaulted” puis sauvegardées :
Java:
private static void applyDefaultConfig(ConfigurationSection userSection) {
    // pour chaque paire clef/valeur dans la configuration par défaut,
    for(Map.Entry<String, Object> entry : userSection.getDefaultSection().getValues(false).entrySet()) {
        final String key = entry.getKey():
        
        // si la section n'a pas de valeur pour la clef,
        if(!userSection.contains(key, false)) {
            // on en met une.
            userSection.set(key, entry.getValue());
        }
        
        // si la clef est une sous-section,
        if(userSection.isConfigurationSection(key)) {
            // on répète.
            applyDefaultConfig(userSection.getConfigurationSection(key));
        }
    }
}

applyDefaultConfig(userConfig);
userConfig.save(new File(this.getDataFolder(), "database.yml"));

J'ai écrit sur mon téléphone donc il y aura probablement des trucs à corriger, mais globalement l'idée est là.

Cordialement,
ShE3py
 

Kenda

Massacreur de zombies
16 Juillet 2016
242
1
2
125
29
www.youtube.com
Bonsoir,

Le addDefault(...) rajoute plutôt un « si la valeur n'existe pas prendre ça », les valeurs par défaut ne sont pas sauvegardées ensuite si elles manquent.

Et pour moi ce serait mieux d'ajouter un fichier « database.yml » à la racine du .jar de ton plugin qui lui contiendrait les valeurs par défaut, et de ne pas les mettre du tout dans ton code, parce qu'en soit c'est plus esthétique.

Java:
//assert this instanceof JavaPlugin;

// Copie le fichier embarqué dans le .jar dans `plugins/MyPlugin/` avec le même nom de fichier, sans le remplacer (`false`)
this.saveResource("database.yml", false);

// On charge le fichier de configuration utilisateur
YamlConfiguration userConfig = YamlConfiguration.loadConfiguration(new File(this.getDataFolder(), "database.yml"));

// On charge le fichier de configuration par défaut (celui dans le .jar)
YamlConfiguration defaultConfig = YamlConfiguration.loadConfiguration(this.getTextResource("database.yml"));

// On définit les valeurs utilisateurs par défaut sur celles embarquées dans le .jar
userConfig.setDefaults(defaultConfig);

// Lecture
// si `database.host` n'existe pas, il prendra dans les defaults, c.-à-d. `defaultConfig.getString("database.host")`
String host = userConfig.getString("database.host");

Pour forcer les valeurs absentes à être “defaulted” puis sauvegardées :
Java:
private static void applyDefaultConfig(ConfigurationSection userSection) {
    // pour chaque paire clef/valeur dans la configuration par défaut,
    for(Map.Entry<String, Object> entry : userSection.getDefaultSection().getValues(false).entrySet()) {
        final String key = entry.getKey():
       
        // si la section n'a pas de valeur pour la clef,
        if(!userSection.contains(key, false)) {
            // on en met une.
            userSection.set(key, entry.getValue());
        }
       
        // si la clef est une sous-section,
        if(userSection.isConfigurationSection(key)) {
            // on répète.
            applyDefaultConfig(userSection.getConfigurationSection(key));
        }
    }
}

applyDefaultConfig(userConfig);
userConfig.save(new File(this.getDataFolder(), "database.yml"));

J'ai écrit sur mon téléphone donc il y aura probablement des trucs à corriger, mais globalement l'idée est là.

Cordialement,
ShE3py

Je te remercie beaucoup :)
Je ne savais pas que c'étais possible de mettre le database direct dans le .jar sans passé par tout le code, enfin bon, c'est vrai que c'est bien plsu esthétique :)