|
@@ -0,0 +1,42 @@
|
|
|
+import calendar
|
|
|
+from datetime import datetime
|
|
|
+from typing import Any, Union
|
|
|
+
|
|
|
+from core.tools.entities.tool_entities import ToolInvokeMessage
|
|
|
+from core.tools.tool.builtin_tool import BuiltinTool
|
|
|
+
|
|
|
+
|
|
|
+class WeekdayTool(BuiltinTool):
|
|
|
+ def _invoke(self,
|
|
|
+ user_id: str,
|
|
|
+ tool_parameters: dict[str, Any],
|
|
|
+ ) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
|
|
+ """
|
|
|
+ Calculate the day of the week for a given date
|
|
|
+ """
|
|
|
+ year = tool_parameters.get('year')
|
|
|
+ month = tool_parameters.get('month')
|
|
|
+ day = tool_parameters.get('day')
|
|
|
+
|
|
|
+ date_obj = self.convert_datetime(year, month, day)
|
|
|
+ if not date_obj:
|
|
|
+ return self.create_text_message(f'Invalid date: Year {year}, Month {month}, Day {day}.')
|
|
|
+
|
|
|
+ weekday_name = calendar.day_name[date_obj.weekday()]
|
|
|
+ month_name = calendar.month_name[month]
|
|
|
+ readable_date = f"{month_name} {date_obj.day}, {date_obj.year}"
|
|
|
+ return self.create_text_message(f'{readable_date} is {weekday_name}.')
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def convert_datetime(year, month, day) -> datetime | None:
|
|
|
+ try:
|
|
|
+ # allowed range in datetime module
|
|
|
+ if not (year >= 1 and 1 <= month <= 12 and 1 <= day <= 31):
|
|
|
+ return None
|
|
|
+
|
|
|
+ year = int(year)
|
|
|
+ month = int(month)
|
|
|
+ day = int(day)
|
|
|
+ return datetime(year, month, day)
|
|
|
+ except ValueError:
|
|
|
+ return None
|