This bot has some common functions, along with some not so common. I've been using this code to text my wife from work when my phone dies.

Requirements:

  • Gmail account (for texting)
  • xgoogle (for lang translation)

I know it is messy, and the variables are named poorly; sorry. I swear they made since at the time of initial coding :$

Once the bot is in the channel you send it commands denoted with '^'.
Example:
^whoareyou

Some commands require more than one argument like the texting command; they are seporated by '*' or ':'. Just take a look at the code to see where it splits the data.
Example:
^textMessage *ATT *3045555555 *This is a test message

I want to add DCC file transfer, but don't know the raw IRC commands to do it. I know its something like "PRIVMSG #ChtRm DCC file.zip"

I've googled with no good result; maybe I'm stupid...
I found plenty on doing it with a client program like mIRC, but not the raw protocol commands. Anyone have an idea?

#-------------------------------------------------------------------------------
# Name:        PyIRC
# Purpose:     Python based IRC bot
#
# Author:      K.B. Carte (techb)
#
# Created:     04/27/2010
# -->updated:   07/19/2010
#
# Copyright:   (c) K.B. Carte (techb) 2010
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import socket, string, time, random, re, xgoogle, urllib2, cookielib, smtplib
from xgoogle.search import GoogleSearch, SearchError
from xgoogle.translate import Translator

carriers = {"Alltel":"@message.alltel.com",
"ATT":"@txt.att.net",
"NEXTEL":"@messaging.nextel.com",
"SPRI":"@messaging.sprintpcs.com",
"TMOBILE":"@tmomail.net",
"VERIS":"@vtext.com",
"VERGIN":"@vmobl.com"}

chan = 'PyIRC'
ircsite = 'irc.freenode.net'
port = 6667
lang = Translator().lang
translate = Translator().translate

def sendText(body, to = "5555555555@txt.att.net", username = "yourAccount@gmail.com", password = "Your pass"):
    """Sends a text via Gmail"""
    mail_server = smtplib.SMTP("smtp.gmail.com", 587)
    mail_server.ehlo()
    mail_server.starttls()
    mail_server.ehlo()
    mail_server.login(username, password)
    mail_server.sendmail(username, to, body)
    mail_server.close()

def sentance():
    """Genorates a random sentance"""
    noun = ['school', 'yard', 'house', 'ball', 'shoes', 'shirt',
        'fan', 'purse', 'bag', 'pants', 'toaster', 'lamp', 'floor',
        'door', 'table', 'bread', 'dresser', 'cup', 'salt', 'pepper',
        'plate', 'dog', 'cat', 'wood', 'stool', 'suitcase', 'plane',
        'bus', 'car', 'bike', 'phone', 'pillow', 'wall', 'window',
        'bed', 'blanket', 'hand', 'head', 'bra', 'eyes', 'sock',
        'plastic', 'card board', 'pantys', 'oven', 'bow', 'hair',
        'person', 'clock', 'foot', 'boy', 'book', 'ear', 'girl',
        'park', 'basket', 'woman', 'street', 'box', 'man']

    verb = ['bounced', 'cried', 'jumped', 'yelled', 'flew', 'screamed',
        'coughed','smoked','sneezed','exploded','puked','fell','burned',
        'smiled','spied','slept','drove','####ed','skipped','ran','walked',
        'died','laughed','sang','tripped','frowned','slipped','committed murder']

    adjective = ['beautiful','black','old','ugly','wet','red','loud','blue','dry',
             'quiet','purple','hairy','medicore','yellow','bald','meloncholy',
             'white','smooth','bright','clear','rough','dark','round','sexual',
             'heavy','square','sexy','smelly','triangular','angry','discusting',
             'octagon','sad','delicious','precious','happy','fat','distinguished',
             'scared','skinny','burnt','brown','new']

    ending = ['?', '.', '...', '!']

    s = "The %s %s %s %s" % (random.choice(adjective),
                                 random.choice(noun),
                                 random.choice(verb),
                                 random.choice(ending))
    return(s)

irc = socket.socket()
irc.connect((ircsite, port))
print irc.recv(1024)
n = 'PyIRCV3'
irc.send('NICK %s\r\n' %  n)
irc.send("USER %s %s bla :%s\r\n" % ("Ohlook", 'itsnotmy', 'Realname'))
time.sleep(4)
irc.send("JOIN #%s\r\n" % chan)

