changeset 907:cd02f5ef30df

primitivus: display chat states (with symbols) for MUC participants
author souliane <souliane@mailoo.org>
date Mon, 17 Mar 2014 13:24:55 +0100
parents 1cbae66fa725
children 2ef523f0b5c3
files frontends/src/constants.py frontends/src/primitivus/chat.py frontends/src/primitivus/primitivus frontends/src/quick_frontend/quick_app.py frontends/src/quick_frontend/quick_chat.py frontends/src/wix/chat.py frontends/src/wix/main_window.py
diffstat 7 files changed, 80 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/src/constants.py	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/constants.py	Mon Mar 17 13:24:55 2014 +0100
@@ -62,6 +62,16 @@
 
     NO_SECURITY_LIMIT = -1
 
-    #XMLUI
+    # XMLUI
     SAT_FORM_PREFIX = "SAT_FORM_"
-    SAT_PARAM_SEPARATOR = "_XMLUI_PARAM_" # used to have unique elements names
+    SAT_PARAM_SEPARATOR = "_XMLUI_PARAM_"  # used to have unique elements names
+
+    # MUC
+    ALL_OCCUPANTS = 1
+    MUC_USER_STATES = {
+        "active": u'✔',
+        "inactive": u'☄',
+        "gone": u'✈',
+        "composing": u'✎',
+        "paused": u"⦷"
+    }
--- a/frontends/src/primitivus/chat.py	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/primitivus/chat.py	Mon Mar 17 13:24:55 2014 +0100
@@ -25,6 +25,7 @@
 from sat_frontends.primitivus.card_game import CardGame
 from sat_frontends.quick_frontend.quick_utils import escapePrivate, unescapePrivate
 from sat_frontends.primitivus.xmlui import XMLUI
+from sat_frontends.primitivus.constants import Const
 import time
 from sat.tools.jid  import JID
 
@@ -175,21 +176,32 @@
             main_widget = self.pile
         self._w = main_widget
 
