From 41f8fc80c52e55cc5e15cc2cd06a5b1bd654b3e8 Mon Sep 17 00:00:00 2001 From: Fabian Schlenz Date: Sat, 9 Jul 2016 12:19:36 +0200 Subject: [PATCH] WIP: Added StatsExporter. --- .../CommandLineController.java | 4 + .../telegram_backup/Database.java | 36 ++++++++ .../exporter/StatsExporter.java | 85 +++++++++++++++++++ .../resources/templates/stats/index.mustache | 85 +++++++++++++++++++ 4 files changed, 210 insertions(+) create mode 100644 src/main/java/de/fabianonline/telegram_backup/exporter/StatsExporter.java create mode 100644 src/main/resources/templates/stats/index.mustache diff --git a/src/main/java/de/fabianonline/telegram_backup/CommandLineController.java b/src/main/java/de/fabianonline/telegram_backup/CommandLineController.java index f61b369..555ccd3 100644 --- a/src/main/java/de/fabianonline/telegram_backup/CommandLineController.java +++ b/src/main/java/de/fabianonline/telegram_backup/CommandLineController.java @@ -18,6 +18,7 @@ package de.fabianonline.telegram_backup; import de.fabianonline.telegram_backup.TelegramUpdateHandler; import de.fabianonline.telegram_backup.exporter.HTMLExporter; +import de.fabianonline.telegram_backup.exporter.StatsExporter; import com.github.badoualy.telegram.api.Kotlogram; import com.github.badoualy.telegram.api.TelegramApp; @@ -95,6 +96,9 @@ public class CommandLineController { if (options.export.toLowerCase().equals("html")) { (new HTMLExporter()).export(user); System.exit(0); + } else if (options.export.toLowerCase().equals("stats")) { + (new StatsExporter()).export(user); + System.exit(0); } else { show_error("Unknown export format."); } diff --git a/src/main/java/de/fabianonline/telegram_backup/Database.java b/src/main/java/de/fabianonline/telegram_backup/Database.java index a5dbe28..a7bb007 100644 --- a/src/main/java/de/fabianonline/telegram_backup/Database.java +++ b/src/main/java/de/fabianonline/telegram_backup/Database.java @@ -543,6 +543,41 @@ public class Database { } } + public int getMessagesFromUserCount() { + try { + ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM messages WHERE sender_id=" + user_manager.getUser().getId()); + rs.next(); + return rs.getInt(1); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public HashMap getMessageTypesWithCount() { + HashMap map = new HashMap(); + try { + ResultSet rs = stmt.executeQuery("SELECT message_type, COUNT(id) FROM messages GROUP BY message_type"); + while (rs.next()) { + map.put(rs.getString(1), rs.getInt(2)); + } + return map; + } catch (Exception e) { throw new RuntimeException(e); } + } + + public HashMap getMessageMediaTypesWithCount() { + HashMap map = new HashMap(); + try { + ResultSet rs = stmt.executeQuery("SELECT media_type, COUNT(id) FROM messages GROUP BY media_type"); + while (rs.next()) { + String s = rs.getString(1); + if (s==null) s="null"; + map.put(s, rs.getInt(2)); + } + return map; + } catch (Exception e) { throw new RuntimeException(e); } + } + + public LinkedList getListOfChatsForExport() { LinkedList list = new LinkedList(); try { @@ -560,6 +595,7 @@ public class Database { } } + public LinkedList getListOfDialogsForExport() { LinkedList list = new LinkedList(); try { diff --git a/src/main/java/de/fabianonline/telegram_backup/exporter/StatsExporter.java b/src/main/java/de/fabianonline/telegram_backup/exporter/StatsExporter.java new file mode 100644 index 0000000..a53f702 --- /dev/null +++ b/src/main/java/de/fabianonline/telegram_backup/exporter/StatsExporter.java @@ -0,0 +1,85 @@ +/* Telegram_Backup + * Copyright (C) 2016 Fabian Schlenz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + +package de.fabianonline.telegram_backup.exporter; + +import de.fabianonline.telegram_backup.UserManager; +import de.fabianonline.telegram_backup.Database; + +import java.io.File; +import java.io.PrintWriter; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.util.LinkedList; +import java.util.HashMap; +import java.util.Map; + +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; + +public class StatsExporter { + public void export(UserManager user) { + try { + Database db = new Database(user, null); + + // Create base dir + String base = user.getFileBase() + "export" + File.separatorChar + "stats" + File.separatorChar; + new File(base).mkdirs(); + + HashMap scope = new HashMap(); + + // Collect data + LinkedList dialogs = db.getListOfDialogsForExport(); + LinkedList chats = db.getListOfChatsForExport(); + + scope.put("count.chats", chats.size()); + scope.put("count.dialogs", dialogs.size()); + + int count_messages_chats = 0; + int count_messages_dialogs = 0; + for (Database.Chat c : chats) count_messages_chats += c.count; + for (Database.Dialog d : dialogs) count_messages_dialogs += d.count; + + scope.put("count.messages", count_messages_chats + count_messages_dialogs); + scope.put("count.messages.chats", count_messages_chats); + scope.put("count.messages.dialogs", count_messages_dialogs); + + scope.put("count.messages.from_me", db.getMessagesFromUserCount()); + + HashMap types; + types = db.getMessageTypesWithCount(); + for (Map.Entry entry : types.entrySet()) { + scope.put("count.messages.type." + entry.getKey(), entry.getValue()); + } + + types = db.getMessageMediaTypesWithCount(); + for (Map.Entry entry : types.entrySet()) { + scope.put("count.messages.media_type." + entry.getKey(), entry.getValue()); + } + + MustacheFactory mf = new DefaultMustacheFactory(); + Mustache mustache = mf.compile("templates/stats/index.mustache"); + FileWriter w = new FileWriter(base + "index.html"); + mustache.execute(w, scope); + w.close(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("Exception above!"); + } + } +} diff --git a/src/main/resources/templates/stats/index.mustache b/src/main/resources/templates/stats/index.mustache new file mode 100644 index 0000000..12bc41e --- /dev/null +++ b/src/main/resources/templates/stats/index.mustache @@ -0,0 +1,85 @@ +count.chats: {{count.chats}} +count.dialogs: {{count.dialogs}} +count.messages: {{count.messages}} +count.messages.chats: {{count.messages.chats}} +count.messages.dialogs: {{count.messages.dialogs}} +count.messages.from_me: {{count.messages.from_me}} + +count.messages.type.message: {{count.messages.type.message}} +count.messages.type.empty_message: {{count.messages.type.empty_message}} +count.messages.type.service_message: {{count.messages.type.service_message}} + +count.messages.media_type.null: {{count.messages.media_type.null}} +count.messages.media_type.photo:{{count.messages.media_type.photo}} +count.messages.media_type.audio:{{count.messages.media_type.audio}} +count.messages.media_type.video:{{count.messages.media_type.video}} +count.messages.media_type.geo:{{count.messages.media_type.geo}} +count.messages.media_type.document:{{count.messages.media_type.document}} +count.messages.media_type.sticker:{{count.messages.media_type.sticker}} +count.messages.media_type.venue:{{count.messages.media_type.venue}} +count.messages.media_type.contact:{{count.messages.media_type.contact}} + + + + + + + + + +
+
+
+ +