readbuffer = ''
while True:
    readbuffer= irc.recv(1024)
    temp=string.split(readbuffer, "\n")
    Check = readbuffer.split(':')
    print readbuffer

    if 'PING' in readbuffer:
        """PIN/PONG connection echo response"""
        irc.send("PONG :%s" % Check[1])

    if 'JOIN' in readbuffer:
        """Greet people that join the channel"""
        na = Check[1].split('!')
        irc.send("PRIVMSG #%s :Hello %s\r\n" % (chan, str(na[0])))

    if "^translate" in readbuffer:
        """Translate command"""
        if "^translate lang" in readbuffer:
            na = readbuffer.split('!')
            for i in lang:
                """send privet message to who wants to know
                   the languages supported, it is a big list"""
                irc.send("PRIVMSG %s :%s = %s\r\n" % (na[0].strip(':'),lang[i],i))
        else:
            tran = readbuffer.split(':')
            na = readbuffer.split('!')
            tran = tran[2:]
            if not tran:
                irc.send("PRIVMSG #%s :syntax'^translate :search term :<lang>\r\n'" % chan)
            else:
                tr = tran[1].strip()
                try:
                    l = translate(tr, lang_to=tran[2].strip())
                    l= l.encode('ascii','ignore')
                    print l
                    irc.send("PRIVMSG #%s :%s\r\n" % (chan, l))
                except xgoogle.translate.TranslationError:
                    irc.send("PRIVMSG #%s :not a valid language\r\n" % chan)

    if "^quote" in readbuffer:
        """Pulls a quote from HBH"""
        cj = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        opener.addheaders.append(('User-agent', 'Mozilla/4.0'))
        opener.addheaders.append( ('Referer', 'http://www.hellboundhackers.org/index.php') )
        resp = opener.open('http://www.hellboundhackers.org/index.php')
        r = resp.read()
        resp.close()
        del cj, opener
        da = re.findall("nter; width:70%;'>(.*)</div>",r)
        irc.send("PRIVMSG #%s :%s\r\n" % (chan, da[0]))

    if "^google" in readbuffer:
        """googles the search term and displays the first 5 results"""
        try:
            fin = readbuffer.split(':')
            if not fin:
                irc.send("PRIVMSG #%s :syntax'^google :search term\r\n'" % chan)
            else:
                fin = fin[3].strip()
                gs = GoogleSearch(fin)
                gs.results_per_page = 10
                results = gs.get_results()
                for results in results:
                    irc.send("PRIVMSG #%s :%s\r\n" % (chan, results.url.encode("utf8")))
        except IndexError:
            irc.send("PRIVMSG #%s :syntax ^+google :search term\r\n" % chan)
        except SearchError, e:
            irc.send("PRIVMAS #%s :Search failed: %s" % (chan, e))

    if "^time" in readbuffer:
        """displays time"""
        irc.send("PRIVMSG #%s :%s\r\n" % (chan, time.strftime('%I')+':'+time.strftime('%M')))

    if "^sentance" in readbuffer:
        """calls random sentance"""
        sen = sentance()
        irc.send("PRIVMSG #%s :%s\r\n" % (chan, sen))

    if "^boobs" in readbuffer:
        """crude perverted humor lol"""
        irc.send("PRIVMSG #%s :(.Y.)\r\n" % chan)

    if "^say" in readbuffer:
        """make the bot say the given word/phrase"""
        th = readbuffer.split('^say')
        th = th[-1].split('\r\n')
        irc.send("PRIVMSG #%s :%s\r\n" % (chan, th[0].strip()))

    if "^test" in readbuffer:
        """test bot, see if its listening"""
        irc.send("PRIVMSG #%s :I'm still alive...\r\n" % chan)

    if "^commands" in readbuffer:
        """shows a list of supported commands"""
        irc.send("PRIVMSG #%s :^ + (commands, carr, say <term/phrase>, sentance, test, whoareyou, boobs, google :<search term>, quote,\r\n" % chan)
        irc.send("PRIVMSG #%s :translate :<term/phrase> :<lang code> **type trans lang for list of available languages**)\r\n" % chan)
        irc.send("PRIVMSG #%s :^ + textMessage *carr *10 digit number *The message\r\n")

    if "^whoareyou" in readbuffer:
        """Shows who/what the bot is and written in"""
        irc.send("PRIVMSG #%s :I am %s, I was created By: TechB\r\n" % (chan, n))
        irc.send("PRIVMSG #%s :I was written in Python 2.6, and edited with PyScripter\r\n" % chan)
        irc.send("PRIVMSG #%s :The Classes used are socket, string, time, random, re, xgoogle, urllib2, cookielib, smtplib\r\n" % chan)
        irc.send("PRIVMSG #%s :As well as some functions from TechB\r\n" % chan)
        irc.send("PRIVMSG #%s :type ^commands for a list of things I can do\r\n" % chan)

    if "^carr" in readbuffer:
        """list of carrier codes used in ^textMessage"""
        irc.send("PRIVMSG #%s :%s\r\n" % (chan,carriers.keys()))

    if "^textMessage" in readbuffer:
        """Send text to a cellphone"""
        try:
            text = readbuffer.split('^textMessage')
            text = text[-1].split('\r\n')
            text = text[0].strip()
            text = text.split('*')
            carr = text[1].strip()
            numb = text[2].strip()
            bdy = text[3]
            sendText(bdy, to=numb+carriers[carr])
        except:
            irc.send("PRIVMSG #%s :^+carr for carrier codes\r\n" % chan)
The article starter has earned a lot of community kudos, and such articles offer a bounty for quality replies.