0f52bf087be267a4a8a253beb5e9dca14529973f
[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.state_changed(new_state)
52     
53     def state_changed(self, new_state):
54         self.state = new_state
55         # look up the dictionary object for the current state, then construct
56         # a presence object using that as a keyword argument
57         new_presence = xmpp.dispatcher.Presence(**self.presences[new_state])
58         self.jabberclient.send(new_presence)
59
60 if __name__ == '__main__':
61     
62     from dbus.mainloop.glib import DBusGMainLoop
63     DBusGMainLoop(set_as_default=True)
64     # get on the bus
65     system_bus = dbus.SystemBus()
66     
67     # dictionary to hold door names and objects
68     doors = {'uccdoor': None, 'unisfadoor': None, 'chdoor': None, 'mrdoor': None, 'uccpir': None}
69     
70     # create and save door objects
71     for doorname in doors.keys():
72         doors[doorname] = Door(doorname)
73     
74     # engage!
75     loop = gobject.MainLoop()
76     try:
77         loop.run()
78     except KeyboardInterrupt:
79         loop.quit()

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