Mobilizon-Reshare-condividi.../mobilizon_bots/event/event_selector.py

66 lines
2.0 KiB
Python
Raw Normal View History

2021-05-05 14:29:13 +02:00
from abc import ABC, abstractmethod
2021-05-04 22:58:00 +02:00
from typing import List, Optional
import arrow
2021-05-04 22:58:00 +02:00
from mobilizon_bots.event.event import MobilizonEvent
class EventSelectionStrategy(ABC):
@abstractmethod
def select(
self,
published_events: List[MobilizonEvent],
unpublished_events: List[MobilizonEvent],
publisher_name: str,
2021-05-04 22:58:00 +02:00
) -> Optional[MobilizonEvent]:
pass
class SelectNextEventStrategy(EventSelectionStrategy):
def __init__(self, minimum_break_between_events_in_minutes: int):
self.minimum_break_between_events_in_minutes = (
minimum_break_between_events_in_minutes
)
2021-05-04 22:58:00 +02:00
def select(
self,
published_events: List[MobilizonEvent],
unpublished_events: List[MobilizonEvent],
publisher_name: str = "telegram",
2021-05-04 22:58:00 +02:00
) -> Optional[MobilizonEvent]:
last_published_event = published_events[-1]
first_unpublished_event = unpublished_events[0]
now = arrow.now()
assert last_published_event.publication_time[publisher_name] < now, (
2021-05-05 14:29:13 +02:00
f"Last published event has been published in the future\n"
f"{last_published_event.publication_time[publisher_name]}\n"
f"{now}"
2021-05-05 14:29:13 +02:00
)
2021-05-04 22:58:00 +02:00
if (
last_published_event.publication_time[publisher_name].shift(
minutes=self.minimum_break_between_events_in_minutes
)
> now
2021-05-04 22:58:00 +02:00
):
return None
return first_unpublished_event
class EventSelector:
def __init__(
self,
published_events: List[MobilizonEvent],
unpublished_events: List[MobilizonEvent],
):
self.published_events = published_events.sort(key=lambda x: x.begin_datetime)
self.unpublished_events = unpublished_events.sort(
key=lambda x: x.begin_datetime
)
def select_event_to_publish(
self, strategy: EventSelectionStrategy
) -> Optional[MobilizonEvent]:
return strategy.select(self.published_events, self.unpublished_events)