[Telepathy-commits] [telepathy-butterfly/master] Implement simple presence
Olivier Le Thanh Duong
olivier at lethanh.be
Mon Jan 5 14:08:37 PST 2009
Signed-off-by: Jonny Lamb <jonny.lamb at collabora.co.uk>
---
butterfly/connection.py | 3 +
butterfly/presence.py | 36 +-------
butterfly/simple_presence.py | 203 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 207 insertions(+), 35 deletions(-)
create mode 100644 butterfly/simple_presence.py
diff --git a/butterfly/connection.py b/butterfly/connection.py
index bc56fd1..c6be838 100644
--- a/butterfly/connection.py
+++ b/butterfly/connection.py
@@ -25,6 +25,7 @@ import pymsn
import pymsn.event
from butterfly.presence import ButterflyPresence
+from butterfly.simple_presence import ButterflySimplePresence
from butterfly.aliasing import ButterflyAliasing
from butterfly.avatars import ButterflyAvatars
from butterfly.handle import ButterflyHandleFactory
@@ -37,6 +38,7 @@ logger = logging.getLogger('Butterfly.Connection')
class ButterflyConnection(telepathy.server.Connection,
ButterflyPresence,
+ ButterflySimplePresence,
ButterflyAliasing,
ButterflyAvatars,
pymsn.event.ClientEventInterface,
@@ -91,6 +93,7 @@ class ButterflyConnection(telepathy.server.Connection,
except TypeError: # handle old versions of tp-python
telepathy.server.Connection.__init__(self, 'msn', account)
ButterflyPresence.__init__(self)
+ ButterflySimplePresence.__init__(self)
ButterflyAliasing.__init__(self)
ButterflyAvatars.__init__(self)
pymsn.event.ClientEventInterface.__init__(self, self._msn_client)
diff --git a/butterfly/presence.py b/butterfly/presence.py
index de04b43..7475ca7 100644
--- a/butterfly/presence.py
+++ b/butterfly/presence.py
@@ -24,46 +24,12 @@ import pymsn
from butterfly.handle import ButterflyHandleFactory
from butterfly.util.decorator import async
+from butterfly.simple_presence import ButterflyPresenceMapping
__all__ = ['ButterflyPresence']
logger = logging.getLogger('Butterfly.Presence')
-class ButterflyPresenceMapping(object):
- ONLINE = 'available'
- AWAY = 'away'
- BUSY = 'dnd'
- IDLE = 'xa'
- BRB = 'brb'
- PHONE = 'phone'
- LUNCH = 'lunch'
- INVISIBLE = 'hidden'
- OFFLINE = 'offline'
-
- to_pymsn = {
- ONLINE: pymsn.Presence.ONLINE,
- AWAY: pymsn.Presence.AWAY,
- BUSY: pymsn.Presence.BUSY,
- IDLE: pymsn.Presence.IDLE,
- BRB: pymsn.Presence.BE_RIGHT_BACK,
- PHONE: pymsn.Presence.ON_THE_PHONE,
- LUNCH: pymsn.Presence.OUT_TO_LUNCH,
- INVISIBLE: pymsn.Presence.INVISIBLE,
- OFFLINE: pymsn.Presence.OFFLINE
- }
-
- to_telepathy = {
- pymsn.Presence.ONLINE: ONLINE,
- pymsn.Presence.AWAY: AWAY,
- pymsn.Presence.BUSY: BUSY,
- pymsn.Presence.IDLE: IDLE,
- pymsn.Presence.BE_RIGHT_BACK: BRB,
- pymsn.Presence.ON_THE_PHONE: PHONE,
- pymsn.Presence.OUT_TO_LUNCH: LUNCH,
- pymsn.Presence.INVISIBLE: INVISIBLE,
- pymsn.Presence.OFFLINE: OFFLINE
- }
-
class ButterflyPresence(telepathy.server.ConnectionInterfacePresence,
pymsn.event.ContactEventInterface,
diff --git a/butterfly/simple_presence.py b/butterfly/simple_presence.py
new file mode 100644
index 0000000..245d179
--- /dev/null
+++ b/butterfly/simple_presence.py
@@ -0,0 +1,203 @@
+# telepathy-butterfly - an MSN connection manager for Telepathy
+#
+# Copyright (C) 2006-2007 Ali Sabil <ali.sabil at gmail.com>
+# Copyright (C) 2008 Olivier Le Thanh Duong <olivier at lethanh.be>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+# Implementation of the SimplePresence specification at :
+# http://telepathy.freedesktop.org/spec.html#org.freedesktop.Telepathy.Connection.Interface.SimplePresence
+
+import logging
+import time
+
+import telepathy
+import telepathy.constants
+import telepathy.errors
+import pymsn
+
+from butterfly.handle import ButterflyHandleFactory
+from butterfly.util.decorator import async
+
+__all__ = ['ButterflySimplePresence']
+
+logger = logging.getLogger('Butterfly.SimplePresence')
+
+class ButterflyPresenceMapping(object):
+ ONLINE = 'available'
+ AWAY = 'away'
+ BUSY = 'dnd'
+ IDLE = 'xa'
+ BRB = 'brb'
+ PHONE = 'phone'
+ LUNCH = 'lunch'
+ INVISIBLE = 'hidden'
+ OFFLINE = 'offline'
+
+ to_pymsn = {
+ ONLINE: pymsn.Presence.ONLINE,
+ AWAY: pymsn.Presence.AWAY,
+ BUSY: pymsn.Presence.BUSY,
+ IDLE: pymsn.Presence.IDLE,
+ BRB: pymsn.Presence.BE_RIGHT_BACK,
+ PHONE: pymsn.Presence.ON_THE_PHONE,
+ LUNCH: pymsn.Presence.OUT_TO_LUNCH,
+ INVISIBLE: pymsn.Presence.INVISIBLE,
+ OFFLINE: pymsn.Presence.OFFLINE
+ }
+
+ to_telepathy = {
+ pymsn.Presence.ONLINE: ONLINE,
+ pymsn.Presence.AWAY: AWAY,
+ pymsn.Presence.BUSY: BUSY,
+ pymsn.Presence.IDLE: IDLE,
+ pymsn.Presence.BE_RIGHT_BACK: BRB,
+ pymsn.Presence.ON_THE_PHONE: PHONE,
+ pymsn.Presence.OUT_TO_LUNCH: LUNCH,
+ pymsn.Presence.INVISIBLE: INVISIBLE,
+ pymsn.Presence.OFFLINE: OFFLINE
+ }
+
+ to_presence_type = {
+ ONLINE: telepathy.constants.CONNECTION_PRESENCE_TYPE_AVAILABLE,
+ AWAY: telepathy.constants.CONNECTION_PRESENCE_TYPE_AWAY,
+ BUSY: telepathy.constants.CONNECTION_PRESENCE_TYPE_BUSY,
+ IDLE: telepathy.constants.CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY,
+ BRB: telepathy.constants.CONNECTION_PRESENCE_TYPE_AWAY,
+ PHONE: telepathy.constants.CONNECTION_PRESENCE_TYPE_BUSY,
+ LUNCH: telepathy.constants.CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY,
+ INVISIBLE: telepathy.constants.CONNECTION_PRESENCE_TYPE_HIDDEN,
+ OFFLINE: telepathy.constants.CONNECTION_PRESENCE_TYPE_OFFLINE
+ }
+
+class ButterflySimplePresence(
+ telepathy.server.ConnectionInterfaceSimplePresence,
+ pymsn.event.ContactEventInterface,
+ pymsn.event.ProfileEventInterface):
+
+ def __init__(self):
+ telepathy.server.ConnectionInterfaceSimplePresence.__init__(self)
+ pymsn.event.ContactEventInterface.__init__(self, self.msn_client)
+ pymsn.event.ProfileEventInterface.__init__(self, self.msn_client)
+
+ dbus_interface = 'org.freedesktop.Telepathy.Connection.Interface.SimplePresence'
+
+ self._implement_property_get(dbus_interface, {'Statuses' : self.get_statuses})
+
+ def GetPresences(self, contacts):
+ return self.get_simple_presences(contacts)
+
+ def SetPresence(self, status, message):
+ if status == ButterflyPresenceMapping.OFFLINE:
+ self.Disconnect()
+
+ try:
+ presence = ButterflyPresenceMapping.to_pymsn[status]
+ except KeyError:
+ raise telepathy.errors.InvalidArgument
+ message = message.encode("utf-8")
+
+ logger.info("Setting Presence to '%s'" % presence)
+ logger.info("Setting Personal message to '%s'" % message)
+
+ if self._status != telepathy.CONNECTION_STATUS_CONNECTED:
+ self._initial_presence = presence
+ self._initial_personal_message = message
+ else:
+ self.msn_client.profile.personal_message = message
+ self.msn_client.profile.presence = presence
+
+ def get_simple_presences(self, contacts):
+ presences = {}
+ for handle_id in contacts:
+ handle = self.handle(telepathy.HANDLE_TYPE_CONTACT, handle_id)
+ try:
+ contact = handle.contact
+ except AttributeError:
+ contact = handle.profile
+
+ if contact is not None:
+ presence = ButterflyPresenceMapping.to_telepathy[contact.presence]
+ personal_message = unicode(contact.personal_message, "utf-8")
+ else:
+ presence = ButterflyPresenceMapping.OFFLINE
+ personal_message = u""
+
+ presence_type = ButterflyPresenceMapping.to_presence_type[presence]
+
+ presences[handle] = (presence_type, presence, personal_message)
+ return presences
+
+ # pymsn.event.ContactEventInterface
+ def on_contact_presence_changed(self, contact):
+ handle = ButterflyHandleFactory(self, 'contact',
+ contact.account, contact.network_id)
+ logger.info("Contact %r presence changed to '%s'" % (handle, contact.presence))
+ self._presence_changed(handle, contact.presence, contact.personal_message)
+
+ # pymsn.event.ContactEventInterface
+ on_contact_personal_message_changed = on_contact_presence_changed
+
+ # pymsn.event.ProfileEventInterface
+ def on_profile_presence_changed(self):
+ profile = self.msn_client.profile
+ self._presence_changed(ButterflyHandleFactory(self, 'self'),
+ profile.presence, profile.personal_message)
+
+ # pymsn.event.ProfileEventInterface
+ on_profile_personal_message_changed = on_profile_presence_changed
+
+ @async
+ def _presence_changed(self, handle, presence, personal_message):
+ presence = ButterflyPresenceMapping.to_telepathy[presence]
+ personal_message = unicode(personal_message, "utf-8")
+ presence_type = ButterflyPresenceMapping.to_presence_type[presence]
+
+ self.PresenceChanged({handle: (presence_type, presence, personal_message)})
+
+ def get_statuses(self):
+ # you get one of these for each status
+ # {name:(Type, May_Set_On_Self, Can_Have_Message}
+ return {
+ ButterflyPresenceMapping.ONLINE:(
+ telepathy.CONNECTION_PRESENCE_TYPE_AVAILABLE,
+ True, True),
+ ButterflyPresenceMapping.AWAY:(
+ telepathy.CONNECTION_PRESENCE_TYPE_AWAY,
+ True, True),
+ ButterflyPresenceMapping.BUSY:(
+ telepathy.CONNECTION_PRESENCE_TYPE_AWAY,
+ True, True),
+ ButterflyPresenceMapping.IDLE:(
+ telepathy.CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY,
+ True, True),
+ ButterflyPresenceMapping.BRB:(
+ telepathy.CONNECTION_PRESENCE_TYPE_AWAY,
+ True, True),
+ ButterflyPresenceMapping.PHONE:(
+ telepathy.CONNECTION_PRESENCE_TYPE_AWAY,
+ True, True),
+ ButterflyPresenceMapping.LUNCH:(
+ telepathy.CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY,
+ True, True),
+ ButterflyPresenceMapping.INVISIBLE:(
+ telepathy.CONNECTION_PRESENCE_TYPE_HIDDEN,
+ True, False),
+ ButterflyPresenceMapping.OFFLINE:(
+ telepathy.CONNECTION_PRESENCE_TYPE_OFFLINE,
+ True, False)
+ }
+
--
1.5.6.5
More information about the Telepathy-commits
mailing list