#!/usr/bin/env python # -*- encoding: utf-8 -*- from os import getenv, mkdir import sqlite3 as sqlite from time import localtime, strftime import codecs,sys import os.path if len(sys.argv)>1: database = sys.argv[1] else: database = getenv('HOME') + "/.local/share/gajim/logs.db" dumpdirname = os.path.splitext(os.path.basename(database))[0] print "using database %s" % database print "make shure there is no log file in ./%s because the files won't be erased before writing" % dumpdirname mkdir(dumpdirname) link = sqlite.connect(database) cur = link.cursor() result = cur.execute( """SELECT jids.jid, jids.type, logs.contact_name, logs.time, logs.kind, logs.show, logs.message, logs.subject FROM jids, logs WHERE jids.jid_id = logs.jid_id ORDER BY logs.time ASC;""") logs = {} file_pattern = "%s/gajim-%s.log" def mkline(log_id, line): try: file = logs[log_id] if file == None: raise KeyError except KeyError: # log_id may contain slashes -- think resource in MUC log_id = log_id.replace("/","_") filename = file_pattern % (dumpdirname,log_id) try: print "open %s" % filename logs[log_id] = codecs.open(filename, "a", "utf-8") except IOError: # Too many opened files print "purge opened files" for id in logs: logs[id].close() logs[id] = None print "open %s" % filename logs[log_id] = codecs.open(filename, "a", "utf-8") file = logs[log_id] file.write(line) file.write("\n") #print line for row in result: jid, type, contact_name, time, kind, show, message, subject = row t = localtime(time) time_str = strftime("%a %d %b %Y %H:%M:%S %Z", t) groupchat = (kind == 1 or kind == 2) privatechat = (kind == 4 or kind == 6) privatemsg = (kind == 5 or kind == 7) log_id = strftime("%Y%m", t) + "-" + jid if groupchat: log_id = "group-" + log_id else: if not contact_name:contact_name = jid else: contact_name = "%s|%s" % (jid, contact_name) if show == 0: show = "online" elif show == 1: show = "chat" elif show == 2: show = "away" elif show == 3: show = "xa" elif show == 4: show = "dnd" elif show == 5: show = "offline" if kind == 0: kind = "status" elif kind == 1: kind = "status" # groupchat elif kind == 2: kind = "msg" # groupchat elif kind == 3: kind = "recvmsg" # privatemsg elif kind == 4: kind = "recvchat" # privatechat elif kind == 5: kind = "sentmsg" # privatemsg elif kind == 6: kind = "sentchat" # privatechat elif kind == 7: kind = "error" if groupchat: prefix1 = "%s | %s |" % (time_str, jid) prefix2 = prefix1 else: prefix1 = "%s |" % time_str prefix2 = "%s %s" % (prefix1, ("[%s]" % show).ljust(9)) prefix3 = "%s %s" % (prefix2, ("<%s>" % contact_name).rjust(30)) if subject: line = prefix3 + " Subject: %s" % subject mkline(log_id, line) if kind == 'status': line = prefix1 + " status %s %s: %s" % (contact_name, show, message) elif kind == 'msg': line = prefix3 + " %s" % message elif kind == 'recvmsg': line = prefix3 + " [RM] %s" % message elif kind == 'recvchat': line = prefix3 + " [RC] %s" % message elif kind == 'sentmsg': line = prefix3 + " [SM] %s" % message elif kind == 'sentchat': line = prefix3 + " [SC] %s" % message else: line = prefix3 + " %s %s" % (("[%s]" % kind), message) mkline(log_id, line) # kate: space-indent on; indent-width 4; encoding: utf-8