Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services/presence2/presenceservice.py
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2007-03-05 17:56:17 (GMT)
committer Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>2007-03-05 17:56:17 (GMT)
commit148c93968bb89f952aacc6c2bc9e685f6c8fe99c (patch)
treed2890f76b4e28dbd70b2342b4884051a8d01835e /services/presence2/presenceservice.py
parent39c6542e40c552f011e6c694bbbd1a22c8f5e06e (diff)
create/remove activities according to ActivitiesChanged signal
Diffstat (limited to 'services/presence2/presenceservice.py')
-rw-r--r--services/presence2/presenceservice.py83
1 files changed, 72 insertions, 11 deletions
diff --git a/services/presence2/presenceservice.py b/services/presence2/presenceservice.py
index 7ffd923..47bcdea 100644
--- a/services/presence2/presenceservice.py
+++ b/services/presence2/presenceservice.py
@@ -43,7 +43,7 @@ class PresenceService(dbus.service.Object):
self._next_object_id = 0
self._buddies = {} # key -> Buddy
- self._handles = {} # tp client -> (handle -> Buddy)
+ self._handles_buddies = {} # tp client -> (handle -> Buddy)
self._activities = {} # activity id -> Activity
bus = dbus.SessionBus()
@@ -59,19 +59,19 @@ class PresenceService(dbus.service.Object):
# Set up the server connection
self._server_plugin = ServerPlugin(self._registry)
- self._handles[self._server_plugin] = {}
+ self._handles_buddies[self._server_plugin] = {}
self._server_plugin.connect('status', self._server_status_cb)
self._server_plugin.connect('contact-online', self._contact_online)
self._server_plugin.connect('contact-offline', self._contact_offline)
self._server_plugin.connect('avatar-updated', self._avatar_updated)
self._server_plugin.connect('properties-changed', self._properties_changed)
- self._server_plugin.connect('activities-changed', self._activities_changed)
+ self._server_plugin.connect('contact-activities-changed', self._contact_activities_changed)
self._server_plugin.start()
# Set up the link local connection
self._ll_plugin = LinkLocalPlugin(self._registry)
- self._handles[self._ll_plugin] = {}
+ self._handles_buddies[self._ll_plugin] = {}
dbus.service.Object.__init__(self, self._bus_name, _PRESENCE_PATH)
@@ -89,7 +89,7 @@ class PresenceService(dbus.service.Object):
buddy.connect("validity-changed", self._buddy_validity_changed_cb)
self._buddies[key] = buddy
- buddies = self._handles[tp]
+ buddies = self._handles_buddies[tp]
buddies[handle] = buddy
# store the handle of the buddy for this CM
buddy.handles[tp] = handle
@@ -105,7 +105,7 @@ class PresenceService(dbus.service.Object):
print "Buddy left: %s (%s)" % (buddy.props.nick, buddy.props.color)
def _contact_offline(self, tp, handle):
- buddy = self._handles[tp].pop(handle)
+ buddy = self._handles_buddies[tp].pop(handle)
key = buddy.props.key
# the handle of the buddy for this CM is not valid anymore
@@ -122,19 +122,80 @@ class PresenceService(dbus.service.Object):
return self._next_object_id
def _avatar_updated(self, tp, handle, avatar):
- buddy = self._handles[tp].get(handle)
+ buddy = self._handles_buddies[tp].get(handle)
if buddy and not buddy.props.owner:
print "Buddy %s icon updated" % buddy.props.key
buddy.props.icon = avatar
def _properties_changed(self, tp, handle, prop):
- buddy = self._handles[tp].get(handle)
+ buddy = self._handles_buddies[tp].get(handle)
if buddy:
buddy.set_properties(prop)
print "Buddy %s properties updated" % buddy.props.key
- def _activities_changed(self, tp, handle, prop):
- pass
+ def _new_activity(self, activity_id):
+ objid = self._get_next_object_id()
+ activity = Activity(self._bus_name, objid, activity_id)
+ # FIXME : don't do that shit !
+ activity._valid = True
+ self._activities[activity_id] = activity
+
+ print "new activity", activity_id
+ self.ActivityAppeared(activity.object_path())
+
+ return activity
+
+ def _remove_activity(self, activity):
+ print "remove activity", activity.get_id()
+
+ self.ActivityDisappeared(activity.object_path())
+ del self._activities[activity.get_id()]
+
+ def _contact_activities_changed(self, tp, contact_handle, activities):
+ print "------------activities changed-------------"
+ buddies = self._handles_buddies[tp]
+ buddy = buddies.get(contact_handle)
+
+ if not buddy:
+ # We don't know this buddy
+ # FIXME: What should we do here?
+ # FIXME: Do we need to check if the buddy is valid or something?
+ print "contact_activities_changed: buddy unknow"
+ return
+
+ old_activities = set()
+ for activity in buddy.get_joined_activities():
+ old_activities.add(activity.get_id())
+
+ new_activities = set(activities)
+
+ activities_joined = new_activities - old_activities
+ for act in activities_joined:
+ print "buddy", contact_handle, "joined", act
+ activity = self._activities.get(act)
+ if not activity:
+ # new activity
+ activity = self._new_activity(act)
+
+ activity.buddy_joined(buddy)
+ buddy.add_activity(activity)
+
+ activities_left = old_activities - new_activities
+ for act in activities_left:
+ print "buddy", contact_handle, "left", act
+ activity = self._activities.get(act)
+ if not activity:
+ continue
+
+ activity.buddy_left(buddy)
+ buddy.remove_activity(activity)
+
+ if not activity.get_joined_buddies():
+ self._remove_activity(activity)
+
+ # current activity
+ if len(activities) > 0:
+ buddy.set_properties({'current-activity':activities[0]})
@dbus.service.signal(_PRESENCE_INTERFACE, signature="o")
def ActivityAppeared(self, activity):
@@ -190,7 +251,7 @@ class PresenceService(dbus.service.Object):
raise NotImplementedError("not implemented yet")
def cleanup(self):
- for tp in self._handles:
+ for tp in self._handles_buddies:
tp.cleanup()
def main():