summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormathieui <mathieui@mathieui.net>2022-02-15 23:05:23 +0100
committerMaxime Buquet <pep@bouah.net>2022-03-23 15:38:00 +0100
commitdef167791d099ffecb5a4b5a5582dce99e319987 (patch)
treec542f6d22bf8c5f8ca3ef42fd2981c74c18132a5
parent6174ca70d9bc36fde9d0a0c08ccb67e874a4711c (diff)
downloadpoezio-def167791d099ffecb5a4b5a5582dce99e319987.tar.gz
poezio-def167791d099ffecb5a4b5a5582dce99e319987.tar.bz2
poezio-def167791d099ffecb5a4b5a5582dce99e319987.tar.xz
poezio-def167791d099ffecb5a4b5a5582dce99e319987.zip
fix: do not triplicate messages on /message tab openings
add a synchronization primitive to avoid /say until the logs are loaded and synced (otherwise we do the /say THEN the message we just sent can be loaded from the archive, while also being displayed)
-rw-r--r--poezio/log_loader.py11
-rw-r--r--poezio/tabs/basetabs.py3
-rw-r--r--poezio/tabs/conversationtab.py1
-rw-r--r--poezio/tabs/privatetab.py1
4 files changed, 14 insertions, 2 deletions
diff --git a/poezio/log_loader.py b/poezio/log_loader.py
index caee714b..2e3b27c2 100644
--- a/poezio/log_loader.py
+++ b/poezio/log_loader.py
@@ -76,10 +76,17 @@ class LogLoader:
mam_only: bool
def __init__(self, logger: Logger, tab: tabs.ChatTab,
- local_logs: bool = True):
+ local_logs: bool = True,
+ done_event: Optional[asyncio.Event] = None):
self.mam_only = not local_logs
self.logger = logger
self.tab = tab
+ self.done_event = done_event
+
+ def _done(self) -> None:
+ """Signal end if possible"""
+ if self.done_event is not None:
+ self.done_event.set()
async def tab_open(self) -> None:
"""Called on a tab opening or a MUC join"""
@@ -104,6 +111,7 @@ class LogLoader:
if messages:
self.tab._text_buffer.add_history_messages(messages)
self.tab.core.refresh_window()
+ self._done()
async def mam_tab_open(self, nb: int) -> List[BaseMessage]:
"""Fetch messages in MAM when opening a new tab.
@@ -238,6 +246,7 @@ class LogLoader:
if messages:
tab._text_buffer.add_history_messages(messages)
tab.core.refresh_window()
+ self._done()
async def local_scroll_requested(self, nb: int) -> List[BaseMessage]:
"""Fetch messages locally on scroll up.
diff --git a/poezio/tabs/basetabs.py b/poezio/tabs/basetabs.py
index c88a8a10..44330782 100644
--- a/poezio/tabs/basetabs.py
+++ b/poezio/tabs/basetabs.py
@@ -1000,6 +1000,7 @@ class OneToOneTab(ChatTab):
self.__status = Status("", "")
self.last_remote_message = datetime.now()
+ self._initial_log = asyncio.Event()
# Set to true once the first disco is done
self.__initial_disco = False
@@ -1036,7 +1037,7 @@ class OneToOneTab(ChatTab):
elif use_log and initial:
asyncio.create_task(self.handle_message(initial, display=False))
asyncio.create_task(
- LogLoader(logger, self, use_log).tab_open()
+ LogLoader(logger, self, use_log, self._initial_log).tab_open()
)
async def handle_message(self, msg: SMessage, display: bool = True):
diff --git a/poezio/tabs/conversationtab.py b/poezio/tabs/conversationtab.py
index 76c86d70..14a6be64 100644
--- a/poezio/tabs/conversationtab.py
+++ b/poezio/tabs/conversationtab.py
@@ -173,6 +173,7 @@ class ConversationTab(OneToOneTab):
@refresh_wrapper.always
@command_args_parser.raw
async def command_say(self, line: str, attention: bool = False, correct: bool = False):
+ await self._initial_log.wait()
msg: SMessage = self.core.xmpp.make_message(
mto=self.get_dest_jid(),
mfrom=self.core.xmpp.boundjid
diff --git a/poezio/tabs/privatetab.py b/poezio/tabs/privatetab.py
index 9ed968b7..c68e5d2e 100644
--- a/poezio/tabs/privatetab.py
+++ b/poezio/tabs/privatetab.py
@@ -205,6 +205,7 @@ class PrivateTab(OneToOneTab):
async def command_say(self, line: str, attention: bool = False, correct: bool = False) -> None:
if not self.on:
return
+ await self._initial_log.wait()
our_jid = JID(self.jid.bare)
our_jid.resource = self.own_nick
msg: SMessage = self.core.xmpp.make_message(