# HG changeset patch # User souliane # Date 1449919134 -3600 # Node ID 3a6cd1c14974b0d88c52407213565ad80004172c # Parent 40b7f18ac7049a8d9c0c8c7c9b27810b09140188 frontends: small message refactorisation: - factorize some treatments that were done both in Primitivus and Libervia - the way it was done, especially with QuickChat.printMessage returning a tuple, was quite disturbing - FIXME: we can probably remove some arguments and do a deeper factorization e.g with QuickChatText diff -r 40b7f18ac704 -r 3a6cd1c14974 frontends/src/primitivus/chat.py --- a/frontends/src/primitivus/chat.py Tue Dec 15 17:43:36 2015 +0100 +++ b/frontends/src/primitivus/chat.py Sat Dec 12 12:18:54 2015 +0100 @@ -297,21 +297,15 @@ def onPrivateCreated(self, widget): self.host.contact_lists[widget.profile].specialResourceVisible(widget.target) - def printMessage(self, from_jid, msg, extra=None, profile=C.PROF_KEY_NONE): - assert isinstance(from_jid, jid.JID) - if extra is None: - extra = {} - try: - timestamp = float(extra['timestamp']) - except KeyError: - timestamp = None - try: - nick, mymess = QuickChat.printMessage(self, from_jid, msg, extra, profile) - except TypeError: - # None is returned, the message is managed - return - new_text = ChatText(self, timestamp, nick, mymess, msg) + def printMessage(self, nick, my_message, message, timestamp, extra=None, profile=C.PROF_KEY_NONE): + """Print message in chat window. + @param nick (unicode): author nick + @param my_message (boolean): True if profile is the author + @param message (unicode): message content + @param extra (dict): extra data + """ + new_text = ChatText(self, timestamp, nick, my_message, message) if timestamp and self.content: for idx in range(len(self.content) - 1, -1, -1): current_text = self.content[idx] @@ -321,8 +315,8 @@ # we discard double messages, to avoid backlog / history conflict # FIXME: messages that have been sent several times will be displayed only once - if ((idx and self.content[idx - 1].message == msg) or - (self.content[idx].message == msg) or + if ((idx and self.content[idx - 1].message == message) or + (self.content[idx].message == message) or (idx < len(self.content) - 2 and self.content[idx + 1].message)): return @@ -334,7 +328,7 @@ # XXX: do not send notifications for each line of the history being displayed # FIXME: this must be changed in the future if the timestamp is passed with # all messages and not only with the messages coming from the history. - self._notify(from_jid, msg) + self._notify(nick, message) def printInfo(self, msg, type_='normal', extra=None): """Print general info @@ -354,10 +348,11 @@ self.content.append(_widget) self._notify(msg=msg) - def _notify(self, from_jid="somebody", msg=""): + def _notify(self, contact="somebody", msg=""): """Notify the user of a new message if primitivus doesn't have the focus. - @param from_jid: contact who wrote to the users - @param msg: the message that has been received + + @param contact (unicode): contact who wrote to the users + @param msg (unicode): the message that has been received """ if msg == "": return @@ -368,9 +363,9 @@ self.host.redraw() if not self.host.x_notify.hasFocus(): if self.type == C.CHAT_ONE2ONE: - self.host.x_notify.sendNotification(_("Primitivus: %s is talking to you") % from_jid) + self.host.x_notify.sendNotification(_("Primitivus: %s is talking to you") % contact) elif self.nick is not None and self.nick.lower() in msg.lower(): - self.host.x_notify.sendNotification(_("Primitivus: %(user)s mentioned you in room '%(room)s'") % {'user': from_jid, 'room': self.target}) + self.host.x_notify.sendNotification(_("Primitivus: %(user)s mentioned you in room '%(room)s'") % {'user': contact, 'room': self.target}) # MENU EVENTS # def onTarotRequest(self, menu): diff -r 40b7f18ac704 -r 3a6cd1c14974 frontends/src/quick_frontend/quick_chat.py --- a/frontends/src/quick_frontend/quick_chat.py Tue Dec 15 17:43:36 2015 +0100 +++ b/frontends/src/quick_frontend/quick_chat.py Sat Dec 12 12:18:54 2015 +0100 @@ -140,20 +140,21 @@ log_msg += _(u" (%d messages)" % size) log.debug(log_msg) + target = self.target.bare + def onHistory(history): for line in history: - timestamp, from_jid, to_jid, message, type_, extra = line # FIXME: extra is unused ! + timestamp, from_jid, to_jid, message, type_, extra = line # FIXME: extra is unused ! if ((self.type == C.CHAT_GROUP and type_ != C.MESS_TYPE_GROUPCHAT) or (self.type == C.CHAT_ONE2ONE and type_ == C.MESS_TYPE_GROUPCHAT)): continue - self.printMessage(jid.JID(from_jid), message, {'timestamp':timestamp}, profile) + extra["timestamp"] = timestamp + self.newMessage(jid.JID(from_jid), target, message, type_, extra, profile) self.afterHistoryPrint() def onHistoryError(err): log.error(_("Can't get history")) - target = self.target.bare - self.host.bridge.getHistory(unicode(self.host.profiles[profile].whoami.bare), unicode(target), size, True, search, profile, callback=onHistory, errback=onHistoryError) def _get_nick(self, entity): @@ -181,27 +182,39 @@ # we have a private message, we forward it to a private conversation widget chat_widget = self.getOrCreatePrivateWidget(target) chat_widget.newMessage(from_jid, target, msg, type_, extra, profile) + return + if type_ == C.MESS_TYPE_INFO: + self.printInfo(msg, extra=extra) else: - if type_ == C.MESS_TYPE_INFO: - self.printInfo(msg, extra=extra) + nick = self._get_nick(from_jid) + if msg.startswith('/me '): + self.printInfo('* %s %s' % (nick, msg[4:]), type_='me', extra=extra) else: - self.printMessage(from_jid, msg, extra, profile) + # my_message is True if message comes from local user + my_message = (from_jid.resource == self.nick) if self.type == C.CHAT_GROUP else (from_jid.bare == self.host.profiles[profile].whoami.bare) + try: + timestamp = float(extra['timestamp']) + except KeyError: + timestamp = None + self.printMessage(nick, my_message, msg, timestamp, extra, profile) - def printMessage(self, from_jid, msg, extra=None, profile=C.PROF_KEY_NONE): - """Print message in chat window. Must be implemented by child class""" - nick = self._get_nick(from_jid) - mymess = (from_jid.resource == self.nick) if self.type == C.CHAT_GROUP else (from_jid.bare == self.host.profiles[profile].whoami.bare) #mymess = True if message comes from local user - if msg.startswith('/me '): - self.printInfo('* %s %s' % (nick, msg[4:]), type_='me', extra=extra) - return - return nick, mymess + def printMessage(self, nick, my_message, message, timestamp, extra=None, profile=C.PROF_KEY_NONE): + """Print message in chat window. + + @param nick (unicode): author nick + @param my_message (boolean): True if profile is the author + @param message (unicode): message content + @param extra (dict): extra data + """ + raise NotImplementedError def printInfo(self, msg, type_='normal', extra=None): - """Print general info - @param msg: message to print - @type_: one of: - normal: general info like "toto has joined the room" - me: "/me" information like "/me clenches his fist" ==> "toto clenches his fist" + """Print general info. + + @param msg (unicode): message to print + @param type_ (unicode): + - 'normal': general info like "toto has joined the room" + - 'me': "/me" information like "/me clenches his fist" ==> "toto clenches his fist" @param extra (dict): message data """ raise NotImplementedError