--- /dev/null
+#! /usr/bin/env python
+# UCC Door Server - Jabber/XMPP door client
+# Released under an MIT-style license; see COPYING for details.
+
+import dbus
+import gobject
+import xmpp
+import os
+
+server = 'ucc.asn.au'
+password = open(os.environ['HOME']+ '/.jabberpw', 'r').readline().strip()
+
+class Door(object):
+ # XXX: if the server process is not running, this client will terminate
+ # XXX: if the server process stops, there is not notification, and old
+ # statuses will be persisted until it is restarted
+
+ def __init__(self, doorname):
+ self.presences = {-1: {'show': 'dnd', 'status': 'busted'},
+ 0: {'show': 'away', 'status': 'closed'},
+ 1: {'show': 'chat', 'status': 'open'},}
+
+ if 'pir' in doorname:
+ self.presences = {-1: {'show': 'dnd', 'status': 'busted'},
+ 0: {'show': 'away', 'status': 'nothing moves'},
+ 1: {'show': 'chat', 'status': 'there is movement'},}
+
+ self.state = -1
+
+ # connect to hardware server over D-BUS
+ self.remoteobj = system_bus.get_object('au.asn.ucc.DoorServer',
+ '/au/asn/ucc/doors/' + doorname)
+ self.remoteobj.connect_to_signal('status_changed', self.state_changed,
+ dbus_interface='au.asn.ucc.DoorInterface')
+
+ # connect to the Jabber server
+ self.jabberclient = xmpp.Client(server, debug=None)
+ self.jabberclient.connect()
+ self.jabberclient.auth(doorname, password)
+ # make self available via jabber, don't bother getting the contact list
+ self.jabberclient.sendInitPresence(requestRoster = 0)
+
+ try:
+ new_state = self.remoteobj.get_status(dbus_interface='au.asn.ucc.DoorInterface')
+ except:
+ pass
+
+ self.state_changed(new_state)
+
+ def state_changed(self, new_state):
+ self.state = new_state
+ # look up the dictionary object for the current state, then construct
+ # a presence object using that as a keyword argument
+ new_presence = xmpp.dispatcher.Presence(**self.presences[new_state])
+ self.jabberclient.send(new_presence)
+
+if __name__ == '__main__':
+
+ from dbus.mainloop.glib import DBusGMainLoop
+ DBusGMainLoop(set_as_default=True)
+ # get on the bus
+ system_bus = dbus.SystemBus()
+
+ # dictionary to hold door names and objects
+ doors = {'uccdoor': None, 'unisfadoor': None, 'chdoor': None, 'mrdoor': None, 'uccpir': None}
+
+ # create and save door objects
+ for doorname in doors.keys():
+ doors[doorname] = Door(doorname)
+
+ # engage!
+ loop = gobject.MainLoop()
+ try:
+ loop.run()
+ except KeyboardInterrupt:
+ loop.quit()