# -*- coding: utf-8 -*- """ DateTime-Info Plugin fuer Trixy. Beantwortet Fragen zu Datum und Uhrzeit: - Aktuelle Uhrzeit - Heutiges Datum - Wochentag-Abfragen fuer beliebige Daten """ from datetime import date as date_type from datetime import datetime from pathlib import Path from typing import Any from trixy_core.nlp.decorators import intent, pattern, example from trixy_core.nlp.entities import _WEEKDAY_NAMES, _MONTH_NAMES, ResolvedEntity from trixy_core.nlp.handler import IntentReceivedData, IntentResult from trixy_core.nlp.intent_registry import IntentRegistry from trixy_core.plugins.trixy_plugin import TrixyPlugin from trixy_core.utils.debug import pdebug, pinfo class DatetimeInfoPlugin(TrixyPlugin): """Plugin fuer Datum- und Uhrzeit-Abfragen.""" NAME = "datetime_info" VERSION = "1.0.0" DESCRIPTION = "Datum- und Uhrzeit-Abfragen per Sprache" AUTHOR = "Trixy" def __init__( self, application: Any, plugin_path: Path, config: dict[str, Any] | None = None, ) -> None: super().__init__(application, plugin_path, config) self._registry = IntentRegistry.get_instance() async def on_load(self) -> None: """Plugin laden.""" pinfo(f"DatetimeInfoPlugin: Lade Plugin v{self.VERSION}") async def on_unload(self) -> None: """Plugin entladen.""" self._registry.unregister_plugin(self.NAME) pdebug("DatetimeInfoPlugin: Entladen") # ===== Intent-Handler ===== @intent("current_time", description="Aktuelle Uhrzeit abfragen") @pattern("(wieviel|wie viel) uhr ist [es]") @pattern("wie (spaet|spät) ist [es]") @pattern("uhrzeit") @pattern("(sag|nenn) [mir] [die] (uhrzeit|zeit)") @example("Wieviel Uhr ist es?", "Wie spät ist es?") async def handle_current_time( self, data: IntentReceivedData, ) -> IntentResult: """Handler fuer den Intent 'current_time'.""" now = datetime.now() if now.minute == 0: response = f"Es ist {now.hour} Uhr." else: response = f"Es ist {now.hour} Uhr {now.minute:02d}." return IntentResult.success_with_response(response) @intent("current_date", description="Heutiges Datum abfragen") @pattern("(welcher|welches|was fuer ein) (tag|datum) ist heute") @pattern("was ist heute [fuer ein] (tag|datum)") @pattern("(sag|nenn) [mir] [das] datum") @pattern("datum [heute]") @example("Welcher Tag ist heute?", "Welches Datum haben wir?") async def handle_current_date( self, data: IntentReceivedData, ) -> IntentResult: """Handler fuer den Intent 'current_date'.""" today = date_type.today() weekday = _WEEKDAY_NAMES[today.weekday()] month = _MONTH_NAMES[today.month] response = f"Heute ist {weekday}, der {today.day}. {month}." return IntentResult.success_with_response(response) @intent("date_query", description="Datum-Abfrage mit Slot") @pattern("(welcher|was fuer ein) (tag|wochentag) ist {date:datum}") @pattern("was ist {date:datum} [fuer ein] (tag|wochentag)") @pattern("was (fuer|für) [ein] (tag|wochentag) ist [der] {date:datum}") @pattern("(welcher|was fuer ein) (tag|wochentag) ist [der] {date:datum}") @example("Welcher Tag ist morgen?", "Was ist Dienstag fuer ein Tag?") @example("Was fuer ein Wochentag ist der 5. Mai?") async def handle_date_query( self, data: IntentReceivedData, date: str = "", ) -> IntentResult: """Handler fuer den Intent 'date_query'.""" resolved = data.get_resolved_slot("date") if resolved is None or not isinstance(resolved.value, date_type): raw = data.get_slot("date", "") return IntentResult.failure( f"Datum '{raw}' konnte nicht aufgeloest werden", response_text="Das Datum konnte ich leider nicht verstehen.", ) target: date_type = resolved.value weekday = _WEEKDAY_NAMES[target.weekday()] month = _MONTH_NAMES[target.month] # Antwort je nach Eingabe-Typ variieren raw_lower = resolved.raw.lower() if raw_lower in ("heute",): response = f"Heute ist {weekday}, der {target.day}. {month}." elif raw_lower in ("morgen",): response = f"Morgen ist {weekday}, der {target.day}. {month}." elif raw_lower in ("uebermorgen", "übermorgen"): response = f"Uebermorgen ist {weekday}, der {target.day}. {month}." elif raw_lower in ( "montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag", "sonntag", ): response = f"{weekday} ist der {target.day}. {month} {target.year}." else: # Absolutes Datum: "der 5. Mai 2026 ist ein Dienstag" response = ( f"Der {target.day}. {month} {target.year} ist ein {weekday}." ) return IntentResult.success_with_response(response)