Python IRC bot, v3

Dec 21, 2011 10:43 PM

Beware, the code is quite ratty. A goal in this version was to be able to update/add commands without having to restart the bot. Mission accomplished.

botim.py:

import sys

import socket

import re

import select

from time import sleep

from command import command

#Global Variables

host    = "irc.darchoods.net"   #This is the IRC server variable.

port    = 6667                  #This is the port

nick    = ""             #Bot name

ident   = ""             #ID to NickServ with this name

servername = "bla"

realname= ""             #Bots real name for server identification

password= ""

channel = "#nullbytez"          #This is the channel name

CRLF = '\r\n'

# Examples

# Considered adding something to make it a little more channel independant

"""

    All functions must take one argument: args

    args[0] is the socket

    args[1] is the command object

    args[2] is a list of extra arguments

"""

def pong(args):

    args[0].sendall('PONG :' + args[1] + CRLF)

def b_quit(args):

    args[0].sendall("QUIT :Quit Leaving" + CRLF)

def addUser(args):

    args[1].addSafe('ryoh', args[2][0])

def rmUser(args):

    args[1].rmSafe('ryoh', args[2][0])

def opUser(args):

    args[0].sendall("MODE #nullbytez +o " + args[2][0] + CRLF)

def loadMod(args):

    args[1].load('ryoh', args[2][0])

def refresh(args):

    args[1].refresh('ryoh', args[2][0])

def main():

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP )

    s.connect((host, port))

    s.sendall("NICK %s\r\n" % nick) #Sets the Bot's nick name

    s.sendall("USER %s %s %s :%s\r\n" % (ident, host, servername, realname)) #Logs Bot into IRC and ID's

    # at this point I'm connected and ready to start talking

    f = s.makefile() # I do this to take advantage of readline()

    runner = command(['ryoh', 'L-'])

    runner.add('ryoh', 'pong', pong)

    runner.add('ryoh', '!quit', b_quit)

    runner.add('ryoh', '!add', addUser)

    runner.add('ryoh', '!rm', rmUser)

    runner.add('ryoh', '!op', opUser)

    runner.add('ryoh', '!load', loadMod)

    runner.add('ryoh', '!reload', refresh)

    while 1:

        ready = select.select([0, f], [], [])

        if 0 in ready[0]:

            data = sys.stdin.readline().rstrip().lstrip()

            if data: s.sendall(data + CRLF)

        if f in ready[0]:

            line = f.readline().rstrip().lstrip()

            if 'PING' in line:

                server = line.split(':')[1].lstrip().rstrip()

                runner.do('ryoh', 'pong', s, server)

            if line:

                print line

                if line[0] == ':':

                    try:

                        extras = line.split(':')[2].split(' ')[1:]

                    except IndexError: extras = ''

                    try:

                        if runner.check(line.split(':')[2].split(' ')[0]):

                            runner.do(line.split(':')[1].split('!')[0],

                            line.split(':')[2].split(' ')[0], s, runner, extras)

                    except IndexError: pass

            else: break

if __name__ == '__main__':

    main()

command.py:

class command:

    _COMMANDS = {}

    _safe = []

    def __init__(self, safe):

        self._safe = safe

    def add(self, user, command, handle):

        if user in self._safe:

            if command not in self._COMMANDS:

                self._COMMANDS[command.lower()] = handle

    def rm(self, user, command):

        if user in self._safe:

            if command.lower() in self._COMMANDS:

                del self._COMMANDS[command.lower()]

    def do(self, user, command, *args):

        if user in self._safe:

            self._COMMANDS[command.lower()](args)

    def load(self, user, module):

        self._extract(__import__(module))

    def _extract(self, module):

        for command in dir(module):

            self._COMMANDS["!" + command] = eval("module."+command)

    def refresh(self, user, module):

        m = __import__(module)

        reload(m)

        self._extract(m)

    def getSafe(self, user):

        if user in self._safe:

            return self.safe

    def addSafe(self, user, name):

        if user in self._safe:

            self._safe.append(name)

    def rmSafe(self, user, name):

        if user in self._safe:

            self._safe.remove(name)

    def check(self, command):

        if command in self._COMMANDS:

            return True

        else:

            return False

extras.py:

"""

    All functions must take one argument: args

    args[0] is the socket

    args[1] is the command object

    args[2] is a list of extra arguments

"""

CRLF = '\r\n'

def say(args):

    string = ''

    for c in args[2]:

        string += c + ' '

    args[0].sendall("PRIVMSG #nullbytez :" + string + CRLF)

def nig(args):

    args[0].sendall("PRIVMSG #nullbytez :now I can add shit on the fly" + CRLF)

Just updated your iPhone? You'll find new Apple Intelligence capabilities, sudoku puzzles, Camera Control enhancements, volume control limits, layered Voice Memo recordings, and other useful features. Find out what's new and changed on your iPhone with the iOS 18.2 update.

Related Articles

637263493835297420.jpg

How to Use Zero-Width Characters to Hide Secret Messages in Text (& Even Reveal Leaks)

636455706472146367.jpg

How to Hide DDE-Based Attacks in MS Word

Comments

No Comments Exist

Be the first, drop a comment!