# to run this script in irc channel
# python bot_learning_definitions.py irc.freenode.net '#algolit' monster

from __future__ import division
import nltk
from nltk.corpus import wordnet as wn
from pattern.en import tag
import sys
from time import sleep
import irc.bot



# Functions

# transformation of the message
def rewriting(words):
    definitions = []
    # tokenize source and get Part-of-Speech tags for each word
    for word in words:
        # create tuple of tuples with pairs of word + POS-tag
        collection = tag(word)
        # transform tuple into list to be able to manipulate it
        collection = list(collection)
        # for each pair:
        for element in collection:
            # look for nouns & replace them with their definition
            if element[1] == "NN":
                synset = wn.synsets(element[0])
                definitions.append("<")
                definitions.append(synset[0].definition())
                definitions.append(">")
            else:
                # non-nouns are left as words
                definitions.append(element[0])
    # write the transformed sentence
    reply = " ".join(definitions)
    return reply




# Actions bot
class MyBot(irc.bot.SingleServerIRCBot):
    def __init__(self, channel, nickname, server, port=6667):
        irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
        self.channel = channel

    def on_welcome(self, c, e):
        c.join(self.channel)
        print "join"

    def on_privmsg(self, c, e):
        pass

    def on_pubmsg(self, c, e):
        # e.target, e.source, e.arguments, e.type
        # captures last line in chat
        print e.arguments
        msg = e.arguments[0]
        # splits chat message in wordlist
        words = msg.split()
        reply = rewriting(words)
        c.privmsg(self.channel, reply)

# Launch bot
if __name__ == "__main__":
    import sys
    if len(sys.argv) != 4:
        print "Usage: bot_learning_definitions.py <server[:port]> <channel> <nickname>"
        sys.exit(1)
    s = sys.argv[1].split(":", 1)
    server = s[0]
    if len(s) == 2:
        try:
            port = int(s[1])
        except ValueError:
            print "Error: Erroneous port."
            sys.exit(1)
    else:
        port = 6667
    channel = sys.argv[2]
    nickname = sys.argv[3]
    bot = MyBot(channel, nickname, server, port)
    bot.start()