def __init__(self): bar = BARS['userlist'] super( UserlistView, self ).__init__(u"Lista użytkowników", bar = bar ) self._about = self.AboutDialog( 5, 5 ) self._old = None numbers = [] for obj in Users(): text = "%10d: %-35s" % ( obj.ggnumber, obj.show ) self.add_menu_item( text, UserView( obj ) ) numbers.append( obj.ggnumber ) dir = FileManager._history_dir() dirs = [] for number in listdir( dir ): try: number = int( number ) except: # the file is not a GG number, so it's not a history file continue if number in numbers: continue dirs.append( number ) dirs.sort() for number in dirs: text = "%10s: %-35s" % ( number, '' ) self.add_menu_item( text, UserView( obj ) ) self.refresh()
def __init__(self): bar = BARS['userlist'] super(UserlistView, self).__init__(u"Lista użytkowników", bar=bar) self._about = self.AboutDialog(5, 5) self._old = None numbers = [] for obj in Users(): text = "%10d: %-35s" % (obj.ggnumber, obj.show) self.add_menu_item(text, UserView(obj)) numbers.append(obj.ggnumber) dir = FileManager._history_dir() dirs = [] for number in listdir(dir): try: number = int(number) except: # the file is not a GG number, so it's not a history file continue if number in numbers: continue dirs.append(number) dirs.sort() for number in dirs: text = "%10s: %-35s" % (number, '') self.add_menu_item(text, UserView(obj)) self.refresh()
def SQL_MSG(uid): global _SQL_MSG uid = strip_gg(uid) if not _SQL_MSG.has_key(uid): _SQL_MSG[uid] = sqlite3.connect(FileManager._gg_history_sql_of(uid)) create_tables_msg( _SQL_MSG[uid] ) _SQL_MSG[uid].text_factory = unicode _SQL_MSG[uid].row_factory = sqlite3.Row return _SQL_MSG[uid]
def show_number(self, ggnumber): if FileManager.has_history( ggnumber ): sql = SQL() query = 'select * from users where ggnumber=:ggnumber;' ret = sql.execute(query, {'ggnumber' : ggnumber }) row = ret.fetchone() user = User(row, ggnumber) view = UserView( user ) self.clear() view() else: self.refresh() ROText(1, 0, u'Nie znaleziono histori dla podanego numeru.', u'Błąd' ).run()
def show_number(self, ggnumber): if FileManager.has_history(ggnumber): sql = SQL() query = 'select * from users where ggnumber=:ggnumber;' ret = sql.execute(query, {'ggnumber': ggnumber}) row = ret.fetchone() user = User(row, ggnumber) view = UserView(user) self.clear() view() else: self.refresh() ROText(1, 0, u'Nie znaleziono histori dla podanego numeru.', u'Błąd').run()
def is_cache_needed(ggnumber): """is_cache_needed(ggnumber) -> bool Is new cache for the GG number needed. """ sql = SQL() query = 'select seek from cache_info where ggnumber=:ggnumber' tab = { 'ggnumber' : ggnumber, } try: seek = sql.execute( query, tab ).fetchall()[0][0] except: return True fp = open(FileManager.history_of(ggnumber), "rb") fp.seek(0, 2) #seek to the end if seek != fp.tell(): return True else: return False
def cache_history( number ): """cache_history( number ) -> None Update cache for the specific user. number - GG number of the person to reloads cache """ def create_time(text): if EKG_CONFIG.get('log_timestamp') != None: time_struct = time.strptime(text, EKG_CONFIG.get('log_timestamp')) return time.mktime(time_struct) else: return int(text) main_sql = SQL() ret = main_sql.execute( 'select seek from cache_info where ggnumber=:ggnumber', {'ggnumber':number} ) row = ret.fetchone() if row != None: offset = row[0] else: offset = 0 sql = SQL_MSG(number) if not FileManager.has_history(number): return file = open(FileManager.history_of(number), "rb") file.seek(offset) reader = GaduReader(file, encoding=FileManager.history_encoding) loop = -1 for row in reader: try: #jeśli jest już taki rekord, to nie dodawaj nowego query = 'select * from msg where time=:time' tab = {} if row[0] in ['chatsend', 'msgsend']: tab['msg'] = row[4] tab['time'] = create_time(row[3]) else: tab['msg'] = row[5] tab['time'] = create_time(row[4]) ret = sql.execute(query,tab) rows = ret.fetchall() if len(rows) > 0: continue #-------------------------------- loop += 1 if row[0] == 'status': tab = { 'type' : row[0], #'ggnumber' : int( strip_gg( row[1] ) ), 'nick' : row[2], 'ip' : row[3], 'time' : create_time( row[4] ), 'status' : row[5], } if len( row ) > 6: tab['descr'] = row[6] else: tab['descr'] = None query = '''insert into msg( type, nick, ip, time, status, descr ) values ( :type, :nick, :ip, datetime(:time, 'unixepoch'), :status, :descr);''' elif row[0] in ['chatrecvign', 'msgrecvign', 'chatrecv', 'msgrecv', 'chatrcv']: tab = { 'type' : row[0], #'ggnumber' : int( strip_gg( row[1] ) ), 'nick' : row[2], 'time' : create_time( row[3] ), 'send_time' : create_time( row[4] ), 'msg' : row[5], } query = '''insert into msg( type, nick, time, send_time, msg ) values ( :type, :nick, datetime(:time, 'unixepoch'), :send_time, :msg);''' elif row[0] in ['chatsend', 'msgsend']: tab = { 'type' : row[0], #'ggnumber' : int( strip_gg( row[1] ) ), 'nick' : row[2], 'time' : create_time( row[3] ), 'msg' : row[4], } query = '''insert into msg( type, nick, time, msg ) values ( :type, :nick, datetime(:time, 'unixepoch'), :msg);''' else: raise ValueError('Unknown row type [%s] in %s when reading line %d from %s.' % (row[0], str(row), loop, str(file))) sql.execute( query, tab ) except IndexError: raise ValueError('Row %s has less fields (%d) than expected when reading ' 'line %d from %s, counting from byte %d.' % (str(row), len(row), loop, str(file), offset)) except UnicodeEncodeError: print 'Unicode Encoding Error in %s when reading line %d from %s, couting from byte %d.' % (str(row), loop, str(file), offset) #raise ValueError('Unicode Encoding Error in %s when reading line %d from %s, ' # 'couting from byte %d.' % (str(row), loop, str(file), offset)) except ValueError: print "Error in line %d: '%s'. Probalby wrong timestamp." % (loop, str(row) ) from datetime import datetime tab = { 'ggnumber' : number, 'seek' : file.tell(), } try: query = 'insert into cache_info values ( :ggnumber, :seek );' main_sql.execute( query, tab ) except sqlite3.IntegrityError: query = 'update cache_info set seek=:seek where ggnumber=:ggnumber;' main_sql.execute( query, tab ) main_sql.commit() sql.commit()