alarm skill update

fukurou

the supreme coder
ADMIN
old ver:
Python:
class DiAlarmer(Skill):
    def __init__(self):
        super().__init__()
        self.off: Responder = Responder("shut up", "stop")
        self._cron: Cron = Cron("", 3, 3)
        self.msg_extra: str = ""
        self.default_alarm: str = "beep beep beep"
        self._alarm_armed: bool = False
        self.alarm_active: bool = False

    @override
    def setKokoro(self, kokoro: Kokoro):
        self._kokoro = kokoro
        alarm_time: str = self._kokoro.grimoireMemento.load("dialarmer")
        if alarm_time != "null":
            self._cron.setStartTime(alarm_time)
            self._alarm_armed = True

    def setCron(self, cron):
        self._cron = cron

    def set_default_alarm(self, alarm: str):
        if alarm and not any(c in alarm for c in ";<>/\\*&^$%#"):
            self.default_alarm = alarm
        return self

    def input(self, ear, skin, eye):
        # Turn off alarm
        if self.alarm_active and self.off.responsesContainsStr(ear):
            self.setSimpleAlg("alarm is now off")
            self.alarm_active = False
            self._cron.turnOff()
            self.msg_extra = ""
            return

        if ear == "cancel alarm":
            self._kokoro.grimoireMemento.save("dialarmer", "")
            self.setSimpleAlg("alarm has been canceled")
            self._alarm_armed = False
            self._cron.turnOff()
            self.msg_extra = ""
            return

        match ear:
            case "pasta alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(13))
                self.setSimpleAlg(f"alarm set to 13 minutes from now")
                self.msg_extra = "your pasta is ready"
                self._alarm_armed = True
            case "hummus alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(60))
                self.setSimpleAlg(f"alarm set to an hour from now")
                self.msg_extra = "your hummus has been cooking for an hour"
                self._alarm_armed = True
            case "hot water alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(5))
                self.setSimpleAlg(f"alarm set to 5 minutes from now")
                self.msg_extra = "your water are boiling"
                self._alarm_armed = True
            case _:
                temp = RegexUtil.extractRegex(r"(?<=set alarm to\s)([0-9]{1,2}:[0-9]{1,2})", ear)
                if not len(temp) == 0:
                    self._cron.setStartTime(temp)
                    self.setSimpleAlg(f"alarm set to {temp}")
                    self.msg_extra = ""
                    self._alarm_armed = True
                    self._cron.setStartTime(temp)
                    self._kokoro.grimoireMemento.save("dialarmer",temp)
                    return
        if self._cron.triggerWithoutRenewal():
            self.alarm_active = True
            if len(self.msg_extra) > 0:
                self.setSimpleAlg(self.default_alarm,self.msg_extra)
            else:
                self.setSimpleAlg(self.default_alarm)

    def skillNotes(self, param: str) -> str:
        if param == "notes":
            return "alarm clock skill"
        elif param == "triggers":
            return "set alarm to 9:40. shut up to stop and cancel snooze"
        return "alarm clock skill"
 

fukurou

the supreme coder
ADMIN
new STT optimized version:

Python:
class DiAlarmer(Skill):
    def __init__(self):
        super().__init__()
        self.off: Responder = Responder("shut up", "stop")
        self._cron: Cron = Cron("", 3, 3)
        self.msg_extra: str = ""
        self.default_alarm: str = "beep beep beep"
        self._alarm_armed: bool = False
        self.alarm_active: bool = False

    @override
    def setKokoro(self, kokoro: Kokoro):
        self._kokoro = kokoro
        alarm_time: str = self._kokoro.grimoireMemento.load("dialarmer")
        if alarm_time != "null":
            self._cron.setStartTime(alarm_time)
            self._alarm_armed = True

    def setCron(self, cron):
        self._cron = cron

    def set_default_alarm(self, alarm: str):
        if alarm and not any(c in alarm for c in ";<>/\\*&^$%#"):
            self.default_alarm = alarm
        return self

    def input(self, ear, skin, eye):
        # Turn off alarm
        if self.alarm_active and self.off.responsesContainsStr(ear):
            self.setSimpleAlg("alarm is now off")
            self.alarm_active = False
            self._cron.turnOff()
            self.msg_extra = ""
            return

        if ear == "cancel alarm":
            self._kokoro.grimoireMemento.save("dialarmer", "")
            self.setSimpleAlg("alarm has been canceled")
            self._alarm_armed = False
            self._cron.turnOff()
            self.msg_extra = ""
            return

        match ear:
            case "pasta alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(13))
                self.setSimpleAlg(f"alarm set to 13 minutes from now")
                self.msg_extra = "your pasta is ready"
                self._alarm_armed = True
            case "hummus alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(60))
                self.setSimpleAlg(f"alarm set to an hour from now")
                self.msg_extra = "your hummus has been cooking for an hour"
                self._alarm_armed = True
            case "hot water alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(5))
                self.setSimpleAlg(f"alarm set to 5 minutes from now")
                self.msg_extra = "your water are boiling"
                self._alarm_armed = True
            case _:
                # Handle special time words
                ear_lower = ear.lower()
                if "noon" in ear_lower:
                    time_str = "12:00"
                elif "midnight" in ear_lower:
                    time_str = "00:00"
                else:
                    # Check for "set alarm to 9" (single hour)
                    hour_match = RegexUtil.extractRegex(r"(?<=set alarm to\s)([0-9]{1,2})(?=\s|$)", ear)
                    if hour_match:
                        hour = int(hour_match[0])
                        if 0 <= hour <= 23:
                            time_str = f"{hour:02d}:00"
                        else:
                            return
                    else:
                        # Original HH:MM or HHMM regex
                        temp = RegexUtil.extractRegex(r"(?<=set alarm to\s)([0-1]?[0-9]:[0-5][0-9]|2[0-3]:[0-5][0-9]|[0-2][0-9][0-5][0-9]|0?[0-9][0-5][0-9])", ear)
                        if not temp:
                            return
                        time_str = temp[0]
                        if ":" not in time_str:
                            if len(time_str) == 3:
                                time_str = f"0{time_str[0]}:{time_str[1:]}"
                            elif len(time_str) == 4:
                                time_str = f"{time_str[:2]}:{time_str[2:]}"
                
                self._cron.setStartTime(time_str)
                self.setSimpleAlg(f"alarm set to {time_str}")
                self.msg_extra = ""
                self._alarm_armed = True
                self._kokoro.grimoireMemento.save("dialarmer", time_str)
                return
                
        if self._cron.triggerWithoutRenewal():
            self.alarm_active = True
            if len(self.msg_extra) > 0:
                self.setSimpleAlg(self.default_alarm, self.msg_extra)
            else:
                self.setSimpleAlg(self.default_alarm)

    def skillNotes(self, param: str) -> str:
        if param == "notes":
            return "alarm clock skill"
        elif param == "triggers":
            return "set alarm to 9:40. shut up to stop and cancel snooze"
        return "alarm clock skill"
 