-    def updateChatState(self, state):
-        """Update the chat state of the contact.
-        @param state: new state to set
+    def updateChatState(self, state, nick=None):
+        """Set the chat state (XEP-0085) of the contact. Leave nick to None
+        to set the state for a one2one conversation, or give a nickname or
+        Const.ALL_OCCUPANTS to set the state of a participant within a MUC.
+        @param state: the new chat state
+        @param nick: None for one2one, the MUC user nick or Const.ALL_OCCUPANTS
         """
-        if (self.type == 'one2one'):
+        if nick:
+            assert(self.type == 'group')
+            occupants = self.occupants if nick == Const.ALL_OCCUPANTS else [nick]
+            options = self.present_wid.getAllValues()
+            for index in xrange(0, len(options)):
+                nick = options[index].value
+                if nick in occupants:
+                    options[index] = (nick, '%s %s' % (Const.MUC_USER_STATES[state], nick))
+            self.present_wid.changeValues(options)
+            self.host.redraw()
+        else:
+            assert(self.type == 'one2one')
             self.__setSurrendedText(state)
             self.showDecoration()
             self.host.redraw()
-        elif (self.type == 'group'):
-            # TODO: chat state for groupchat
-            pass
 
     def _presentClicked(self, list_wid, clicked_wid):
         assert(self.type == 'group')
-        nick = clicked_wid.getValue()
+        nick = clicked_wid.getValue().value
         if nick == self.getUserNick():
             #We ignore click on our own nick
             return
@@ -250,9 +262,9 @@
         nick = unicode(param_nick) #FIXME: should be done in DBus bridge
         QuickChat.replaceUser(self, nick, show_info)
         presents = self.present_wid.getAllValues()
-        if nick not in presents:
+        if nick not in [present.value for present in presents]:
             presents.append(nick)
-            presents.sort()
+            presents.sort(cmp=lambda a, b: cmp(a.value if hasattr(a, 'value') else a, b.value if hasattr(b, 'value') else b))
             self.present_wid.changeValues(presents)
         self.host.redraw()
 
--- a/frontends/src/primitivus/primitivus	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/primitivus/primitivus	Mon Mar 17 13:24:55 2014 +0100
@@ -604,24 +604,6 @@
 
     #MISC CALLBACKS#
 
-    def chatStateReceived(self, from_jid_s, state, profile):
-        """Signal observer to display a contact chat state
-        @param from_jid_s: contact who sent his new state
-        @state: state
-        @profile: current profile
-        """
-        if not self.check_profile(profile):
-            return
-
-        if from_jid_s == "@ALL@":
-            for win in self.chat_wins:
-                self.chat_wins[win].updateChatState(state)
-            return
-
-        from_bare = JID(from_jid_s).bare
-        if from_bare in self.chat_wins:
-            self.chat_wins[from_bare].updateChatState(state)
-
     def setStatusOnline(self, online=True, show="", statuses={}):
         if not online or not statuses:
             return
--- a/frontends/src/quick_frontend/quick_app.py	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/quick_frontend/quick_app.py	Mon Mar 17 13:24:55 2014 +0100
@@ -496,6 +496,31 @@
         if room_jid in self.chat_wins:
             self.chat_wins[room_jid].getGame("Quiz").quizGameTimerRestarted(time_left)
 
+    def chatStateReceived(self, from_jid_s, state, profile):
+        """Callback when a new chat state is received.
+        @param from_jid_s: JID of the contact who sent his state, or '@ALL@'
+        @param state: new state (string)
+        @profile: current profile
+        """
+        if not self.check_profile(profile):
+            return
+
+        if from_jid_s == '@ALL@':
+            target = '@ALL@'
+            nick = Const.ALL_OCCUPANTS
+        else:
+            from_jid = JID(from_jid_s)
+            target = from_jid.bare
+            nick = from_jid.resource
+
+        for bare in self.chat_wins.keys():
+            if target == '@ALL' or target == bare:
+                chat_win = self.chat_wins[bare]
+                if chat_win.type == 'one2one':
+                    chat_win.updateChatState(state)
+                elif chat_win.type == 'group':
+                    chat_win.updateChatState(state, nick=nick)
+
     def _subscribe_cb(self, answer, data):
         entity, profile = data
         if answer:
--- a/frontends/src/quick_frontend/quick_chat.py	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/quick_frontend/quick_chat.py	Mon Mar 17 13:24:55 2014 +0100
@@ -153,3 +153,12 @@
         #No need to raise an error as game are not mandatory
         warning(_('getGame is not implemented in this frontend'))
 
+    def updateChatState(self, state, nick=None):
+        """Set the chat state (XEP-0085) of the contact. Leave nick to None
+        to set the state for a one2one conversation, or give a nickname or
+        Const.ALL_OCCUPANTS to set the state of a participant within a MUC.
+        @param state: the new chat state
+        @param nick: None for one2one, the MUC user nick or ALL_OCCUPANTS
+        """
+        raise NotImplementedError
+
--- a/frontends/src/wix/chat.py	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/wix/chat.py	Mon Mar 17 13:24:55 2014 +0100
@@ -267,10 +267,20 @@
             self.host.waitProgress(id, _("File Transfer"), _("Copying %s") % os.path.basename(filename), self.host.profile)
 
     def onStartTarot(self, e):
-        debug (_("Starting Tarot game"))
-        warning (_("FIXME: temporary menu, must be changed"))
+        debug(_("Starting Tarot game"))
+        warning(_("FIXME: temporary menu, must be changed"))
         if len(self.occupants) != 4:
             err_dlg = wx.MessageDialog(self, _("You need to be exactly 4 peoples in the room to start a Tarot game"), _("Can't start game"), style = wx.OK | wx.ICON_ERROR) #FIXME: gof: temporary only, need to choose the people with who the game has to be started
             err_dlg.ShowModal()
         else:
             self.host.bridge.tarotGameCreate(self.id, list(self.occupants), self.host.profile)
+
+    def updateChatState(self, state, nick=None):
+        """Set the chat state (XEP-0085) of the contact. Leave nick to None
+        to set the state for a one2one conversation, or give a nickname or
+        Const.ALL_OCCUPANTS to set the state of a participant within a MUC.
+        @param state: the new chat state
+        @param nick: None for one2one, the MUC user nick or Const.ALL_OCCUPANTS
+        """
+        #TODO: chat states not implemented yet
+        pass
--- a/frontends/src/wix/main_window.py	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/wix/main_window.py	Mon Mar 17 13:24:55 2014 +0100
@@ -523,12 +523,3 @@
             self.Show()
             self.Raise()
         e.Skip()
-
-    def chatStateReceived(self, from_jid_s, state, profile):
-        """Signal observer to display a contact chat state
-        @param from_jid_s: contact who sent his new state
-        @state: state
-        @profile: current profile
-        """
-        print "TODO: chatStateReceived not implemented yet"
-        pass