root/hacks/trunk/statusbot/jabberbot.py

Revision 54, 3.1 kB (checked in by verbosus, 3 years ago)

Added the statusbot (and jabberbot) project

Line 
1# -*- coding: utf-8 -*-
2
3"""Jabber Bot, a Jabber-based robot
4
5Available commands:
6- time? (current time)
7- whoami? (your jabber user id)
8- subscribe (add yourself to the bot’s roster)
9- unsubscribe (remove yourself from the bot’s roster)
10- status? (return your status)
11- uptime? (server uptime)
12- unicodename <char> (find the name of a UTF-8-encoded unicode codepoint)
13- google <string> (google search!)
14- help! (display help message)
15"""
16
17import sys, os
18from contrib import xmpp
19from contrib import google
20import time
21import datetime
22import unicodedata
23
24__author__ = "Antonio Cavedoni <antonio@cavedoni.org>"
25__svnid__ = "$Id$"
26
27class JabberBot:
28    def __init__(self, jabber_id, password):
29        self.jabber_id = xmpp.protocol.JID(jabber_id)
30        self.password = password
31
32    def connect(self):
33        self.client = xmpp.Client(self.jabber_id.getDomain())
34        self.client.connect(server=('talk.google.com', 5223))
35        self.client.auth(self.jabber_id.getNode(), self.password)
36        self.client.RegisterHandler('message', self.message_callback)
37        self.client.sendInitPresence()
38        self.roster = self.client.getRoster()
39
40    def cli_program_send(self, program, user):
41        f = os.popen(program, "r")
42        self.send(user, f.read())
43        f.close()
44
45    def message_callback(self, conn, mess):
46        text = mess.getBody()
47        user = mess.getFrom().getStripped()
48        if text == "time?":
49            self.send(user, datetime.datetime.now())
50        elif text == "whoami?":
51            self.send(user, user)
52        elif text == "subscribe":
53            self.roster.Subscribe(user)
54        elif text == "unsubscribe":
55            self.roster.Unsubscribe(user)
56        elif text == "status?":
57            self.send(user, self.roster.getStatus(user))
58        elif text == "uptime?":
59            self.cli_program_send('uptime', user)
60        elif text.startswith("unicodename "):
61            try:
62                arg = text[len("unicodename "):]
63                self.send(user, unicodedata.name(arg))
64            except:
65                self.send(
66                    user, "Sorry, you must provide a single UTF-8 character")
67        elif text.startswith("google "):
68            arg = text[len("google "):]
69            data = google.doGoogleSearch(arg)
70            results = []
71            for r in data.results:
72                results.append(
73                    "* %s: %s" %
74                    (r.title.replace('<b>', '').replace('</b>', ''), r.URL))
75            self.send(user, "\n".join(results))
76        elif text == "help!":
77            self.send(user, __doc__)
78        print "%s: %s" % (user, text)
79
80    def check_events(self):
81        self.client.Process(1)
82
83    def send(self, recipient, msg):
84        self.client.send(
85            xmpp.protocol.Message(recipient, msg))
86
87if __name__ == "__main__":
88    # this is for the google search facility
89    google.LICENSE_KEY = "your key"
90
91    # example usage
92    bot = JabberBot('username', 'password')
93    bot.connect()
94    try:
95        while 1:
96            bot.check_events()
97            time.sleep(0.1)
98    except KeyboardInterrupt:
99        print "Thanks for using my services. Take care! --Jabber Bot"
100        sys.exit(0)
Note: See TracBrowser for help on using the browser.