import twitter, codecs

SEED = ["pudo", 
		"hdready", 
		"mad2000", 
		"Riiike", 
		"CaKiba", 
		"Julemond", 
		"reVLis", 
		"vodzup", 
		"daphne_fielding", 
		"an_ro", 
		"McRoomie", 
		"diggi", 
		"Lennedy", 
		"Schuhaholic", 
		"MichaG", 
		"de_nial", 
		"koelibri", 
		"krik", 
		"mksm", 
		"brandi3000", 
		"Thommyjb", 
		"benikrama", 
		"_Eva__", 
		"tim_my", 
		"Ohrentoast", 
		"nihilz", 
		"aleboehm", 
		"Sabbikini", 
		"schessie", 
		"Isus"]


class FGraph():
	ACCOUNTS = []
	DEPTH = 2
	
	def __init__(self):
		self.viz = codecs.open("matrikel.viz", mode="w", encoding="utf-8")
		self.csv = codecs.open("matrikel.csv", mode="w", encoding="utf-8")
		self.fail_over()
		self.nodes = {}
		self.popularity = {}
		self.edges = []
	
	def fail_over(self):
		acct = self.ACCOUNTS.pop()
		self.api = twitter.Api(username=acct[0], password=acct[1])
			
	def include_person(self, name, rdepth):
		print "U: %s" % name
		if rdepth == 0: 
			return
		
		self.seen = self.seen + [name]
		try:
			for friend in self.api.GetFriends(name):
				if not friend.screen_name in self.nodes.keys():
					self.nodes[friend.screen_name] = friend.name
					self.popularity[friend.screen_name] = 1
				else:
					self.popularity[friend.screen_name] = self.popularity[friend.screen_name] + 1
				self.edges = self.edges + [[name, friend.screen_name]]
				if friend.screen_name not in self.seen:
					self.include_person(friend.screen_name, rdepth - 1)
		except:
			self.fail_over()
			
	def is_member(self, name):
		return True
		if name in self.roots:
			return True
		if not name in self.popularity.keys():
			return False
		if self.popularity[name] < 2:
			return False
		return True
	
	def crawl(self, roots):	
		self.seen = roots
		self.roots = roots
		self.viz.write("""
digraph "amw05 twitter" {
	outputorder = nodesfirst;
	ratio = 0.6; 
	overlap=false; 
	node [fontsize=12,fontname=Sans];

""")
		for person in roots:
			self.include_person(person, self.DEPTH)
			
		for (screen_name, name) in self.nodes.items():
			if self.is_member(screen_name):
				self.viz.write("_%s [label=\"%s: %s\"]\n" % (screen_name, screen_name, name))
				self.csv.write("%s\t%d\n" % (screen_name, self.popularity[screen_name]))
			else:
				print "discarded %s" % screen_name
				#self.viz.write("//_%s [label=\"%s: %s\"]\n" % (screen_name, screen_name, name))
		
		for (fro, to) in self.edges:
			if self.is_member(fro) and self.is_member(to):
				self.viz.write("_%s -> _%s;\n" % (fro, to))
			else:
				pass
				#self.viz.write("//_%s -> _%s;\n" % (fro, to))
			
		self.viz.write("}\n")
		self.viz.close()
		self.csv.close()
		
fg = FGraph()
fg.crawl(SEED)