# -*- mode: python; -*-

import subprocess

processor.maildir_base = "~/Maildir"
processor.auto_reload_rcfile = True

def is_to_or_from(mail,address):
	"""
	Return true if [mail] is to or from an address that contains [address].
	"""
	return (
		mail["From"].contains(address)
		or mail.target.contains(address))
def is_to_or_from_re(mail,address):
	"""
	Return true if [mail] is to or from an address that matches the
	regex [address].
	"""
	return (
		mail["From"].matches(address)
		or mail.target.matches(address))
	
def bogofilter_auto(mail):
	p = subprocess.Popen(
		["bogofilter", "-u", "-v", "-I", mail.path],
		stdout=subprocess.PIPE,
		stderr=subprocess.STDOUT)
	(output, _) = p.communicate()
	processor.log("*** Bogofilter result: {0!r}".format(output.rstrip()))
	if p.returncode not in [0, 1, 2]:
		processor.log_error(
			"Error running bogofilter: Return code = {0!r}".format(
				p.returncode))
	return p.returncode

def bogofilter_ham(mail):
	subprocess.call(["bogofilter", "-S", "-n", "-I", mail.path])

def bogofilter_spam(mail):
	subprocess.call(["bogofilter", "-N", "-s", "-I", mail.path])

def handle_incoming_spam_training(mail):
	bogofilter_spam(mail)
	mail.move(".Bulk Mail")

def handle_incoming_ham_training(mail):
	bogofilter_ham(mail)
	mail.move(".Ham")

def handle_incoming_ham(mail):
	my_filters(mail)

def handle_incoming_unknown(mail):
	# Filter spam
	
	spam = bogofilter_auto(mail)
	if spam == 0:
		mail.move(".Bulk Mail")
		return
	elif spam == 1:
		mail.move(".Ham")
		return
	elif spam == 2:
		# maybe spam
		my_filters(mail)
		return
	else:
		mail.move(".Error")
		return

