feature: add a mam_sync_limit tab option

This commit is contained in:
mathieui 2021-04-11 13:58:40 +02:00
parent 4ae1b714c4
commit 18b1d5ae72
5 changed files with 17 additions and 5 deletions

View file

@ -868,6 +868,14 @@ Options related to logging.
If ``true``, will try to fill local logs with missing MAM history If ``true``, will try to fill local logs with missing MAM history
when opening a tab or joining a room. when opening a tab or joining a room.
mam_sync_limit
**Default value:** ``2000``
Maximum number of messages to fetch on a MAM sync. Will affect
performance when joining rooms with a huge backlog for the first time
or after a long period.
Plugins Plugins
~~~~~~~ ~~~~~~~

View file

@ -93,6 +93,7 @@ DEFAULT_CONFIG: ConfigDict = {
'log_dir': '', 'log_dir': '',
'log_errors': True, 'log_errors': True,
'mam_sync': True, 'mam_sync': True,
'mam_sync_limit': 2000,
'max_lines_in_memory': 2048, 'max_lines_in_memory': 2048,
'max_messages_in_memory': 2048, 'max_messages_in_memory': 2048,
'max_nick_length': 25, 'max_nick_length': 25,

View file

@ -265,14 +265,15 @@ class MAMFiller:
logger: Logger logger: Logger
future: asyncio.Future future: asyncio.Future
done: asyncio.Event done: asyncio.Event
max_msgs: int = 2000 limit: int
def __init__(self, logger: Logger, tab: tabs.ChatTab): def __init__(self, logger: Logger, tab: tabs.ChatTab, limit: int = 2000):
self.tab = tab self.tab = tab
self.logger = logger self.logger = logger
logger.fd_busy(tab.jid) logger.fd_busy(tab.jid)
self.future = asyncio.ensure_future(self.fetch_routine()) self.future = asyncio.ensure_future(self.fetch_routine())
self.done = asyncio.Event() self.done = asyncio.Event()
self.limit = limit
def cancel(self) -> None: def cancel(self) -> None:
"""Cancel the routine and signal the end.""" """Cancel the routine and signal the end."""
@ -292,7 +293,7 @@ class MAMFiller:
messages = await fetch_history( messages = await fetch_history(
self.tab, self.tab,
start=last_msg_time, start=last_msg_time,
amount=self.max_msgs, amount=self.limit,
) )
log.debug( log.debug(
'Fetched %s messages to fill local logs for %s', 'Fetched %s messages to fill local logs for %s',

View file

@ -1014,7 +1014,8 @@ class OneToOneTab(ChatTab):
use_log = config.get_by_tabname('use_log', self.jid) use_log = config.get_by_tabname('use_log', self.jid)
mam_sync = config.get_by_tabname('mam_sync', self.jid) mam_sync = config.get_by_tabname('mam_sync', self.jid)
if use_log and mam_sync: if use_log and mam_sync:
self.mam_filler = MAMFiller(logger, self) limit = config.get_by_tabname('mam_sync_limit', self.jid)
self.mam_filler = MAMFiller(logger, self, limit)
asyncio.ensure_future( asyncio.ensure_future(
LogLoader(logger, self, use_log).tab_open() LogLoader(logger, self, use_log).tab_open()
) )

View file

@ -181,7 +181,8 @@ class MucTab(ChatTab):
use_log = config.get_by_tabname('mam_sync', self.general_jid) use_log = config.get_by_tabname('mam_sync', self.general_jid)
mam_sync = config.get_by_tabname('mam_sync', self.general_jid) mam_sync = config.get_by_tabname('mam_sync', self.general_jid)
if self.mam_filler is None and use_log and mam_sync: if self.mam_filler is None and use_log and mam_sync:
self.mam_filler = MAMFiller(logger, self) limit = config.get_by_tabname('mam_sync_limit', self.jid)
self.mam_filler = MAMFiller(logger, self, limit)
muc.join_groupchat( muc.join_groupchat(
self.core, self.core,
self.jid.bare, self.jid.bare,