sockets and classes

TheDustbustr thedustbustr at aol.com
Wed Aug 1 14:36:53 EDT 2001


I did not include the code to read from the socket in my post to make the code
more readable, but it was there.  And it was recieving data, i accidently had
deleted the 'print data' statement :P

New problem:  I get the following error:
     if arg[0] == 'privmsg':
TypeError: unsubscriptable object
Whats that supposed to mean?

Hres all the code i have, about 100 lines.  Its not commented very well at all
cause I'm in a rush- post if comments are needed for you to understand what I'm
doing.

Thanks, Dustin

#BEGIN CODE BLOCK
# pIRC by Dustin Getz
# a simple IRC client/bot

import socket, string, sys, errno, thread

HOST = 'liberty.nj.us.dal.net'
PORT = 7000

NICK='Dustin2'
REAL='Ima Bot'
QUITMSG='Bye'
IDENT='hacker'

oplist=['Dustin']
commandlist=[]

class Irc:
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def connect(self):
        print 'Connecting to %s:%s' % (self.host, self.port)
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect((self.host, self.port))

    def sendcmd(self, cmd):
        self.sock.send(cmd)

    def docmd(self,arg):
        pass

    def parse(self, data):
        if string.find(string.lower(data), 'privmsg') >= 0:
            garbage,middle,msg = string.split(data,':')
            sender,cmd,rcpt = string.split(middle)
            arg=[string.lower(cmd),sender,rcpt,msg]
            return arg
        elif string.find(string.lower(data), 'ping') >= 0: 
             sender,cmd,pong = string.split(data[1:])
             arg=[string.lower(cmd),sender,pong]
             return arg

    def prettify(self, data):
        if string.find(string.lower(data), 'privmsg') >= 0:
            if data[:1]==':':
                garbage,middle,msg = string.split(data,':')
                sender,cmd,rcpt = string.split(middle)
                return '<%s> %s' % (sender,msg)
            else:
                middle,msg = string.split(data,':')
                cmd,rcpt = string.split(middle)
                return '<Dustin> %s' % msg
        else:
            return data

#    def get_control(self):
#        while 1:
#            data = self.sock.recv(256)
#            if string.lower(data) == 'die':
#                irc.sock.send('QUIT :%s' % QUITMSG)
#                irc.sock.close
#                self.sock.close
#                break
#            else:
#                irc.sock.send(data)
#                print data

class Log:
    pass

irc=Irc(HOST, PORT)
irc.connect()

log=Log()
log.raw=open('ircraw.txt','w')
log.plain=open('ircplain.txt','w')

while 1:	# initial registration
    data = irc.sock.recv(1024)
    log.raw.write(data)
    print data
    if string.find(string.lower(data), 'got ident response') > 0 or
string.find(string.lower(data), 'no ident response') > 0: break

print 'USER %s localhost localhost :%s\n' % (IDENT, REAL)
irc.sendcmd('USER %s localhost localhost :%s\n' % (IDENT, REAL))
print 'NICK %s\n' % NICK
irc.sendcmd('NICK %s\n' % NICK)

#ctl = irc('localhost',5989)
#ctl.connect()
#thread.start_new_thread(get_control,())

while 1:	# main program loop
    data = irc.sock.recv(2048)
    log.raw.write(data)
    arg = irc.parse(data)
    if arg[0] == 'privmsg':
        if arg[3] in commandlist:
            if arg[1] in oplist: irc.docmd(arg)
            else: irc.send('PRIVMSG %s :You do not have sufficient privleges to
execute %s.' % (arg[1],arg[3]))
        else: irc.send('PRIVMSG %s :Unknown command.  Type HELP for list of
commands.' % arg[1])
    elif arg[0] == 'ping': irc.send('PONG %s' % arg[2])
    display=irc.prettify(data)
    log.plain.write(display)
    print display
#END CODE BLOCK



More information about the Python-list mailing list