mirror of
https://github.com/baiqwerdvd/ArknightsUID.git
synced 2025-05-07 12:43:29 +08:00
158 lines
5.3 KiB
Python
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))
|