Skip to content

Commit

Permalink
修改项目管理工具为 pdm
Browse files Browse the repository at this point in the history
优化 cli 展示效果
浏览器更改为 FireFox
增加版本更新检查
增加启动时校验 MAH
修复直播无图时报错无通知
Web API 秘钥改为每次启动随机生成
  • Loading branch information
djkcyl committed Feb 11, 2023
1 parent a3dabe8 commit 6bfb78a
Show file tree
Hide file tree
Showing 23 changed files with 2,114 additions and 2,280 deletions.
5 changes: 3 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ main.spec
logo.png
tv.png
docker_build
poetry.lock
package
static/browser
build
Expand All @@ -20,4 +19,6 @@ __pycache__
release.py
test.py
data/
Dockerfile
Dockerfile
pdm.lock
.pdm.toml
16 changes: 11 additions & 5 deletions .github/workflows/prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,15 @@ jobs:
name: Upload to PyPI
runs-on: ubuntu-latest
steps:
- name: Prepare environment
uses: actions/checkout@v2
- name: Build and publish to pypi
uses: JRubics/[email protected]
- name: Setup Python
uses: actions/setup-python@v4
with:
pypi_token: ${{ secrets.PYPI_TOKEN }}
python-version: "3.9.x"

- name: Install Dependencies
run: |
pip install pdm
- name: Build and Publish
run: |
pdm publish -u __token__ -p ${{ secrets.PYPI_TOKEN }}
16 changes: 11 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,15 @@ jobs:
name: Upload to PyPI
runs-on: ubuntu-latest
steps:
- name: Prepare environment
uses: actions/checkout@v2
- name: Build and publish to pypi
uses: JRubics/[email protected]
- name: Setup Python
uses: actions/setup-python@v4
with:
pypi_token: ${{ secrets.PYPI_TOKEN }}
python-version: "3.9.x"

- name: Install Dependencies
run: |
pip install pdm
- name: Build and Publish
run: |
pdm publish -u __token__ -p ${{ secrets.PYPI_TOKEN }}
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ docker_build
build
venv
nuitka/
dist/
dist/
.pdm.toml
18 changes: 14 additions & 4 deletions aunly_bbot/bot.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import sys
import asyncio

from creart import it
from pathlib import Path
Expand All @@ -12,10 +13,12 @@
from graia.amnesia.builtins.memcache import MemcacheService
from graia.ariadne.entry import config, HttpClientConfig, WebsocketClientConfig

from .core import cache
from .core.log import logger
from .website import BotService
from .website import BotWebService
from .core.bot_config import BotConfig
from .utils.fastapi import FastAPIService
from .utils.fonts_provider import get_font
from .utils.verify_mah import verify_mirai
from .utils.detect_package import is_package
from .core.announcement import base_telemetry
Expand All @@ -28,6 +31,9 @@

base_telemetry()

logger.info("正在下载字体...")
asyncio.run(get_font())
logger.success("字体下载完成!")

host = BotConfig.Mirai.mirai_host
if verify_mirai(host, BotConfig.Mirai.account, BotConfig.Mirai.verify_key):
Expand All @@ -46,6 +52,7 @@

