Add update feature

This commit is contained in:
iwumingz 2022-04-11 10:05:12 +08:00
parent 9fb6b582f0
commit 159b029b10
7 changed files with 70 additions and 18 deletions

View File

@ -4,7 +4,7 @@
@File : custom.py @File : custom.py
@Time : 2022/04/02 10:17:03 @Time : 2022/04/02 10:17:03
@Author : Viperorz @Author : Viperorz
@Version : 1.0.5 @Version : v1.1.7
@License : (C)Copyright 2021-2022 @License : (C)Copyright 2021-2022
@Desc : None @Desc : None
""" """

View File

@ -134,7 +134,7 @@ restart:
update: update:
cmd: update cmd: update
format: -update format: -update <无|force>
usage: 更新配置文件和sycgram到主分支的最新版本 usage: 更新配置文件和sycgram到主分支的最新版本
prefix: prefix:
@ -159,5 +159,5 @@ download:
ip: ip:
cmd: ip cmd: ip
format: -ip <IP地址|域名> format: -ip <IP地址|域名|me>
usage: 查询IP地址或域名的信息 usage: 查询IP地址或域名的信息

View File

@ -5,7 +5,7 @@ CONTAINER_NAME="sycgram"
GITHUB_IMAGE_NAME="iwumingz/${CONTAINER_NAME}" GITHUB_IMAGE_NAME="iwumingz/${CONTAINER_NAME}"
GITHUB_IMAGE_PATH="ghcr.io/${GITHUB_IMAGE_NAME}" GITHUB_IMAGE_PATH="ghcr.io/${GITHUB_IMAGE_NAME}"
PROJECT_PATH="/opt/${CONTAINER_NAME}" PROJECT_PATH="/opt/${CONTAINER_NAME}"
PROJECT_VERSION="v1.1.6" PROJECT_VERSION="v1.1.7"
red='\033[0;31m' red='\033[0;31m'
green='\033[0;32m' green='\033[0;32m'

View File

@ -1,8 +1,8 @@
from core import command from core import command
from pyrogram import Client from pyrogram import Client
from pyrogram.types import Message from pyrogram.types import Message
from tools.sessions import session
from tools.helpers import Parameters, show_cmd_tip, show_exception from tools.helpers import Parameters, show_cmd_tip, show_exception
from tools.sessions import session
@Client.on_message(command('ip')) @Client.on_message(command('ip'))
@ -10,8 +10,9 @@ async def ip(_: Client, msg: Message):
"""查询ip信息""" """查询ip信息"""
cmd, address = Parameters.get(msg) cmd, address = Parameters.get(msg)
if not address: if not address:
await show_cmd_tip(msg, cmd) return await show_cmd_tip(msg, cmd)
return elif address == "me":
address = ''
async def get_api(api: str) -> str: async def get_api(api: str) -> str:
async with session.get(api) as resp: async with session.get(api) as resp:

View File

@ -9,9 +9,9 @@ from pyrogram.types import Message
from tools.constants import (SYCGRAM, SYCGRAM_ERROR, SYCGRAM_INFO, from tools.constants import (SYCGRAM, SYCGRAM_ERROR, SYCGRAM_INFO,
SYCGRAM_WARNING, UPDATE_CMD) SYCGRAM_WARNING, UPDATE_CMD)
from tools.helpers import Parameters, show_cmd_tip, show_exception from tools.helpers import Parameters, show_cmd_tip, show_exception
from tools.updates import (get_alias_of_cmds, pull_and_update_command_yml, from tools.updates import (get_alias_of_cmds, is_latest_version,
reset_cmd_alias, update_cmd_alias, pull_and_update_command_yml, reset_cmd_alias,
update_cmd_prefix) update_cmd_alias, update_cmd_prefix)
@Client.on_message(command("restart")) @Client.on_message(command("restart"))
@ -25,7 +25,23 @@ async def restart(_: Client, msg: Message):
@Client.on_message(command("update")) @Client.on_message(command("update"))
async def update(_: Client, msg: Message): async def update(_: Client, msg: Message):
"""更新sycgram到主分支的最新版本""" """更新sycgram到主分支的最新版本"""
text = f"**{SYCGRAM_INFO}**\n> # `It's updating {SYCGRAM} ...`" # arg - 是否强制更新
_, arg = Parameters.get(msg)
arg = False if arg != "force" else True
version_info = f"**{SYCGRAM_INFO}**\n> # `The current version is the latest.`"
if not arg:
try:
res = await is_latest_version()
except Exception as e:
return await show_exception(msg, e)
if res:
return await msg.edit_text(version_info, parse_mode='md')
else:
text = f"**{SYCGRAM_INFO}**\n> # `Updating to the latest version.`"
else:
text = f"**{SYCGRAM_INFO}**\n> # `Forcing to update to the latest version.`"
await msg.edit_text(text, parse_mode='md') await msg.edit_text(text, parse_mode='md')
try: try:
await pull_and_update_command_yml() await pull_and_update_command_yml()
@ -36,7 +52,7 @@ async def update(_: Client, msg: Message):
except Exception as e: except Exception as e:
text = f"**{SYCGRAM_ERROR}**\n> # `{e}`" text = f"**{SYCGRAM_ERROR}**\n> # `{e}`"
else: else:
text = f"**{SYCGRAM_INFO}**\n> # `{SYCGRAM.title()} is already the latest version.`" text = version_info
finally: finally:
await msg.edit_text(text, parse_mode='md') await msg.edit_text(text, parse_mode='md')
@ -66,7 +82,7 @@ async def prefix(_: Client, msg: Message):
logger.error(e) logger.error(e)
await msg.edit_text(text, parse_mode='md') await msg.edit_text(text, parse_mode='md')
else: else:
text = f"**{SYCGRAM_INFO}**\n> # `Restarting {SYCGRAM} prefix of all commands.`" text = f"**{SYCGRAM_INFO}**\n> # `Restarting prefix of all commands.`"
await msg.edit_text(text, parse_mode='md') await msg.edit_text(text, parse_mode='md')
sys.exit() sys.exit()
@ -101,7 +117,7 @@ async def alias(_: Client, msg: Message):
logger.error(e) logger.error(e)
await msg.edit_text(text, parse_mode='md') await msg.edit_text(text, parse_mode='md')
else: else:
text = f"**{SYCGRAM_INFO}**\n> # `Reset alias of <{source}> ...`" text = f"**{SYCGRAM_INFO}**\n> # `Resetting alias of <{source}> ...`"
await msg.edit_text(text, parse_mode='md') await msg.edit_text(text, parse_mode='md')
sys.exit() sys.exit()

