1
0
mirror of https://github.com/fabianonline/telegram_backup.git synced 2024-12-25 14:25:35 +00:00

The code is now compiling, but still largely untested. So it's still kinda WIP.

This commit is contained in:
Fabian Schlenz 2018-04-09 06:07:53 +02:00
parent 77efde1136
commit ec4097e777
14 changed files with 105 additions and 207 deletions

View File

@ -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 <x>' to use account <x>.\n" +
"Use '--list-accounts' to see all available accounts."))
System.exit(1)
}
if (found_account == null) {

View File

@ -17,27 +17,24 @@ package de.fabianonline.telegram_backup
class CommandLineOptions(args: Array<String>) {
val booleans = mutableListOf<String>()
val values = mutableMapOf<String, MutableList<String>>()
val values = mutableMapOf<String, String>()
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<String>()
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!!)
}
}

View File

@ -53,7 +53,7 @@ class CommandLineRunner(args: Array<String>) {
}
fun setupLogging() {
if (options.booleans.hasKey('anonymize')) {
if (options.booleans.contains("anonymize")) {
Utils.anonymize = true
}
@ -76,13 +76,13 @@ class CommandLineRunner(args: Array<String>) {
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)
}
}

View File

@ -245,14 +245,14 @@ class Database constructor(val file_base: String, val user_manager: UserManager)
val map = mutableMapOf<String, String>()
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<TLAbsMessage>, api_layer: Int, source_type: MessageSource = MessageSource.NORMAL) {
fun saveMessages(all: TLVector<TLAbsMessage>, 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 (?, ?)")

View File

@ -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(".")

View File

@ -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)
}

View File

@ -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<Int> {
@ -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()) {

View File

@ -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<String, MutableList<String>>()
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<String> = 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<String>()
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<String>? = 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<String> = settings.get(key) ?: listOf<String>()
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")
}

View File

@ -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<String, Setting>()
val gmaps_key: Setting
private val db_settings: Map<String, String>
private var ini_settings: Map<String, List<String>>
val ini_settings: Map<String, List<String>>
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<String>? {
return ini_settings[name]
}
private fun load_ini(filename: String): Map<String, List<String>> {
@ -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<String>?, source: SettingSource) {
companion object {
val all = mutableListOf<Setting>()
fun build(name: String, ini_value: List<String>?, cli_value: List<String>?, default: String?): Setting {
var value: List<String>?
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) {

View File

@ -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>(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>(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>(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()

View File

@ -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")

View File

@ -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

View File

@ -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) {

View File

@ -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)
}
}