"""
MegaHAL - MegaHAL bot for IRC
Copyright (C) 2010  Brian S. Stephan

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from ConfigParser import NoOptionError
import os
import re

from extlib import irclib
from extlib import megahal

from Module import Module

class MegaHAL(Module):
    """Have an annoying, dumb, and hilarious chatterbot on IRC."""

    def __init__(self, config, server, modlist):
        """
        Upon creation, open the MegaHAL brain and get ready for doing actual stuff.
        """

        Module.__init__(self, config, server, modlist)

        try:
            filename = self.config.get(self.__class__.__name__, 'brainfile')
            self.megahal = megahal.MegaHAL(None, filename, 1)
        except NoOptionError:
            self.megahal = megahal.MegaHAL()

    def reload(self, connection, event, nick, userhost, replypath, what, admin_unlocked):
        """
        Broken. Don't do anything.

        TODO: figure out why this is broken. (probably because nothing closes the old
        brain file or deletes the old object, and then all hell breaks loose.)
        """

    def do(self, connection, event, nick, userhost, replypath, what, admin_unlocked):
        """
        Say something on IRC if the bot is being addressed, or at least learn what
        was said.
        """

        line = what
        reply = ""
        append_nick = False

        if line[-1] == '\'':
            line = line[:-1]

        if re.search(connection.get_nickname(), line, re.IGNORECASE) is not None:
            addressed_pattern = '^' + connection.get_nickname() + '[:,]\s+'
            addressed_re = re.compile(addressed_pattern)
            if addressed_re.match(line):
                line = addressed_re.sub('', line)
                append_nick = True

            try:
                reply = self.megahal.get_reply(line)
            except UnicodeDecodeError: pass
        elif re.search('^megahal$', line, re.IGNORECASE) is not None:
            reply = self.megahal.get_reply_nolearn('')
        else:
            self.megahal.learn(line)

        self.megahal.sync()
        if reply is not "":
            if append_nick:
                reply = nick + ": " + reply
            return self.reply(connection, replypath, reply)

# vi:tabstop=4:expandtab:autoindent
# kate: indent-mode python;indent-width 4;replace-tabs on;