app.launch_manager.add_service(
PlaywrightService(
browser_type="firefox",
user_data_dir=Path("data").joinpath("browser"),
device_scale_factor=2 if BotConfig.Bilibili.mobile_style else 1.25,
user_agent=(
Expand All @@ -69,14 +76,17 @@
app.launch_manager.add_service(
UvicornService(host=BotConfig.Webui.webui_host, port=int(BotConfig.Webui.webui_port))
)
app.launch_manager.add_service(BotService())
app.launch_manager.add_service(BotWebService())

app.create(GraiaScheduler)
saya = it(Saya)


with saya.module_context():

saya.require("aunly_bbot.function")
if cache.get("test"):
logger.info("正在进入测试模式...")
saya.require("aunly_bbot.test")
else:
saya.require("aunly_bbot.function")

from . import function # noqa
33 changes: 24 additions & 9 deletions aunly_bbot/cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
import click


@click.group()
from ..core.announcement import PROJECT_VERSION


@click.group(help="BBot 命令行工具")
@click.version_option(
PROJECT_VERSION,
"-v",
"--version",
package_name="aunly-bbot",
prog_name="BBot",
message="%(prog)s 当前版本:%(version)s",
help="显示 BBot 版本",
)
@click.help_option("-h", "--help", help="显示帮助信息")
def main():
pass


@click.command()
def run():
@click.command(help="运行 BBot")
@click.option("-t", "--test", is_flag=True, help="测试模式")
@click.help_option("-h", "--help", help="显示帮助信息")
def run(test: bool):
if test:
from ..core import cache

cache["test"] = True

from .run import run_bot

run_bot()


@click.command()
@click.command(help="BBot 配置向导")
def config():
from .config import click_config

Expand All @@ -22,6 +40,3 @@ def config():

main.add_command(run)
main.add_command(config)

main.commands["run"].help = "运行 BBot"
main.commands["config"].help = "BBot 配置向导"
10 changes: 10 additions & 0 deletions aunly_bbot/cli/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ def __init__(self) -> None:
self.master()
self.admins()
self.max_subscriptions()
self.update_check()

if data.get("session", None):
httpx.post(
Expand Down Expand Up @@ -332,6 +333,15 @@ def access_control(self):
).prompt()
self.config["access_control"] = access_control.name == "是(开启)"

def update_check(self):
update_check = ListPrompt(
"是否开启更新检查?",
[Choice("是(开启)"), Choice("否(关闭)")],
allow_filter=False,
annotation="使用键盘的 ↑ 和 ↓ 来选择, 按回车确认",
).prompt()
self.config["update_check"] = update_check.name == "是(开启)"


def click_config(ignore_exist=False):
click.secho(BBOT_ASCII_LOGO, fg="bright_blue", bold=True)
Expand Down
2 changes: 2 additions & 0 deletions aunly_bbot/core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@
}

Bili_Auth = Auth()

cache = {}
24 changes: 9 additions & 15 deletions aunly_bbot/core/announcement.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import re
import contextlib

from pathlib import Path
from loguru import logger
from importlib import metadata
Expand All @@ -14,13 +16,13 @@
RAW_TOML = TOML_PATH.read_text(encoding="utf-8") if TOML_PATH.exists() else ""

PROJECT_VERSION = (
RAW_TOML.split("version = ")[1].split("\n")[0].strip('"')
re.search(r'version = "([^"]+)"', RAW_TOML)[1] # type: ignore
if RAW_TOML
else metadata.version("aunly_bbot")
)

ARIADNE_VERSION = (
(RAW_TOML.split("version = ")[2].split(", extras")[0].split("\n")[0].strip('"}{^'))
# (RAW_TOML.split("graia-ariadne[standard]")[1].split("=")[1].split('"')[0])
re.search(r'graia-ariadne.+=(.+)"', RAW_TOML)[1] # type: ignore
if RAW_TOML
else metadata.version("graia-ariadne")
)
Expand All @@ -43,19 +45,11 @@


def get_monitored_libs():
monitored_libs = {}
libs = list(
filter(
None,
RAW_TOML.split("[tool.poetry.dependencies]")[1]
.split("[tool.poetry.group.dev.dependencies]")[0]
.split("\n"),
)
libs = re.findall(
r'"([\w\d-]+)(\[.*\])?<.+=(.+)"',
re.findall(r"dependencies = \[\n(.*)\n\]", RAW_TOML, re.S)[0],
)
for lib in libs:
lib_name, lib_version = lib.split("=", maxsplit=1)
monitored_libs[lib_name.strip()] = lib_version.strip()
return monitored_libs
return {lib[0].lower(): lib[2] for lib in libs}


def get_dist_map() -> dict[str, str]:
Expand Down
34 changes: 24 additions & 10 deletions aunly_bbot/function/event/bot_launch.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import sys
import asyncio

import contextlib
from loguru import logger
from graia.saya import Channel
from graia.ariadne.app import Ariadne
Expand All @@ -21,15 +20,21 @@
@channel.use(ListenerSchema(listening_events=[AccountLaunch]))
async def main(app: Ariadne):
"""
Graia 成功启动
Graia 成功启动并链接到 Mirai HTTP API 后执行的函数
"""
update = await update_version()
if update:
logger.warning(f"[版本更新] 检测到新版本:{update[0]} > {update[1]}")
with contextlib.suppress(Exception):
await asyncio.sleep(5)
if BotConfig.update_check:
update = await update_version()
if update:
old_version, new_version = update
logger.warning(f"[版本更新] 检测到新版本:{new_version} > {old_version}")
await app.send_friend_message(
BotConfig.master, MessageChain(f"检测到新版本:{new_version} > {old_version}")
)
else:
logger.success("[版本更新] 当前版本为最新版本")

try:
logger.info("正在获取浏览器版本")
logger.info("[Playwright] 正在获取浏览器版本")
browser_context = app.launch_manager.get_interface(PlaywrightContext)
if not BotConfig.Bilibili.mobile_style:
await browser_context.context.add_cookies(
Expand All @@ -53,8 +58,17 @@ async def main(app: Ariadne):
sys.exit(1)

logger.info("[BiliBili推送] 正在获取首页 Cookie")
await hc.get("https://bilibili.com/", follow_redirects=True)
logger.debug(hc.cookies)

for _ in range(3):
try:
await hc.get("https://bilibili.com/", follow_redirects=True)
break
except Exception as e:
logger.error(f"[BiliBili推送] 获取首页 Cookie 失败 {e},正在重试")
await asyncio.sleep(2)
else:
logger.error("[BiliBili推送] 获取首页 Cookie 失败,已达最大重试次数")
sys.exit(1)

logger.info("Graia 成功启动")
group_list = await app.get_group_list()
Expand Down
14 changes: 9 additions & 5 deletions aunly_bbot/function/pusher/live.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@

@channel.use(SchedulerSchema(every_custom_seconds(3)))
async def main(app: Ariadne):

if not BOT_Status["init"] or BOT_Status["init"] and len(get_all_uid()) == 0:
await asyncio.sleep(5)
return
Expand Down Expand Up @@ -83,9 +82,14 @@ async def main(app: Ariadne):
area_parent = live_data["area_v2_parent_name"]
area = live_data["area_v2_name"]
room_area = f"{area_parent} / {area}"
cover_img = await app.upload_image(
await Image(url=live_data["cover_from_user"]).get_bytes(),
UploadMethod.Group,
cover_img_url = live_data.get("cover_from_user", live_data.get("keyframe"))
cover_img = (
await app.upload_image(
await Image(url=cover_img_url).get_bytes(),
UploadMethod.Group,
)
if cover_img_url
else None
)
set_name(up_id, up_name)
logger.info(f"[BiliBili推送] {up_name} 开播了 - {room_area} - {title}")
Expand All @@ -107,7 +111,7 @@ async def main(app: Ariadne):
msg = [
f"{nick}{room_area} 区开播啦 !\n标题:{title}\n",
cover_img,
"\n",
"\n" if cover_img else "",
await get_b23_url(f"https://live.bilibili.com/{room_id}"),
]

Expand Down
5 changes: 3 additions & 2 deletions aunly_bbot/function/scheduler/version_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ async def main(app: Ariadne):
update = await update_version()

if update:
logger.warning(f"[版本更新] 检测到新版本:{update[0]} > {update[1]}")
old_version, new_version = update
logger.warning(f"[版本更新] 检测到新版本:{new_version} > {old_version}")
await app.send_friend_message(
BotConfig.master,
MessageChain(f"检测到 BBot 版本更新:{update[0]} > {update[1]},请及时更新以避免出现问题。"),
MessageChain(f"检测到 BBot 版本更新:{new_version} > {old_version},建议及时更新以避免出现问题并获取最新功能。"),
)
1 change: 1 addition & 0 deletions aunly_bbot/model/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ class _BotConfig(BaseModel, extra=Extra.ignore):
admins: Optional[list[int]]
max_subsubscribe: int = 4
access_control: bool = True
update_check: bool = True

# 验证 admins 列表
@validator("admins")
Expand Down
3 changes: 2 additions & 1 deletion aunly_bbot/static/bot_config.exp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Event:
push: true # 是否向管理员发送推送的事件提醒。
subscribe: true # 是否向管理员发送订阅的事件提醒。
Webui:
webui_host: "0.0.0.0"
webui_host: "127.0.0.1"
webui_port: 6080
webui_enable: true
log_level: INFO # 控制台输出的日志等级
Expand All @@ -34,6 +34,7 @@ master: 123456789 # **需要** 填入 bot 主人的 qq 号
admins: # 可以填入 bot 管理员的 qq 号, list 里填 int
- 123456789
max_subsubscribe: 4 # 非 vip 群聊最大可订阅数量
update_check: true # 是否检查更新

# 警告: 在 bot 第一次成功运行后配置文件将会被规范化, 此文件中的注释均会被清除,
# 并且配置项顺序可能会出现变动, 若需要查看配置项的详细信息可参考配置文档
Expand Down
Loading

0 comments on commit 6bfb78a

Please sign in to comment.