|  | @@ -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
 |