| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- # -*- 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)
|