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)