Помогите Работа с кастомными конфигами

Статус
Закрыто для дальнейших ответов.

Alex555333222

Активный участник
Пользователь
Баллы
66
Всем привет друзья, такой вопрос создал кастомный конфиг, назвал например players.yml. В самом плагине внес туда информацию, не получается при создании этого файла выводить туда дэфолтные значения, которые в самом коде в файле написал. Так же появился вопрос, например файл был изменен в ручную пользователем:
Файл player.yml
Groups:
__Players:
__- lolka
__- karat
__Mobs:
__- animal
__- zombie

Можно ли в коде получить значения Players and Mobs при, том что разработчик точно не знает как называются группы (то есть вместо Players, можно было написать Users или что то другое и чтобы все так же хорошо работало). Короче получить значения можно через точку, например "Groups.Players" - это понятно, но если не знает разработчик какие значения будут после точки, как их можно получить и загнать в какую то переменную. Если кто знает подскажите пожалуйста, желательно самым простым языком, заранее спасибо. (В место нижних подчеркиваний стоят должны стоять пробелы, для справки).
 
Я не понимаю как найти один параметр, а ты предлагаешь все вывести
Код:
    public static void regursion(ConfigurationSection cections, String start) {
        for (String cection : cections.getKeys(false)) {
            Object tmp = cections.get(cection);
            if (tmp instanceof MemorySection) {
                regursion((ConfigurationSection) tmp, start + "." + cection);
            } else {
                System.out.println((start + "." + cection + "." + tmp).substring(1));
            }
        }
    }
 
Код:
    public static void regursion(ConfigurationSection cections, String start) {
        for (String cection : cections.getKeys(false)) {
            Object tmp = cections.get(cection);
            if (tmp instanceof MemorySection) {
                regursion((ConfigurationSection) tmp, start + "." + cection);
            } else {
                System.out.println((start + "." + cection + "." + tmp).substring(1));
            }
        }
    }
Все круто работает, спасибо большое, не совсем понятно как это конечно работает, но работает. И не совсем понятно зачем нужна работа со строкой substring(1).
 
Все круто работает, спасибо большое, не совсем понятно как это конечно работает, но работает. И не совсем понятно зачем нужна работа со строкой substring(1).
Да просто код Г, вот и всё. Он тебе сделал рекурсивный вывод всех данных с неограниченным количеством вложений.

Любой объект конфига, хранящий другие объекты, является ConfigurationSection.
Секции можно вкладывать друг в друга неограниченное количество раз.

При помощи section.getKeys(false) можно получить все вложенные ключи секции.
false - получить ключи только 1-го уровня вложенности. Если нужно всё до самых глубоких глубин - можешь использовать true. Исходя из твоей задачи, у тебя лишь один уровень вложения, поэтому false.

section.getConfigurationSection("Название") позволяет получить из указанной секции вложенную секцию с указанным названием (ключом).
А section.getStringList("Название"), соответственно, вернёт список строк по указанному ключу.

Ниже пример реализации конкретно твоей задачи.
Заодно познаешь потенциал функционального апи - можно хоть в мапу собрать, хоть в консоль все вывести.

PHP:
    public static void printListsToConsole(ConfigurationSection baseSection, String listsSectionName) {
        processLists(baseSection, listsSectionName, (listName, listLines) -> System.out.println(listName + " > " + listLines.toString()));
    }

    public static Map<String, List<String>> loadListsToMap(ConfigurationSection baseSection, String listsSectionName) {
        Map<String, List<String>> result = new HashMap<>();
        processLists(baseSection, listsSectionName, result::put);
        return result;
    }

    public static void processLists(ConfigurationSection baseSection, String listsSectionName, BiConsumer<String, List<String>> processor) {
        if (listsSectionName != null)
            baseSection = baseSection.getConfigurationSection(listsSectionName);
        
        if (baseSection == null)
            throw new IllegalArgumentException("Lists section not found");
        
        for (String listName : baseSection.getKeys(false)) {
            List<String> listLines = baseSection.getStringList(listName);
            processor.accept(listName, listLines);
        }
    }
 
А самое главное, как кастомный конфиг загрузить в папку плагина (при ее создании), не пустой, а наполненный так же как заполнен в коде плагина. Ну то есть:
для config.yml - это getConfig().options().copyDefaults(true); saveDefaultConfig();
а для например player.yml - это ???
 
Код:
File playersFile = new File (plugin.getDataFolder(), "players.yml");
        FileConfiguration players = YamlConfiguration.loadConfiguration(playersFile);
        if(!playersFile.exists())
         {
         players.options().copyDefaults(true);
         }
 
Последнее редактирование:
А самое главное, как кастомный конфиг загрузить в папку плагина (при ее создании), не пустой, а наполненный так же как заполнен в коде плагина. Ну то есть:
для config.yml - это getConfig().options().copyDefaults(true); saveDefaultConfig();
а для например player.yml - это ???
plugin.saveResource("lang.yml", false);
true перезапишет файл, если он уже существует
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх