baiqwerdvd 7e56bd5fcd update
2024-12-28 16:54:12 +08:00

158 lines
5.3 KiB
Python

import asyncio
import json
import random
import aiohttp
from msgspec import Struct, convert
from gsuid_core.aps import scheduler
from gsuid_core.bot import Bot
from gsuid_core.data_store import get_res_path
from gsuid_core.logger import logger
from gsuid_core.models import Event
from gsuid_core.subscribe import gs_subscribe
from gsuid_core.sv import SV
from ..arknightsuid_config import PREFIX
sv_server_check = SV("明日方舟版本更新")
sv_server_check_sub = SV("订阅明日方舟版本更新", pm=3)
task_name_server_check = "订阅明日方舟版本更新"
class VersionModel(Struct):
clientVersion: str
resVersion: str
class UpdateCheckResult(Struct):
version: VersionModel
old_version: VersionModel | None
client_updated: bool
res_updated: bool
async def check_update() -> UpdateCheckResult:
"""
check if there is an update
Returns:
tuple[VersionModel, bool, bool]:
VersionModel: the current version
bool: if the client version is updated
bool: if the resource version is updated
"""
async with aiohttp.ClientSession() as session:
async with session.get(
"https://ak-conf.hypergryph.com/config/prod/official/Android/version"
) as response:
data = json.loads(await response.text())
version = convert(data, VersionModel)
version_path = get_res_path("ArknightsUID") / "version.json"
is_first = False if version_path.exists() else True
if is_first:
with open(version_path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2)
logger.info("First time checking version")
return UpdateCheckResult(
version=version, old_version=None, client_updated=False, res_updated=False
)
else:
with open(version_path, encoding="utf-8") as f:
base_version_json = json.load(f)
base_version = convert(base_version_json, VersionModel)
if (
version.clientVersion != base_version.clientVersion
or version.resVersion != base_version.resVersion
):
with open(version_path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2)
result = UpdateCheckResult(
version=version,
old_version=base_version,
client_updated=False,
res_updated=False,
)
if version.clientVersion != base_version.clientVersion:
result.client_updated = True
if version.resVersion != base_version.resVersion:
result.res_updated = True
return result
@sv_server_check.on_command("取明日方舟最新版本")
async def get_latest_version(bot: Bot, ev: Event):
result = await check_update()
await bot.send(
f"clientVersion: {result.version.clientVersion}\nresVersion: {result.version.resVersion}"
)
@sv_server_check_sub.on_fullmatch(f"{PREFIX}订阅版本更新")
async def sub_ann_(bot: Bot, ev: Event):
if ev.group_id is None:
return await bot.send("请在群聊中订阅")
data = await gs_subscribe.get_subscribe(task_name_server_check)
if data:
for subscribe in data:
if subscribe.group_id == ev.group_id:
return await bot.send("已经订阅了明日方舟版本更新!")
await gs_subscribe.add_subscribe(
"session",
task_name=task_name_server_check,
event=ev,
extra_message="",
)
logger.info(data)
await bot.send("成功订阅明日方舟版本更新!")
@scheduler.scheduled_job("interval", seconds=2, id="check update")
async def match_checker():
logger.info("Checking for Arknights client update")
result = await check_update()
if not result.res_updated and not result.client_updated:
logger.info("No update found")
return
datas = await gs_subscribe.get_subscribe(task_name_server_check)
if not datas:
logger.info("[明日方舟版本更新] 暂无群订阅")
return
for subscribe in datas:
if result.client_updated:
logger.warning("检测到明日方舟客户端版本更新")
if result.old_version is None:
await subscribe.send(
f"检测到明日方舟客户端版本更新\nclientVersion: {result.version.clientVersion}\nresVersion: {result.version.resVersion}",
)
else:
await subscribe.send(
f"检测到明日方舟客户端版本更新\nclientVersion: {result.old_version.clientVersion} -> {result.version.clientVersion}\nresVersion: {result.old_version.resVersion} -> {result.version.resVersion}",
)
await asyncio.sleep(random.uniform(1, 3))
elif result.res_updated:
logger.warning("检测到明日方舟资源版本更新")
if result.old_version is None:
await subscribe.send(
f"检测到明日方舟资源版本更新\nclientVersion: {result.version.clientVersion}\nresVersion: {result.version.resVersion}",
)
else:
await subscribe.send(
f"检测到明日方舟资源版本更新\nclientVersion: {result.version.clientVersion}\nresVersion: {result.old_version.resVersion} -> {result.version.resVersion}",
)
await asyncio.sleep(random.uniform(1, 3))