MibooGram/plugins/tools/player_detail.py
2024-08-02 17:34:30 +08:00

61 lines
2.0 KiB
Python

from typing import Tuple, Optional
from simnet import ZZZClient
from simnet.models.zzz.calculator import ZZZCalculatorCharacterDetails
from gram_core.dependence.redisdb import RedisDB
from plugins.tools.genshin import GenshinHelper
class NeedClient(Exception):
"""无缓存,需要 StarRailClient"""
class PlayerDetailHelper:
def __init__(self, helper: GenshinHelper, redis: RedisDB):
self.helper = helper
self.qname = "plugins:agent_detail"
self.redis = redis.client
self.expire = 15 * 60 # 15分钟
async def set_characters_for_redis(
self,
uid: int,
nickname: str,
data: "ZZZCalculatorCharacterDetails",
) -> None:
data_k = f"{self.qname}:{uid}:data"
json_data = data.json(by_alias=True)
await self.redis.set(data_k, json_data, ex=self.expire)
async def del_characters_for_redis(
self,
uid: int,
) -> None:
data_k = f"{self.qname}:{uid}:data"
await self.redis.delete(data_k)
async def get_characters_for_redis(
self,
uid: int,
) -> Tuple[Optional[str], Optional["ZZZCalculatorCharacterDetails"]]:
data_k = f"{self.qname}:{uid}:data"
data_v = await self.redis.get(data_k)
if data_v is None:
return None, None
json_data = str(data_v, encoding="utf-8")
return "", ZZZCalculatorCharacterDetails.parse_raw(json_data)
async def get_characters(
self, uid: int, client: "ZZZClient" = None
) -> Tuple[Optional[str], Optional["ZZZCalculatorCharacterDetails"]]:
nickname, data = await self.get_characters_for_redis(uid)
if nickname is None or data is None:
if not client:
raise NeedClient
data1 = await client.get_zzz_characters()
cids = [i.id for i in data1.characters]
data = await client.get_zzz_character_info(cids)
await self.set_characters_for_redis(client.player_id, "", data)
return nickname, data