View File

@ -8,8 +8,7 @@ from typing import Any, Dict, Optional, Tuple
from loguru import logger from loguru import logger
from tools.constants import INSTALL_SPEEDTEST, SPEEDTEST_PATH_FILE, SYCGRAM_ERROR from .constants import INSTALL_SPEEDTEST, SPEEDTEST_PATH_FILE, SYCGRAM_ERROR
from .helpers import basher from .helpers import basher
@ -53,7 +52,7 @@ class Speedtester:
f"Sponsor: {self.get_sponsor()}\n" \ f"Sponsor: {self.get_sponsor()}\n" \
f"Upload: {self.get_speed('upload')}\n" \ f"Upload: {self.get_speed('upload')}\n" \
f"Download: {self.get_speed('download')}\n" \ f"Download: {self.get_speed('download')}\n" \
f"jitter: {self.get_ping('jitter')}\n" \ f"Jitter: {self.get_ping('jitter')}\n" \
f"Latency: {self.get_ping('latency')}\n" \ f"Latency: {self.get_ping('latency')}\n" \
f"Time: {self.get_time()}" f"Time: {self.get_time()}"
return text, f"{self.__output.get('result').get('url')}.png" return text, f"{self.__output.get('result').get('url')}.png"

View File

@ -1,9 +1,12 @@
import json
import re import re
from typing import Any, Dict from typing import Any, Dict
import yaml import yaml
from loguru import logger
from .constants import CMD_YML_REMOTE, COMMAND_YML from .constants import CMD_YML_REMOTE, COMMAND_YML, SYCGRAM
from .helpers import basher
from .sessions import session from .sessions import session
@ -89,3 +92,36 @@ async def pull_and_update_command_yml(is_update: bool = True) -> None:
# 合并到本地,以本地为主 # 合并到本地,以本地为主
update_cmd_yml(data) update_cmd_yml(data)
resp.raise_for_status() resp.raise_for_status()
async def get_remote_version() -> str:
"""获取远程仓库版本"""
api = "https://api.github.com/repos/iwumingz/sycgram/tags"
async with session.get(api, timeout=9.9) as resp:
if resp.status == 200:
res = await resp.json()
return res[0].get('name')
resp.raise_for_status()
async def get_local_version() -> str:
"""获取本地仓库版本"""
cmd = f"docker inspect ghcr.io/iwumingz/{SYCGRAM}:latest -f '{{json .Config.Labels}}'"
res = await basher(cmd, timeout=10)
if not res.get('error'):
try:
data = json.loads(res.get('output'))
except Exception as e:
raise e
else:
return data.get('org.opencontainers.image.version')
raise ValueError(res.get('error'))
async def is_latest_version() -> bool:
"""检测是否为最新版本镜像"""
remote_v = await get_remote_version()
local_v = await get_local_version()
logger.info(f"Remote image version is {remote_v}")
logger.info(f"Local image version is {local_v}")
return remote_v == local_v