diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineController.kt b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineController.kt index 47a9929..ef68648 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineController.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineController.kt @@ -41,7 +41,6 @@ class CommandLineController(val options: CommandLineOptions) { val handler: TelegramUpdateHandler var client: TelegramClient val user_manager: UserManager - val inisettings: IniSettings val settings: Settings val database: Database logger.info("CommandLineController started. App version {}", Config.APP_APPVER) @@ -63,7 +62,7 @@ class CommandLineController(val options: CommandLineOptions) { // Setup file_base logger.debug("Target dir from Config: {}", Config.TARGET_DIR.anonymize()) - target_dir = options.values.get("target")?.last() ?: Config.TARGET_DIR + target_dir = options.values.get("target") ?: Config.TARGET_DIR logger.debug("Target dir after options: {}", target_dir) println("Base directory for files: ${target_dir.anonymize()}") @@ -73,16 +72,16 @@ class CommandLineController(val options: CommandLineOptions) { } if (options.booleans.contains("login")) { - cmd_login(app, target_dir, options.values.get("account")?.last()) + cmd_login(app, target_dir, options.values.get("account")) } logger.trace("Checking accounts") - phone_number = try { selectAccount(target_dir, options.values.get("account")?.last()) + phone_number = try { selectAccount(target_dir, options.values.get("account")) } catch(e: AccountNotFoundException) { show_error("The specified account could not be found.") } catch(e: NoAccountsException) { println("No accounts found. Starting login process...") - cmd_login(app, target_dir, options.values.get("account")?.last()) + cmd_login(app, target_dir, options.values.get("account")) } // TODO: Create a new TelegramApp if the user set his/her own TelegramApp credentials @@ -124,7 +123,7 @@ class CommandLineController(val options: CommandLineOptions) { System.exit(0) } - val export = options.values.get("export")?.last() + val export = options.values["export"] logger.debug("options.val_export: {}", export) if (export != null) { if (export.toLowerCase() == "html") { @@ -138,7 +137,7 @@ class CommandLineController(val options: CommandLineOptions) { println("You are logged in as ${user_manager.toString().anonymize()}") logger.info("Initializing Download Manager") - val d = DownloadManager(client, CommandLineDownloadProgress(), database, user_manager, inisettings) + val d = DownloadManager(client, CommandLineDownloadProgress(), database, user_manager, settings, file_base) if (options.booleans.contains("list_channels")) { val chats = d.getChats() @@ -147,7 +146,7 @@ class CommandLineController(val options: CommandLineOptions) { var download: Boolean println("Channels:") - download = inisettings.download_channels + download = settings.download_channels if (!download) println("Download of channels is disabled - see download_channels in config.ini") print_header(download) for (c in chats.channels) { @@ -155,7 +154,7 @@ class CommandLineController(val options: CommandLineOptions) { } println() println("Supergroups:") - download = inisettings.download_supergroups + download = settings.download_supergroups if (!download) println("Download of supergroups is disabled - see download_supergroups in config.ini") print_header(download) for (c in chats.supergroups) { @@ -166,17 +165,17 @@ class CommandLineController(val options: CommandLineOptions) { logger.debug("Calling DownloadManager.downloadMessages with limit {}", options.values.get("limit_messages")?.last()) d.downloadMessages(options.values.get("limit_messages")?.last()?.toInt()) - logger.debug("IniSettings#download_media: {}", inisettings.download_media) - if (inisettings.download_media) { + logger.debug("IniSettings#download_media: {}", settings.download_media) + if (settings.download_media) { logger.debug("Calling DownloadManager.downloadMedia") d.downloadMedia() } else { println("Skipping media download because download_media is set to false.") } - if (options.boolean.contains("daemon")) { + if (options.booleans.contains("daemon")) { logger.info("Initializing TelegramUpdateHandler") - handler = TelegramUpdateHandler(user_manager, database) + handler = TelegramUpdateHandler(user_manager, database, file_base, settings) client.close() logger.info("Creating new client") client = Kotlogram.getDefaultClient(app, storage, Kotlogram.PROD_DC4, handler) @@ -203,7 +202,7 @@ class CommandLineController(val options: CommandLineOptions) { } private fun selectAccount(file_base: String, requested_account: String?): String { - var found_account: String? = null + var found_account: String? val accounts = Utils.getAccounts(file_base) if (requested_account != null) { logger.debug("Account requested: {}", requested_account.anonymize()) @@ -218,7 +217,6 @@ class CommandLineController(val options: CommandLineOptions) { show_error(("You have more than one account but didn't specify which one to use.\n" + "Use '--account ' to use account .\n" + "Use '--list-accounts' to see all available accounts.")) - System.exit(1) } if (found_account == null) { diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineOptions.kt b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineOptions.kt index 7808202..e9947a5 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineOptions.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineOptions.kt @@ -17,27 +17,24 @@ package de.fabianonline.telegram_backup class CommandLineOptions(args: Array) { val booleans = mutableListOf() - val values = mutableMapOf>() + val values = mutableMapOf() var last_key: String? = null init { for(arg in args) { - if (arg.starts_with("--")) { + if (arg.startsWith("--")) { if (last_key!=null) { - booleans.add(last_key) + booleans.add(last_key!!) } - last_key = arg.substr(2) + last_key = arg.substring(2) } else { - if (last_key==null) throw RuntimeException("Unexpected parameter without switch: $arg") - var list = values.get(last_key) - if (list==null) { - list = mutableListOf() - values.add(last_key, list) + if (last_key==null) { + throw RuntimeException("Unexpected unnamed parameter ${arg}") } - list.add(arg) + values.put(last_key!!, arg) last_key = null } } - if (last_key!=null) booleans.add(last_key) + if (last_key!=null) booleans.add(last_key!!) } } diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineRunner.kt b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineRunner.kt index 5728c32..e517da7 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineRunner.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineRunner.kt @@ -53,7 +53,7 @@ class CommandLineRunner(args: Array) { } fun setupLogging() { - if (options.booleans.hasKey('anonymize')) { + if (options.booleans.contains("anonymize")) { Utils.anonymize = true } @@ -76,13 +76,13 @@ class CommandLineRunner(args: Array) { rootLogger.addAppender(appender) rootLogger.setLevel(Level.OFF) - if (options.cmd_trace) { + if (options.booleans.contains("trace")) { (LoggerFactory.getLogger("de.fabianonline.telegram_backup") as Logger).setLevel(Level.TRACE) - } else if (options.cmd_debug) { + } else if (options.booleans.contains("debug")) { (LoggerFactory.getLogger("de.fabianonline.telegram_backup") as Logger).setLevel(Level.DEBUG) } - if (options.cmd_trace_telegram) { + if (options.booleans.contains("trace_telegram")) { (LoggerFactory.getLogger("com.github.badoualy") as Logger).setLevel(Level.TRACE) } } diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/Database.kt b/src/main/kotlin/de/fabianonline/telegram_backup/Database.kt index b71cb2c..12b915b 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/Database.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/Database.kt @@ -245,14 +245,14 @@ class Database constructor(val file_base: String, val user_manager: UserManager) val map = mutableMapOf() val rs = stmt.executeQuery(query) while(rs.next()) { - map.add(rs.getString(1), rs.getString(2)) + map.put(rs.getString(1), rs.getString(2)) } rs.close() return map } @Synchronized - fun saveMessages(all: TLVector, api_layer: Int, source_type: MessageSource = MessageSource.NORMAL) { + fun saveMessages(all: TLVector, api_layer: Int, source_type: MessageSource = MessageSource.NORMAL, settings: Settings?) { //"(id, dialog_id, from_id, from_type, text, time, has_media, data, sticker, type) " + //"VALUES " + //"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); @@ -314,7 +314,7 @@ class Database constructor(val file_base: String, val user_manager: UserManager) } ps.setString(7, text) ps.setString(8, "" + msg.getDate()) - val f = FileManagerFactory.getFileManager(msg, user_manager) + val f = FileManagerFactory.getFileManager(msg, user_manager, file_base, settings) if (f == null) { ps.setNull(9, Types.BOOLEAN) ps.setNull(10, Types.VARCHAR) @@ -499,7 +499,7 @@ class Database constructor(val file_base: String, val user_manager: UserManager) ps_insert_or_replace.close() } - fun fetchSettings() = queryStringMap("SELECT key, value FROM settings WHERE key='${key}'") + fun fetchSettings() = queryStringMap("SELECT key, value FROM settings") fun saveSetting(key: String, value: String?) { val ps = conn.prepareStatement("INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)") diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/DatabaseUpdates.kt b/src/main/kotlin/de/fabianonline/telegram_backup/DatabaseUpdates.kt index b0e5676..7ac15ba 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/DatabaseUpdates.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/DatabaseUpdates.kt @@ -313,7 +313,7 @@ internal class DB_Update_6(conn: Connection, db: Database) : DatabaseUpdate(conn } else { ps.setInt(1, msg.getFwdFrom().getFromId()) } - val f = FileManagerFactory.getFileManager(msg, db.user_manager) + val f = FileManagerFactory.getFileManager(msg, db.user_manager, db.file_base, settings = null) if (f == null) { ps.setNull(2, Types.VARCHAR) ps.setNull(3, Types.VARCHAR) @@ -431,7 +431,7 @@ internal class DB_Update_9(conn: Connection, db: Database) : DatabaseUpdate(conn } } rs.close() - db.saveMessages(messages, api_layer=53, source_type=MessageSource.SUPERGROUP) + db.saveMessages(messages, api_layer=53, source_type=MessageSource.SUPERGROUP, settings=null) execute("DELETE FROM messages WHERE id IN (" + messages_to_delete.joinToString() + ")") print(".") diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/DbSettings.kt b/src/main/kotlin/de/fabianonline/telegram_backup/DbSettings.kt deleted file mode 100644 index 26d4344..0000000 --- a/src/main/kotlin/de/fabianonline/telegram_backup/DbSettings.kt +++ /dev/null @@ -1,12 +0,0 @@ -package de.fabianonline.telegram_backup - -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) -} - - diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt index 9913a51..3e2f7e4 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt @@ -60,7 +60,7 @@ enum class MessageSource(val descr: String) { SUPERGROUP("supergroup") } -class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInterface, val db: Database, val user_manager: UserManager, val inisettings: IniSettings) { +class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInterface, val db: Database, val user_manager: UserManager, val settings: Settings, val file_base: String) { internal var has_seen_flood_wait_message = false @Throws(RpcErrorException::class, IOException::class) @@ -109,7 +109,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte } } System.out.println("Top message ID is " + max_message_id) - var max_database_id = db!!.getTopMessageID() + var max_database_id = db.getTopMessageID() System.out.println("Top message ID in database is " + max_database_id) if (limit != null) { System.out.println("Limit is set to " + limit) @@ -137,8 +137,8 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte logger.info("Searching for missing messages in the db") System.out.println("Checking message database for completeness...") - val db_count = db!!.getMessageCount() - val db_max = db!!.getTopMessageID() + val db_count = db.getMessageCount() + val db_max = db.getTopMessageID() logger.debug("db_count: {}", db_count) logger.debug("db_max: {}", db_max) @@ -163,12 +163,12 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte } */ - if (inisettings.download_channels) { + if (settings.download_channels) { println("Checking channels...") for (channel in chats.channels) { if (channel.download) downloadMessagesFromChannel(channel) } } - if (inisettings.download_supergroups) { + if (settings.download_supergroups) { println("Checking supergroups...") for (supergroup in chats.supergroups) { if (supergroup.download) downloadMessagesFromChannel(supergroup) } } @@ -176,7 +176,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte private fun downloadMessagesFromChannel(channel: Channel) { val obj = channel.obj - val max_known_id = db!!.getTopMessageIDForChannel(channel.id) + val max_known_id = db.getTopMessageIDForChannel(channel.id) if (obj.getTopMessage() > max_known_id) { val ids = makeIdList(max_known_id + 1, obj.getTopMessage()) var channel_name = channel.title @@ -196,7 +196,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte } else { "${source_type.descr} $source_name" } - prog!!.onMessageDownloadStart(ids.size, source_string) + prog.onMessageDownloadStart(ids.size, source_string) logger.debug("Entering download loop") while (ids.size > 0) { @@ -221,9 +221,9 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte tries++ try { if (channel == null) { - response = client!!.messagesGetMessages(vector) + response = client.messagesGetMessages(vector) } else { - response = client!!.channelsGetMessages(channel, vector) + response = client.channelsGetMessages(channel, vector) } break } catch (e: RpcErrorException) { @@ -241,10 +241,10 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte CommandLineController.show_error("Requested ${vector.size} messages, but got ${response.getMessages().size}. That is unexpected. Quitting.") } - prog!!.onMessageDownloaded(response.getMessages().size) - db!!.saveMessages(response.getMessages(), Kotlogram.API_LAYER, source_type=source_type) - db!!.saveChats(response.getChats()) - db!!.saveUsers(response.getUsers()) + prog.onMessageDownloaded(response.getMessages().size) + db.saveMessages(response.getMessages(), Kotlogram.API_LAYER, source_type=source_type, settings=settings) + db.saveChats(response.getChats()) + db.saveUsers(response.getUsers()) logger.trace("Sleeping") try { TimeUnit.MILLISECONDS.sleep(Config.DELAY_AFTER_GET_MESSAGES) @@ -254,12 +254,12 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte } logger.debug("Finished.") - prog!!.onMessageDownloadFinished() + prog.onMessageDownloadFinished() } @Throws(RpcErrorException::class, IOException::class) fun downloadMedia() { - download_client = client!!.getDownloaderClient() + download_client = client.getDownloaderClient() var completed: Boolean do { completed = true @@ -289,19 +289,19 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte private fun _downloadMedia() { logger.info("This is _downloadMedia") logger.info("Checking if there are messages in the DB with a too old API layer") - val ids = db!!.getIdsFromQuery("SELECT id FROM messages WHERE has_media=1 AND api_layer<" + Kotlogram.API_LAYER) + val ids = db.getIdsFromQuery("SELECT id FROM messages WHERE has_media=1 AND api_layer<" + Kotlogram.API_LAYER) if (ids.size > 0) { System.out.println("You have ${ids.size} messages in your db that need an update. Doing that now.") logger.debug("Found {} messages", ids.size) downloadMessages(ids, null, source_type=MessageSource.NORMAL) } - val messages = this.db!!.getMessagesWithMedia() + val messages = db.getMessagesWithMedia() logger.debug("Database returned {} messages with media", messages.size) - prog!!.onMediaDownloadStart(messages.size) + prog.onMediaDownloadStart(messages.size) for (msg in messages) { if (msg == null) continue - val m = FileManagerFactory.getFileManager(msg, user_manager) + val m = FileManagerFactory.getFileManager(msg, user_manager, file_base, settings=settings) logger.trace("message {}, {}, {}, {}, {}", msg.getId(), msg.getMedia().javaClass.getSimpleName().replace("TLMessageMedia", "…"), @@ -309,25 +309,25 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte if (m.isEmpty) "empty" else "non-empty", if (m.downloaded) "downloaded" else "not downloaded") if (m.isEmpty) { - prog!!.onMediaDownloadedEmpty() + prog.onMediaDownloadedEmpty() } else if (m.downloaded) { - prog!!.onMediaAlreadyPresent(m) + prog.onMediaAlreadyPresent(m) } else { try { val result = m.download() if (result) { - prog!!.onMediaDownloaded(m) + prog.onMediaDownloaded(m) } else { - prog!!.onMediaSkipped() + prog.onMediaSkipped() } } catch (e: TimeoutException) { // do nothing - skip this file - prog!!.onMediaSkipped() + prog.onMediaSkipped() } } } - prog!!.onMediaDownloadFinished() + prog.onMediaDownloadFinished() } private fun makeIdList(start: Int, end: Int): MutableList { @@ -339,7 +339,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte fun getChats(): ChatList { val cl = ChatList() logger.trace("Calling messagesGetDialogs") - val dialogs = client!!.messagesGetDialogs(0, 0, TLInputPeerEmpty(), 100) + val dialogs = client.messagesGetDialogs(0, 0, TLInputPeerEmpty(), 100) logger.trace("Got {} dialogs back", dialogs.getDialogs().size) // Add dialogs @@ -352,10 +352,10 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte if (tl_peer_channel == null) continue var download = true - if (inisettings.whitelist_channels != null) { - download = inisettings.whitelist_channels.contains(tl_channel.getId().toString()) - } else if (inisettings.blacklist_channels != null) { - download = !inisettings.blacklist_channels.contains(tl_channel.getId().toString()) + if (settings.whitelist_channels != null) { + download = settings.whitelist_channels.contains(tl_channel.getId().toString()) + } else if (settings.blacklist_channels != null) { + download = !settings.blacklist_channels.contains(tl_channel.getId().toString()) } val channel = Channel(id=tl_channel.getId(), access_hash=tl_channel.getAccessHash(), title=tl_channel.getTitle(), obj=tl_peer_channel, download=download) if (tl_channel.getMegagroup()) { diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/IniSettings.kt b/src/main/kotlin/de/fabianonline/telegram_backup/IniSettings.kt deleted file mode 100644 index 3fe4ba9..0000000 --- a/src/main/kotlin/de/fabianonline/telegram_backup/IniSettings.kt +++ /dev/null @@ -1,72 +0,0 @@ -package de.fabianonline.telegram_backup - -import java.io.File -import org.slf4j.LoggerFactory -import org.slf4j.Logger - -class IniSettings(val file_base: String) { - val logger = LoggerFactory.getLogger(IniSettings::class.java) - var settings = mutableMapOf>() - - init { - loadIni(file_base + "config.ini") - copySampleIni(file_base + "config.sample.ini") - } - - private fun loadIni(filename: String) { - val file = File(filename) - logger.trace("Checking ini file {}", filename.anonymize()) - if (!file.exists()) return - logger.debug("Loading ini file {}", filename.anonymize()) - file.forEachLine { parseLine(it) } - } - - private fun parseLine(original_line: String) { - 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=="") { - settings.remove(key) - } else { - var map = settings.get(key) - if (map == null) { - map = mutableListOf() - settings.put(key, map) - } - map.add(value) - } - } - - private fun copySampleIni(filename: String) { - val stream = Config::class.java.getResourceAsStream("/config.sample.ini") - File(filename).outputStream().use { stream.copyTo(it) } - stream.close() - } - - 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") -} diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/Settings.kt b/src/main/kotlin/de/fabianonline/telegram_backup/Settings.kt index 9cce5eb..0afc136 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/Settings.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/Settings.kt @@ -5,25 +5,41 @@ 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> + val 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) + val gmaps_key = get_setting_string("gmaps_key", default=Config.SECRET_GMAPS) + val pagination = get_setting_boolean("pagination", default=true) + val pagination_size = get_setting_int("pagination_size", default=Config.DEFAULT_PAGINATION) + val download_media = get_setting_boolean("download_media", default=true) + val download_channels = get_setting_boolean("download_channels", default=false) + val download_supergroups = get_setting_boolean("download_supergroups", default=false) + val whitelist_channels = get_setting_list("whitelist_channels") + val blacklist_channels = get_setting_list("blacklist_channels") + + + private fun get_setting_string(name: String, default: String): String { + return ini_settings[name]?.last() ?: cli_settings.values[name] ?: default } - private fun get_setting(name: String, default: String? = null): Setting { - return Setting.build(name, ini_settings[name], cli_settings.values[name], default) + private fun get_setting_int(name: String, default: Int): Int { + return ini_settings[name]?.last()?.toInt() ?: cli_settings.values[name]?.toInt() ?: default + } + + private fun get_setting_boolean(name: String, default: Boolean): Boolean { + return ini_settings[name]?.last()?.toBoolean() ?: cli_settings.values[name]?.toBoolean() ?: default + } + + private fun get_setting_list(name: String): List? { + return ini_settings[name] } private fun load_ini(filename: String): Map> { @@ -63,39 +79,7 @@ class Settings(val file_base: String, val database: Database, val cli_settings: 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) { diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/TelegramUpdateHandler.kt b/src/main/kotlin/de/fabianonline/telegram_backup/TelegramUpdateHandler.kt index 0b3073a..f65b71e 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/TelegramUpdateHandler.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/TelegramUpdateHandler.kt @@ -28,14 +28,14 @@ import de.fabianonline.telegram_backup.mediafilemanager.AbstractMediaFileManager import de.fabianonline.telegram_backup.mediafilemanager.FileManagerFactory import org.slf4j.LoggerFactory -internal class TelegramUpdateHandler(val user_manager: UserManager, val db: Database) : UpdateCallback { +internal class TelegramUpdateHandler(val user_manager: UserManager, val db: Database, val file_base: String, val settings: Settings) : UpdateCallback { val logger = LoggerFactory.getLogger(TelegramUpdateHandler::class.java) override fun onUpdates(client: TelegramClient, updates: TLUpdates) { logger.debug("onUpdates - " + updates.getUpdates().size + " Updates, " + updates.getUsers().size + " Users, " + updates.getChats().size + " Chats") for (update in updates.getUpdates()) { - processUpdate(update, client) + processUpdate(update) logger.debug(" " + update.javaClass.getName()) } db.saveUsers(updates.getUsers()) @@ -45,7 +45,7 @@ internal class TelegramUpdateHandler(val user_manager: UserManager, val db: Data override fun onUpdatesCombined(client: TelegramClient, updates: TLUpdatesCombined) { logger.debug("onUpdatesCombined") for (update in updates.getUpdates()) { - processUpdate(update, client) + processUpdate(update) } db.saveUsers(updates.getUsers()) db.saveChats(updates.getChats()) @@ -53,7 +53,7 @@ internal class TelegramUpdateHandler(val user_manager: UserManager, val db: Data override fun onUpdateShort(client: TelegramClient, update: TLUpdateShort) { logger.debug("onUpdateShort") - processUpdate(update.getUpdate(), client) + processUpdate(update.getUpdate()) logger.debug(" " + update.getUpdate().javaClass.getName()) } @@ -76,7 +76,7 @@ internal class TelegramUpdateHandler(val user_manager: UserManager, val db: Data message.getEntities(), null, null) val vector = TLVector(TLAbsMessage::class.java) vector.add(msg) - db.saveMessages(vector, Kotlogram.API_LAYER) + db.saveMessages(vector, Kotlogram.API_LAYER, settings=settings) System.out.print('.') } @@ -109,7 +109,7 @@ internal class TelegramUpdateHandler(val user_manager: UserManager, val db: Data m.getEntities(), null, null) val vector = TLVector(TLAbsMessage::class.java) vector.add(msg) - db.saveMessages(vector, Kotlogram.API_LAYER) + db.saveMessages(vector, Kotlogram.API_LAYER, settings=settings) System.out.print('.') } @@ -121,15 +121,15 @@ internal class TelegramUpdateHandler(val user_manager: UserManager, val db: Data logger.debug("onUpdateTooLong") } - private fun processUpdate(update: TLAbsUpdate, client: TelegramClient) { + private fun processUpdate(update: TLAbsUpdate) { if (update is TLUpdateNewMessage) { val abs_msg = update.getMessage() val vector = TLVector(TLAbsMessage::class.java) vector.add(abs_msg) - db.saveMessages(vector, Kotlogram.API_LAYER) + db.saveMessages(vector, Kotlogram.API_LAYER, settings=settings) System.out.print('.') if (abs_msg is TLMessage) { - val fm = FileManagerFactory.getFileManager(abs_msg, user_manager) + val fm = FileManagerFactory.getFileManager(abs_msg, user_manager, file_base, settings) if (fm != null && !fm.isEmpty && !fm.downloaded) { try { fm.download() diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/exporter/HTMLExporter.kt b/src/main/kotlin/de/fabianonline/telegram_backup/exporter/HTMLExporter.kt index 586c37f..ee61236 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/exporter/HTMLExporter.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/exporter/HTMLExporter.kt @@ -37,11 +37,11 @@ import de.fabianonline.telegram_backup.* import org.slf4j.Logger import org.slf4j.LoggerFactory -class HTMLExporter(val db: Database, val user: UserManager, val ini: IniSettings, val file_base: String) { +class HTMLExporter(val db: Database, val user: UserManager, val settings: Settings, val file_base: String) { @Throws(IOException::class) fun export() { try { - val pagination = if (ini.pagination) ini.pagination_size else -1 + val pagination = if (settings.pagination) settings.pagination_size else -1 // Create base dir logger.debug("Creating base dir") diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt index f082df0..bc2034e 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt @@ -21,6 +21,7 @@ import de.fabianonline.telegram_backup.Config import com.github.badoualy.telegram.tl.api.* import com.github.badoualy.telegram.tl.exception.RpcErrorException +import de.fabianonline.telegram_backup.Settings import java.io.IOException import java.io.File diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/FileManagerFactory.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/FileManagerFactory.kt index fb1224d..8248f15 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/FileManagerFactory.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/FileManagerFactory.kt @@ -29,6 +29,7 @@ import com.github.badoualy.telegram.tl.api.* import com.github.badoualy.telegram.tl.api.upload.TLFile import com.github.badoualy.telegram.tl.exception.RpcErrorException import com.github.badoualy.telegram.tl.api.request.TLRequestUploadGetFile +import de.fabianonline.telegram_backup.Settings import java.io.IOException import java.io.File @@ -41,7 +42,7 @@ import java.util.concurrent.TimeoutException import org.apache.commons.io.FileUtils object FileManagerFactory { - fun getFileManager(m: TLMessage?, u: UserManager, file_base: String): AbstractMediaFileManager? { + fun getFileManager(m: TLMessage?, u: UserManager, file_base: String, settings: Settings?): AbstractMediaFileManager? { if (m == null) return null val media = m.getMedia() ?: return null @@ -53,7 +54,7 @@ object FileManagerFactory { StickerFileManager(m, u, file_base) } else d } else if (media is TLMessageMediaGeo) { - return GeoFileManager(m, u, file_base) + return GeoFileManager(m, u, file_base, settings) } else if (media is TLMessageMediaEmpty) { return UnsupportedFileManager(m, u, file_base, "empty") } else if (media is TLMessageMediaUnsupported) { diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt index 2d68c3c..a47041c 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt @@ -18,14 +18,15 @@ package de.fabianonline.telegram_backup.mediafilemanager import de.fabianonline.telegram_backup.UserManager import de.fabianonline.telegram_backup.DownloadManager -import de.fabianonline.telegram_backup.IniSettings import com.github.badoualy.telegram.tl.api.* +import de.fabianonline.telegram_backup.Config +import de.fabianonline.telegram_backup.Settings import java.io.IOException import java.io.File -class GeoFileManager(msg: TLMessage, user: UserManager, file_base: String) : AbstractMediaFileManager(msg, user, file_base) { +class GeoFileManager(msg: TLMessage, user: UserManager, file_base: String, val settings: Settings?) : AbstractMediaFileManager(msg, user, file_base) { protected lateinit var geo: TLGeoPoint // We don't know the size, so we just guess. @@ -59,7 +60,7 @@ class GeoFileManager(msg: TLMessage, user: UserManager, file_base: String) : Abs "center=${geo.getLat()},${geo.getLong()}&" + "markers=color:red|${geo.getLat()},${geo.getLong()}&" + "zoom=14&size=300x150&scale=2&format=png&" + - "key=" + IniSettings.gmaps_key + "key=" + (settings?.gmaps_key ?: Config.SECRET_GMAPS) return DownloadManager.downloadExternalFile(targetPathAndFilename, url) } }