import sys,re,math
import os, os.path
import rfc822,nntplib,cPickle
try:
	import jwzthreading as jwzthreads
except:
	print "get jwzthreading from http://www.amk.ca/python/code/jwz"

if not os.path.exists(".cache/"): os.mkdir(".cache/");

def loadNewsData(server, group, lookback = 512):
	cache = ".cache/"+group+"/"
	conn = nntplib.NNTP(server)
	resp, count, first, last, name = conn.group(group)

	if not os.path.exists(cache): os.mkdir(cache)
	
	first = str(max(int(last) - lookback + 1, int(first)))
	hdrcache = cache + first + "-" + last + "-hdrs.pickle"
	
	if(os.path.exists(hdrcache)):
		return cPickle.load(open(hdrcache))
	
	first = max(int(last) - 512, int(first))
	xover = conn.xover(str(first), str(last))
	cPickle.dump(xover, open(hdrcache, "w"))
	return xover

class MyMessage (jwzthreads.Message):
    __slots__ = ['id', 'sender', 'date', 'size']

def new_message(entry):
	m = MyMessage()
	(m.id, m.subject, m.sender, m.date, m.message_id, m.references, m.size, null) = entry
	return m

def recurse_thread(container, msg_cb, combine_cb):
	result = 0
	if(container.message):
		result = msg_cb(container.message)
	reduce(combine_cb, [recurse_thread(each, msg_cb, combine_cb) for each in container.children], result)
	return result

xover = loadNewsData('news.gmane.org', 'gmane.org.user-groups.linux.ilugc')
messages = [new_message(entry) for entry in xover[1]]
threads = jwzthreads.thread(messages)
challenge = filter(lambda m : recurse_thread(m, lambda msg: not msg.sender.startswith("Kenneth Gonsalves"), lambda a,b: a and b), 
				filter(lambda m : recurse_thread(m, lambda msg: rfc822.parsedate(msg.date)[:2] == (2007,3), lambda a,b: a or b), 
								[threads[v] for v in threads]))


for each in [v.message for v in challenge]:
	print "(%s) %s: %s by %s" % (each.id, each.date, each.subject, each.sender)
	# http://permalink.gmane.org/gmane.org.user-groups.linux.ilugc/<id>
