package de.fabianonline.telegram_backup import java.io.File import org.slf4j.LoggerFactory class Settings(val file_base: String, val database: Database, val cli_settings: CommandLineOptions) { val logger = LoggerFactory.getLogger(Settings::class.java) val settings = mutableMapOf() val gmaps_key: Setting private val db_settings: Map private var ini_settings: Map> init { db_settings = database.fetchSettings() ini_settings = load_ini("config.ini") copy_sample_ini("config.sample.ini") // Merging CLI and INI settings gmaps_key = get_setting("gmaps_key", default=Config.SECRET_GMAPS) } private fun get_setting(name: String, default: String? = null): Setting { return Setting.build(name, ini_settings[name], cli_settings.values[name], default) } private fun load_ini(filename: String): Map> { val map = mutableMapOf>() val file = File(file_base + filename) logger.trace("Checking ini file {}", filename.anonymize()) if (!file.exists()) return map logger.debug("Loading ini file {}", filename.anonymize()) file.forEachLine { parseLine(it, map) } return map } private fun parseLine(original_line: String, map: MutableMap>) { logger.trace("Parsing line: {}", original_line) var line = original_line.trim().replaceAfter("#", "").removeSuffix("#") logger.trace("After cleaning: {}", line) if (line == "") return val parts: List = line.split("=", limit=2).map{it.trim()} if (parts.size < 2) throw RuntimeException("Invalid config setting: $line") val (key, value) = parts if (value=="") { map.remove(key) } else { var list = map.get(key) if (list == null) { list = mutableListOf() map.put(key, list) } list.add(value) } } private fun copy_sample_ini(filename: String) { val stream = Config::class.java.getResourceAsStream("/config.sample.ini") File(filename).outputStream().use { stream.copyTo(it) } stream.close() } open class Setting(name: String, value: List?, source: SettingSource) { companion object { val all = mutableListOf() fun build(name: String, ini_value: List?, cli_value: List?, default: String?): Setting { var value: List? var source: SettingSource if (cli_value != null) { value=cli_value source=SettingSource.CLI } else if (ini_value != null) { value=ini_value source=SettingSource.INI } else { if (default!=null) { value = listOf(default) } else { value = null } source=SettingSource.DEFAULT } return Setting(name, value, source); } } } enum class SettingSource { INI, CLI, DEFAULT } } /* class DbSettings(val database: Database) { private fun fetchValue(name: String): String? = database.fetchSetting(name) private fun saveValue(name: String, value: String?) = database.saveSetting(name, value) var pts: String? get() = fetchValue("pts") set(x: String?) = saveValue("pts", x) } package de.fabianonline.telegram_backup class Settings(val file_base: String) { val logger = LoggerFactory.getLogger(Settings::class.java) var settings = mutableMapOf>() init { loadIni(file_base + "config.ini") copySampleIni(file_base + "config.sample.ini") } fun println() = println(settings) fun getString(key: String, default: String? = null): String? = settings.get(key)?.last() ?: default fun getStringList(key: String): List? = settings.get(key) fun getInt(key: String, default: Int? = null): Int? = try { settings.get(key)?.last()?.toInt() } catch (e: NumberFormatException) { null } ?: default fun getBoolean(key: String, default: Boolean = false): Boolean { val value = settings.get(key)?.last() if (value==null) return default return value=="true" } fun getArray(key: String): List = settings.get(key) ?: listOf() val gmaps_key = getString("gmaps_key", default=Config.SECRET_GMAPS)!! val pagination = getBoolean("pagination", default=true) val pagination_size = getInt("pagination_size", default=Config.DEFAULT_PAGINATION)!! val download_media = getBoolean("download_media", default=true) val download_channels = getBoolean("download_channels", default=false) val download_supergroups = getBoolean("download_supergroups", default=false) val whitelist_channels = getStringList("whitelist_channels") val blacklist_channels = getStringList("blacklist_channels") } */