169 lines
5.3 KiB
Python
169 lines
5.3 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from ._validate import validate_params
|
|
|
|
try:
|
|
import lark_oapi
|
|
|
|
HAS_LARK_SDK = True
|
|
except ImportError:
|
|
HAS_LARK_SDK = False
|
|
lark_oapi = None # type: ignore
|
|
|
|
|
|
@validate_params
|
|
async def list_calendar_events(
|
|
client: Any,
|
|
calendar_id: str = "primary",
|
|
start_time: str = "",
|
|
end_time: str = "",
|
|
page_size: int = 50,
|
|
page_token: str = "",
|
|
) -> dict[str, Any]:
|
|
if not HAS_LARK_SDK or not client:
|
|
return {"events": [], "has_more": False, "page_token": ""}
|
|
|
|
try:
|
|
builder = (
|
|
lark_oapi.api.calendar.v4.ListCalendarEventRequest.builder()
|
|
.calendar_id(calendar_id)
|
|
.page_size(min(page_size, 100))
|
|
)
|
|
if start_time:
|
|
builder.start_time(start_time)
|
|
if end_time:
|
|
builder.end_time(end_time)
|
|
if page_token:
|
|
builder.page_token(page_token)
|
|
|
|
request = builder.build()
|
|
resp = await client.calendar.v4.calendar_event.list(request)
|
|
if not resp.success():
|
|
raise RuntimeError(f"\u67e5\u8be2\u65e5\u5386\u4e8b\u4ef6\u5931\u8d25: {resp.msg}")
|
|
|
|
data = resp.data if hasattr(resp, "data") else {}
|
|
items = data.get("items", [])
|
|
events = []
|
|
for item in items:
|
|
events.append(
|
|
{
|
|
"event_id": item.get("event_id", ""),
|
|
"summary": item.get("summary", ""),
|
|
"description": item.get("description", ""),
|
|
"start_time": _format_event_time(item.get("start_time")),
|
|
"end_time": _format_event_time(item.get("end_time")),
|
|
"location": item.get("location", ""),
|
|
"organizer": _get_display_name(item.get("organizer")),
|
|
"status": item.get("status", ""),
|
|
}
|
|
)
|
|
|
|
return {
|
|
"events": events,
|
|
"has_more": data.get("has_more", False),
|
|
"page_token": data.get("page_token", ""),
|
|
"sync_token": data.get("sync_token", ""),
|
|
}
|
|
except Exception as e:
|
|
raise RuntimeError(f"\u67e5\u8be2\u65e5\u5386\u4e8b\u4ef6\u5931\u8d25: {e}") from e
|
|
|
|
|
|
@validate_params
|
|
async def get_calendar_event(
|
|
client: Any,
|
|
calendar_id: str,
|
|
event_id: str,
|
|
) -> dict[str, Any]:
|
|
if not HAS_LARK_SDK or not client:
|
|
raise RuntimeError("SDK \u4e0d\u53ef\u7528")
|
|
|
|
try:
|
|
request = (
|
|
lark_oapi.api.calendar.v4.GetCalendarEventRequest.builder()
|
|
.calendar_id(calendar_id)
|
|
.event_id(event_id)
|
|
.build()
|
|
)
|
|
resp = await client.calendar.v4.calendar_event.get(request)
|
|
if not resp.success():
|
|
raise RuntimeError(f"\u83b7\u53d6\u65e5\u5386\u4e8b\u4ef6\u5931\u8d25: {resp.msg}")
|
|
|
|
data = resp.data if hasattr(resp, "data") else {}
|
|
item = data.get("event", data)
|
|
return {
|
|
"event_id": item.get("event_id", ""),
|
|
"summary": item.get("summary", ""),
|
|
"description": item.get("description", ""),
|
|
"start_time": _format_event_time(item.get("start_time")),
|
|
"end_time": _format_event_time(item.get("end_time")),
|
|
"location": item.get("location", ""),
|
|
"organizer": _get_display_name(item.get("organizer")),
|
|
"attendees": [
|
|
_get_display_name(a) for a in (item.get("attendees") or [])
|
|
],
|
|
"status": item.get("status", ""),
|
|
}
|
|
except Exception as e:
|
|
raise RuntimeError(f"\u83b7\u53d6\u65e5\u5386\u4e8b\u4ef6\u5931\u8d25: {e}") from e
|
|
|
|
|
|
@validate_params
|
|
async def list_calendars(
|
|
client: Any,
|
|
page_size: int = 50,
|
|
page_token: str = "",
|
|
) -> dict[str, Any]:
|
|
if not HAS_LARK_SDK or not client:
|
|
return {"calendars": [], "has_more": False, "page_token": ""}
|
|
|
|
try:
|
|
builder = (
|
|
lark_oapi.api.calendar.v4.ListCalendarRequest.builder()
|
|
.page_size(min(page_size, 100))
|
|
)
|
|
if page_token:
|
|
builder.page_token(page_token)
|
|
|
|
request = builder.build()
|
|
resp = await client.calendar.v4.calendar.list(request)
|
|
if not resp.success():
|
|
raise RuntimeError(f"\u67e5\u8be2\u65e5\u5386\u5217\u8868\u5931\u8d25: {resp.msg}")
|
|
|
|
data = resp.data if hasattr(resp, "data") else {}
|
|
items = data.get("calendar_list", [])
|
|
calendars = []
|
|
for item in items:
|
|
calendars.append(
|
|
{
|
|
"calendar_id": item.get("calendar_id", ""),
|
|
"summary": item.get("summary", ""),
|
|
"description": item.get("description", ""),
|
|
}
|
|
)
|
|
|
|
return {
|
|
"calendars": calendars,
|
|
"has_more": data.get("has_more", False),
|
|
"page_token": data.get("page_token", ""),
|
|
}
|
|
except Exception as e:
|
|
raise RuntimeError(f"\u67e5\u8be2\u65e5\u5386\u5217\u8868\u5931\u8d25: {e}") from e
|
|
|
|
|
|
def _format_event_time(ts: Any) -> str:
|
|
if ts is None:
|
|
return ""
|
|
if isinstance(ts, dict):
|
|
return ts.get("date_time") or ts.get("date") or ""
|
|
return str(ts)
|
|
|
|
|
|
def _get_display_name(obj: Any) -> str:
|
|
if obj is None:
|
|
return ""
|
|
if isinstance(obj, dict):
|
|
return obj.get("display_name") or obj.get("name") or ""
|
|
return str(obj)
|