refactor: coalesce progress edit wakeups (#17)
This commit is contained in:
+41
-36
@@ -127,56 +127,61 @@ class ProgressEdits:
|
|||||||
self.last_edit_at = last_edit_at
|
self.last_edit_at = last_edit_at
|
||||||
self.last_rendered = last_rendered
|
self.last_rendered = last_rendered
|
||||||
self.is_resume_line = is_resume_line
|
self.is_resume_line = is_resume_line
|
||||||
self._event_seq = 0
|
self.event_seq = 0
|
||||||
self._published_seq = 0
|
self.rendered_seq = 0
|
||||||
self.wakeup = anyio.Event()
|
self.signal_send, self.signal_recv = anyio.create_memory_object_stream(1)
|
||||||
|
|
||||||
async def _wait_for_wakeup(self) -> None:
|
|
||||||
await self.wakeup.wait()
|
|
||||||
self.wakeup = anyio.Event()
|
|
||||||
|
|
||||||
async def run(self) -> None:
|
async def run(self) -> None:
|
||||||
if self.progress_id is None:
|
if self.progress_id is None:
|
||||||
return
|
return
|
||||||
while True:
|
while True:
|
||||||
await self._wait_for_wakeup()
|
while self.rendered_seq == self.event_seq:
|
||||||
while self._published_seq < self._event_seq:
|
try:
|
||||||
await self.sleep(
|
await self.signal_recv.receive()
|
||||||
max(
|
except anyio.EndOfStream:
|
||||||
0.0,
|
return
|
||||||
self.last_edit_at + self.progress_edit_every - self.clock(),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
seq_at_render = self._event_seq
|
await self.sleep(
|
||||||
now = self.clock()
|
max(
|
||||||
md = self.renderer.render_progress(now - self.started_at)
|
0.0,
|
||||||
rendered, entities = prepare_telegram(
|
self.last_edit_at + self.progress_edit_every - self.clock(),
|
||||||
md, limit=self.limit, is_resume_line=self.is_resume_line
|
|
||||||
)
|
)
|
||||||
if rendered != self.last_rendered:
|
)
|
||||||
logger.debug(
|
|
||||||
"[progress] edit message_id=%s md=%s", self.progress_id, md
|
|
||||||
)
|
|
||||||
self.last_edit_at = now
|
|
||||||
edited = await self.bot.edit_message_text(
|
|
||||||
chat_id=self.chat_id,
|
|
||||||
message_id=self.progress_id,
|
|
||||||
text=rendered,
|
|
||||||
entities=entities,
|
|
||||||
)
|
|
||||||
if edited is not None:
|
|
||||||
self.last_rendered = rendered
|
|
||||||
|
|
||||||
self._published_seq = seq_at_render
|
seq_at_render = self.event_seq
|
||||||
|
now = self.clock()
|
||||||
|
md = self.renderer.render_progress(now - self.started_at)
|
||||||
|
rendered, entities = prepare_telegram(
|
||||||
|
md, limit=self.limit, is_resume_line=self.is_resume_line
|
||||||
|
)
|
||||||
|
if rendered != self.last_rendered:
|
||||||
|
logger.debug(
|
||||||
|
"[progress] edit message_id=%s md=%s", self.progress_id, md
|
||||||
|
)
|
||||||
|
self.last_edit_at = now
|
||||||
|
edited = await self.bot.edit_message_text(
|
||||||
|
chat_id=self.chat_id,
|
||||||
|
message_id=self.progress_id,
|
||||||
|
text=rendered,
|
||||||
|
entities=entities,
|
||||||
|
)
|
||||||
|
if edited is not None:
|
||||||
|
self.last_rendered = rendered
|
||||||
|
|
||||||
|
self.rendered_seq = seq_at_render
|
||||||
|
|
||||||
async def on_event(self, evt: TakopiEvent) -> None:
|
async def on_event(self, evt: TakopiEvent) -> None:
|
||||||
if not self.renderer.note_event(evt):
|
if not self.renderer.note_event(evt):
|
||||||
return
|
return
|
||||||
if self.progress_id is None:
|
if self.progress_id is None:
|
||||||
return
|
return
|
||||||
self._event_seq += 1
|
self.event_seq += 1
|
||||||
self.wakeup.set()
|
try:
|
||||||
|
self.signal_send.send_nowait(None)
|
||||||
|
except anyio.WouldBlock:
|
||||||
|
pass
|
||||||
|
except (anyio.BrokenResourceError, anyio.ClosedResourceError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user