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

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