sigh
[uccdoor.git] / client-xmpp.py
1 #! /usr/bin/env python
2 # UCC Door Server - Jabber/XMPP door client
3 # David Adam <[email protected]>
4 # Released under an MIT-style license; see COPYING for details.
5
6 import syslog
7 import dbus
8 import gobject
9 import xmpp
10 import os
11
12 server = 'ucc.asn.au'
13 password = open(os.environ['HOME']+ '/.jabberpw', 'r').readline().strip()
14
15 class Door(object):
16     # XXX: if the server process is not running, this client will terminate
17     # XXX: if the server process stops, there is not notification, and old
18     #      statuses will be persisted until it is restarted
19     
20     def __init__(self, doorname):
21         self.presences = {-1: {'show': 'dnd', 'status': 'busted'},
22             0: {'show': 'away', 'status': 'closed'},
23             1: {'show': 'chat', 'status': 'open'},}
24         
25         if 'pir' in doorname:
26             self.presences = {-1: {'show': 'dnd', 'status': 'busted'},
27                 0: {'show': 'away', 'status': 'nothing moves'},
28                 1: {'show': 'chat', 'status': 'there is movement'},}
29         
30         self.state = -1
31         
32         # connect to hardware server over D-BUS
33         self.remoteobj = system_bus.get_object('au.asn.ucc.DoorServer',
34                                                '/au/asn/ucc/doors/' + doorname)
35         self.remoteobj.connect_to_signal('status_changed', self.state_changed,
36                                          dbus_interface='au.asn.ucc.DoorInterface')
37         
38         # connect to the Jabber server
39         self.jabberclient = xmpp.Client(server, debug=None)
40         self.jabberclient.connect()
41         self.jabberclient.auth(doorname, password)
42         # make self available via jabber, don't bother getting the contact list
43         self.jabberclient.sendInitPresence(requestRoster = 0)
44         
45         try:
46             new_state = self.remoteobj.get_status(dbus_interface='au.asn.ucc.DoorInterface')
47         except Exception, e:
48             syslog.syslog(142, "get_status failed: %s" % e)
49             pass
50         
51         self.doorname = doorname
52         self.state_changed(new_state)
53     
54     def state_changed(self, new_state):
55         print "xmpp state change detected for %s from %i to %i" % (self.doorname, self.state, new_state)
56         self.state = new_state
57         # look up the dictionary object for the current state, then construct
58         # a presence object using that as a keyword argument
59         new_presence = xmpp.dispatcher.Presence(**self.presences[new_state])
60         self.jabberclient.send(new_presence)
61
62 if __name__ == '__main__':
63     
64     from dbus.mainloop.glib import DBusGMainLoop
65     DBusGMainLoop(set_as_default=True)
66     # get on the bus
67     system_bus = dbus.SystemBus()
68     
69     # dictionary to hold door names and objects
70     doors = {'uccdoor': None, 'unisfadoor': None, 'chdoor': None, 'mrdoor': None, 'uccpir': None}
71     
72     # create and save door objects
73     for doorname in doors.keys():
74         doors[doorname] = Door(doorname)
75     
76     # engage!
77     loop = gobject.MainLoop()
78     try:
79         loop.run()
80     except KeyboardInterrupt:
81         loop.quit()

UCC git Repository :: git.ucc.asn.au