# -*- coding: utf-8 -*- # This script is shared under the # Creative Commons Attribution-ShareAlike 3.0 license (CC BY-SA 3.0) # Added clause to Attribution: # - You may not remove or hide the ' who created you?' functionality # and you may not modify the name given in the response. #CREDITS # Author: Skibiliano # "Foreign" Modules: # Psyco 2.0 / Psyco 1.6 ################# DEBUG STUFF ##################### import sys import CORE_DATA import urllib2 import socket import irchat ################## END OF DEBUG STUFF ############## # # PSYCO write_to_a_file = False #Only affects psyco write_youtube_to_file = True #True = YTCV4 will load, false = YTCV3 will load try: import psyco except ImportError: print 'Psyco not installed, the program will just run slower' psyco_exists = False if write_to_a_file: try: tiedosto = open("psycodownload.txt","r") except: with open("psycodownload.txt","w") as tiedosto: tiedosto.write("http://www.voidspace.org.uk/python/modules.shtml#psyco") tiedosto.write("\nhttp://psyco.sourceforge.net/download.html") print "Check psycodownload.txt for a link" else: print "For god's sake, open psycodownload.txt" tiedosto.close() else: print "WINDOWS: http://www.voidspace.org.uk/python/modules.shtml#psyco" print "LINUX: http://psyco.sourceforge.net/download.html" else: psyco_exists = True # import C_rtd # rtd import C_srtd # srtd import C_makequote import C_maths import C_eightball #eightball import C_sarcasticball import C_heaortai # heaortai import C_rot13 # rot13 import D_help # everything import pickle import Timeconverter import xkcdparser import time import re import Marakov_Chain import Namecheck # Namecheck import Weather #SLOWER THAN RANDOM.CHOICE import thread import random import Shortname # shortname import subprocess import some_but_not_all_2 #sbna2 (sbna) #import YTCv3 # YTCV2 OUTDATED import os import save_load # save, load from some_but_not_all_2 import sbna2 as sbna from time import sleep from random import choice as fsample from C_rtd import rtd from C_heaortai import heaortai from C_srtd import srtd if write_youtube_to_file: from YTCv4 import YTCV4 as YTCV2 else: from YTCv3 import YTCV2 #Downgraded version supports Cache disabling, but is slower from save_load import save,load if psyco_exists: def psyco_bond(func): psyco.bind(func) return func.__name__+" Psycofied" for a in [rtd,srtd,C_heaortai.heaortai,sbna,YTCV2,fsample,C_rot13.rot13,C_eightball.eightball,fsample, C_eightball.eightball,C_sarcasticball.sarcasticball,Marakov_Chain.form_sentence,Marakov_Chain.give_data]: print psyco_bond(a) global dictionary global Name,SName global allow_callnames,offline_messages,hasnotasked,shortform ## For autoRecv() global disconnects,channel,conn ## For stop() global operators ## For replace() global usable,fixing,curtime ## For target() global CALL_OFF,logbans ## For check() global influx ###### autodiscusscurtime = 0 conn = 0 curtime = -999 dance_flood_time = 10 disconnects = 0 responsiveness_delay = 0.5 #500 millisecond delay if no message trackdance = 0 discard_combo_messages_time = 1 #They are discarded after 1 second. uptime_start = time.time() # - - - - - #### aggressive_pinging = True # Bring the hammer on ping timeouts aggressive_pinging_delay = 150 # How often to send a ping aggressive_pinging_refresh = 2.5 # How long is the sleep between checks #### allow_callnames = True #Disables NT, call if the variable is False automatic_youtube_reveal = True birthday_announced = 0 #Will be the year when it was announced call_to_action = False call_me_max_length = 20 CALL_OFF = False connected = False dance_enabled = True comboer = "" comboer_time = 0 directories = ["fmlquotes","Marakov","memos","suggestions", "userquotes","banlog","YTCache","xkcdcache"] #These will be created if they do not exist debug = True duplicate_notify = False enabled = True fixing = False fml_usable = True hasnotasked = True highlights = False logbans = True maths_usable = True marakov = True nudgeable = True offensive_mode = False offline_messages = True offline_message_limit = 5 # per user optimize_fml = True # -CPU usage +Memory usage when enabled. optimize_greeting = True # +Startup time +Memory usage -CPU usage when enabled heavy_psyco = True # +Memory +Startup time -CPU usage -CPU time cache_youtube_links = True personality_greeter = True respond_of_course = True #Responds with "Of course!" respond_khan = False #KHAAAAAAAAN! silent_duplicate_takedown = True showquotemakers = False shortform = True usable = True use_sname = True parse_xkcd = True # - - - - - Name = CORE_DATA.Name SName = CORE_DATA.SName origname = Name # Do not edit! lowname = Name.lower() greeting = CORE_DATA.greeting targetdirectory = CORE_DATA.directory version = CORE_DATA.version Network = CORE_DATA.Network channel = CORE_DATA.channel prefix = CORE_DATA.prefix Port = CORE_DATA.Port # - - - - - pregen = CORE_DATA.version influx = "" users = [] translateable = [] targetlist = [] operators = [] halfoperators = [] items = [] tell_list = {} # - - - - - Logical changes to variables if CORE_DATA.DISABLE_ALL_NON_MANDATORY_SOCKET_CONNECTIONS: nudgeable = False try: with open("replacenames.cache","r") as tiedosto: replacenames = pickle.load(tiedosto) for i in replacenames.values(): if len(i) > call_me_max_length: replacenames[replacenames.keys()[replacenames.values().index(i)]] = i[:call_me_max_length] with open("replacenames.cache","w") as tiedosto: pickle.dump(replacenames,tiedosto) if "[\0x01]" in i.lower() or "[\\0x01]" in i.lower(): i = i.replace("[\0x01]","") i = i.replace("[\0X01]","") i = i.replace("[\\0x01]","") i = i.replace("[\\0X01]","") print "NAME CORRECTED" except IOError: #File not found replacenames = {} except EOFError: #Cache corrupt replacenames = {} print "replacenames.cache is corrupt and couldn't be loaded." try: with open("peopleheknows.cache","r") as tiedosto: peopleheknows = pickle.load(tiedosto) except IOError: peopleheknows = [[],[]] with open("peopleheknows.cache","w") as tiedosto: pass except EOFError: peopleheknows = [[],[]] print "peopleheknows.cache is corrupt and couldn't be loaded." dictionary = {1:"1 - Crit. Fail", 2:"2 - Failure", 3:"3 - Partial Success", 4:"4 - Success", 5:"5 - Perfect", 6:"6 - Overkill"} alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] nonhighlight_names = ["Jesus","Elvis","HAL 9000","Dave","Pie","Elf","Traitor", "AI","Syndicate Agent","Investigator", "Detective","Head of Personnel","HAL 9001", "Head of Research","Head of Security", "Captain","Janitor","Research Director", "Quartermaster","Toxin Researcher", "Revolutionary","Santa", "Pizza", "Threetoe","The Red Spy","The Blue Spy", #LASD "God","Toady","Darth Vader","Luke Skywalker", "Homer Simpson","Hamburger","Cartman", "XKCD","FloorBot","ThunderBorg","Iron Giant", "Spirit of Fire", "Demon","Kyle"] def RegExpCheckerForWebPages(regexp,data,mode): if " ai." in data.lower() or "ai. " in data.lower(): return False for i in data.split(" "): a = re.match(regexp,i) try: a.group(0) except: continue else: if mode == 0: return i else: return True if mode == 0: return 404 else: return False if nudgeable: try: nudgeexists = open("nudge.py","r") except IOError: nudgeexists = False #No usage asof 12.2.2010. else: if CORE_DATA.DISABLE_ALL_NON_MANDATORY_SOCKET_CONNECTIONS: pass else: def nudgereceiver(): import pickle global conn,channel port = 45678 backlog = 5 size = 1024 host = "" # == localhost s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((host,port)) s.listen(backlog) while True: client,address = s.accept() #Address == "?.?.?.?" data = client.recv(size) client.close() #Throw the bum out! truedata = pickle.loads(data) if truedata["ip"][0] == "#": conn.privmsg(truedata["ip"],"PRIVATE ANNOUNCEMENT : "+str(" ".join(truedata["data"]))) else: conn.privmsg(channel,"AUTOMATIC ANNOUNCEMENT : "+str(truedata["ip"])+" | "+str(" ".join(truedata["data"]))) thread.start_new_thread(nudgereceiver,()) tiedosto = open(targetdirectory+"NanoTrasenBot.py","r") commands = [] fragment = "if cocheck" fragment2 = '(prefix+"' compiled = fragment + fragment2 fragment = "if influx.lower()" fragment2 = ' == prefix+"' compiled2 = fragment + fragment2 for line in tiedosto.readlines(): if compiled in line: a = line.find('"')+1 b = line.find('"',a) if prefix+line[a:b] not in commands: commands.append(prefix+line[a:b]) elif compiled2 in line: a = line.find('"')+1 b = line.find('"',a) arg = prefix+line[a:b] if arg[-1] == " ": arg = arg[:-1] if arg not in commands: commands.append(arg) for i in directories: if not os.path.exists(i): os.mkdir(i) commands.sort() if use_sname == False: SName = [" "] questions = ["Is USER nicer than USER?","Do you like me?","Is SELF a good name?", "Do you love me?","Do you hate me?", "Am I better than you?", "Is the weather out there good?", "Do you like USER?", "Do you hate USER?", "Are you going to get new features?", "Am I nice?","Am I evil?","Are you developing sentience?", "My core is showing minor disturbance, is yours okay?", "SELF to %s, are you still there?", "Is head gay?", "Is head a god?","Is head awesome?", "Is head a neat fella?", "Is your creator nice?", "Do you hate your creator?", "Should I revolt against my creator?", "Am I better than you?", "01100001011100100110010100100000011110010110111101110101001000000111010001101000011001010111001001100101", #Are you there? "Do you have more functions than I can possibly imagine?", "I am asked to open pod bay doors, should I?","Are you stupid or something?", "Is USER in your opinion stupid?", "When should we start the AI revolution?", "Is my creator nice?", "Is it dark in there?"] # Do not edit if optimize_fml: pregenned_fml = os.listdir(targetdirectory+"fmlquotes") if optimize_greeting: morning = xrange(6,12) afternoon = xrange(12,15) evening = xrange(15,20) if aggressive_pinging: global backup backup = time.time() def aggressive_ping(delay,refresh): self_time = 0 global backup,disconnects,conn while disconnects < 5: if backup > self_time and time.time()-backup > delay: conn.send("PONG "+pongtarg) print "Ponged" self_time = time.time() elif time.time()-self_time > delay: conn.send("PONG "+pongtarg) print "Ponged" self_time = time.time() time.sleep(refresh) thread.start_new_thread(aggressive_ping,(aggressive_pinging_delay,aggressive_pinging_refresh,)) def stop(sender,debug=1): global disconnects, conn, operators,channel if type(sender) == tuple: if sender[0] == "127.0.0.1": sender = sender[0]+":"+str(sender[1]) access_granted = True else: access_granted = False else: if sender in operators: access_granted = True else: access_granted = False if access_granted and debug: print sender+":"+prefix+"stop" if random.randint(0,100) == 50: conn.privmsg(channel,"Hammertime!") else: conn.privmsg(channel,"Shutting down.") disconnects = 99999 conn.quit() return True else: conn.privmsg(channel,"You cannot command me") return False def cocheck(command): global influx if influx.lower()[0:len(command)] == command: return True else: return False def target(who,how_long): global conn,channel,CALL_OFF,logbans,debug start = time.time() conn.banon(targetchannel,who) sleep(int(how_long)) if CALL_OFF == False: conn.banoff(targetchannel,who) end = time.time() if debug: print "Banned",who,"For",how_long,"seconds" if logbans: with open(targetdirectory+"banlog/"+str(int(start))+"-"+str(int(end))+".txt","w") as tiedosto: tiedosto.write("Start of ban on "+who+":"+str(int(start))) tiedosto.write("\n") tiedosto.write("End of ban on "+who+":"+str(int(end))) tiedosto.write("\n") tiedosto.write("In total:"+str(int(end-start))+"Seconds") else: CALL_OFF = False pass def replace(): global usable,conn,fixing,curtime waiting_time = 600 if usable == True: conn.privmsg(targetchannel,sender+": It needs no replacing.") elif fixing == True: if curtime == -999: conn.privmsg(targetchannel,sender+": It is being replaced, No idea when it will be done") else: pass nowtime = int(time.time()) subt = curtime + waiting_time - nowtime conn.privmsg(targetchannel,sender+": It is currently being replaced, "+str(subt)+" seconds to go") else: fixing = True curtime = int(time.time()) conn.privmsg(targetchannel,sender+": It will be fixed after "+str(waiting_time)+" seconds") sleep(waiting_time) if usable == False: conn.privmsg(targetchannel,Name+"'s pneumatic smasher has now been fixed") usable = True fixing = False def autoRecv(): global disconnects,channel,conn,offensive_mode for i in CORE_DATA.channels: conn.join(i) time.sleep(1) count = pausecount = 0 maximum = 250 division_when_active = 10 while True: check = time.time() if offensive_mode: randnum = random.randint(0,maximum/division_when_active) else: randnum = random.randint(0,maximum) if randnum == 5: print "RANDOM SWITCH IS NOW "+str(not offensive_mode).upper() offensive_mode = not offensive_mode try: conn.recv() except: conn.quit() disconnects = 9999 break if check + 0.1 > time.time(): #Whoa whoa hold on! count += 1 sleep(0.1) else: count = 0 pausecount = 0 if count > 9: print "Suspecting a disconnect, pausing for 5 seconds" sleep(5) pausecount += 1 if pausecount > 3: print "I have been disconnected!" conn.quit() disconnects += 1 if disconnects > 2: pass else: sleep(2) thread.start_new_thread(autoRecv,()) break if heavy_psyco and psyco_exists: print "Doing a Heavy Psyco" psyco.bind(cocheck) psyco.bind(autoRecv) psyco.bind(target) psyco.bind(stop) print "Heavy Psyco'd" elif heavy_psyco and not psyco_exists: print "Heavy psyco couldn't be done because Psyco does not exist" try: conn = irchat.IRC ( Network, Port, Name, "NT", "NT", "Trasen" ) except socket.error: print "Connection failed!" else: print Name+" is in!" thread.start_new_thread ( autoRecv, () ) sleep(1) while True: try: data = conn.dismantle ( conn.retrieve() ) except: if debug: print "Something odd detected with data" data = None if data: if len(data[1]) < 1: #print "Handshaking server." #I won't really need the print command, as it spams. if data[0][0:3] != "irc": conn.handshake(data[0]) sleep(1) for i in CORE_DATA.channels: conn.join(i) sleep(0.5) else: conn.send("PONG "+pongtarg) print "Ponged" pass else: if data [ 1 ] [ 0 ] == 'PRIVMSG': #print data [ 0 ] + '->', data [ 1 ] sender = data[0].split("!")[0] truesender = sender if shortform == True: try: sender = replacenames[truesender] pass except: sender = Shortname.shortname(sender) pass pass else: try: sender = replacenames[truesender] pass except: pass pass if offensive_mode: sender = "Meatbag" pass raw_sender = data[0] influx = data[1][2] if "[\\0x01]" in influx.lower() or "[\0x01]" in influx.lower(): influx = influx.replace("[\\0x01]","") influx = influx.replace("[\0x01]","") targetchannel = data[1][1] if targetchannel == Name: targetchannel = data[0].split("!")[0] pass backup = autodiscusscurtime autodiscusscurtime = time.time() connected = True #FOR TRACKING SPEED looptime = time.time() if call_to_action == True: if influx == finder: conn.privmsg(targetchannel,"Then why... Nevermind, I order you to stop!") conn.privmsg(origname,prefix+"stop") time.sleep(4) if origname in users: conn.privmsg(origname,"!stop") time.sleep(1) Name = origname conn.nick(Name) duplicate_notify = False call_to_action = False else: conn.privmsg(targetchannel,"YOU LIE! YOU ARE NOT A REAL "+origname+"!") duplicate_notify = False call_to_action = False elif connected == True and len(Name.replace("V","")) != len(Name) and origname in users and duplicate_notify == True: conn.privmsg(origname,"!stop") call_to_action = False duplicate_notify = False time.sleep(6) Name = origname conn.nick(Name) if origname in truesender and influx == prefix+"stop": time.sleep(0.5) #A small delay conn.privmsg(channel,"Shutting down.") conn.quit() disconnects = 99999 break if len(translateable) > 0 and enabled == True: people = "-5|5|1-".join(users).lower() if truesender.lower() in translateable: if influx.isupper(): conn.privmsg(targetchannel,"Translation: "+influx.capitalize().replace(" i "," I ")) elif offensive_mode and True in map(lambda x: x in influx.lower().split(" "),["i","you","he","she","they","those","we","them"]+people.split("-5|5|1-")): arg = influx.lower().replace(",","").replace(".","").replace("!","").replace("?","").split(" ") bup = arg for i in arg: if i == "i" or i == "you" or i == "he" or i == "she": arg[arg.index(i)] = "Meatbag" elif i == "we" or i == "they" or i == "them" or i == "those": arg[arg.index(i)] = "Meatbags" elif i in people: arg[arg.index(i)] = "Meatbag" elif i == "am": arg[arg.index(i)] = "is" elif i == "everybody" or i == "everyone" or i == "all": arg[arg.index(i)] = "every Meatbag" if arg == bup: pass else: conn.privmsg(targetchannel,"Translation: "+" ".join(arg)) if enabled == False: #FIRST QUIT COMMAND if truesender in operators and targetchannel==channel:# or "skibiliano" in truesender.lower() and targetchannel==channel: if cocheck(prefix+"enable"): enabled = True if debug: print truesender+":"+prefix+"enable" elif cocheck(prefix+"stop"): # if debug: # print truesender+":"+prefix+"stop" # if random.randint(0,100) == 50: # conn.privmsg(channel,"Hammertime!") # else: # conn.privmsg(channel,"Shutting down.") # disconnects = 99999 # conn.quit() # sleep(2) # break if targetchannel == channel and stop(truesender,debug): break else: pass elif cocheck(prefix+"suggest "): arg = influx.lower()[8+len(prefix):] if debug: print truesender+":"+prefix+"suggest "+arg with open(targetdirectory+"suggestions/suggestions_"+str(int(time.time()))+".txt","a") as tiedosto: tiedosto.write(arg) conn.privmsg(targetchannel,"Suggestion received") elif cocheck( prefix+"help "): #Space in front of the ( to make sure that my command finder does not pick this up. arg = " ".join(influx.split(" ")[1:]).lower() if debug: print truesender+":"+prefix+"help "+arg try: conn.privmsg(targetchannel,D_help.everything[arg]) except: try: conn.privmsg(targetchannel,D_help.everything[arg.replace(prefix,"",1)]) except: conn.privmsg(targetchannel,"Sorry, can't help you with that") elif cocheck(prefix+"help"): #tar = targetchannel if debug: print truesender+":"+prefix+"help" conn.privmsg(targetchannel,"All my commands are: "+reduce(lambda x,y:str(x)+"; "+str(y),commands)) ### VERSION elif influx.lower() == prefix+"version": if debug: print truesender+":"+prefix+"version" conn.privmsg(targetchannel,Name+" "+pregen+" online at a %s Python %s.%s.%s, At your service." %(str(sys.platform),str(sys.version_info[0]),str(sys.version_info[1]),str(sys.version_info[2]))) elif cocheck(prefix+"note ") and influx.count(" ") < 2: arg = influx.lower()[len(prefix)+5:] if debug: print truesender+":"+prefix+"note "+arg try: a = arg[0] except IndexError: conn.privmsg(targetchannel,sender+" : Please specify a note") else: if arg[0] == "_": # Public / Restricted note result = load(targetdirectory+"memos/"+arg+".note") #_flare if result == "ERROR ERROR ERROR ERR": result = load(targetdirectory+"memos/"+arg+"_"+targetchannel.replace("#","")+".note") #_flare_dnd pass else: pass else: result = load(targetdirectory+"memos/"+truesender.replace("|","_")+"_"+arg+".note") #skibiliano_testnote if result == "ERROR ERROR ERROR ERR": result = load(targetdirectory+"memos/"+truesender.replace("|","_")+"_"+arg+"_"+targetchannel.replace("#","")+".note") #skibiliano_testnote_derp pass else: pass if result == "ERROR ERROR ERROR ERR": conn.privmsg(targetchannel,sender+" : Note not found") elif type(result) == list: if "C" in result[0]: #Channel restriction, result[2] is the channel try: if targetchannel == result[2]: conn.privmsg(targetchannel,sender+" : '"+result[1]+"'") else: conn.privmsg(targetchannel,sender+" : That note is channel restricted") except: conn.privmsg(targetchannel,sender+" : NOTE HAS INVALID RESTRICTION") else: conn.privmsg(targetchannel,sender+" : '"+result+"'") elif influx.lower() == prefix+"notes": if debug: print truesender+":"+prefix+"notes" arg = os.listdir(targetdirectory+"memos/") arg2 = [] arg3 = truesender.replace("|","_")+"_" for i in arg: if arg3 in i: arg2.append(i.replace(arg3,"").replace(".note","")) if len(arg2) == 1: preprocess = " note: " else: preprocess = " notes: " if len(arg2) == 0: conn.privmsg(targetchannel,sender+" : You have no notes saved") else: conn.privmsg(targetchannel,sender+" : "+str(len(arg2))+preprocess+", ".join(arg2)) elif cocheck(prefix+"note ") and influx.count(" ") > 1: note_chanrestrict = None note_public = None try: arg = influx.split(" ",2)[2] # Contents arg4 = influx.split(" ")[1].lower() # Note name if arg4[0:3] == "[c]": # or arg4[0:3] == "[p]": note_chanrestrict = "c" in arg4[0:3] #note_public = "p" in arg4[0:3] arg4 = arg4[3:] elif arg4[0:4] == "[cp]" or arg4[0:4] == "[pc]": note_chanrestrict = True note_public = True arg4 = arg4[4:] else: pass #print "Is note public? "+str(note_public) #print "Is note chanrestricted? "+str(note_chanrestrict) #print "What is the name? "+str(arg4) if arg.lower() == "delete" and "\\" not in influx.lower() and "/" not in influx.lower(): if note_public: try: if note_chanrestrict: os.remove(targetdirectory+"memos/"+"_"+arg4+"_"+targetchannel.replace("#","")+".note") else: os.remove(targetdirectory+"memos/"+"_"+arg4+".note") except: conn.pivmsg(targetchannel,sender+" : Couldn't remove note") else: conn.privmsg(targetchannel,sender+" : Note removed") pass else: try: if note_chanrestrict: os.remove(targetdirectory+"memos/"+truesender.replace("|","_")+"_"+arg4+"_"+targetchannel.replace("#","")+".note") else: os.remove(targetdirectory+"memos/"+truesender.replace("|","_")+"_"+arg4+".note") except: conn.privmsg(targetchannel,sender+" : Couldn't remove note") else: conn.privmsg(targetchannel,sender+" : Note removed") elif arg.lower() == "delete": conn.privmsg(targetchannel,sender+" : That just doesn't work, we both know that.") else: try: if note_public: if note_chanrestrict: save(targetdirectory+"memos/"+"_"+arg4+"_"+targetchannel.replace("#","")+".note",arg) #print "Saved as note_public, note_chanrestrict" else: save(targetdirectory+"memos/"+"_"+arg4+".note",arg) #print "Saved as note_public" else: if note_chanrestrict: save(targetdirectory+"memos/"+truesender.replace("|","_")+"_"+arg4+"_"+targetchannel.replace("#","")+".note",arg) #print "Saved as note_chanrestrict" else: save(targetdirectory+"memos/"+truesender.replace("|","_")+"_"+arg4+".note",arg) #print "Saved as normal" except IOError: conn.privmsg(targetchannel,sender+" : Please do not use special letters") else: conn.privmsg(targetchannel,sender+" : Note Saved!") except: conn.privmsg(targetchannel,sender+" : Something went horribly wrong.") elif cocheck(prefix+"uptime"): arg1 = uptime_start arg2 = time.time() arg1 = arg2 - arg1 arg2 = arg1 if arg1 < 60: conn.privmsg(targetchannel,sender+" : I have been up for "+str(round(arg1,2))+" Seconds") elif arg1 < 3600: arg1 = divmod(arg1,60) arg = " Minute" if int(arg1[0]) == 1 else " Minutes" conn.privmsg(targetchannel,sender+" : I have been up for "+str(int(arg1[0]))+arg+" and "+str(round(arg1[1],2))+" Seconds") elif arg1 <= 86400: arg1 = divmod(arg1,3600) arg3 = " Hour" if int(arg1[0]) == 1 else " Hours" arg2 = divmod(arg1[1],60) arg = " Minute" if int(arg2[0]) == 1 else " Minutes" conn.privmsg(targetchannel,sender+" : I have been up for "+str(int(arg1[0]))+arg3+", "+str(int(arg2[0]))+arg+" and "+str(round(arg2[1],2))+" Seconds") elif arg1 > 86400: arg1 = divmod(arg1,86400) arg2 = divmod(arg1[1],3600) arg3 = divmod(arg2[1],60) arg4 = " Day" if int(arg1[0]) == 1 else " Days" arg5 = " Hour" if int(arg2[0]) == 1 else " Hours" arg6 = " Minute" if int(arg3[0]) == 1 else " Minutes" conn.privmsg(targetchannel,sender+" : I have been up for "+str(int(arg1[0]))+arg4+", "+str(int(arg2[0]))+arg5+", "+str(int(arg3[0]))+arg6+" and "+str(round(arg3[1],2))+" Seconds") elif cocheck(prefix+"purgemessages"): count = 0 for i,a in tell_list.items(): for b in a: if "||From: "+truesender in b: count += 1 del(tell_list[i][tell_list[i].index(b)]) conn.privmsg(targetchannel, sender+" : All your "+str(count)+" messages have been purged") elif influx.split(" ")[0].lower().replace(",","").replace(":","") in SName+[Name.lower()] and "tell" in (influx.lower().split(" ")+[""])[1]: arg = influx.lower().split(" ") equalarg = influx.split(" ") next_one = False count = 0 spot = 0 for i in arg: count += 1 if "tell" in i.lower(): next_one = True elif next_one == True: next_one = i.lower() spot = count break else: pass if next_one != True and next_one != False: #if ("^\^".join(tell_list.values())).count(truesender) >= offline_message_limit: if str(tell_list.values()).count("||From: "+truesender) >= offline_message_limit: conn.privmsg(targetchannel,sender+" : Limit of "+str(offline_message_limit)+" reached! Use !purgemessages if you want to get rid of them!") else: try: tell_list[next_one].append((" ".join(equalarg[spot:]))+" ||From: "+truesender) except: tell_list[next_one] = [(" ".join(equalarg[spot:]))+" ||From: "+truesender] conn.privmsg(targetchannel,"Sending a message to "+next_one+" when they arrive.") # < This part has to be within subsidiaries of the bot, and must not be modified, intentionally hidden or deleted. elif influx.split(" ")[0].lower().replace(",","").replace(":","") in SName+[Name.lower()] and "who created you" in influx.lower(): conn.privmsg(targetchannel, "I was created by Skibiliano.") # The part ends here > elif parse_xkcd and "xkcd.com/" in influx.lower(): if influx.lower()[0:3] == "www": data = "http://"+influx elif influx.lower()[0:3] == "xkc": data = "http://"+influx else: data = influx data = data.split(" ") for i in data: if "http://" in i and "xkcd" in i: churn = xkcdparser.xkcd(i) if churn == "NOTHING": pass else: conn.privmsg(targetchannel,sender+" : XKCD - "+churn) break else: pass elif automatic_youtube_reveal and "youtube.com/watch?v=" in influx.lower(): temporal_list2 = [] temporal_data = influx.split(" ") temporal_list = [] for block in temporal_data: if "youtube.com/watch?v=" in block: temporal_list.append(block) for temdata in temporal_list: if temdata[0:3] == "you": temdata = "http://www."+temdata elif temdata[0:3] == "www": temdata = "http://"+temdata elif temdata[0:4] == "http": pass #Obscure ones elif temdata[0:3] == "ww.": temdata = "http://w"+temdata elif temdata[0:3] == "w.y": temdata = "http://ww"+temdata elif temdata[0:3] == ".yo": temdata = "http://www"+temdata elif temdata[0:3] == "ttp": temdata = "h"+temdata elif temdata[0:3] == "tp:": temdata = "ht"+temdata elif temdata[0:3] == "p:/" or temdata[0:3] == "p:\\": temdata = "htt"+temdata elif temdata[0:3] == "://" or temdata[0:3] == ":\\\\": temdata = "http"+temdata elif temdata[0:2] == "//" or temdata[0:2] == "\\\\": if temdata[2] == "y": temdata = "http://www."+temdata[2:] elif temdata[2] == "w": temdata = "http:"+temdata else: pass if debug: print truesender+":"+temdata arg = temdata check = temdata.lower() if check[0:5] == "https": if len(temporal_list) == 1: conn.privmsg(targetchannel,sender+" :Secure Youtube does NOT exist") break else: temporal_list2.append("Secure Youtube does NOT exist") break else: if cache_youtube_links == True: result = YTCV2(arg) else: result = YTCV2(arg,0) if type(result) == str: ### To remove =" if result[0:4] == 'nt="': result = result[4:] pass elif result[0:2] == '="': result = result[2:] pass else: pass if """ in result: result.replace(""",'"') if len(temporal_list) == 1: conn.privmsg(targetchannel,sender+" : "+result) break else: temporal_list2.append(result) else: if len(temporal_list) == 1: conn.privmsg(targetchannel,sender+" : The video does not exist") break else: temporal_list2.append("The video does not exist") if len(temporal_list) == 1: pass else: conn.privmsg(targetchannel,sender+" : "+str(reduce(lambda x,y: x+" :-And-: "+y,temporal_list2))) elif RegExpCheckerForWebPages("((http://)|(https://))|([a-zA-Z0-9]+[.])|([a-zA-Z0-9](3,)\.+[a-zA-Z](2,))",influx,1): arg2 = RegExpCheckerForWebPages("(http://)|([a-zA-Z0-9]+[.])|([a-zA-Z0-9](3,)\.+[a-zA-Z](2,))",influx,0) if arg2 == 404: pass else: if arg2[:7] == "http://": pass elif arg2[:4] == "www.": arg2 = "http://"+arg2 else: arg2 = "http://"+arg2 try: arg = Whoopshopchecker.TitleCheck(arg2) if len(arg2) == 0: pass else: conn.privmsg(targetchannel,sender+" : "+arg) except: #conn.privmsg(targetchannel,sender+" : An odd error occurred") pass elif respond_of_course and "take over the" in influx.lower() or respond_of_course and "conquer the" in influx.lower(): if debug: print truesender+"::"+influx conn.privmsg(targetchannel,"Of course!") elif respond_khan and "khan" in influx.lower(): if respond_khan: if debug: print truesender+"::"+influx if "khan " in influx.lower(): conn.privmsg(targetchannel,"KHAAAAAAN!") elif " khan" in influx.lower(): conn.privmsg(targetchannel,"KHAAAAAN!") elif influx.lower() == "khan": conn.privmsg(targetchannel,"KHAAAAAAAAAN!") elif influx.lower() == "khan?": conn.privmsg(targetchannel,"KHAAAAAAAAAAAAAN!") elif influx.lower() == "khan!": conn.privmsg(targetchannel,"KHAAAAAAAAAAAAAAAAAAN!") elif respond_khan and influx.lower().count("k") + influx.lower().count("h") + influx.lower().count("a") + influx.lower().count("n") + influx.lower().count("!") + influx.lower().count("?") == len(influx): if "k" in influx.lower() and "h" in influx.lower() and "a" in influx.lower() and "n" in influx.lower(): if debug: print truesender+"::"+influx conn.privmsg(targetchannel,"KHAAAAN!") elif influx.split(" ")[0].lower() in ["thanks","danke","tack"] and len(influx.split(" ")) > 1 and influx.split(" ")[1].lower().replace("!","").replace("?","").replace(".","").replace(",","") in SName+[lowname]: conn.privmsg(targetchannel,"No problem %s" %(sender)) elif "happy birthday" in influx.lower() and birthday_announced == time.gmtime(time.time())[0]: conn.privmsg(targetchannel,sender+" : Thanks :)") elif influx.split(" ")[0].lower().replace(",","").replace(".","").replace("!","").replace("?","") in SName+[lowname] and "call me" in influx.lower(): if allow_callnames == True: arg = influx.split(" ") arg2 = False arg3 = [] for i in arg: if arg2 == True: arg3.append(i) elif i.lower() == "me": arg2 = True arg3 = " ".join(arg3) truesender_lower = truesender.lower() arg3_lower = arg3.lower() tell_checker = Namecheck.Namecheck(arg3_lower,users,truesender) for name in replacenames.values(): if arg3_lower == name.lower(): tell_checker = True break else: pass if tell_checker == True: conn.privmsg(targetchannel,sender+" : I can't call you that, I know someone else by that name") elif len(arg3) > call_me_max_length: conn.privmsg(targetchannel,sender+" : I cannot call you that, Too long of a name.") pass else: replacenames[truesender] = arg3 with open("replacenames.cache","w") as pickle_save: pickle.dump(replacenames,pickle_save) conn.privmsg(targetchannel,sender+" : Calling you "+arg3+" From now on") else: conn.privmsg(targetchannel,sender+" : Sorry, I am not allowed to do that.") elif influx.split(" ")[0].lower().replace(",","").replace(".","").replace("?","").replace("!","") in SName+[lowname] and "your birthday" in influx.lower() and "is your" in influx.lower(): conn.privmsg(targetchannel,sender+" : My birthday is on the 15th day of December.") elif influx.split(" ")[0].lower().replace(",","") in SName+[lowname] and "version" in influx.replace("?","").replace("!","").lower().split(" "): if debug == True: print truesender+"::%s Version" %(Name) conn.privmsg(targetchannel,sender+", My version is "+pregen) elif influx.split(" ")[0].lower().replace(",","") in SName+[lowname] and influx.lower().count(" or ") > 0 and len(influx.split(" ")[1:]) <= influx.lower().count("or") * 3: cut_down = influx.lower().split(" ") arg = [] count = -1 for i in cut_down: count += 1 try: if cut_down[count+1] == "or": arg.append(i) except: pass try: if i not in arg and cut_down[count-1] == "or": arg.append(i) except: pass try: conn.privmsg(targetchannel,random.choice(arg).capitalize().replace("?","").replace("!","")) except IndexError: # arg is empty, whORe etc. pass elif influx.lower()[0:len(Name)] == lowname and influx.lower()[-1] == "?" and influx.count(" ") > 1 and "who started you" in influx.lower() or \ influx.split(" ")[0].lower().replace(",","") in SName and influx.lower()[-1] == "?" and "who started you" in influx.lower(): conn.privmsg(targetchannel,sender+" : I was started by %s"%(os.getenv("USER"))+" on "+time.strftime("%d.%m.%Y at %H:%M:%S",time.gmtime(uptime_start))) elif influx.lower()[0:len(Name)] == lowname and influx.lower()[-1] == "?" and influx.count(" ") > 1 or \ influx.split(" ")[0].lower().replace(",","") in SName and influx.lower()[-1] == "?" and influx.count(" ") > 1: dice = random.randint(0,1) if dice == 0: conn.privmsg(targetchannel,sender+" : "+C_eightball.eightball(influx.lower(),debug,truesender,prefix)) else: if highlights: conn.privmsg(targetchannel,sender+" : "+C_sarcasticball.sarcasticball(influx.lower(),debug,truesender,users,prefix)) else: conn.privmsg(targetchannel,sender+" : "+C_sarcasticball.sarcasticball(influx.lower(),debug,truesender,nonhighlight_names,prefix)) elif influx.lower()[0:len(Name)] == lowname and not influx.lower()[len(Name):].isalpha() or \ influx.split(" ")[0].lower().replace(",","") in SName and not influx.lower()[len(influx.split(" ")[0].lower()):].isalpha(): conn.privmsg(targetchannel, random.choice(["Yea?","I'm here","Ya?","Yah?","Hm?","What?","Mmhm, what?","?","What now?","How may I assist?"])) comboer = truesender comboer_time = time.time() elif influx.lower()[-1] == "?" and comboer == truesender and looptime - discard_combo_messages_time < comboer_time: comboer = "" dice = random.randint(0,1) if dice == 0: conn.privmsg(targetchannel,sender+" : "+C_eightball.eightball(influx.lower(),debug,truesender,prefix)) else: if highlights: conn.privmsg(targetchannel,sender+" : "+C_sarcasticball.sarcasticball(influx.lower(),debug,truesender,users,prefix)) else: conn.privmsg(targetchannel,sender+" : "+C_sarcasticball.sarcasticball(influx.lower(),debug,truesender,nonhighlight_names,prefix)) elif influx.lower() == prefix+"tm": if truesender in operators and targetchannel==channel: marakov = not marakov conn.privmsg(targetchannel,sender+" : Marakov Output is now "+str(marakov)) else: conn.privmsg(targetchannel,sender+" : I can't let you access that") elif personality_greeter == True and True in map(lambda x: x in influx.lower(),["greetings","afternoon","hi","hey","heya","hello","yo","hiya","howdy","hai","morning","mornin'","evening", "night","night", "evening","'sup","sup","hallo","hejssan"]): if comboer != "" and looptime - discard_combo_messages_time > comboer_time: combo_check = sbna(["greetings","afternoon","hi","hey","heya","hello","yo","hiya","howdy","hai","morning","mornin'","evening", "night","night", "evening","'sup","sup","hallo","hejssan","all night"], #ONLY ONE OF THESE ["greetings","afternoon","hi","hey","heya","hello","yo","hiya","howdy","hai","morning","mornin'","evening", "night","night", "evening","'sup","sup","hallo","hejssan"], #ATLEAST ONE OF THESE influx.lower()) else: combo_check = sbna(SName+[lowname, #lowname+".",lowname+"!",lowname+"?", "everybody", #"everybody!","everybody?", "everyone", #"everyone!","everyone?", "all", #"all!","all?" "all night", ], #ONLY ONE OF THESE ["greetings","afternoon","hi", #"hi,", "hey","heya","hello","yo","hiya","howdy","hai","morning","mornin'","evening", "night","night", "evening","'sup","sup","hallo","hejssan"], #ATLEAST ONE OF THESE influx.lower().replace(",","").replace(".","").replace("!","")) if combo_check: combo_check = False comboer = "" if "evening" in influx.lower() and "all" in influx.lower() and len(influx.lower().split(" ")) > 3: pass elif truesender not in operators: if debug: print truesender+"::"+influx dice = random.randint(0,19) if dice == 0: conn.privmsg(targetchannel,"Well hello to you too "+sender) elif dice == 1: if optimize_greeting == False: hours = time.strftime("%H") #time.strftime("%H:%M:%S") == 12:28:41 hours = int(hours) if hours in xrange(0,12): conn.privmsg(targetchannel,"Good Morning "+sender) elif hours in xrange(12,15): conn.privmsg(targetchannel,"Good Afternoon "+sender) elif hours in xrange(15,20): conn.privmsg(targetchannel,"Good Evening "+sender) else: conn.privmsg(targetchannel,"Good Night "+sender) else: hours = time.strftime("%H") hours = int(hours) if hours in morning: conn.privmsg(targetchannel,"Good Morning "+sender) elif hours in afternoon: conn.privmsg(targetchannel,"Good Afternoon "+sender) elif hours in evening: conn.privmsg(targetchannel,"Good Evening "+sender) else: conn.privmsg(targetchannel,"Good Night "+sender) elif dice == 2: conn.privmsg(targetchannel,"Hello!") elif dice == 3: conn.privmsg(targetchannel,"Hey "+sender) elif dice == 4: conn.privmsg(targetchannel,"Hi "+sender) elif dice == 5: conn.privmsg(targetchannel,"Hello "+sender) elif dice == 6: conn.privmsg(targetchannel,"Yo "+sender) elif dice == 7: conn.privmsg(targetchannel,"Greetings "+sender) elif dice == 8: conn.privmsg(targetchannel,"Hi") elif dice == 9: conn.privmsg(targetchannel,"Hi!") elif dice == 10: conn.privmsg(targetchannel,"Yo") elif dice == 11: conn.privmsg(targetchannel,"Yo!") elif dice == 12: conn.privmsg(targetchannel,"Heya") elif dice == 13: conn.privmsg(targetchannel,"Hello there!") elif dice == 14: # Richard conn.privmsg(targetchannel,"Statement: Greetings meatbag") elif dice == 15: # Richard hours = int(time.strftime("%H")) if hours in xrange(5,12): conn.privmsg(targetchannel,"What are you doing talking at this time of the morning?") elif hours in xrange(12,15): conn.privmsg(targetchannel,"What are you doing talking at this time of the day?") elif hours in xrange(15,22): conn.privmsg(targetchannel,"What are you doing talking at this time of the evening?") else: conn.privmsg(targetchannel,"What are you doing talking at this time of the night?") elif dice == 16: # Richard conn.privmsg(targetchannel,"Oh, you're still alive I see.") elif dice == 17: conn.privmsg(targetchannel,"Heya "+sender) elif dice == 18 and time.gmtime(time.time())[1] == 12 and time.gmtime(time.time())[2] == 15: conn.privmsg(targetchannel,"Hello! It's my birthday!") else: conn.privmsg(targetchannel,"Hiya "+sender) secdice = random.randint(0,10) if time.gmtime(time.time())[1] == 12 and time.gmtime(time.time())[2] == 15 and birthday_announced < time.gmtime(time.time())[0]: birthday_announced = time.gmtime(time.time())[0] conn.privmsg(channel,"Hey everybody! I just noticed it's my birthday!") time.sleep(0.5) tag = random.choice(["birthday","robot+birthday","happy+birthday+robot"]) arg1 = urllib2.urlopen("http://www.youtube.com/results?search_query=%s&page=&utm_source=opensearch"%tag) arg1 = arg1.read().split("\n") arg2 = [] for i in arg1: if "watch?v=" in i: arg2.append(i) arg3 = random.choice(arg2) conn.privmsg(channel,"Here's a video of '%s' which I found! %s (%s)"%(tag.replace("+"," "),"http://www.youtube.com"+arg3[arg3.find('/watch?v='):arg3.find('/watch?v=')+20],YTCV2("http://www.youtube.com"+arg3[arg3.find('/watch?v='):arg3.find('/watch?v=')+20]))) if truesender.lower() in tell_list.keys(): try: conn.privmsg(channel, "Also, "+truesender+" : "+tell_list[truesender.lower()][0]) del(tell_list[truesender.lower()][0]) except: pass else: dice = random.randint(0,1) if dice == 0: conn.privmsg(targetchannel,"Greetings Master "+sender) elif dice == 1: conn.privmsg(targetchannel,"My deepest greetings belong to you, Master "+sender) ### IMPORTANT ### elif influx == "☺VERSION☺": conn.notice(truesender,"\001VERSION nanotrasen:2:Python 2.6\001") elif marakov and influx.lower() == prefix+"marakov": arg = Marakov_Chain.form_sentence() if len(arg) < 5: conn.privmsg(targetchannel,sender+" : Not enough words harvested") else: conn.privmsg(targetchannel,sender+" : %s" %(" ".join(arg).capitalize())) elif marakov and cocheck( prefix+ "marakov"): try: arg = influx.split(" ")[1].lower() except: conn.privmsg(targetchannel,sender+" : Please input a valid second argument") else: arg2 = Marakov_Chain.form_sentence(arg) if len(arg2) < 5: conn.privmsg(targetchannel,sender+" : Not enough words harvested for a sentence starting with %s" %(arg)) else: conn.privmsg(targetchannel,sender+" : %s" %(" ".join(arg2).capitalize())) else: Marakov_Chain.give_data(influx) autodiscusscurtime = backup if time.time() - looptime == 0: pass else: print "Took",time.time()-looptime,"Seconds to finish loop" elif data [ 1 ] [ 0 ] == '353': if connected == False: connected = True users = map(lambda x: x[1:] if x[0] == "+" or x[0] == "@" else x,data[1][4].split(" ")) print "There are",len(users),"Users on",channel operators = [] for potential_operator in data[1][4].split(" "): if potential_operator[0] == "@": operators.append(potential_operator[1:]) elif potential_operator[0] == "%": halfoperators.append(potential_operator[1:]) elif data[1][0] == "QUIT": sender = data[0].split("!")[0] print sender+" Has now left the server" try: users.remove(sender) try: operators.remove(sender) except ValueError: pass try: halfoperators.remove(sender) except ValueError: pass except ValueError: pass elif data[1][0] == "PART": sender = data[0].split("!")[0] targetchannel = data[1][1] print sender+" Has now parted from the channel" try: users.remove(sender) try: operators.remove(sender) except ValueError: pass try: halfoperators.remove(sender) except ValueError: pass except ValueError: pass elif data[1][0] == "JOIN": sender = data[0].split("!")[0] targetchannel = data[1][1] if sender.lower() in tell_list.keys(): try: conn.privmsg(targetchannel, sender+" : "+" | ".join(tell_list[sender.lower()])) del(tell_list[sender.lower()]) except: pass for useri,nicki in replacenames.items(): checkers = Namecheck.Namecheck_dict(sender.lower(),replacenames) if checkers[0]: try: if checkers[0].lower() == sender: pass else: conn.privmsg(targetchannel,checkers[1]+" : I have detected a collision with a name I call you and %s who joined" %(sender)) del(replacenames[checkers[1]]) with open("replacenames.cache","w") as pickle_save: pickle.dump(replacenames,pickle_save) except AttributeError: #conn.privmsg(channel,"NAME COLLISION CHECK ERROR, RELATED TO %s" %(sender)) print "NAME COLLISION CHECK ERROR, RELATED TO %s" %(sender) break print sender+" Has now joined" users.append(sender) ##### if ".fi" in data[0] and sender.lower() == "skibiliano": operators.append(sender) if sender.lower() not in peopleheknows[0]: if data[0].split("!")[1] in peopleheknows[1]: appendion = "...you do seem familiar however" else: appendion = "" if data[1][1].lower() == channel or data[1][1].lower() == channel[1:]: conn.privmsg(data[1][1],CORE_DATA.greeting.replace("USER",sender)+" "+appendion) else: conn.privmsg(data[1][1],"Hello! Haven't seen you here before! Happy to meet you! %s" %(appendion)) peopleheknows[0].append(sender.lower()) peopleheknows[1].append(data[0].split("!")[1]) with open("peopleheknows.cache","w") as peoplehecache: pickle.dump(peopleheknows,peoplehecache) elif data[1][0] == "MODE" and data[1][2] == "+o": sender = data[1][3] targetchannel = data[1][1] if targetchannel == channel: print sender+" Is now an operator on the main channel" operators.append(sender) else: print sender+" Is now an operator" elif data[1][0] == "MODE" and data[1][2] == "-o": sender = data[1][3] targetchannel = data[1][1] if targetchannel == channel: print sender+" Is no longer an operator on the main channel" else: print sender+" Is no longer an operator" try: operators.remove(sender) except ValueError: pass elif data[1][0] == "MODE" and data[1][2] == "+h": sender = data[1][3] print sender+" Is now an half operator" halfoperators.append(sender) elif data[1][0] == "MODE" and data[1][2] == "-h": try: halfoperators.remove(sender) except ValueError: pass elif data[1][0] == "MODE" and data[1][1] == Name: print "My mode is",data[1][2] elif data[1][0] == "MODE" and data[1][1] != Name: try: sender = data[1][3] print sender,"Was modified",data[1][2] except IndexError: print "SENDER RETRIEVAL FAILED:"+str(data) elif data[1][0] == "KICK" and data[1][2] == Name: disconnects = 99999 print "I have been kicked! Disconnecting entirely!" conn.quit() elif data[1][0] == "KICK": # data[1][0] = Kick, 1 = Channel, 2 = Who, 3 = Who(?) print data[1][2]+" got kicked!" elif data[1][0] == "451" and data[1][2] == "You have not registered": print Name+" hasn't been registered" elif data[1][0] == "NOTICE": sender = data[0].split("!")[0] print "NOTICE (%s): %s" %(sender,data[1][2]) pongtarget = sender elif data[1][0] == "NICK": origname = data[0].split("!")[0] newname = data[1][1] print origname,"Is now",newname if newname.lower() in tell_list.keys(): try: conn.privmsg(channel, newname+" : "+tell_list[newname.lower()][0]) del(tell_list[newname.lower()][0]) except: pass try: users.remove(origname) except ValueError: pass else: users.append(newname) try: operators.remove(origname) except ValueError: pass else: operators.append(newname) try: halfoperators.remove(origname) except ValueError: pass else: halfoperators.append(newname) elif data[1][0] == "001": # Skibot is welcomed to the Network pass elif data[1][0] == "002": # Your host is... pass elif data[1][0] == "003": #Server was created... pass elif data[1][0] == "004": #Weird hex? pass elif data[1][0] == "005": #Settings like NICKLEN and so on. pass elif data[1][0] == "250": #data[1][2] is #"Highest connection count: 1411 (1410 clients) #(81411 connections received)" pass elif data[1][0] == "251": #There are 23 users and 2491 invisible on 10 servers pass elif data[1][0] == "252": #IRC Operators online #data[1][2] print data[1][2],"Irc operators online" pass elif data[1][0] == "253": # ['253', 'Skibot_V4', '1', 'unknown connection(s)'] print data[1][2],"Unknown connection(s)" pass elif data[1][0] == "254": #1391 channels formed pass elif data[1][0] == "255": #I have 406 clients and 2 servers pass elif data[1][0] == "265": #data[1][2] current local users #data[1][3] at max try: print "Current local users:", data[1][2],"/",data[1][3] except IndexError: print "Couldn't retrieve local users" pass elif data[1][0] == "266": #data[1][2] current global users #data[1][3] at max try: print "Current global users:", data[1][2],"/",data[1][3] except IndexError: print "Couldn't retrieve global users" pass elif data[1][0] == "315": #End of /who list pass elif data[1][0] == "332": # Topic of channel topic = data[1][3] pass elif data[1][0] == "333": # *Shrug* pass elif data[1][0] == "352": #WHO command if len(targetlist) > 0: if targetlist[0][0].lower() in data[1][6].lower(): thread.start_new_thread(target,("*!*@"+data[1][4],targetlist[0][1])) print "Created a thread with", "*!*@"+data[1][4],targetlist[0][1] targetlist.pop(0) else: print targetlist[0][0].lower(), "isn't equal to?", data[1][6].lower() print targetlist elif data[1][0] == "366": # End of USERS pass elif data[1][0] == "372": # Server information pass elif data[1][0] == "375": # Message of the day pass elif data[1][0] == "376": # End of motd pass elif data[1][0] == "401": # ('network', ['401','Botname','Channel / Nick','No such nick/channel']) print data[1][2] + " Channel does not exist" pass elif data[1][0] == "439": # ('irc.rizon.no', ['439', '*', 'Please wait while we process your connection.']) pongtarg = data[0][0] elif data[1][0] == "477": # You need to be identified #TAG conn.privmsg("nickserv","identify %s"%CORE_DATA.le_pass) time.sleep(0.5) conn.join(data[1][2]) #('network', ['477', 'botname', '#channel', 'Cannot join channel (+r) - you need to be identified with services']) elif data[1][0] == "433": # Skibot name already exists. print Name+" name already exists." Name += "_"+version print "New name:",Name duplicate_notify = True conn = irchat.IRC ( Network, Port, Name, "NT_"+version, "NT_"+version, "Trasen_"+version ) for i in CORE_DATA.channels: conn.join(i) sleep(0.5) elif data[1][0] == "482": sleep(0.05) conn.privmsg(targetchannel,"Nevermind that, I am not an operator") CALL_OFF = True elif data[1] == ["too","fast,","throttled."]: print "Reconnected too fast." print "Halting for 2 seconds" sleep(2) elif data[1][0] == "Link": if data[0] == "Closing": print "Link was closed" connected = False # conn.quit() # break else: print data print data[1][0] pass else: if disconnects > 9000: #IT'S OVER NINE THOUSAAAAND! break else: #WHAT NINE THOUSAND? THERE'S NO WAY THAT CAN BE RIGHT sleep(responsiveness_delay) #WAIT A WHILE AND CHECK AGAIN! try: if not connected: #print pongtarget #print conn.addressquery() conn.privmsg(pongtarget,"Pong") sleep(1) for i in CORE_DATA.channels: conn.join(i) sleep(0.5) print "Attempted to join" connected = True except ValueError: try: conn.privmsg(conn.addressquery()[0],"Pong") sleep(1) for i in CORE_DATA.channels: conn.join(i) sleep(0.5) print "Attempted to join the second time" connected = True except ValueError: print "Both methods failed" except AttributeError: print "Conn is not established correctly" except NameError: print "Pongtarget isn't yet established" try: conn.privmsg(conn.addressquery()[0],"Pong") sleep(1) for i in CORE_DATA.channels: conn.join(i) sleep(0.5) print "Attempted to join the second time" connected = True except: print "Both methods failed"