mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
Merge branch 'main' into feature/webui-config
This commit is contained in:
commit
7f5f689900
40
.github/actions/setup-python/action.yml
vendored
Normal file
40
.github/actions/setup-python/action.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
name: Setup Python
|
||||||
|
description: Setup Python
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
python-version:
|
||||||
|
description: Python version
|
||||||
|
required: false
|
||||||
|
default: "3.10"
|
||||||
|
env-dir:
|
||||||
|
description: Environment directory
|
||||||
|
required: false
|
||||||
|
default: "."
|
||||||
|
no-root:
|
||||||
|
description: Do not install package in the environment
|
||||||
|
required: false
|
||||||
|
default: "false"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Install poetry
|
||||||
|
run: pipx install poetry
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: ${{ inputs.python-version }}
|
||||||
|
cache: "poetry"
|
||||||
|
cache-dependency-path: |
|
||||||
|
./poetry.lock
|
||||||
|
${{ inputs.env-dir }}/poetry.lock
|
||||||
|
|
||||||
|
- run: |
|
||||||
|
cd ${{ inputs.env-dir }}
|
||||||
|
if [ "${{ inputs.no-root }}" = "true" ]; then
|
||||||
|
poetry install --all-extras --no-root
|
||||||
|
else
|
||||||
|
poetry install --all-extras
|
||||||
|
fi
|
||||||
|
shell: bash
|
||||||
11
.github/workflows/linting.yml
vendored
Normal file
11
.github/workflows/linting.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
name: Sequential Lint and Type Check
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ruff-call:
|
||||||
|
uses: ./.github/workflows/ruff.yml
|
||||||
|
|
||||||
|
pyright-call:
|
||||||
|
needs: ruff-call
|
||||||
|
uses: ./.github/workflows/pyright.yml
|
||||||
55
.github/workflows/pyright.yml
vendored
Normal file
55
.github/workflows/pyright.yml
vendored
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
name: Pyright Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
python-version:
|
||||||
|
description: "Python version"
|
||||||
|
required: false
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- "all"
|
||||||
|
- "3.10"
|
||||||
|
- "3.11"
|
||||||
|
- "3.12"
|
||||||
|
default: "all"
|
||||||
|
debug-mode:
|
||||||
|
description: "enable debug mode"
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pyright:
|
||||||
|
name: Pyright Lint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
concurrency:
|
||||||
|
group: pyright-${{ github.ref }}-${{ matrix.env }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
env: [pydantic-v1, pydantic-v2]
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Python environment
|
||||||
|
uses: ./.github/actions/setup-python
|
||||||
|
with:
|
||||||
|
env-dir: ./envs/${{ matrix.env }}
|
||||||
|
no-root: true
|
||||||
|
|
||||||
|
- run: |
|
||||||
|
(cd ./envs/${{ matrix.env }} && echo "$(poetry env info --path)/bin" >> $GITHUB_PATH)
|
||||||
|
if [ "${{ matrix.env }}" = "pydantic-v1" ]; then
|
||||||
|
sed -i 's/PYDANTIC_V2 = true/PYDANTIC_V2 = false/g' ./pyproject.toml
|
||||||
|
fi
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Run Pyright Check
|
||||||
|
uses: jakebailey/pyright-action@v2
|
||||||
|
with:
|
||||||
|
pylance-version: latest-release
|
||||||
20
.github/workflows/ruff.yml
vendored
Normal file
20
.github/workflows/ruff.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Ruff Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ruff:
|
||||||
|
name: Ruff Lint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
concurrency:
|
||||||
|
group: ruff-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Install Ruff
|
||||||
|
uses: astral-sh/ruff-action@v3
|
||||||
|
- name: Run Ruff Check
|
||||||
|
run: ruff check
|
||||||
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@ -2,8 +2,6 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"charliermarsh.ruff",
|
"charliermarsh.ruff",
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"ms-python.black-formatter",
|
|
||||||
"ms-python.isort",
|
|
||||||
"ms-python.python",
|
"ms-python.python",
|
||||||
"ms-python.vscode-pylance"
|
"ms-python.vscode-pylance"
|
||||||
]
|
]
|
||||||
|
|||||||
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -33,10 +33,10 @@
|
|||||||
"python.testing.unittestEnabled": false,
|
"python.testing.unittestEnabled": false,
|
||||||
"python.testing.pytestEnabled": true,
|
"python.testing.pytestEnabled": true,
|
||||||
"[python]": {
|
"[python]": {
|
||||||
"editor.defaultFormatter": "charliermarsh.ruff", // 默认使用 Ruff 格式化
|
"editor.defaultFormatter": "charliermarsh.ruff",
|
||||||
"editor.wordBasedSuggestions": "allDocuments",
|
"editor.wordBasedSuggestions": "allDocuments",
|
||||||
"editor.formatOnType": true,
|
"editor.formatOnType": true,
|
||||||
"editor.formatOnSave": true, // 保存时自动格式化
|
"editor.formatOnSave": true,
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.ruff": "explicit",
|
"source.fixAll.ruff": "explicit",
|
||||||
"source.organizeImports": "explicit"
|
"source.organizeImports": "explicit"
|
||||||
|
|||||||
4811
envs/pydantic-v1/poetry.lock
generated
Normal file
4811
envs/pydantic-v1/poetry.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
140
envs/pydantic-v1/pyproject.toml
Normal file
140
envs/pydantic-v1/pyproject.toml
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
[tool.poetry]
|
||||||
|
name = "zhenxun_bot"
|
||||||
|
version = "0.2.4"
|
||||||
|
description = "基于 Nonebot2 和 go-cqhttp 开发,以 postgresql 作为数据库,非常可爱的绪山真寻bot"
|
||||||
|
authors = ["HibiKier <775757368@qq.com>"]
|
||||||
|
license = "AGPL"
|
||||||
|
package-mode = false
|
||||||
|
|
||||||
|
[[tool.poetry.source]]
|
||||||
|
name = "aliyun"
|
||||||
|
url = "https://mirrors.aliyun.com/pypi/simple/"
|
||||||
|
priority = "primary"
|
||||||
|
|
||||||
|
[tool.poetry.dependencies]
|
||||||
|
python = "^3.10"
|
||||||
|
playwright = "^1.41.1"
|
||||||
|
nonebot-adapter-onebot = "^2.3.1"
|
||||||
|
nonebot-plugin-apscheduler = "^0.5"
|
||||||
|
tortoise-orm = { extras = ["asyncpg"], version = "^0.20.0" }
|
||||||
|
cattrs = "^23.2.3"
|
||||||
|
ruamel-yaml = "^0.18.5"
|
||||||
|
strenum = "^0.4.15"
|
||||||
|
nonebot-plugin-session = "^0.2.3"
|
||||||
|
ujson = "^5.9.0"
|
||||||
|
nb-cli = "^1.3.0"
|
||||||
|
nonebot2 = { extras = ["fastapi"], version = "^2.3.3" }
|
||||||
|
pillow = "^10.0.0"
|
||||||
|
retrying = "^1.3.4"
|
||||||
|
aiofiles = "^23.2.1"
|
||||||
|
nonebot-plugin-htmlrender = ">=0.6.0,<1.0.0"
|
||||||
|
pypinyin = "^0.51.0"
|
||||||
|
beautifulsoup4 = "^4.12.3"
|
||||||
|
lxml = "^5.1.0"
|
||||||
|
psutil = "^5.9.8"
|
||||||
|
feedparser = "^6.0.11"
|
||||||
|
imagehash = "^4.3.1"
|
||||||
|
cn2an = "^0.5.22"
|
||||||
|
dateparser = "^1.2.0"
|
||||||
|
bilireq = "0.2.3post0"
|
||||||
|
python-jose = { extras = ["cryptography"], version = "^3.3.0" }
|
||||||
|
python-multipart = "^0.0.9"
|
||||||
|
aiocache = "^0.12.2"
|
||||||
|
py-cpuinfo = "^9.0.0"
|
||||||
|
nonebot-plugin-alconna = "^0.54.0"
|
||||||
|
tenacity = "^9.0.0"
|
||||||
|
nonebot-plugin-uninfo = ">0.4.1"
|
||||||
|
pydantic = "1.10.18"
|
||||||
|
|
||||||
|
[tool.poetry.group.dev.dependencies]
|
||||||
|
nonebug = "^0.4"
|
||||||
|
pytest-cov = "^5.0.0"
|
||||||
|
pytest-mock = "^3.6.1"
|
||||||
|
pytest-asyncio = "^0.25"
|
||||||
|
pytest-xdist = "^3.3.1"
|
||||||
|
respx = "^0.21.1"
|
||||||
|
ruff = "^0.8.0"
|
||||||
|
pre-commit = "^4.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
[tool.nonebot]
|
||||||
|
plugins = [
|
||||||
|
"nonebot_plugin_apscheduler",
|
||||||
|
"nonebot_plugin_session",
|
||||||
|
"nonebot_plugin_htmlrender",
|
||||||
|
"nonebot_plugin_alconna",
|
||||||
|
]
|
||||||
|
plugin_dirs = ["zhenxun/services", "zhenxun/builtin_plugins", "zhenxun/plugins"]
|
||||||
|
adapters = [
|
||||||
|
{ name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" },
|
||||||
|
# { name = "DoDo", module_name = "nonebot.adapters.dodo" },
|
||||||
|
# { name = "开黑啦", module_name = "nonebot.adapters.kaiheila" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.ruff]
|
||||||
|
line-length = 88
|
||||||
|
target-version = "py310"
|
||||||
|
|
||||||
|
[tool.ruff.format]
|
||||||
|
line-ending = "lf"
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
select = [
|
||||||
|
"F", # Pyflakes
|
||||||
|
"W", # pycodestyle warnings
|
||||||
|
"E", # pycodestyle errors
|
||||||
|
"I", # isort
|
||||||
|
"UP", # pyupgrade
|
||||||
|
"ASYNC", # flake8-async
|
||||||
|
"C4", # flake8-comprehensions
|
||||||
|
"T10", # flake8-debugger
|
||||||
|
"T20", # flake8-print
|
||||||
|
"PYI", # flake8-pyi
|
||||||
|
"PT", # flake8-pytest-style
|
||||||
|
"Q", # flake8-quotes
|
||||||
|
"TID", # flake8-tidy-imports
|
||||||
|
"RUF", # Ruff-specific rules
|
||||||
|
]
|
||||||
|
ignore = [
|
||||||
|
"E402", # module-import-not-at-top-of-file
|
||||||
|
"UP037", # quoted-annotation
|
||||||
|
"RUF001", # ambiguous-unicode-character-string
|
||||||
|
"RUF002", # ambiguous-unicode-character-docstring
|
||||||
|
"RUF003", # ambiguous-unicode-character-comment
|
||||||
|
"TID252", # relative-imports
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.ruff.lint.isort]
|
||||||
|
force-sort-within-sections = true
|
||||||
|
known-first-party = ["zhenxun", "tests/*"]
|
||||||
|
extra-standard-library = ["typing_extensions"]
|
||||||
|
|
||||||
|
[tool.ruff.lint.flake8-pytest-style]
|
||||||
|
fixture-parentheses = false
|
||||||
|
mark-parentheses = false
|
||||||
|
|
||||||
|
[tool.ruff.lint.pyupgrade]
|
||||||
|
keep-runtime-typing = true
|
||||||
|
|
||||||
|
[tool.pyright]
|
||||||
|
pythonVersion = "3.10"
|
||||||
|
pythonPlatform = "All"
|
||||||
|
defineConstant = { PYDANTIC_V2 = true }
|
||||||
|
executionEnvironments = [
|
||||||
|
{ root = "./tests", extraPaths = [
|
||||||
|
"./",
|
||||||
|
] },
|
||||||
|
{ root = "./" },
|
||||||
|
]
|
||||||
|
|
||||||
|
typeCheckingMode = "standard"
|
||||||
|
reportShadowedImports = false
|
||||||
|
disableBytesTypePromotions = true
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
asyncio_mode = "auto"
|
||||||
|
asyncio_default_fixture_loop_scope = "session"
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["poetry-core>=1.0.0"]
|
||||||
|
build-backend = "poetry.core.masonry.api"
|
||||||
4905
envs/pydantic-v2/poetry.lock
generated
Normal file
4905
envs/pydantic-v2/poetry.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
140
envs/pydantic-v2/pyproject.toml
Normal file
140
envs/pydantic-v2/pyproject.toml
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
[tool.poetry]
|
||||||
|
name = "zhenxun_bot"
|
||||||
|
version = "0.2.4"
|
||||||
|
description = "基于 Nonebot2 和 go-cqhttp 开发,以 postgresql 作为数据库,非常可爱的绪山真寻bot"
|
||||||
|
authors = ["HibiKier <775757368@qq.com>"]
|
||||||
|
license = "AGPL"
|
||||||
|
package-mode = false
|
||||||
|
|
||||||
|
[[tool.poetry.source]]
|
||||||
|
name = "aliyun"
|
||||||
|
url = "https://mirrors.aliyun.com/pypi/simple/"
|
||||||
|
priority = "primary"
|
||||||
|
|
||||||
|
[tool.poetry.dependencies]
|
||||||
|
python = "^3.10"
|
||||||
|
playwright = "^1.41.1"
|
||||||
|
nonebot-adapter-onebot = "^2.3.1"
|
||||||
|
nonebot-plugin-apscheduler = "^0.5"
|
||||||
|
tortoise-orm = { extras = ["asyncpg"], version = "^0.20.0" }
|
||||||
|
cattrs = "^23.2.3"
|
||||||
|
ruamel-yaml = "^0.18.5"
|
||||||
|
strenum = "^0.4.15"
|
||||||
|
nonebot-plugin-session = "^0.2.3"
|
||||||
|
ujson = "^5.9.0"
|
||||||
|
nb-cli = "^1.3.0"
|
||||||
|
nonebot2 = { extras = ["fastapi"], version = "^2.3.3" }
|
||||||
|
pillow = "^10.0.0"
|
||||||
|
retrying = "^1.3.4"
|
||||||
|
aiofiles = "^23.2.1"
|
||||||
|
nonebot-plugin-htmlrender = ">=0.6.0,<1.0.0"
|
||||||
|
pypinyin = "^0.51.0"
|
||||||
|
beautifulsoup4 = "^4.12.3"
|
||||||
|
lxml = "^5.1.0"
|
||||||
|
psutil = "^5.9.8"
|
||||||
|
feedparser = "^6.0.11"
|
||||||
|
imagehash = "^4.3.1"
|
||||||
|
cn2an = "^0.5.22"
|
||||||
|
dateparser = "^1.2.0"
|
||||||
|
bilireq = "0.2.3post0"
|
||||||
|
python-jose = { extras = ["cryptography"], version = "^3.3.0" }
|
||||||
|
python-multipart = "^0.0.9"
|
||||||
|
aiocache = "^0.12.2"
|
||||||
|
py-cpuinfo = "^9.0.0"
|
||||||
|
nonebot-plugin-alconna = "^0.54.0"
|
||||||
|
tenacity = "^9.0.0"
|
||||||
|
nonebot-plugin-uninfo = ">0.4.1"
|
||||||
|
pydantic = "2.10.6"
|
||||||
|
|
||||||
|
[tool.poetry.group.dev.dependencies]
|
||||||
|
nonebug = "^0.4"
|
||||||
|
pytest-cov = "^5.0.0"
|
||||||
|
pytest-mock = "^3.6.1"
|
||||||
|
pytest-asyncio = "^0.25"
|
||||||
|
pytest-xdist = "^3.3.1"
|
||||||
|
respx = "^0.21.1"
|
||||||
|
ruff = "^0.8.0"
|
||||||
|
pre-commit = "^4.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
[tool.nonebot]
|
||||||
|
plugins = [
|
||||||
|
"nonebot_plugin_apscheduler",
|
||||||
|
"nonebot_plugin_session",
|
||||||
|
"nonebot_plugin_htmlrender",
|
||||||
|
"nonebot_plugin_alconna",
|
||||||
|
]
|
||||||
|
plugin_dirs = ["zhenxun/services", "zhenxun/builtin_plugins", "zhenxun/plugins"]
|
||||||
|
adapters = [
|
||||||
|
{ name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" },
|
||||||
|
# { name = "DoDo", module_name = "nonebot.adapters.dodo" },
|
||||||
|
# { name = "开黑啦", module_name = "nonebot.adapters.kaiheila" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.ruff]
|
||||||
|
line-length = 88
|
||||||
|
target-version = "py310"
|
||||||
|
|
||||||
|
[tool.ruff.format]
|
||||||
|
line-ending = "lf"
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
select = [
|
||||||
|
"F", # Pyflakes
|
||||||
|
"W", # pycodestyle warnings
|
||||||
|
"E", # pycodestyle errors
|
||||||
|
"I", # isort
|
||||||
|
"UP", # pyupgrade
|
||||||
|
"ASYNC", # flake8-async
|
||||||
|
"C4", # flake8-comprehensions
|
||||||
|
"T10", # flake8-debugger
|
||||||
|
"T20", # flake8-print
|
||||||
|
"PYI", # flake8-pyi
|
||||||
|
"PT", # flake8-pytest-style
|
||||||
|
"Q", # flake8-quotes
|
||||||
|
"TID", # flake8-tidy-imports
|
||||||
|
"RUF", # Ruff-specific rules
|
||||||
|
]
|
||||||
|
ignore = [
|
||||||
|
"E402", # module-import-not-at-top-of-file
|
||||||
|
"UP037", # quoted-annotation
|
||||||
|
"RUF001", # ambiguous-unicode-character-string
|
||||||
|
"RUF002", # ambiguous-unicode-character-docstring
|
||||||
|
"RUF003", # ambiguous-unicode-character-comment
|
||||||
|
"TID252", # relative-imports
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.ruff.lint.isort]
|
||||||
|
force-sort-within-sections = true
|
||||||
|
known-first-party = ["zhenxun", "tests/*"]
|
||||||
|
extra-standard-library = ["typing_extensions"]
|
||||||
|
|
||||||
|
[tool.ruff.lint.flake8-pytest-style]
|
||||||
|
fixture-parentheses = false
|
||||||
|
mark-parentheses = false
|
||||||
|
|
||||||
|
[tool.ruff.lint.pyupgrade]
|
||||||
|
keep-runtime-typing = true
|
||||||
|
|
||||||
|
[tool.pyright]
|
||||||
|
pythonVersion = "3.10"
|
||||||
|
pythonPlatform = "All"
|
||||||
|
defineConstant = { PYDANTIC_V2 = true }
|
||||||
|
executionEnvironments = [
|
||||||
|
{ root = "./tests", extraPaths = [
|
||||||
|
"./",
|
||||||
|
] },
|
||||||
|
{ root = "./" },
|
||||||
|
]
|
||||||
|
|
||||||
|
typeCheckingMode = "standard"
|
||||||
|
reportShadowedImports = false
|
||||||
|
disableBytesTypePromotions = true
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
asyncio_mode = "auto"
|
||||||
|
asyncio_default_fixture_loop_scope = "session"
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["poetry-core>=1.0.0"]
|
||||||
|
build-backend = "poetry.core.masonry.api"
|
||||||
225
poetry.lock
generated
225
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@ -125,7 +125,7 @@ async def _(session: Uninfo, arparma: Arparma, idx: Match[int]):
|
|||||||
|
|
||||||
@_del_matcher.handle()
|
@_del_matcher.handle()
|
||||||
async def _(session: Uninfo, arparma: Arparma, idx: int):
|
async def _(session: Uninfo, arparma: Arparma, idx: int):
|
||||||
result = await Manager.delete_group_message(session, int(idx))
|
result = await Manager.delete_group_message(session, idx)
|
||||||
if not result:
|
if not result:
|
||||||
await MessageUtils.build_message("未查找到指定id的群组欢迎消息...").finish()
|
await MessageUtils.build_message("未查找到指定id的群组欢迎消息...").finish()
|
||||||
await MessageUtils.build_message(result).send()
|
await MessageUtils.build_message(result).send()
|
||||||
|
|||||||
@ -23,8 +23,11 @@ BASE_PATH.mkdir(parents=True, exist_ok=True)
|
|||||||
driver = nonebot.get_driver()
|
driver = nonebot.get_driver()
|
||||||
|
|
||||||
|
|
||||||
old_file = DATA_PATH / "custom_welcome_msg" / "custom_welcome_msg.json"
|
def __migrate():
|
||||||
if old_file.exists():
|
"""首次数据迁移"""
|
||||||
|
old_file = DATA_PATH / "custom_welcome_msg" / "custom_welcome_msg.json"
|
||||||
|
if not old_file.exists():
|
||||||
|
return
|
||||||
try:
|
try:
|
||||||
old_data: dict[str, str] = json.load(old_file.open(encoding="utf8"))
|
old_data: dict[str, str] = json.load(old_file.open(encoding="utf8"))
|
||||||
for group_id, message in old_data.items():
|
for group_id, message in old_data.items():
|
||||||
@ -54,6 +57,7 @@ def migrate(path: Path):
|
|||||||
参数:
|
参数:
|
||||||
path: 路径
|
path: 路径
|
||||||
"""
|
"""
|
||||||
|
__migrate()
|
||||||
text_file = path / "text.json"
|
text_file = path / "text.json"
|
||||||
if not text_file.exists():
|
if not text_file.exists():
|
||||||
return
|
return
|
||||||
@ -249,9 +253,11 @@ class Manager:
|
|||||||
返回:
|
返回:
|
||||||
list: 消息内容
|
list: 消息内容
|
||||||
"""
|
"""
|
||||||
|
path = cls.get_path(session)
|
||||||
json_data = cls.__get_data(session)
|
json_data = cls.__get_data(session)
|
||||||
if not json_data:
|
if not json_data or not path:
|
||||||
return None
|
return None
|
||||||
|
file = path / "text.json"
|
||||||
key_list = list(json_data.keys())
|
key_list = list(json_data.keys())
|
||||||
if idx < 0 or idx >= len(key_list):
|
if idx < 0 or idx >= len(key_list):
|
||||||
return None
|
return None
|
||||||
|
|||||||
@ -2,11 +2,12 @@ import os
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
from nonebot import on_message
|
from nonebot import on_message
|
||||||
|
from nonebot.adapters import Event
|
||||||
from nonebot.matcher import Matcher
|
from nonebot.matcher import Matcher
|
||||||
from nonebot.plugin import PluginMetadata
|
from nonebot.plugin import PluginMetadata
|
||||||
from nonebot.rule import to_me
|
|
||||||
from nonebot_plugin_alconna import UniMsg
|
from nonebot_plugin_alconna import UniMsg
|
||||||
from nonebot_plugin_session import EventSession
|
from nonebot_plugin_session import EventSession
|
||||||
|
from nonebot_plugin_uninfo import Uninfo
|
||||||
|
|
||||||
from zhenxun.configs.path_config import IMAGE_PATH
|
from zhenxun.configs.path_config import IMAGE_PATH
|
||||||
from zhenxun.configs.utils import PluginExtraData
|
from zhenxun.configs.utils import PluginExtraData
|
||||||
@ -29,7 +30,22 @@ __plugin_meta__ = PluginMetadata(
|
|||||||
).to_dict(),
|
).to_dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
_matcher = on_message(rule=to_me(), priority=996, block=False)
|
|
||||||
|
async def rule(event: Event, message: UniMsg, session: Uninfo) -> bool:
|
||||||
|
group_id = session.group.id if session.group else None
|
||||||
|
text = message.extract_plain_text().strip()
|
||||||
|
if await BanConsole.is_ban(session.user.id, group_id):
|
||||||
|
return False
|
||||||
|
if group_id:
|
||||||
|
if await BanConsole.is_ban(None, group_id):
|
||||||
|
return False
|
||||||
|
if g := await GroupConsole.get_group(group_id):
|
||||||
|
if g.level < 0:
|
||||||
|
return False
|
||||||
|
return event.is_tome() and bool(text and len(text) < 20)
|
||||||
|
|
||||||
|
|
||||||
|
_matcher = on_message(rule=rule, priority=996, block=False)
|
||||||
|
|
||||||
|
|
||||||
_path = IMAGE_PATH / "_base" / "laugh"
|
_path = IMAGE_PATH / "_base" / "laugh"
|
||||||
@ -37,37 +53,30 @@ _path = IMAGE_PATH / "_base" / "laugh"
|
|||||||
|
|
||||||
@_matcher.handle()
|
@_matcher.handle()
|
||||||
async def _(matcher: Matcher, message: UniMsg, session: EventSession):
|
async def _(matcher: Matcher, message: UniMsg, session: EventSession):
|
||||||
gid = session.id3 or session.id2
|
text = message.extract_plain_text().strip()
|
||||||
if await BanConsole.is_ban(session.id1, gid):
|
plugin = await PluginInfo.get_or_none(
|
||||||
|
name=text,
|
||||||
|
load_status=True,
|
||||||
|
plugin_type=PluginType.NORMAL,
|
||||||
|
block_type__isnull=True,
|
||||||
|
status=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
if not plugin:
|
||||||
return
|
return
|
||||||
if gid:
|
|
||||||
if await BanConsole.is_ban(None, gid):
|
image = None
|
||||||
return
|
if _path.exists():
|
||||||
if g := await GroupConsole.get_group(gid):
|
if files := os.listdir(_path):
|
||||||
if g.level < 0:
|
image = _path / random.choice(files)
|
||||||
return
|
message_list = []
|
||||||
if text := message.extract_plain_text().strip():
|
if image:
|
||||||
if plugin := await PluginInfo.get_or_none(
|
message_list.append(image)
|
||||||
name=text,
|
message_list.append(
|
||||||
load_status=True,
|
"桀桀桀,预判到会有 '笨蛋' 把功能名称当命令用,特地前来嘲笑!"
|
||||||
plugin_type=PluginType.NORMAL,
|
f"但还是好心来帮帮你啦!\n请at我发送 '帮助{plugin.name}' 或者"
|
||||||
block_type__isnull=True,
|
f" '帮助{plugin.id}' 来获取该功能帮助!"
|
||||||
status=True,
|
)
|
||||||
):
|
logger.info("检测到功能名称当命令使用,已发送帮助信息", "功能帮助", session=session)
|
||||||
image = None
|
await MessageUtils.build_message(message_list).send(reply_to=True)
|
||||||
if _path.exists():
|
matcher.stop_propagation()
|
||||||
if files := os.listdir(_path):
|
|
||||||
image = _path / random.choice(files)
|
|
||||||
message_list = []
|
|
||||||
if image:
|
|
||||||
message_list.append(image)
|
|
||||||
message_list.append(
|
|
||||||
"桀桀桀,预判到会有 '笨蛋' 把功能名称当命令用,特地前来嘲笑!"
|
|
||||||
f"但还是好心来帮帮你啦!\n请at我发送 '帮助{plugin.name}' 或者"
|
|
||||||
f" '帮助{plugin.id}' 来获取该功能帮助!"
|
|
||||||
)
|
|
||||||
logger.info(
|
|
||||||
"检测到功能名称当命令使用,已发送帮助信息", "功能帮助", session=session
|
|
||||||
)
|
|
||||||
await MessageUtils.build_message(message_list).send(reply_to=True)
|
|
||||||
matcher.stop_propagation()
|
|
||||||
|
|||||||
@ -478,35 +478,42 @@ class ShopManage:
|
|||||||
user = await UserConsole.get_user(user_id, platform)
|
user = await UserConsole.get_user(user_id, platform)
|
||||||
if not user.props:
|
if not user.props:
|
||||||
return None
|
return None
|
||||||
is_change = False
|
|
||||||
for uuid in list(user.props.keys()):
|
|
||||||
if user.props[uuid] <= 0:
|
|
||||||
is_change = True
|
|
||||||
del user.props[uuid]
|
|
||||||
if is_change:
|
|
||||||
await user.save(update_fields=["props"])
|
|
||||||
result = await GoodsInfo.filter(uuid__in=user.props.keys()).all()
|
|
||||||
data_list = []
|
|
||||||
uuid2goods = {item.uuid: item for item in result}
|
|
||||||
column_name = ["-", "使用ID", "名称", "数量", "简介"]
|
|
||||||
for i, p in enumerate(user.props):
|
|
||||||
if prop := uuid2goods.get(p):
|
|
||||||
icon = ""
|
|
||||||
icon_path = ICON_PATH / prop.icon
|
|
||||||
if icon_path.exists():
|
|
||||||
icon = (icon_path, 33, 33)
|
|
||||||
data_list.append(
|
|
||||||
[
|
|
||||||
icon,
|
|
||||||
i,
|
|
||||||
prop.goods_name,
|
|
||||||
user.props[p],
|
|
||||||
prop.goods_description,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
user.props = {uuid: count for uuid, count in user.props.items() if count > 0}
|
||||||
|
|
||||||
|
goods_list = await GoodsInfo.filter(uuid__in=user.props.keys()).all()
|
||||||
|
goods_by_uuid = {item.uuid: item for item in goods_list}
|
||||||
|
|
||||||
|
table_rows = []
|
||||||
|
for i, prop_uuid in enumerate(user.props):
|
||||||
|
prop = goods_by_uuid.get(prop_uuid)
|
||||||
|
if not prop:
|
||||||
|
continue
|
||||||
|
|
||||||
|
icon = ""
|
||||||
|
if prop.icon:
|
||||||
|
icon_path = ICON_PATH / prop.icon
|
||||||
|
icon = (icon_path, 33, 33) if icon_path.exists() else ""
|
||||||
|
|
||||||
|
table_rows.append(
|
||||||
|
[
|
||||||
|
icon,
|
||||||
|
i,
|
||||||
|
prop.goods_name,
|
||||||
|
user.props[prop_uuid],
|
||||||
|
prop.goods_description,
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
if not table_rows:
|
||||||
|
return None
|
||||||
|
|
||||||
|
column_name = ["-", "使用ID", "名称", "数量", "简介"]
|
||||||
return await ImageTemplate.table_page(
|
return await ImageTemplate.table_page(
|
||||||
f"{name}的道具仓库", "", column_name, data_list
|
f"{name}的道具仓库",
|
||||||
|
"通过 使用道具[ID/名称] 令道具生效",
|
||||||
|
column_name,
|
||||||
|
table_rows,
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
from .configure import * # noqa: F403
|
|
||||||
from .menu import * # noqa: F403f
|
|
||||||
from .tabs import * # noqa: F403f
|
|
||||||
@ -143,4 +143,4 @@ async def _(query: QueryModel) -> Result[BaseResultModel]:
|
|||||||
async def _(plugin_name: str | None = None) -> Result[dict]:
|
async def _(plugin_name: str | None = None) -> Result[dict]:
|
||||||
if plugin_name:
|
if plugin_name:
|
||||||
return Result.ok(ApiDataSource.SQL_DICT.get(plugin_name))
|
return Result.ok(ApiDataSource.SQL_DICT.get(plugin_name))
|
||||||
return Result.ok(str(ApiDataSource.SQL_DICT))
|
return Result.ok(ApiDataSource.SQL_DICT)
|
||||||
|
|||||||
@ -5,6 +5,8 @@ from nonebot_plugin_session import EventSession
|
|||||||
from nonebot_plugin_uninfo import Uninfo
|
from nonebot_plugin_uninfo import Uninfo
|
||||||
|
|
||||||
from zhenxun.configs.config import Config
|
from zhenxun.configs.config import Config
|
||||||
|
from zhenxun.models.ban_console import BanConsole
|
||||||
|
from zhenxun.models.group_console import GroupConsole
|
||||||
from zhenxun.models.level_user import LevelUser
|
from zhenxun.models.level_user import LevelUser
|
||||||
from zhenxun.utils.platform import PlatformUtils
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
|
|
||||||
@ -89,3 +91,21 @@ def notice_rule(event_type: type | list[type]) -> Rule:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
return Rule(_rule)
|
return Rule(_rule)
|
||||||
|
|
||||||
|
|
||||||
|
def is_allowed_call() -> Rule:
|
||||||
|
"""是否允许调用插件"""
|
||||||
|
|
||||||
|
async def _rule(session: Uninfo) -> bool:
|
||||||
|
group_id = session.group.id if session.group else None
|
||||||
|
if await BanConsole.is_ban(session.user.id, group_id):
|
||||||
|
return False
|
||||||
|
if group_id:
|
||||||
|
if await BanConsole.is_ban(None, group_id):
|
||||||
|
return False
|
||||||
|
if g := await GroupConsole.get_group(group_id):
|
||||||
|
if g.level < 0:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
return Rule(_rule)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user