fukurou

the supreme coder
ADMIN
fixed code:
Python:
class DiAlarmer(Skill):
    def __init__(self):
        super().__init__()
        self.off: Responder = Responder("shut up", "stop")
        self._cron: Cron = Cron("", 3, 3)
        self.msg_extra: str = ""
        self.default_alarm: str = "beep beep beep"
        self._alarm_armed: bool = False
        self.alarm_active: bool = False

    def setKokoro(self, kokoro: Kokoro):
        self._kokoro = kokoro
        alarm_time: str = self._kokoro.grimoireMemento.load("dialarmer")
        if alarm_time != "null":
            self._cron.setStartTime(alarm_time)
            self._alarm_armed = True

    def setCron(self, cron):
        self._cron = cron

    def set_default_alarm(self, alarm: str):
        if alarm and not any(c in alarm for c in ";<>/\\*&^$%#"):
            self.default_alarm = alarm
        return self

    def input(self, ear, skin, eye):
        # Turn off alarm
        if self.alarm_active and self.off.responsesContainsStr(ear):
            self.setSimpleAlg("alarm is now off")
            self.alarm_active = False
            self._cron.turnOff()
            self.msg_extra = ""
            return

        if ear == "cancel alarm":
            self._kokoro.grimoireMemento.save("dialarmer", "")
            self.setSimpleAlg("alarm has been canceled")
            self._alarm_armed = False
            self._cron.turnOff()
            self.msg_extra = ""
            return

        match ear:
            case "pasta alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(13))
                self.setSimpleAlg(f"alarm set to 13 minutes from now")
                self.msg_extra = "your pasta is ready"
                self._alarm_armed = True
            case "hummus alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(60))
                self.setSimpleAlg(f"alarm set to an hour from now")
                self.msg_extra = "your hummus has been cooking for an hour"
                self._alarm_armed = True
            case "hot water alarm":
                self._cron.setStartTime(TimeUtils.timeInXMinutes(5))
                self.setSimpleAlg(f"alarm set to 5 minutes from now")
                self.msg_extra = "your water are boiling"
                self._alarm_armed = True
            case "":
                pass
            case _:
                ear_lower = ear.lower()
                if "noon" in ear_lower:
                    time_str = "12:00"
                elif "midnight" in ear_lower:
                    time_str = "00:00"
                else:
                    match_time = re.search(r"set alarm to\s+(.+?)$", ear, re.IGNORECASE)
                    if not match_time:
                        return

                    time_part = match_time.group(1).strip()

                    if ":" in time_part:
                        parts = time_part.split(":")
                        if len(parts) == 2 and parts[0].isdigit() and parts[1].isdigit():
                            hour = int(parts[0])
                            minute = int(parts[1])
                            if 0 <= hour <= 23 and 0 <= minute <= 59:
                                time_str = f"{hour}:{minute:02d}"
                            else:
                                return
                        else:
                            return
                    elif time_part.isdigit() and len(time_part) in (3, 4):
                        if len(time_part) == 3:
                            hour = int(time_part[0])
                            minute = int(time_part[1:])
                        else:
                            hour = int(time_part[:2])
                            minute = int(time_part[2:])

                        if 0 <= hour <= 23 and 0 <= minute <= 59:
                            time_str = f"{hour}:{minute:02d}"
                        else:
                            return
                    elif time_part.isdigit() and 1 <= len(time_part) <= 2:
                        hour = int(time_part)
                        if 0 <= hour <= 23:
                            time_str = f"{hour}:00"
                        else:
                            return
                    else:
                        return

                self._cron.setStartTime(time_str)
                self.setSimpleAlg(f"alarm set to {time_str}")
                self.msg_extra = ""
                self._alarm_armed = True
                self._kokoro.grimoireMemento.save("dialarmer", time_str)
                return  # <-- THIS RETURN CAUSES THE ISSUE!
        # Check if cron triggered - THIS SHOULD RUN AFTER preset alarms, but NOT after custom alarm due to return above
        if self._cron.triggerWithoutRenewal():
            self.alarm_active = True
            if len(self.msg_extra) > 0:
                self.setSimpleAlg(self.default_alarm, self.msg_extra)
            else:
                self.setSimpleAlg(self.default_alarm)

    def skillNotes(self, param: str) -> str:
        if param == "notes":
            return "alarm clock skill"
        elif param == "triggers":
            return "set alarm to 9:40. shut up to stop and cancel snooze"
        return "alarm clock skill"
 
Top