root/trunk/RBJabber/RBJabber/PresenceMap.py

Revision 400, 2.7 kB (checked in by sholloway, 6 years ago)

Integrated SubjectObserver? from old foundation into tree for meantime

Line 
1 #!/usr/bin/env python
2 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 ##~ License
4 ##~
5 ##- The RuneBlade Foundation library is intended to ease some
6 ##- aspects of writing intricate Jabber, XML, and User Interface (wxPython, etc.)
7 ##- applications, while providing the flexibility to modularly change the
8 ##- architecture. Enjoy.
9 ##~
10 ##~ Copyright (C) 2002  TechGame Networks, LLC.
11 ##~
12 ##~ This library is free software; you can redistribute it and/or
13 ##~ modify it under the terms of the BSD style License as found in the
14 ##~ LICENSE file included with this distribution.
15 ##~
16 ##~ TechGame Networks, LLC can be reached at:
17 ##~ 3578 E. Hartsel Drive #211
18 ##~ Colorado Springs, Colorado, USA, 80920
19 ##~
20 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21
22 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 #~ Imports
24 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25
26 from SubjectObserver.Subject import Subject
27 from SubjectObserver.Observer import Observer
28 from SubjectObserver.BidableSubject import BidableSubject
29 from JabberSubject import FromJIDSubject
30 import JID
31
32 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33 #~ Classes
34 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35
36 class PresenceMapMixin(object):
37     def __init__(self, JC):
38         JC.stream.AddObserver('presence', self.OnPresence)
39         self.ByJID = {}
40         self.ByResource = {}
41
42     def OnPresence(self, subject, presence):
43         self.ByJID[presence.from_] = presence
44         self.ByResource.setdefault(presence.from_.nominal(), {})[presence.from_.resource()] = presence
45
46     def __getitem__(self, name):
47         return self.ByJID.get(JID.JID(name))
48     def __setitem__(self, name, value):
49         self.ByJID[JID.JID(name)] = value
50     def __delitem__(self, name):
51         del self.ByJID[JID.JID(name)]
52     def __contains__(self, name):
53         return JID.JID(name) in self.ByJID
54
55 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56
57 class PresenceMap(PresenceMapMixin, BidableSubject):
58     def __init__(self, JC):
59         PresenceMapMixin.__init__(self, JC)
60         BidableSubject.__init__(self)
61
62     def OnPresence(self, subject, presence):
63         self.__super.OnPresence(subject, presence)
64         self.UpdateObservers(PresenceFrom=presence.from_)
65
66 PresenceMap._PresenceMap__super = super(PresenceMap)
67
68 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69
70 class PresenceUpdate(FromJIDSubject):
71     def __init__(self, JC):
72         FromJIDSubject.__init__(self)
73         JC.stream.AddObserver('presence', self)
74
75 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
76
77 class PresenceUpdateMap(PresenceUpdate, PresenceMapMixin):
78     def __init__(self, JC):
79         PresenceUpdate.__init__(self, JC)
80         PresenceMapMixin.__init__(self, JC)
81
Note: See TracBrowser for help on using the browser.