View Single Post
Old 06-13-2025, 10:30 AM   #71
patjack
Junior Member
patjack began at the beginning.
 
Posts: 1
Karma: 10
Join Date: Jun 2025
Device: Kobo Clara
Event for same time everyday

Added an event to occur at the same time everyday, may add days of the week selections as well later.

Code:
from calibre_plugins.action_chains.events import ChainEvent
from qt.core import QApplication, Qt, QWidget, QVBoxLayout, QGroupBox, QLabel, QTimeEdit, QTimer, QTime, pyqtSignal
from calibre.utils.date import now
from calibre import prints
from calibre.constants import DEBUG
from datetime import datetime

class ConfigWidget(QWidget):
    def __init__(self, plugin_action):
        QWidget.__init__(self)
        self.plugin_action = plugin_action
        self.gui = plugin_action.gui
        self.db = self.gui.current_db
        self._init_controls()
    def _init_controls(self):
        l = self.l = QVBoxLayout()
        self.setLayout(l)
        
        time_edit_box = QGroupBox('Trigger time (24h format):')
        time_edit_box_l = QVBoxLayout()
        time_edit_box.setLayout(time_edit_box_l)
        l.addWidget(time_edit_box)
        self.time_edit = QTimeEdit()
        self.time_edit.setDisplayFormat('HH:mm')
        self.time_edit.setTime(QTime.fromString('08:00', 'HH:mm'))
        time_edit_box_l.addWidget(self.time_edit)
        
        l.addStretch(1)
        
        self.setMinimumSize(300,300)

    def load_settings(self, settings):
        if settings:
            self.time_edit.setTime(QTime.fromString(settings['trigger_time'], 'HH:mm'))


    def save_settings(self):
        settings = {}
        settings['trigger_time'] = self.time_edit.time().toString('HH:mm')
        self.plugin_action.plugin_restart_required.emit('events_dialog', 'Timer event interval')
        return settings

class TimeOfDayEvent(ChainEvent):
    name = 'Time of Day'
    time_triggered = pyqtSignal()

    def __init__(self, plugin_action):
        ChainEvent.__init__(self, plugin_action)
        self.last_triggered_date = None
        QTimer.singleShot(5*1000, self.check_time)

    def get_target_time(self):
        event_options = self.get_options()
        target_time = event_options.get('trigger_time','08:00')
        return target_time

    def get_event_signal(self):
        return self.time_triggered
    
    def config_widget(self):
        return ConfigWidget

    def check_time(self):    
        now_time = QTime.currentTime()
        today_str = now().date().isoformat()
        if datetime.now().strftime('%H:%M') + '' == self.get_target_time():
            if self.last_triggered_date != today_str:
                if not self.plugin_action.chainStack:
                    QTimer.singleShot(0, self.time_triggered.emit)
                    self.last_triggered_date = today_str
patjack is offline   Reply With Quote