Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion interactions/models/internal/tasks/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ async def __call__(self) -> None:

def _fire(self, fire_time: datetime) -> None:
"""Called when the task is being fired."""
self.trigger.last_call_time = fire_time
self.trigger.set_last_call_time(fire_time)
_ = asyncio.create_task(self())
self.iteration += 1

Expand Down
18 changes: 14 additions & 4 deletions interactions/models/internal/tasks/triggers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ def reschedule(self) -> None:
"""Update the last call time to now"""
self.last_call_time = datetime.now()

def set_last_call_time(self, call_time: datetime) -> None:
self.last_call_time = call_time

@abstractmethod
def next_fire(self) -> datetime | None:
"""
Expand Down Expand Up @@ -114,6 +117,10 @@ class OrTrigger(BaseTrigger):

def __init__(self, *trigger: BaseTrigger) -> None:
self.triggers: list[BaseTrigger] = list(trigger)
self.current_trigger: BaseTrigger = None

def set_last_call_time(self, call_time: datetime) -> None:
self.current_trigger.last_call_time = call_time

def _get_delta(self, d: BaseTrigger) -> timedelta:
next_fire = d.next_fire()
Expand All @@ -123,8 +130,11 @@ def __or__(self, other: "BaseTrigger") -> "OrTrigger":
self.triggers.append(other)
return self

def _set_current_trigger(self) -> BaseTrigger | None:
self.current_trigger = self.triggers[0] if len(self.triggers) == 1 else min(self.triggers, key=self._get_delta)
return self.current_trigger

def next_fire(self) -> datetime | None:
if len(self.triggers) == 1:
return self.triggers[0].next_fire()
trigger = min(self.triggers, key=self._get_delta)
return trigger.next_fire()
if not self._set_current_trigger():
return None
return self.current_trigger.next_fire()