diff options
-rw-r--r-- | poezio/tabs/basetabs.py | 2 | ||||
-rw-r--r-- | poezio/tabs/muctab.py | 2 | ||||
-rw-r--r-- | poezio/text_buffer.py | 28 |
3 files changed, 23 insertions, 9 deletions
diff --git a/poezio/tabs/basetabs.py b/poezio/tabs/basetabs.py index 73db87f2..c5d074bd 100644 --- a/poezio/tabs/basetabs.py +++ b/poezio/tabs/basetabs.py @@ -609,7 +609,7 @@ class ChatTab(Tab): message = self._text_buffer.modify_message( txt, old_id, new_id, time=time, user=user, jid=jid) if message: - self.text_win.modify_message(old_id, message) + self.text_win.modify_message(message.identifier, message) self.core.refresh_window() return True return False diff --git a/poezio/tabs/muctab.py b/poezio/tabs/muctab.py index 3985a6c7..73aa1457 100644 --- a/poezio/tabs/muctab.py +++ b/poezio/tabs/muctab.py @@ -1129,7 +1129,7 @@ class MucTab(ChatTab): user=user, jid=jid) if message: - self.text_win.modify_message(old_id, message) + self.text_win.modify_message(message.identifier, message) return highlight return False diff --git a/poezio/text_buffer.py b/poezio/text_buffer.py index d9347527..9550bb0c 100644 --- a/poezio/text_buffer.py +++ b/poezio/text_buffer.py @@ -11,7 +11,7 @@ independently by their TextWins. import logging log = logging.getLogger(__name__) -from typing import Union, Optional, List, Tuple +from typing import Dict, Union, Optional, List, Tuple from datetime import datetime from poezio.config import config from poezio.theming import get_theme, dump_tuple @@ -121,6 +121,8 @@ class TextBuffer: self._messages_nb_limit = messages_nb_limit # type: int # Message objects self.messages = [] # type: List[Message] + # Correction id -> Original message id + self.correction_ids = {} # type: Dict[str, str] # we keep track of one or more windows # so we can pass the new messages to them, as they are added, so # they (the windows) can build the lines from the new message @@ -186,15 +188,20 @@ class TextBuffer: return min(ret_val, 1) - def _find_message(self, old_id: str) -> int: + def _find_message(self, old_id: str) -> Tuple[str, int]: """ Find a message in the text buffer from its message id """ + # When looking for a message, ensure the id doesn't appear in a + # message we've removed from our message list. If so return the index + # of the corresponding id for the original message instead. + old_id = self.correction_ids.get(old_id, old_id) + for i in range(len(self.messages) - 1, -1, -1): msg = self.messages[i] if msg.identifier == old_id: - return i - return -1 + return (old_id, i) + return (old_id, -1) def ack_message(self, old_id: str, jid: str) -> Union[None, bool, Message]: """Mark a message as acked""" @@ -211,7 +218,7 @@ class TextBuffer: Edit the ack status of a message, and optionally append some text. """ - i = self._find_message(old_id) + _, i = self._find_message(old_id) if i == -1: return None msg = self.messages[i] @@ -236,9 +243,14 @@ class TextBuffer: jid: Optional[str] = None): """ Correct a message in a text buffer. + + Version 1.1.0 of Last Message Correction (0308) added clarifications + that break the way poezio handles corrections. Instead of linking + corrections to the previous correction/message as we were doing, we + are now required to link all corrections to the original messages. """ - i = self._find_message(old_id) + old_id, i = self._find_message(old_id) if i == -1: log.debug( @@ -262,6 +274,8 @@ class TextBuffer: if not time: time = msg.time + + self.correction_ids[new_id] = old_id message = Message( txt, time, @@ -269,7 +283,7 @@ class TextBuffer: msg.nick_color, False, msg.user, - new_id, + old_id, highlight=highlight, old_message=msg, revisions=msg.revisions + 1, |