# Lots of ugly hardcoded stuff...
# 'medlemsliste' is a file where each line is regexp to be matched by
# logins to identify people. (Look at the regexp object operator
# for an example.)

from socket import *
import string, sys, regex, regex_syntax, time
regex.set_syntax(regex_syntax.RE_SYNTAX_AWK)

kanal = '#python'
passord = ''

members = regex.compile('^[^ ]* part |^[^ ]* join |^[^ ]* quit |^[^ ]* kick |^[^ ]* nick ')
kicked = regex.compile('^[^ ]* kick '+kanal+' marvin')
command = regex.compile('^[^ ]* privmsg marvin ')
names = regex.compile('^[^ ]* 353 ')
ping = regex.compile('^ping ')
operator = regex.compile('sk@.*nvg\.ntnu\.no')
modechange = regex.compile('^[^ ]* mode ') 

HOST = 'irc.ifi.uio.no'
PORT = 6667
ircd = socket(AF_INET, SOCK_STREAM)
ircd.connect(HOST, PORT)
ircd.send('user sk trondviggo irc :sk@nuts.edu\n')
ircd.send('nick Marvin\n')
ircd.send('join ' + kanal + '\n')
server = ircd.makefile()

def borgarfix():
	global borgarliste
	borgar = open('medlemsliste', 'r')
	liste = borgar.readlines()
	borgar.close()
	borgarliste = []
	for line in liste:
		line = line[:-1]
		borgarliste.append(regex.compile(line))
	del(liste)

def order(ordre):
	global kanal, borgarliste

	#ordre[ person, privmsg, markivb, ordreord1, ..., ordreordn ]
	ordre = string.split(ordre)
	ordre[0] = ordre[0][1:]
	tmp = string.splitfields(ordre[0], '!')
	ordre[0] = tmp[0]
	ordre.insert(1, tmp[1])
	del(tmp)
	ordre[4] = ordre[4][1:]
	if ordre[1][0] == '^' or ordre[1][0] == '~' or ordre[1][0] == '-':
		ordre[1] = ordre[1][1:]

	if ordre[4] == 'shutdown':
		if admin(ordre[1]):
			logfile.close()
			sys.exit(0)
	elif ordre[4] == 'join':
		if admin(ordre[1]):
			ircd.send('join '+ordre[5]+'\n')
	elif ordre[4] == 'leave':
		if admin(ordre[1]):
			ircd.send('part '+ordre[5]+'\n')
	elif ordre[4] == 'who':
		liste = chanusers[-1]
		for a in range(len(chanusers)-1):
			liste = liste + ' ' + chanusers[a]
		ircd.send('notice '+ordre[0]+' :On '+kanal+': '+liste+'\n')
	elif ordre[4] == 'op':
		if borgar(ordre[1]):
			ircd.send('mode '+kanal+' +o '+ordre[0]+'\n')
	elif ordre[4] == 'readusers':
		if admin(ordre[1]):
			borgarfix()
	else:
		general_info = 'notice '+ordre[0]+' :Available commands are: who,\
 op (registered users of the bot only).\n'
		ircd.send(general_info)


def borgar(case):
	global borgarliste
	for expression in borgarliste:
		if expression.match(case) == len(case):
			return 1
	else:
		return 0

def admin(case):
	global operator
	if operator.match(case) == len(case):
		return 1
	return 0

def list(namneliste):
	global chanusers, kanal

	chanusers = []
	namneliste = string.splitfields(namneliste[1:], ':')
	tmp = string.split(namneliste[0])
	if tmp[-1] != kanal:
		return
	del(tmp)
	del(namneliste[0])
	namneliste = string.split(namneliste[0])
	while len(namneliste) > 0:
		if namneliste[0][0:1] == '*':
			namneliste[0] = namneliste[0][1:]
		if namneliste[0][0:1] == '@':
			namneliste[0] = namneliste[0][1:]
		chanusers.append(namneliste[0])
		del(namneliste[0])


chanusers = []
borgarfix()
logfile = open('Pylogg_'+time.strftime('%Y%m%dT%H%M%S', time.localtime(time.time())), 'w')
datostempel = time.time()

while 1:
	inndata = server.readline()
	input = string.lower(inndata)


	if kicked.match(input) != -1:
		ircd.send('join '+kanal+' '+passord+'\n')
		logfile.write(time.strftime('%Y%m%dT%H%M%S', time.localtime(time.time()))+ ': ')
		logfile.write(inndata)
		logfile.flush()
	elif ping.match(input) != -1:
		ircd.send('PONG :trondviggo.nvg.ntnu.no\n')
	elif members.match(input) != -1:
		ircd.send('names '+kanal+'\n')
	elif modechange.match(input) != -1:
		logfile.write(time.strftime('%Y%m%dT%H%M%S', time.localtime(time.time()))+ ': ')
		logfile.write(inndata)
		logfile.flush()
	elif command.match(input) != -1:
		order(input)
	elif names.match(input) != -1:
		list(input)
