mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
* ➕ 添加依赖 yarl * ➕ 添加依赖 msgspec * ➖ 移除依赖 ujson * ♻️ 重构 request 使其支持分别设置代理 * ♻️ 重构 resource 接口 * ⚡️ 不再重复获取 Config * ♻️ 使用 yarl 替换 urllib.parse * ⚡️ 给 get_self_netloc 加个 cache * ✨ request 使用 proxy * ✨ 更新模板使用 proxy * 🐛 修复删除 ujson 依赖后 迁移脚本报错的bug
40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
from asyncio import Lock
|
|
from datetime import datetime, timezone
|
|
from typing import ClassVar
|
|
from weakref import WeakValueDictionary
|
|
|
|
from aiocache import Cache as ACache # type: ignore[import-untyped]
|
|
from nonebot.compat import type_validate_json
|
|
from nonebot.log import logger
|
|
from yarl import URL
|
|
|
|
from ....config.config import config
|
|
from ....utils.request import Request
|
|
from .schemas.base import FailedModel, SuccessModel
|
|
|
|
UTC = timezone.utc
|
|
|
|
request = Request(config.tetris.proxy.tetrio or config.tetris.proxy.main)
|
|
|
|
|
|
class Cache:
|
|
cache = ACache(ACache.MEMORY)
|
|
task: ClassVar[WeakValueDictionary[URL, Lock]] = WeakValueDictionary()
|
|
|
|
@classmethod
|
|
async def get(cls, url: URL) -> bytes:
|
|
lock = cls.task.setdefault(url, Lock())
|
|
async with lock:
|
|
if (cached_data := await cls.cache.get(url)) is not None:
|
|
logger.debug(f'{url}: Cache hit!')
|
|
return cached_data
|
|
response_data = await request.request(url)
|
|
parsed_data: SuccessModel | FailedModel = type_validate_json(SuccessModel | FailedModel, response_data) # type: ignore[arg-type]
|
|
if isinstance(parsed_data, SuccessModel):
|
|
await cls.cache.add(
|
|
url,
|
|
response_data,
|
|
(parsed_data.cache.cached_until - datetime.now(UTC)).total_seconds(),
|
|
)
|
|
return response_data
|