summaryrefslogblamecommitdiff
path: root/plugins/chatbot.py
blob: e26928dc34e62ff9cbd77892f26733fe83296063 (plain) (tree)






































































                                                                         
import re
import random
import types
import net.mapserv as mapserv
from utils import extends
import chat


__all__ = [ 'PLUGIN', 'init', 'answer', 'add_command', 'remove_command' ]


PLUGIN = {
    'name': 'chatbot',
    'requires': (),
    'blocks': (),
}

commands = {}


def answer_info(nick, message, is_whisper, match):
    if is_whisper:
        chat.send_whisper(nick, "This is an experimental bot.")

def answer_random(nick, message, is_whisper, answers):
    resp = random.choice(answers)
    if is_whisper:
        chat.send_whisper(nick, resp)
    else:
        mapserv.cmsg_chat_message(resp)

def answer(nick, message, is_whisper):
    try:
        for regex, action in commands.iteritems():
            match = regex.match(message)
            if match:
                if isinstance(action, types.ListType):
                    answer_random(nick, message, is_whisper, action)
                elif isinstance(action, types.FunctionType):
                    action(nick, message, is_whisper, match)
                else:
                    raise ValueError("must be either list or function")
    except:
         answer_random(nick, message, is_whisper, action)

@extends('smsg_being_chat')
def being_chat(data):
    idx = data.message.find(' : ')
    if idx > -1:
        nick = data.message[:idx]
        message = data.message[idx + 3:]
        answer(nick, message, False)


@extends('smsg_whisper')
def got_whisper(data):
    nick, message = data.nick, data.message
    answer(nick, message, True)


def add_command(cmd, action):
    cmd_re = re.compile(cmd)
    commands[cmd_re] = action

def remove_command(cmd):
    cmd_re = re.compile(cmd)
    commands.remove(cmd_re)

def init(config):
    add_command('!info', answer_info)
    add_command('!random', ['asd', 'Ciao!'])