def my_filters(mail):
	# Sort into software mailing lists
	
	if (
		False
		or mail["List-Id"].matches("bug-gsrc\.gnu\.org")
		or mail["Subject"].contains("bug-gsrc")
		):			
		mail.move(".software.bug-gsrc")
		return
	
	if mail["List-Id"].matches("bug-make\.gnu\.org"):
		mail.move(".software.bug-make")
		return
	
	if mail["List-Id"].matches("help-make\.gnu\.org"):
		mail.move(".software.help-make")
		return
	
	if mail["List-Id"].matches("social(|-discuss)\.gnu\.org"):
		mail.move(".software.social")
		return

	if mail["List-ID"].matches("maintenance.lists.parabolagnulinux.org"):
		mail.move(".software.parabola-maintenance")
		return
	if (
		False
		or mail["List-ID"].matches("parabolagnulinux.org")
		or is_to_or_from(mail,     "parabolagnulinux.org")
		):
		mail.move(".software.parabola-dev")
		return
	
	# Sort email from some social websites
	
	if mail["From"].matches("@facebook(|mail)\.com"):
		mail.move(".Social.Facebook")
		return
	
	if (
		False
		or mail["From"].matches("identi\.ca")
		or mail["From"].matches("statusnet")
		):
		mail.move(".Social.Identica")
		return
	
	if mail["From"].matches("twitter\.com"):
		mail.move(".Social.Twitter")
		return
	
	if mail["From"].matches("@xkcd\.com"):
		mail.move(".Social.xkcd")
		return
	
	# Sort email related to Troop 276

	if (
		False
		or mail["List-Id"].contains("troopmailinglist.troop276.net")
		or is_to_or_from(mail,"t276_announcements@att.net")
		or mail["Subject"].matches("troop")
		or mail["Subject"].matches("merit\s*badge")
		or is_to_or_from(mail,"jsting@sbcglobal.net")
		or is_to_or_from(mail,"trdindy@comcast.net")
		or is_to_or_from(mail,"wjensen111@aol.com")
		or is_to_or_from(mail,"dhoyt@yourhomecompany.com")
		or is_to_or_from(mail,"salupo_vincent_p@lilly.com")
		or is_to_or_from(mail,"basu@maharjan.org")
		or is_to_or_from(mail,"muellerindy@yahoo.com")
		or is_to_or_from(mail,"solorzano.luis@rocketmail.com")
		or is_to_or_from(mail,"eldredmac@comcast.net")# MacDonell
		or is_to_or_from(mail,"mitchprather@sbcglobal.net")
		or is_to_or_from(mail,"oa_wap@yahoo.com")
		):
		mail.move(".Troop276")
		return

	if mail["From"].matches("margieshu@sbcglobal\.net"):
		mail.move(".misc.Mom")
		return
	
	# Sort mail from robotics people
	for address in [
		"jeffreysmith@msdlt.k12.in.us",
		"jason.zielke@gmail.com",
		"allison.m.babcock@gmail.com",
		"william.walk@gmail.com",
		"BBonahoom@stanleyworks.com",
		"wcxctrack829@aim.com", # Pat
		"djnels1@comcast.net", # Dave and Julie Nelson
		"sarahlittell@comcast.net",
		"skiplittell@comcast.net",
		"dave.nelson@ecolab.com",
		"@ni.com",
		"@precisepath.com",
		"@usfirst.org",
		"gamefreak207@gmail.com", # Brett Leedy
		"tswilson4801@att.net",
		"justicejade10@aol.com",
		"silioso@gmail.com",
		"cdewalt3@yahoo.com",
		"bryanbonahoom@gmail.com",
		]:
		if is_to_or_from(mail,address):
			mail.move(".School.Robotics")
			return
	for subject_re in [
		"robotics",
		"1024",
		"kil-?a-?bytes",
		]:
		if mail["Subject"].matches(subject_re):
			mail.move(".School.Robotics")
			return

	# Sort mail from scoftware people
	for address in [
		"gnu.org",
		"gitorious.org",
		"sourceforge.com",
		"ietf.org",
		"kde.org",
		"trustees@core3.amsl.com",
		"esr@thyrsus.com",
		"canonical.org",
		"foocorp.net",
		"parabolagnulinux.org",
		"cnuk.org",
		]:
		if is_to_or_from(mail,address):
			mail.move(".software")
			return
	for subject_re in [
		"\[Stow-[^\]]*\].*",
		]:
		if mail["Subject"].matches(subject_re):
			mail.move(".software")
			return

	for address in [
		"nintendo.com",
		"nintendo-news.com",
		]:
		if mail["From"].contains(address):
			mail.move(".Nintendo")
			return
	
	for address in [
		"@lpi.org",
		"@pearson.com",
		"CompTIA",
		]:
		if mail["From"].contains(address):
			mail.move(".CompTIA")
			return

	if mail["From"].contains("@lnnorthstar.org"):
		mail.move(".School.Newspaper")
		return

	if mail["From"].contains("susyphil@aol.com"):
		mail.move(".PMCH")

	for address in [
		"d.farrar@comcast.net",
		"dfarrar@avacoustics.net",
		"@vmware.com",
		]:
		if is_to_or_from(mail,address):
			mail.move(".Work.FAST")
			return

	# Sort misc newsletters
	
	if (
		False
		or mail["From"].contains("newsletter")
		or mail["From"].contains("auto@comicsbyemail.com")
		or mail["From"].contains("oreilly.com")
		or mail["Subject"].contains("newsletter")
		or mail["From"].contains("Info@mailing.jamendo.com")
		):
		mail.move(".misc.Newsletters")
		return

	if (
		False
		or mail["From"].contains("@msdlt.k12.in.us")
		or mail["From"].contains("naviance.com")
		or is_to_or_from(mail,"ibwhite@comcast.net")
		or mail["Subject"].contains("IOA")
		or mail["From"].contains("nths.org")
		or mail["Subject"].contains("NTHS")
		or mail["Subject"].contains("National Technical Honor Society")
		or mail["Subject"].contains("NHS")
		or mail["Subject"].contains("National Honor Society")
		):
		mail.move(".School")
		return
	
	# from college stuff
	if (
		False
		or mail["Subject"].contains("NYLF") # National Youth Leadership Conference
		or mail["Subject"].contains("NSHSS")
		):
		mail.move(".College.Societies")
		return	
	if (
		False
		or mail["From"].contains(".edu")
		or mail["From"].contains("admissions@")
		or mail["From"].contains("college")
		or mail["From"].contains("university")
		or mail["Subject"].contains("college")
		# now we get to the BS
		or mail["From"].contains("@dreamitdoitindiana.com")
		or mail["From"].contains("@indianatechinfo.org")
		):
		mail.move(".College")
		return
	
	if mail["From"].contains("@projectwonderful.com"):
		mail.move(".ProjectWonderful")
		return

	if (
		False
		or mail["From"].matches("@localhost")
		or mail["From"].matches("@[^,>]*\.local")
		or mail["From"].matches("@[^,>]*\.lukeshu\.ath\.cx")
		or mail["To"].matches("luke@")
		):
		mail.move(".LocalSystems")
		return
	if (
		False
		or mail["Subject"].contains("password")
		or mail["Subject"].contains("account")
		):
		mail.move(".misc.accounts")
		return

handle_mapping = {
	".":              handle_incoming_unknown,
	".spam-training": handle_incoming_spam_training,
	".ham-training":  handle_incoming_ham_training,
	".Ham":           handle_incoming_ham,
	}
processor.maildirs = handle_mapping.keys()
for mail in processor:
	handle_mapping[mail.maildir](mail)