# HG changeset patch # User souliane # Date 1395059095 -3600 # Node ID cd02f5ef30df586f245e0bcdd8b84c5ccff36940 # Parent 1cbae66fa725673ada49a8e6ce6bd3f066f5ce39 primitivus: display chat states (with symbols) for MUC participants diff -r 1cbae66fa725 -r cd02f5ef30df frontends/src/constants.py --- 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"⦷" + } diff -r 1cbae66fa725 -r cd02f5ef30df frontends/src/primitivus/chat.py --- 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() diff -r 1cbae66fa725 -r cd02f5ef30df frontends/src/primitivus/primitivus --- 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 diff -r 1cbae66fa725 -r cd02f5ef30df frontends/src/quick_frontend/quick_app.py --- 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: diff -r 1cbae66fa725 -r cd02f5ef30df frontends/src/quick_frontend/quick_chat.py --- 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 + diff -r 1cbae66fa725 -r cd02f5ef30df frontends/src/wix/chat.py --- 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 diff -r 1cbae66fa725 -r cd02f5ef30df frontends/src/wix/main_window.py --- 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