All pastes #132612 Raw Edit

JaffeBot

public python v1 · immutable
#132612 ·published 2006-08-15 11:29 UTC
rendered paste body
# JaffeBot  v0.2# Warning: koden er skitten, skitten, skitten.import sysimport socketimport stringfrom time import time, localtime, strftimesock = socket.socket()bot_owner = "Jaffe"version = "0.4"# liste over alle tilgjengelige kommandoervalidcmds = [".borte", ".tilbake", ".kalkuler", ".skift-kanal", ".klokka", ".hjelp", ".borte-liste", ".ignorert-liste", ".admin-liste", ".ny-admin", ".fjern-admin", ".ignorer", ".fjern-ignorering", ".alias", ".admin-hjelp", ".info", ".avslutt", ".master-hjelp", ".fjern-alias", ".fjern-alle-alias"]# folk som er borteawaylist = []# meldingen til folk som er borteawayreasonlist = []# admin-listeadminlist = [bot_owner]# ignorert-listeignorelist = []# alias-navnaliasnames = []# alias-kommandoeraliascmds = []channel = ""# hovedfunksjondef main(argc):	global channel 	global aliasnames	global aliascmds		inbuffer = ""	if argc < 4:		print "FEIL: Ikke nok argumenter spesifisert."		usage()		return -1		if connect(sys.argv[1], int(sys.argv[2]), sys.argv[3], sys.argv[4]) == -1:		return -1			channel = sys.argv[4]	botnick = sys.argv[3]	aliasnames.extend(validcmds)	aliascmds.extend(validcmds)		# start hovedloopen (hent data, evaluer data, send data):	while True:		inbuffer = sock.recv(1024)		temp = string.split(inbuffer, "\n")		inbuffer = temp.pop()				for line in temp:			line = line.rstrip()						# parse inbufferet			line, args, command = parsebuffer(line)						# er nicket ignorert fra boten?			if (line[0].split("!")[0].replace(":", "") in ignorelist) == True:				# bare NICK skal evalueres av boten, alt annet blir ignorert.				if line[1] != "NICK":					break						# send PONG tilbake hvis server spør PING			if line[0] == "PING":				sock.send("PONG %s\r\n" % line[1])						# rydd opp i listene om noen stikker			elif line[1] == "QUIT":				quitnick = line[0].split("!")[0].replace(":", "")						# oppdater listene om noen i listene skifter nick:			elif line[1] == "NICK":				orignick = line[0].split("!")[0].replace(":", "")				newnick = line[2].replace(":", "")				nickskift(orignick, newnick)						# hvis kommandoen er PRIVMSG, har vi mottatt en melding			elif line[1] == "PRIVMSG":				if (kommando(line, args, command) == -1):					return -1# brukdef usage():	print "Bruk:\n"	print "j-bot.py <server> <port> <nick> <kanal>"# tilkoblingdef connect(server, port, nick, channel):	print "Kobler til " + server + "..."	if sock.connect_ex((server, port)) != 0:		print "FEIL: Kunne ikke koble til serveren!"		return -1	sock.send("NICK %s\r\n" % nick)	sock.send("USER JaffeBot JaffeBot %s JaffeBot\r\n" % server)	sock.send("JOIN %s\r\n" % channel)	sock.send("PRIVMSG %s :Tilkoblet. Skriv .hjelp for en liste over kommandoer.\r\n" % channel)# parse innbufferet og returner kommando + evt. argumenterdef parsebuffer(line):	global channel	global aliasnames	global aliascmds		args = []	line = line.split(" ", 3)	command = ""	alias = ""		if line[1] == "PRIVMSG":			line[3] = line[3].replace(":", "")			# sjekk om det er et alias		if line[3].count(" ") > 0:			tempcmd = line[3].split(" ", 1)			tempcmd.remove(tempcmd[1])			alias = tempcmd[0]		else:			alias = line[3]		if (alias in aliasnames) == True:			command = aliascmds[aliasnames.index(alias)]			line[3] = line[3].replace(alias, command)		else:			command = alias		# sjekk og del opp innbufferet x antall ord etter hvilken kommando som er gitt:		if command == ".borte":			if line[3].count(" ") > 0:				args = line[3].split(" ", 1)				args.remove(command)		elif command == ".kalkuler": 			if line[3].count(" ") > 2:				args = line[3].split(" ", 3)				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)		elif command == ".ny-admin":			if line[3].count(" ") > 0:				args = line[3].split(" ")				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)		elif command == ".ignorer":			if line[3].count(" ") > 0:				args = line[3].split(" ")				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)		elif command == ".fjern-ignorering":			if line[3].count(" ") > 0:				args = line[3].split(" ")				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)		elif command == ".fjern-admin":			if line[3].count(" ") > 0:				args = line[3].split(" ")				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)		elif command == ".skift-kanal":			if line[3].count(" ") > 0:				args = line[3].split(" ")				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)		elif command == ".alias":			if line[3].count(" ") > 1:				args = line[3].split(" ", 2)				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)		elif command == ".fjern-alias":			if line[3].count(" ") > 0:				args = line[3].split(" ")				args.remove(command)			else:				sock.send("PRIVMSG %s :Ikke nok argumenter spesifisert.\r\n" % channel)	return [line[0:4], args, command]# rydd opp i listene om noen quiterdef quit(quitnick):	global awaylist	global adminlist	global ignorelist		if (quitnick in awaylist) == True:		awaylist.remove(quitnick)	if (quitnick in ignorelist) == True:		ignorelist.remove(quitnick)	if (quitnick in adminlist) == True:		adminlist.remove(quitnick)# rydd opp i listene om noen skifter nickdef nickskift(orignick, newnick):	global awaylist	global awayreasonlist	global ignorelist	global adminlist	global bot_owner	if (orignick in awaylist) == True:		print "skift away"		awaylist.remove(orignick)		awaylist.append(newnick)	if (orignick in ignorelist) == True:		print "skift ignore"		ignorelist.remove(orignick)		ignorelist.append(newnick)	if (orignick in adminlist) == True:		print "skift admin"		adminlist.remove(orignick)		adminlist.append(newnick)	if bot_owner == orignick:		bot_owner = newnick# behandle kommandoerdef kommando(line, argument, kommando):	global awaylist	global awayreasonlist	global channel	global bot_owner	global version		# .borte <bortemelding>	if kommando == ".borte":		awnick = line[0].split("!")[0].replace(":", "")		borte(awnick, argument)	# .tilbake	elif kommando == ".tilbake":		bnick = line[0].split("!")[0].replace(":", "")		tilbake(bnick)	# .klokka	elif kommando == ".klokka":		klokka(channel)	# .hjelp	elif kommando == ".hjelp":		sock.send("PRIVMSG %s :JaffeBot-kommandoer: borte, tilbake, klokka, hjelp, admin-hjelp, master-hjelp, borte-liste, admin-liste, ignorert-liste, kalkuler, info\r\n" % channel)	#.admin-hjelp:	elif kommando == ".admin-hjelp":		sock.send("PRIVMSG %s :JaffeBot-adminkommandoer: ignorer, fjern-ignorering, skift-kanal, alias, avslutt\r\n" % channel) 	# .master-hjelp:	elif kommando == ".master-hjelp":		sock.send("PRIVMSG %s :JaffeBot-masterkommandoer: ny-admin, fjern-admin, skift-kanal, avslutt\r\n" % channel)			# .borte-liste	elif kommando == ".borte-liste":		liste("borte")	# .admin-liste	elif kommando == ".admin-liste":		liste("admin")	# .ignorert-liste	elif kommando == ".ignorert-liste":		liste("ignorerte")	# .kalkuler tall1 metode tall2	elif kommando == ".kalkuler":		if len(argument) > 2:			kalkuler(line, argument)	# .avslutt	elif kommando == ".avslutt":		anick = line[0].split("!")[0].replace(":", "")		if (avslutt(anick) == -1):			return -1		# .ny-admin nick	elif kommando == ".ny-admin":		if len(argument) > 0:			reqnick = line[0].split("!")[0].replace(":", "")			ny_admin(reqnick, line, argument)	# .ignorer nick	elif kommando == ".ignorer":		if len(argument) > 0:			reqnick = line[0].split("!")[0].replace(":", "")			ignorer(reqnick, line, argument)	# .fjern-ignorering nick	elif kommando == ".fjern-ignorering":		if len(argument) > 0:			reqnick = line[0].split("!")[0].replace(":", "")			fjern_ignorering(reqnick, line, argument)	# .fjern-admin nick	elif kommando == ".fjern-admin":		if len(argument) > 0:			reqnick = line[0].split("!")[0].replace(":", "")			fjern_admin(reqnick, line, argument)			# .info	elif kommando == ".info":		sock.send("PRIVMSG %s :JaffeBot-master: %s | JaffeBot-versjon: %s\r\n" % (channel, bot_owner, version))			# .skift-kanal kanal	elif kommando == ".skift-kanal":		sock.send("PART %s\r\n" % channel)		channel = argument[0]		sock.send("JOIN %s\r\n" % channel)		sock.send("PRIVMSG %s :Tilkoblet. Skriv .hjelp for en liste over kommandoer.\r\n" % channel)		# .alias .aliasnavn .kommando	elif kommando == ".alias":		if len(argument) > 1:			reqnick = line[0].split("!")[0].replace(":", "")			alias(reqnick, argument)		# .fjern-alias .aliasnavn	elif kommando == ".fjern-alias":		if len(argument) > 0:			reqnick = line[0].split("!")[0].replace(":", "")			fjern_alias(reqnick, argument)		# .fjern-alle-alias	elif kommando == ".fjern-alle-alias":		reqnick = line[0].split("!")[0].replace(":", "")		fjern_alle_alias(reqnick)		# ingen kommando, sjekk om et borte-nick blir nevnt	else:		for nickname in awaylist:			if (line[3].upper().find(nickname.upper())) != -1:				awindex = awaylist.index(nickname)				sock.send("PRIVMSG %s :%s er borte: %s\r\n" % (channel, awaylist[awindex], awayreasonlist[awindex]))# KOMMANDOER:				def borte(awnick, argument):	global awaylist	global awayreasonlist	global channel		if (awnick in awaylist) == True:		sock.send("PRIVMSG %s :Du er allerede borte, %s.\r\n" % (channel, awnick))	else:		awaylist.append(awnick)		if len(argument) > 0:			awayreasonlist.append(argument[0])		else:			awayreasonlist.append("ingen grunn oppgitt")def tilbake(bnick):	global awaylist	global awayreasonlist	global channel		if (bnick in awaylist) == False:		sock.send("PRIVMSG %s :Du er allerede her, %s.\r\n" % (channel, bnick))	else:		awayreasonlist.remove(awayreasonlist[awaylist.index(bnick)])		awaylist.remove(bnick)def klokka(channel):	tid = strftime("%H:%M:%S", localtime())	dato = strftime("%d %b %Y", localtime())	sock.send("PRIVMSG %s :Klokka er %s, den %s.\r\n" % (channel, tid, dato))	def liste(listetype):	global adminlist	global ignorelist	global awaylist	global channel		if listetype == "borte":		if len(awaylist) == 0:			sock.send("PRIVMSG %s :Ingen er borte for øyeblikket.\r\n" % channel)		else:			sock.send("PRIVMSG %s :Folk som er borte: %s\r\n" % (channel, awaylist))	elif listetype == "admin":		sock.send("PRIVMSG %s :JaffeBot-admins: %s\r\n" % (channel, adminlist))	elif listetype == "ignorerte":		if len(ignorelist) == 0:			sock.send("PRIVMSG %s :Ingen er ignorert av JaffeBot.\r\n" % channel)		else:			sock.send("PRIVMSG %s :JaffeBot-ignorerte: %s\r\n" % (channel, ignorelist))	def kalkuler(line, argument):	global channel	number1 = argument[0]	action = argument[1]	number2 = argument[2]	for chars in range(255):		if chars < 48 or chars > 57:			if (number1.find(chr(chars))) != -1:				number1 = number1.replace(chr(chars), "")			if (number2.find(chr(chars))) != -1:				number2 = number2.replace(chr(chars), "")	if len(number1) != 0:		if len(number2) != 0:			if action == "+":				result = str(int(number1) + int(number2))			elif action == "-":				result = str(int(number1) - int(number2))			elif action == "*":				result = str(int(number1) * int(number2))			elif action == "/":				result = str(int(number1) / int(number2))			else:				result = "ugyldig."		else:			result = "ugyldig."	else:		result = "ugyldig."	sock.send("PRIVMSG %s := %s\r\n" % (channel, result))def avslutt(anick):	global adminlist	global bot_owner	global channel		if anick == bot_owner:		sock.send("QUIT :JaffeBot v0.1\r\n")		sock.close()		return -1	else:		sock.send("PRIVMSG %s :Du er ikke autorisert til å avslutte boten.\r\n" % (channel))def ny_admin(reqnick, line, argument):	global adminlist	global bot_owner	global channel		if reqnick == bot_owner:		if (argument[0] in adminlist) == False:			sock.send("WHOIS %s\r\n" % argument[0])			inbuffer = sock.recv(1024)			temp = string.split(inbuffer, "\n")			inbuffer = temp.pop()			if (temp[0].find("No such nick/channel") == -1):				adminlist.append(argument[0])			else:				sock.send("PRIVMSG %s :Det spesifiserte nicket fins ikke.\r\n" % channel)		else:			sock.send("PRIVMSG %s :%s er allerede admin!\r\n" % (channel, argument[0]))	else:		sock.send("PRIVMSG %s :Bare bot-masteren (%s) kan legge til admins.\r\n" % (channel, bot_owner))def ignorer(reqnick, line, argument):	global ignorelist	global adminlist	global channel		if (reqnick in adminlist) == True:		if (argument[0] in adminlist) == False:			if (argument[0] in ignorelist) == False:				sock.send("WHOIS %s\r\n" % argument[0])				inbuffer = sock.recv(1024)				temp = string.split(inbuffer, "\n")				inbuffer = temp.pop()				if (temp[0].find("No such nick/channel") == -1):					ignorelist.append(argument[0])				else:					sock.send("PRIVMSG %s :Det spesifiserte nicket fins ikke.\r\n" % channel)			else:				sock.send("PRIVMSG %s :%s er allerede ignorert.\r\n" % (channel, argument[0]))		else:			sock.send("PRIVMSG %s :Kan ikke ignorere en admin.\r\n" % channel)	else:		sock.send("PRIVMSG %s :Du er ikke autorisert til å ignorere folk.\r\n" % channel)def fjern_ignorering(reqnick, line, argument):	global ignorelist	global adminlist	global channel		if (reqnick in adminlist) == True:		if (argument[0] in ignorelist) == True:			ignorelist.remove(argument[0])		else:			sock.send("PRIVMSG %s :%s er ikke ignorert.\r\n" % (channel, argument[0]))	else:		sock.send("PRIVMSG %s :Du er ikke autorisert til å fjerne ignoreringer.\r\n" % channel)def fjern_admin(reqnick, line, argument):	global adminlist	global channel	global bot_owner		if reqnick == bot_owner:		if (argument[0] in adminlist) == True:			adminlist.remove(argument[0])		else:			sock.send("PRIVMSG %s :%s er ikke admin.\r\n" % (channel, argument[0]))	else:		sock.send("PRIVMSG %s :Bare bot-masteren (%s) kan slette admins.\r\n" % (channel, bot_owner))def alias(reqnick, argument):	global adminlist	global channel	global aliasnames	global aliascmds	args = []		if (reqnick in adminlist) == True:		if argument[1].count(" ") > 0:			args = argument[1].split(" ")			command = args[0]		else:			command = argument[1]		if (argument[0] in aliasnames) == False:			if argument[0].find(".") == 0:				if (command in validcmds) == True:					aliasnames.append(argument[0])					aliascmds.append(argument[1])				else:					sock.send("PRIVMSG %s :%s er ikke en gyldig kommando.\r\n" % (channel, argument[1]))			else:				sock.send("PRIVMSG %s :Kommandoer må alltid ha et kommaprefiks.\r\n" % channel)		else:			sock.send("PRIVMSG %s :Det finnes allerede et alias med navnet %s.\r\n" % (channel, argument[0]))	else:		sock.send("PRIVMSG %s :Du er ikke autorisert til å legge til egne alias.\r\n" % channel)		def fjern_alias(reqnick, argument):	global adminlist	global channel	global aliasnames	global aliascmds		if (reqnick in adminlist) == True:		if (argument[0] in aliasnames) == True:			if (argument[0] in validcmds) == False:				aliasindex = aliasnames.index(argument[0])				del aliasnames[aliasindex]				del aliascmds[aliasindex]			else:				sock.send("PRIVMSG %s :%s er en intern kommando, og kan ikke slettes.\r\n" % (channel, argument[0]))		else:			sock.send("PRIVMSG %s :Det finnes ikke noe alias med navnet %s.\r\n" % (channel, argument[0]))	else:		sock.send("PRIVMSG %s :Du er ikke autorisert til å fjerne alias.\r\n" % channel)def fjern_alle_alias(reqnick):	global aliasnames	global aliascmds	global validcmds	global adminliste		if (reqnick in adminlist) == True:		aliasnames = [validcmds]		aliascmds = [validcmds]	else:		sock.send("PRIVMSG %s :Du er ikke autorisert til å fjerne alias.\r\n" % channel)		# start hovedfunksjonenmain(len(sys.argv) -1)