Kde to žije tam to hnije

  • v registrech ? v tom případě se ti to stalo hned ...
  • A co mam dělat, když je tam účet jenom jeden?? :sa...
  • No to je lahoda. MocMoc děkuji. Tomu se říká kvali...
  • vdaka
  • dobrej návod , už mi to zase fachá, dík :roll:

RE-KLA-MA

Hledání

Přihlášení



You are here:
IRC rainbot PDF Print E-mail
Written by Administrator   
Sunday, 30 May 2010 13:09

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')
#########################

 

 

Add comment


Security code
Refresh