mirror of
https://github.com/DrizzleTime/Foxel.git
synced 2026-05-13 17:30:22 +08:00
93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
import calendar
|
|
from datetime import datetime, timedelta
|
|
from typing import Any, Dict
|
|
|
|
from .base import ToolSpec
|
|
|
|
|
|
def _parse_offset(args: Dict[str, Any], key: str) -> int:
|
|
value = args.get(key)
|
|
if value is None:
|
|
return 0
|
|
try:
|
|
return int(value)
|
|
except (TypeError, ValueError):
|
|
return 0
|
|
|
|
|
|
def _add_months(dt: datetime, months: int) -> datetime:
|
|
if months == 0:
|
|
return dt
|
|
total = dt.year * 12 + (dt.month - 1) + months
|
|
year = total // 12
|
|
month = total % 12 + 1
|
|
last_day = calendar.monthrange(year, month)[1]
|
|
day = min(dt.day, last_day)
|
|
return dt.replace(year=year, month=month, day=day)
|
|
|
|
|
|
async def _time(args: Dict[str, Any]) -> Dict[str, Any]:
|
|
now = datetime.now()
|
|
year_offset = _parse_offset(args, "year")
|
|
month_offset = _parse_offset(args, "month")
|
|
day_offset = _parse_offset(args, "day")
|
|
hour_offset = _parse_offset(args, "hour")
|
|
minute_offset = _parse_offset(args, "minute")
|
|
second_offset = _parse_offset(args, "second")
|
|
|
|
dt = _add_months(now, year_offset * 12 + month_offset)
|
|
dt = dt + timedelta(days=day_offset, hours=hour_offset, minutes=minute_offset, seconds=second_offset)
|
|
|
|
weekday_names = [
|
|
"Monday",
|
|
"Tuesday",
|
|
"Wednesday",
|
|
"Thursday",
|
|
"Friday",
|
|
"Saturday",
|
|
"Sunday",
|
|
]
|
|
weekday = weekday_names[dt.weekday()]
|
|
dt_str = dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
return {
|
|
"ok": True,
|
|
"summary": f"{dt_str} · {weekday}",
|
|
"data": {
|
|
"datetime": dt_str,
|
|
"weekday": weekday,
|
|
"offset": {
|
|
"year": year_offset,
|
|
"month": month_offset,
|
|
"day": day_offset,
|
|
"hour": hour_offset,
|
|
"minute": minute_offset,
|
|
"second": second_offset,
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
TOOLS: Dict[str, ToolSpec] = {
|
|
"time": ToolSpec(
|
|
name="time",
|
|
description=(
|
|
"获取服务器当前时间(精确到秒,含英文星期)。"
|
|
" 支持 year/month/day/hour/minute/second 偏移(可为负数)。"
|
|
),
|
|
parameters={
|
|
"type": "object",
|
|
"properties": {
|
|
"year": {"type": "integer", "description": "年偏移(可为负数)"},
|
|
"month": {"type": "integer", "description": "月偏移(可为负数)"},
|
|
"day": {"type": "integer", "description": "日偏移(可为负数)"},
|
|
"hour": {"type": "integer", "description": "时偏移(可为负数)"},
|
|
"minute": {"type": "integer", "description": "分偏移(可为负数)"},
|
|
"second": {"type": "integer", "description": "秒偏移(可为负数)"},
|
|
},
|
|
"additionalProperties": False,
|
|
},
|
|
requires_confirmation=False,
|
|
handler=_time,
|
|
),
|
|
}
|