Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Der-Henning
GitHub Repository: Der-Henning/tgtg
Path: blob/main/tgtg_scanner/notifiers/notifiers.py
725 views
1
import logging
2
from typing import Type, Union
3
4
from tgtg_scanner.models import Config, Cron, Favorites, Item, Reservations
5
from tgtg_scanner.models.reservations import Reservation
6
from tgtg_scanner.notifiers.apprise import Apprise
7
from tgtg_scanner.notifiers.base import Notifier
8
from tgtg_scanner.notifiers.console import Console
9
from tgtg_scanner.notifiers.discord import Discord
10
from tgtg_scanner.notifiers.ifttt import IFTTT
11
from tgtg_scanner.notifiers.ntfy import Ntfy
12
from tgtg_scanner.notifiers.push_safer import PushSafer
13
from tgtg_scanner.notifiers.script import Script
14
from tgtg_scanner.notifiers.smtp import SMTP
15
from tgtg_scanner.notifiers.telegram import Telegram
16
from tgtg_scanner.notifiers.webhook import WebHook
17
18
log = logging.getLogger("tgtg")
19
20
NOTIFIERS: list[Type[Notifier]] = [Apprise, Console, PushSafer, SMTP, IFTTT, Ntfy, WebHook, Telegram, Script, Discord]
21
22
23
class Notifiers:
24
"""Notifier Manager"""
25
26
def __init__(self, config: Config, reservations: Reservations, favorites: Favorites):
27
self._notifiers: list[Notifier] = [NotifierCls(config, reservations, favorites) for NotifierCls in NOTIFIERS]
28
log.info("Activated notifiers:")
29
if self.notifier_count == 0:
30
log.warning("No notifiers configured!")
31
for notifier in self._enabled_notifiers:
32
log.info("- %s", notifier)
33
if notifier.cron != Cron("* * * * *"):
34
log.info(" Schedule: %s", notifier.cron.get_description(config.locale))
35
36
@property
37
def _enabled_notifiers(self) -> list[Notifier]:
38
return [notifier for notifier in self._notifiers if notifier.enabled]
39
40
@property
41
def notifier_count(self) -> int:
42
"""Number of enabled notifiers
43
44
Returns:
45
int: notifier count
46
"""
47
return len(self._enabled_notifiers)
48
49
def send(self, item: Union[Item, Reservation]) -> None:
50
"""Send notifications on all enabled notifiers.
51
52
Args:
53
item (Item, Reservation): Item information to send
54
"""
55
for notifier in self._notifiers:
56
notifier.send(item)
57
58
def start(self) -> None:
59
"""Start all notifiers"""
60
for notifier in self._notifiers:
61
try:
62
notifier.start()
63
except Exception as exc:
64
log.warning("Error starting %s - %s", notifier, exc)
65
66
def stop(self) -> None:
67
"""Stop all notifiers"""
68
for notifier in self._notifiers:
69
try:
70
notifier.stop()
71
except Exception as exc:
72
log.warning("Error stopping %s - %s", notifier, exc)
73
74