|
Dneska nečekejte žádnej nudnej tutoriál. Dneska je na pořadu dne nudnej IRC robot napsanej v pythonu. Jeho zajímavostí je fakt že zajímavý není.
Nebudu tvrdit že jde o mega efektivní kód, protože to není ani náhodou pravda. Kód vznikl z náhlého návalu inspirace při prohlubování znalostí o pythonu.
Čtení kódu je velice jednoduché, nejsou použity žádné objekty, ale bot umí pár příkazů, dokonce má i malou administraci a zná svoje administrátory takže se baví jen s tím s kým se bavit má,
Možná se i při čtení kódu celkem pobavíte, občas mám ve zvyku do programování zanášet humor.
Tuhle verzi skriptu už rozšiřovat nebudu protože pokračování je už na obzoru bude se to jmenovat Executor. Možná ještě něco fixnu (pokud by někdo teda chtěl)
#!/usr/bin/python
# verze: 0.1
# Author: Ondrej Beranek 2007
# Name: rainbot2
import socket import random bot_server = '127.0.0.1' # irc server bot_port = 6667 # port serveru bot_nick = 'robot_pako' # nick bota bot_channel= '#darley' # kanal bota bot_msg_leave= 'Vrahem byl:' # zprava pri ukonceni bot_admins=['rainbof','Rainbow','Matajon','Maf'] #anketa = [0]=['Kdo je na svete nejkrasnejsi',0,'rainbof',0,'Rainbof',0] bot_mode= 0 # je bot Opem ? rainbot = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) rainbot.connect ( ( bot_server, bot_port ) ) rainbot.send ( 'NICK '+bot_nick+'\n' ) rainbot.send ( 'USER '+bot_nick+' # # :'+bot_nick+'\n') rainbot.send ( 'JOIN '+bot_channel+'\n' ) vtipy = [] ############################## # ankety ############################## def show_anketa(a): # zobrazeni ankety cislo for x in anketa: send_msg_priv(data2[1],x[0]+' '+str(x[1])) def add_anketa(anketa,a,b): # pridani hlasovaci otazky anketa.append([a,b]) return anketa def new_anketa(): # zalozeni ankety return [] ############################## # shell ############################## def readcmd(): try: s = open("prikaz.txt",'r').readlines() except: send_msg('zadne prikazy') else: for x in s: if x[0]!='#': # prikaz se provadi jen pokud neni zakomentovan print 'provadim:' + x rainbot.send (x+'\n') ############################## # vtip baze ############################## def joke_add(joke): # Pridani vtipu try: vtipy.append(joke) return 0 except: return 1 def joke_get(no): # rekne vtip cislo try: return vtipy[no] except: return 0 def joke_random(): # nahodnej vtip return vtipy[random.randint(0,len(vtipy)-1)] def joke_load(): # nacte databazi vtipu try: vtipy=open("vtipy.txt",'r').readlines() return vtipy except: print "zadnej humor" def joke_save(): # ulozeni vtipu try: soubor.writelines(vtipy) return 0 except: return 1 ############################## # prava ############################## def valid_admin(txt): # rekne zda je uzivatel opravnen bavit se s botem valid = 0 for a in bot_admins: if a==txt: valid = 1 return valid ############################## # prace s kanalem ############################## def send_msg(text): # poslani zpravy text = 'PRIVMSG '+bot_channel+' :'+text+'\n' print text rainbot.send(text) def send_msg_priv(user,text): # soukroma zprava text = 'PRIVMSG '+user+' :'+text+'\n' print text rainbot.send(text) def prepare_msg(txt): """ list[0] kanal// list[1] nick1*// list[2] nick2// list[3] gateway// list[4] word1// list[5] word2// list[3] word3//...//""" words = txt[len(txt.split(' ')[0]):].split() #slova na kanale a.split()[0] list=[] list.append(txt[txt.find('#'):txt.find(' :')]) #0 kanal list.append(txt[txt.find(':')+1:txt.find('!')]) #1 nick list.append(txt[txt.find('!~')+1:txt.find('@')]) #2 nick2 list.append(txt[txt.find('@')+1:txt.find(' ')]) #3 hostname for a in words: list.append(a) return list online = 1 vtipy=joke_load() #try: while online == 1: # jedem dokud jsme online :) data = rainbot.recv ( 4096 ) print data data2 = prepare_msg(data) if data[0:4]=='PING': # Nezbytna odpoved serveru rainbot.send('PONG') print "PONG" elif (data2[4] =='PRIVMSG') and (data2[5] ==bot_nick) and (valid_admin(data2[1])==1): # osloveni bota pres PM pro admin if data2[6]==':*kill': # *kill - ukonceni rainbot.send('QUIT : "'+bot_msg_leave+' '+data2[1]+'"\n') online=0 elif (data2[6] ==':*cmd'): # *cmd - provede seznam prikazu z prikaz.txt readcmd() send_msg_priv(data2[1],'hotovo') elif (data2[6] ==':test'): # test send_msg_priv(data2[1],'pohoda sem tu') elif (data2[6] ==':admin+'): # admin+ rainbot.send('MODE '+bot_channel+' +o '+data2[7]+'\n') send_msg_priv(data2[7],'Nyni jsi op') elif (data2[6] ==':admin-'): # admin- rainbot.send('MODE '+bot_channel+' -o '+data2[7]+'\n') send_msg_priv(data2[7],'admin '+data2[7]+' ti odebral prava op') elif (data2[6] ==':anketa+'): # anketa+ nazev='' for a in range(7,len(data2)): nazev=nazev+' '+data2[a] anketa=new_anketa() anketa=add_anketa(anketa,nazev,1) send_msg_priv(data2[1],'zalozeno') elif (data2[6] ==':anketa*'): # anketa* nazev='' for a in range(7,len(data2)): nazev=nazev+' '+data2[a] print "nazev"+nazev anketa=add_anketa(anketa,nazev,0) send_msg_priv(data2[1],'pridano') print anketa elif (data2[6] ==':anketa#'): # anketa# if anketa[0][1]==0: send_msg_priv(data2[1],'Hlasovani uz bylo uzavreno') else: send_msg_priv(data2[1],'Hlasovani uzavreno') elif (data2[6] ==':anketa'): # anketa try: print "len:"+str(len(data2)) if len(data2)==7: # vypis ankety send_msg_priv(data2[1],'Anketni otazka: '+anketa[0][0]) for a in range(1,len(anketa)): send_msg_priv(data2[1],str(a)+'.'+str(anketa[a][0])+' Hlasovano:'+str(anketa[a][1])) except: # pokud anketa neni, budeme si stezovat send_msg_priv(data2[1],'Anekta je v humpolci') else: try: anketa[int(data2[7])][1]+=1 except: send_msg_priv(data2[1],'Nemuzes hlasovat mimo rozsah.') else: send_msg_priv(data2[1],'Neznamy prikaz') send_msg_priv(data2[1],'Prikazy: *kill - \r\n ukonceni bota') send_msg_priv(data2[1],'cmd spusteni pripraveneho makra prikaz.txt') send_msg_priv(data2[1],'*admin+/- <nick> pridani nebo odebrani prav prav kanalu') send_msg_priv(data2[1],'*adminbot+/- <nick> <ip> udeleni nebo odebrani prav k ovladani bota') send_msg_priv(data2[1],'*shell <prikaz> vykona prikaz shellu (vypnuto)') send_msg_priv(data2[1],'Anketni system') send_msg_priv(data2[1],'anketa+ <text> Vytvori novou anketu') send_msg_priv(data2[1],'anketa* <text> prida hlasovaci moznost') send_msg_priv(data2[1],'anketa# ukonci anketu') send_msg_priv(data2[1],'anketa [cislo] hlasovani, bez parametru anketu zobrazi') ############## # udalosti primo na kanalu elif data.find ('MODE '+bot_channel+' +o '+bot_nick)!=-1: # pozna pokud je OP send_msg('diky!') bot_mode = 1 ############## elif (data2[4] =='PRIVMSG') and (data2[5]==bot_channel): # verejne prikazy kanalu if (data2[6] ==':*vtip'): # vypise vtip send_msg(joke_random()) elif (data2[4] =='PRIVMSG') and (data2[5]==bot_nick): # osloveni bota v pripade ze nejsi jeho admin if (data2[6] ==':anketa'): # anketa try: print "len:"+str(len(data2)) if len(data2)==7: # vypis ankety send_msg_priv(data2[1],'Anketni otazka: '+anketa[0][0]) for a in range(1,len(anketa)): send_msg_priv(data2[1],str(a)+'.'+str(anketa[a][0])+' Hlasovano:'+str(anketa[a][1])) except: # pokud anketa neni, budeme si stezovat send_msg_priv(data2[1],'Anketa neni. - blby co ?') else: try: anketa[int(data2[7])][1]+=1 except: send_msg_priv(data2[1],'Nemuzes hlasovat mimo rozsah.') elif (data2[6] ==':*vtip'): # vtip send_msg_priv(data2[1],joke_random()) elif (data2[6] ==':*VTIP'): # vtip send_msg_priv(data2[1],'Nervi na mne!') elif (data2[6] ==':*vtip+'): # vtip+ nazev='' for a in range(7,len(data2)): nazev=nazev+' '+data2[a] joke_add(nazev+'(pridal: '+data2[1]+')') send_msg_priv(data2[1],'vtip pridan') else: send_msg_priv(data2[1],'Neznamy prikaz') send_msg_priv(data2[1],'anketa <cislo> hlasovani v ankete pokud nic nezadas anketa se vypise') send_msg_priv(data2[1],'*vtip <cislo> vypise vtip pokud nezadas jeho cislo vypise nahodnej vtip') send_msg_priv(data2[1],'vtip+ <text> prida vtip') send_msg_priv(data2[1],'prikay zacinajici na * lze pouzit i volne na kanalu') else: pass #except: # rainbot.send('QUIT : "Chyba programu :("\n') #########################
|