Exemple #1
0
// reload считывает данные с ini-файла и загружает в структуру. При необходимости инициализирует данные значениями по умолчанию
func reloadSettings() error {
	var key *ini.Key
	var err error
	var value int

	defUpdSetDelayInt, _ := strconv.Atoi(defUpdSetDelay)
	defUpdDataDelayInt, _ := strconv.Atoi(defUpdDataDelay)

	// открыть ini-файл
	cf, err = ini.Load(nameIniFile)
	if err != nil {
		if os.IsNotExist(err) { // файл с настройками не найден?
			cf = ini.Empty() // создать новый объект с настройками
		} else {
			return err
		}
	}

	// обработать секцию "general" с основными настройками
	section, err := cf.GetSection("general")
	if err != nil {
		section, err = cf.NewSection("general") // секции нет в ini-файле? Тогда создать.
		if err != nil {
			return err // если не удалось создать, то продолжать бессмысленно
		}
		section.Comment = "Основные настройки"
	}

	// перечитывать настройки каждые .... сек
	key, err = section.GetKey("updsetdelay")
	if err != nil {
		key, err = section.NewKey("updsetdelay", defUpdSetDelay)
		if err != nil {
			return err
		}
		key.Comment = "Перечитывать настройки каждые ... сек."
	}
	value = key.RangeInt(defUpdSetDelayInt, 5, 1000000) // значение в пределах 5 - 1000000 секунд. При ошибке инициализация значением по умолчанию
	key.SetValue(strconv.Itoa(value))
	cfstruct.updsetdelay = value

	// обновлять данные плейлиста каждые .... сек
	key, err = section.GetKey("upddatadelay")
	if err != nil {
		key, err = section.NewKey("upddatadelay", defUpdDataDelay)
		if err != nil {
			return err
		}
		key.Comment = "Обновлять данные плейлиста каждые ... сек."
	}
	value = key.RangeInt(defUpdDataDelayInt, 300, 1000000) // значение в пределах 300 - 1000000 секунд. При ошибке инициализация значением по умолчанию
	key.SetValue(strconv.Itoa(value))
	cfstruct.upddatadelay = value

	// Имя файла плейлиста и путь до него.
	key, err = section.GetKey("pathplaylist")
	if err != nil {
		key, err = section.NewKey("pathplaylist", defPathPlaylist)
		if err != nil {
			return err
		}
		key.Comment = "Имя файла плейлиста и путь до него."
	}
	cfstruct.pathplaylist = key.String()

	// Количество параллельных потоков для парсинга сайта
	key, err = section.GetKey("workers")
	if err != nil {
		key, err = section.NewKey("workers", strconv.Itoa(defWorkers))
		if err != nil {
			return err
		}
		key.Comment = "Количество параллельных потоков для парсинга сайта. По умолчанию равен кол-ву ядер процессора."

	}
	value = key.RangeInt(defWorkers, 1, 100) // значение в пределах 1 - 100 отдельных потоков. При ошибке инициализация значением по умолчанию
	key.SetValue(strconv.Itoa(value))
	cfstruct.workers = value

	// секция "каналы"
	section, err = cf.GetSection("channels")
	if err != nil {
		section, err = cf.NewSection("channels") // секции нет в ini-файле? Создать секцию.
		if err != nil {
			return err
		}
	}
	section.Comment = "Список каналов. Пример строки: -:rossija"

	// секция содержит список каналов
	ch := section.Keys() // получить массив списка каналов
	cfstruct.channels = ch

	err = cf.SaveTo(nameIniFile) // сохранить файл с значениями по умолчанию
	if err != nil {
		return err
	}

	return nil
}