48 lines
1.1 KiB
Python
48 lines
1.1 KiB
Python
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
from typing import Any
|
|||
|
|
|
|||
|
|
from yuxi.utils.logging_config import logger
|
|||
|
|
|
|||
|
|
from .helix import HelixClient
|
|||
|
|
|
|||
|
|
|
|||
|
|
def _is_numeric_id(value: str) -> bool:
|
|||
|
|
return value.isdigit()
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def resolve_twitch_target(
|
|||
|
|
input_value: str,
|
|||
|
|
client_id: str,
|
|||
|
|
access_token: str,
|
|||
|
|
) -> dict[str, Any] | None:
|
|||
|
|
"""将输入(用户名或用户 ID)解析为 Twitch 用户信息"""
|
|||
|
|
value = input_value.strip().lstrip("@").lower()
|
|||
|
|
|
|||
|
|
if not value:
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
if not client_id or not access_token:
|
|||
|
|
logger.warning("resolve_twitch_target: missing credentials")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
helix = HelixClient(client_id, access_token)
|
|||
|
|
try:
|
|||
|
|
await helix.start()
|
|||
|
|
|
|||
|
|
if _is_numeric_id(value):
|
|||
|
|
user = await helix.get_user_by_id(value)
|
|||
|
|
if user:
|
|||
|
|
return user
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
user = await helix.get_user_by_name(value)
|
|||
|
|
if user:
|
|||
|
|
return user
|
|||
|
|
return None
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.error(f"resolve_twitch_target error for '{input_value}': {e}")
|
|||
|
|
return None
|
|||
|
|
finally:
|
|||
|
|
await helix.close()
|