# -*- coding: utf-8 -*-

"""Jabber Bot, a Jabber-based robot

Available commands:
- time? (current time)
- whoami? (your jabber user id)
- subscribe (add yourself to the bot’s roster)
- unsubscribe (remove yourself from the bot’s roster)
- status? (return your status)
- uptime? (server uptime)
- unicodename <char> (find the name of a UTF-8-encoded unicode codepoint)
- google <string> (google search!)
- help! (display help message)
"""

import sys, os
from contrib import xmpp
from contrib import google
import time
import datetime
import unicodedata

__author__ = "Antonio Cavedoni <antonio@cavedoni.org>"
__svnid__ = "$Id$"

class JabberBot:
    def __init__(self, jabber_id, password):
        self.jabber_id = xmpp.protocol.JID(jabber_id)
        self.password = password

    def connect(self):
        self.client = xmpp.Client(self.jabber_id.getDomain())
        self.client.connect(server=('talk.google.com', 5223))
        self.client.auth(self.jabber_id.getNode(), self.password)
        self.client.RegisterHandler('message', self.message_callback)
        self.client.sendInitPresence()
        self.roster = self.client.getRoster()

    def cli_program_send(self, program, user):
        f = os.popen(program, "r")
        self.send(user, f.read())
        f.close()

    def message_callback(self, conn, mess):
        text = mess.getBody()
        user = mess.getFrom().getStripped()
        if text == "time?":
            self.send(user, datetime.datetime.now())
        elif text == "whoami?":
            self.send(user, user)
        elif text == "subscribe":
            self.roster.Subscribe(user)
        elif text == "unsubscribe":
            self.roster.Unsubscribe(user)
        elif text == "status?":
            self.send(user, self.roster.getStatus(user))
        elif text == "uptime?":
            self.cli_program_send('uptime', user)
        elif text.startswith("unicodename "):
            try:
                arg = text[len("unicodename "):]
                self.send(user, unicodedata.name(arg))
            except:
                self.send(
                    user, "Sorry, you must provide a single UTF-8 character")
        elif text.startswith("google "):
            arg = text[len("google "):]
            data = google.doGoogleSearch(arg)
            results = []
            for r in data.results:
                results.append(
                    "* %s: %s" %
                    (r.title.replace('<b>', '').replace('</b>', ''), r.URL))
            self.send(user, "\n".join(results))
        elif text == "help!":
            self.send(user, __doc__)
        print "%s: %s" % (user, text)

    def check_events(self):
        self.client.Process(1)

    def send(self, recipient, msg):
        self.client.send(
            xmpp.protocol.Message(recipient, msg))

if __name__ == "__main__":
    # this is for the google search facility
    google.LICENSE_KEY = "your key"

    # example usage
    bot = JabberBot('username', 'password')
    bot.connect()
    try:
        while 1:
            bot.check_events()
            time.sleep(0.1)
    except KeyboardInterrupt:
        print "Thanks for using my services. Take care! --Jabber Bot"
        sys.exit(0)
