С чего начать: Работа с файлами конфигурации

Discussion in 'Разработка плагинов' started by fromgate, 9/1/16.

  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
Dismiss Notice
We welcome you on our site. This site is devoted to the Nukkit project and all that is connected with him. Here you can communicate, download plugins, also many other things get acquainted! Register the account right now :3
  1. fromgate

    fromgate Administrator

    Messages:
    659
    Likes Received:
    184

    Работа с файлами конфигурации

    Мы продолжаем работать с проектом FirstPlugin, который был создан в предыдущем уроке.

    Файл конфигурации плагина - это главный способ хранения настроек или рабочей информации.
    Базовым файлом настроек, является файл config.yml, который находится в директории плагина. Для работы с этим файлом не нужно обращаться к нему по имени, станадртные методы (getConfig(), saveConfig(), reloadConfig()) уже есть в классе плагина (точнее в PluginBase, наследником от которого, является любой плагин).

    Для создания такого файла часто используется заранее подготовленный шаблон, в котором коммантариями поясняется что делает тот или иной параметр настроек.
    Для примера не нужно далеко ходить - файл nukkit.yml, хранящий настройки сервера, как раз и есть такой заранее подготовленный файл.

    1. Cоздаем шаблон файла конфигурации

    config01.png

    Называем его, соответственно config.yml

    config02.png

    И набираем содержимое файла

    Code:
    # Пример файла конфигурации
    #
    
    [size=7]параметр: hello-message - содержит сообщение, которое будет выводиться[/size]
    [size=7]при старте сервера[/size]
    #
    hello-message: Сообщение из файла конфигурации прочитано!
    config03.png

    Шаблон файла подготовлен. При компиляции он будет добавлен в jar-файл плагина.
    Теперь нужно чтобы плагин при первом старте плагина сохранял этот файл.

    2. Создаем метод сохраняющий файл конфигурации в директории плагина

    Создаем в классе плагина метод initConfig():

    Code:
     public void initConfig(){
    this.getDataFolder().mkdirs();
    this.saveResource("config.yml");
    }
    Здесь происходит:

    1. Создание директории плагина (если её еще не существует). Метод плагина getDataFolder() всегда возвращает объект File указывающий на директорию плагина.
    2. Сохраняется файл config.yml из jar-файла. Сохранение произойдёт, только если в директории плагина не существует файла с таким же именем.
    Вызывать этот метод будем из метода onEnable() — метода который всегда выполняется при старте плагина.

    После этого можно подумать о чтении настроек из файла.

    3. Создаем метод, считывающий значение параметров из config.yml

    Я предпочитаю создавать переменную, считывать в неё значение из конфига и потом работаь с этой переменной.

    Поэтому в классе плагина опишем переменную helloMessage:
    Code:
    String helloMessage;
    
    И создадим ещё один метод, для чтения настроек из файла:
    Code:
     public void loadCfg(){
    this.reloadConfig();
    this.helloMessage = this.getConfig().getString("hello-message","Сообщение по умолчанию");
    }
    Вызов этого метода, добавим после вызова метода initConfig() в onEnable().

    Ну а в строке, котороая выводила сообщение "My first plugin enabled" мы организуем вывод значения переменной helloMessage.

    В итоге метод onEnable примет такой вид:
    Code:
     @Override
    public void onEnable(){
    this.initConfig();
    this.loadCfg();
    this.getLogger().info(TextFormat.RED+this.helloMessage);
    }
    Ну а весь плагин будет таким:
    getString.png

    4. Компилируем и смотрим на результат

    Жмём Ctrl+F9, запускаем сервер и...

    config05.png

    Как видите, сообщение было успешно прочитано из файла.
    Если Вы проверите директорию plugins на сервере, то увидите, что там была создана директория FirstPlugin, а в ней появился файл config.yml.
     
    Last edited: 2/2/16
    Leonidius likes this.
  2. BlackJIeB

    BlackJIeB Developer

    Messages:
    16
    Likes Received:
    3
    Minecraft:
    BlackJIeB
    Тут не сказано про его генерацию) Если кратко, то:




    Code:
      public void createData(String username) {
    String name = username.toLowerCase().trim();
    if(!(checkUsername(name))) {
    Config config = new Config(
    new File(this.getDataFolder() + "/players/", name + ".yml"),
    Config.YAML,
    //Default values (not necessary)
    new LinkedHashMap<String, Object>() {
    {
    put("group", "user");
    }
    });
    config.save();
    }
    }
     
    SVIDA likes this.
  3. BlackJIeB

    BlackJIeB Developer

    Messages:
    16
    Likes Received:
    3
    Minecraft:
    BlackJIeB
    Также прилагаю функцию "checkUsername", которая определяет, есть ли файл в нужной директории:


    Code:
      public boolean checkUsername(String username) {
    String name = username.toLowerCase().trim();
    return new File(this.getDataFolder() + "/players/" + name + ".yml").isFile();
    }
     
  4. fromgate

    fromgate Administrator

    Messages:
    659
    Likes Received:
    184
    Ну да, но это уже другая задача ;)
    Здесь речь идёт о стандартном конфиге, макет которого сохранён в виде ресурса. Для большинства плагинов этого достаточно.

    Кстати, пример, который Вы привели требует чтобы файл уже существовал.
    Это такая особенность, которую я бы отнёс скорее к багам, nukkit'а. В общем всегда когда обращаетесь к фалу (будь то через getConfig() или непосредственно к определенному файлу), то нужно обязательно проверять существует ли файл. И если его нет, то создавать хотя бы пустой файл.

    В моем примере, это делается через сохранение ресурсного файла - отдельной проверки не требуется.
     
  5. MediumWorld

    MediumWorld Пользователь

    Messages:
    1
    Likes Received:
    0
    Minecraft:
    misstik32
    Можете скинуть весь код?
     
  6. fromgate

    fromgate Administrator

    Messages:
    659
    Likes Received:
    184
  7. PhantomasGamer

    PhantomasGamer Пользователь

    Messages:
    1
    Likes Received:
    0
    Minecraft:
    PhantomasGamer
    у меня в консоли выдает ошибку(
    код идентичный вашему
     

Share This Page