52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
import logging
|
|
from datetime import datetime, timedelta
|
|
|
|
from twitchAPI.chat import Chat
|
|
|
|
from database import db
|
|
from database.models import TwitchAnnouncement
|
|
from webapp import webapp
|
|
|
|
logger = logging.getLogger('twitch-announcements')
|
|
logger.setLevel(logging.INFO)
|
|
|
|
|
|
async def checkAndSendAnnouncements(chat: Chat, channel: str):
|
|
"""
|
|
Vérifie et envoie les annonces dont la périodicité est écoulée.
|
|
Appelé périodiquement par le bot Twitch.
|
|
"""
|
|
with webapp.app_context():
|
|
announcements: list[TwitchAnnouncement] = TwitchAnnouncement.query.filter_by(enable=True).all()
|
|
now = datetime.now()
|
|
|
|
for announcement in announcements:
|
|
if _shouldSend(announcement, now):
|
|
try:
|
|
await _sendAnnouncement(chat, channel, announcement)
|
|
announcement.last_sent = now
|
|
db.session.commit()
|
|
logger.info(f'Annonce envoyée : {announcement.name}')
|
|
except Exception as e:
|
|
logger.error(f'Erreur lors de l\'envoi de l\'annonce "{announcement.name}": {e}')
|
|
|
|
|
|
def _shouldSend(announcement: TwitchAnnouncement, now: datetime) -> bool:
|
|
"""
|
|
Vérifie si une annonce doit être envoyée basée sur sa périodicité.
|
|
"""
|
|
if announcement.last_sent is None:
|
|
return True
|
|
|
|
time_since_last = now - announcement.last_sent
|
|
periodicity_delta = timedelta(minutes=announcement.periodicity)
|
|
|
|
return time_since_last >= periodicity_delta
|
|
|
|
|
|
async def _sendAnnouncement(chat: Chat, channel: str, announcement: TwitchAnnouncement):
|
|
"""
|
|
Envoie une annonce dans le chat Twitch.
|
|
"""
|
|
await chat.send_message(channel, announcement.text)
|