#!/usr/bin/python import os.path, re, time def parse(f): ret = [] date = None date_re = re.compile('^--- (Log opened|Log closed|Day changed)' + \ ' [^ ]+ ([^ ]+) (\d+) (?:([^ ]+) |)(\d+)') archi_re = re.compile('^(\d+):(\d+).*-!- ([^ ]+) \[.*\] has (joined|quit).*') for line in file(f, 'r').readlines(): m = date_re.match(line) if m: if not m.group(4): date = time.mktime(time.strptime('%s %s %s' % ( m.group(2), m.group(3), m.group(5)), '%b %d %Y')) else: date = time.mktime(time.strptime('%s %s %s %s' % ( m.group(2), m.group(3), m.group(4), m.group(5)), '%b %d %H:%M:%S %Y')) if m.group(1) == 'Log opened': ret.append((date, 'opened')) elif m.group(1) == 'Log closed': ret.append((date, 'closed')) continue m = archi_re.match(line) if m: if m.group(3).startswith('arch') and date: ret.append((date + int(m.group(1)) * 1440 + int(m.group(2)) * 60, m.group(4))) continue return ret events = parse(os.path.expanduser('~/irclogs/freenode/##gaf.log')) events += parse(os.path.expanduser('~/irclogs/freenode/#gaf.log')) events.sort() START = events[0][0] - time.localtime(events[0][0]).tm_wday * 86400 START = int(time.mktime(time.strptime(time.strftime('%b %d %Y', time.localtime(START)), '%b %d %Y'))) END = events[-1][0] - time.localtime(events[-1][0]).tm_wday * 86400 + 86400 * 7 END = int(time.mktime(time.strptime(time.strftime('%b %d %Y', time.localtime(END)), '%b %d %Y'))) events.reverse() print time.ctime(START) print time.ctime(END) print (END - START) / 86400 / 7, 'weeks' events.append((0, 'closed')) from PIL import Image im = Image.new('RGB', (7 * 24 * 4, (END - START) / 86400 / 7)) date = START while events: while events and events[-1][0] < date: state = events.pop()[1] im.putpixel(( (date - START) / (15*60) % (7 * 24 * 4), (date - START) / (15*60) / (7 * 24 * 4)), { 'closed': (128,128,128), 'opened': (128,128,128), 'joined': (0,0,255), 'quit': (0,0,0)}.get(state)) date += 15 * 60 im = im.resize((im.size[0] * 2, im.size[1]*5)) im.save(os.path.expanduser('~/tmp/archimedes.png'), 'PNG')