nonebot-plugin-volt-toy 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. nonebot_plugin_volt_toy-0.1.0/.gitattributes +4 -0
  2. nonebot_plugin_volt_toy-0.1.0/.github/workflows/pypi-publish.yml +87 -0
  3. nonebot_plugin_volt_toy-0.1.0/.gitignore +12 -0
  4. nonebot_plugin_volt_toy-0.1.0/LICENSE +21 -0
  5. nonebot_plugin_volt_toy-0.1.0/PKG-INFO +168 -0
  6. nonebot_plugin_volt_toy-0.1.0/README.md +142 -0
  7. nonebot_plugin_volt_toy-0.1.0/conftest.py +8 -0
  8. nonebot_plugin_volt_toy-0.1.0/nonebot_plugin_volt_toy/__init__.py +41 -0
  9. nonebot_plugin_volt_toy-0.1.0/nonebot_plugin_volt_toy/commands.py +270 -0
  10. nonebot_plugin_volt_toy-0.1.0/nonebot_plugin_volt_toy/config.py +35 -0
  11. nonebot_plugin_volt_toy-0.1.0/nonebot_plugin_volt_toy/platform.py +225 -0
  12. nonebot_plugin_volt_toy-0.1.0/nonebot_plugin_volt_toy/runtime.py +61 -0
  13. nonebot_plugin_volt_toy-0.1.0/nonebot_plugin_volt_toy/store.py +32 -0
  14. nonebot_plugin_volt_toy-0.1.0/pyproject.toml +69 -0
  15. nonebot_plugin_volt_toy-0.1.0/tests/test_model.py +55 -0
  16. nonebot_plugin_volt_toy-0.1.0/tests/test_rankings.py +34 -0
  17. nonebot_plugin_volt_toy-0.1.0/tests/test_records.py +63 -0
  18. nonebot_plugin_volt_toy-0.1.0/tests/test_service.py +121 -0
  19. nonebot_plugin_volt_toy-0.1.0/tests/test_storage.py +109 -0
  20. nonebot_plugin_volt_toy-0.1.0/tests/test_texts.py +58 -0
  21. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/__init__.py +36 -0
  22. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/fmt.py +21 -0
  23. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/model.py +108 -0
  24. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/rankings.py +55 -0
  25. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/records.py +122 -0
  26. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/render.py +72 -0
  27. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/service.py +217 -0
  28. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/settings.py +33 -0
  29. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/state.py +72 -0
  30. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/storage.py +206 -0
  31. nonebot_plugin_volt_toy-0.1.0/volt_toy_core/texts.py +186 -0
@@ -0,0 +1,4 @@
1
+ * text=auto eol=lf
2
+ *.png binary
3
+ *.jpg binary
4
+ *.gif binary
@@ -0,0 +1,87 @@
1
+ # 发布到 PyPI:推 vX.Y.Z tag 时构建并上传,其余情况只做构建检查。
2
+ #
3
+ # 首次使用前在 PyPI 配置一次 Trusted Publisher(不需要长期 token):
4
+ # PyPI → Your projects → Publishing → Add a pending publisher
5
+ # Owner: Funny1Potato
6
+ # Repository: Volt-Toy
7
+ # Workflow name: pypi-publish.yml
8
+ # Environment: pypi
9
+ # 也可以用 API token:在仓库 Secrets 加 PYPI_API_TOKEN,按下文注释改 publish 步骤。
10
+
11
+ name: Publish to PyPI
12
+
13
+ on:
14
+ push:
15
+ branches: [main]
16
+ tags: ["v*"]
17
+ pull_request:
18
+ workflow_dispatch:
19
+
20
+ permissions:
21
+ contents: read
22
+
23
+ jobs:
24
+ build:
25
+ name: 构建
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+
30
+ - uses: actions/setup-python@v5
31
+ with:
32
+ python-version: "3.12"
33
+
34
+ - name: 安装 build
35
+ run: python -m pip install --upgrade build
36
+
37
+ - name: 校验 tag 与 __version__ 一致
38
+ if: startsWith(github.ref, 'refs/tags/v')
39
+ env:
40
+ TAG: ${{ github.ref_name }}
41
+ run: |
42
+ python - <<'PY'
43
+ import os, pathlib, re, sys
44
+
45
+ tag = os.environ["TAG"].lstrip("v")
46
+ src = pathlib.Path("nonebot_plugin_volt_toy/__init__.py").read_text(encoding="utf-8")
47
+ ver = re.search(r'__version__\s*=\s*"([^"]+)"', src).group(1)
48
+ print(f"tag={tag} __version__={ver}")
49
+ sys.exit(0 if tag == ver else 1)
50
+ PY
51
+
52
+ - name: 构建 sdist 与 wheel
53
+ run: python -m build
54
+
55
+ - name: 检查 wheel 内容
56
+ run: |
57
+ listing=$(unzip -l dist/*.whl)
58
+ echo "$listing"
59
+ echo "$listing" | grep -q "nonebot_plugin_volt_toy/__init__.py"
60
+ echo "$listing" | grep -q "volt_toy_core/service.py"
61
+ if echo "$listing" | grep -qE "/(tests|doc)/|main\\.py"; then
62
+ echo "wheel 里混进了非 Python 包文件"; exit 1
63
+ fi
64
+
65
+ - uses: actions/upload-artifact@v4
66
+ with:
67
+ name: dist
68
+ path: dist/
69
+
70
+ publish:
71
+ name: 上传 PyPI
72
+ needs: build
73
+ if: startsWith(github.ref, 'refs/tags/v')
74
+ runs-on: ubuntu-latest
75
+ environment: pypi
76
+ permissions:
77
+ id-token: write # Trusted Publishing 靠这个换临时凭据
78
+ steps:
79
+ - uses: actions/download-artifact@v4
80
+ with:
81
+ name: dist
82
+ path: dist/
83
+
84
+ - uses: pypa/gh-action-pypi-publish@release/v1
85
+ # 改用 API token 时:去掉上面的 id-token 权限,并改成
86
+ # with:
87
+ # password: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,12 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .pytest_cache/
4
+ .venv/
5
+ venv/
6
+ dist/
7
+ build/
8
+ *.egg-info/
9
+ .dev/
10
+ .DS_Store
11
+
12
+ pytest-of-*/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Volt-Toy contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,168 @@
1
+ Metadata-Version: 2.5
2
+ Name: nonebot-plugin-volt-toy
3
+ Version: 0.1.0
4
+ Summary: 电击群友:电压 / 电量 / 度数记账,失败计数,供电局文案
5
+ Author: Volt-Toy
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Keywords: chat,game,nonebot,nonebot2,plugin,zap
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Requires-Python: <4.0,>=3.10
15
+ Requires-Dist: httpx>=0.27.0
16
+ Requires-Dist: nonebot-plugin-alconna>=0.55.0
17
+ Requires-Dist: nonebot-plugin-localstore>=0.7.0
18
+ Requires-Dist: nonebot-plugin-uninfo>=0.8.0
19
+ Requires-Dist: nonebot2>=2.3.0
20
+ Requires-Dist: pydantic>=2.0
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
23
+ Requires-Dist: pytest>=8.0; extra == 'dev'
24
+ Requires-Dist: ruff>=0.6; extra == 'dev'
25
+ Description-Content-Type: text/markdown
26
+
27
+ # Volt-Toy
28
+
29
+ 群聊电击玩具。**v0.1 只做手动电**:群友互相电、电自己,记录次数、失败次数与度数,配一套「供电局」口吻的文案。图片检测留了挂点,暂不实现。
30
+
31
+ ## 目录
32
+
33
+ ```
34
+ main.py AstrBot 适配入口(仓库根目录即 AstrBot 插件目录)
35
+ metadata.yaml AstrBot 插件元数据
36
+ _conf_schema.json AstrBot 配置面板 Schema
37
+ volt_toy_core/ 框架无关内核(纯标准库)
38
+ model.py 三步抽样:档位 → 能量 → 拆电压/电量
39
+ records.py 受电账本:成功/失败/峰值/首电
40
+ texts.py 文案池与严格渲染
41
+ storage.py 原子写 JSON 账本 + JSONL 日志
42
+ state.py 热状态:冷却/连击/额度/跳闸
43
+ service.py 编排:校验 → 抽取 → 记账 → 文案
44
+ rankings.py 榜单聚合
45
+ render.py 榜单/档案文本(两框架共用)
46
+ settings.py 参数默认值
47
+ nonebot_plugin_volt_toy/ nonebot2 适配(Alconna + Uninfo + localstore)
48
+ config.py pydantic 配置(volt_* 字段)
49
+ runtime.py 配置/状态/服务单例
50
+ store.py localstore 数据文件
51
+ platform.py 跨协议会话:群 key / 名字 / 管理员 / 头像
52
+ commands.py Alconna 指令
53
+ tests/ 内核单测
54
+ doc/Agent_notes.md 开发笔记:决策、风险、待验证项
55
+ pyproject.toml nonebot 插件发布用
56
+ ```
57
+
58
+ ## 快速开始(nonebot2)
59
+
60
+ ```bash
61
+ pip install nonebot-plugin-volt-toy
62
+ # 或者从源码:
63
+ pip install .
64
+ ```
65
+
66
+ 在 bot 里加载插件:
67
+
68
+ ```python
69
+ nonebot.load_plugin("nonebot_plugin_volt_toy")
70
+ ```
71
+
72
+ 依赖:`nonebot-plugin-alconna`(多协议指令解析)、`nonebot-plugin-uninfo`(跨协议会话信息)、`nonebot-plugin-localstore`(数据目录)。三个都会在插件加载时用 `require()` 声明。
73
+
74
+ ## 快速开始(AstrBot)
75
+
76
+ 整个仓库就是 AstrBot 插件:把它放到 AstrBot 的 `data/plugins/` 下,重载插件即可。`main.py` 与 `volt_toy_core` 同级,不需要额外安装依赖。
77
+
78
+ ```bash
79
+ cd AstrBot/data/plugins
80
+ git clone https://github.com/Funny1Potato/Volt-Toy
81
+ ```
82
+
83
+ 配置项在 WebUI 的插件配置页中调整,由 `_conf_schema.json` 定义。
84
+
85
+ 插件市场发布:仓库根目录已带 `metadata.yaml` 与 `main.py`,仓库体积约 50KB(远低于 16MB 上限),
86
+ 可直接在 [AstrBot Cloud 发布页](https://cloud.astrbot.app/publish) 提交。
87
+ `metadata.yaml` 声明的支持平台是 QQ 系三个(aiocqhttp / qq_official / qq_official_webhook);
88
+ 文本指令在其它平台理论上可用,但未实测,故未声明。
89
+
90
+ ## 命令
91
+
92
+ | 命令 | 别名 | 说明 |
93
+ | --- | --- | --- |
94
+ | `zap [@目标]` | `电` `电击` `雷` | 施电;不 @ 则电自己(0.8 倍) |
95
+ | `zapkwh` | `度数榜` `电费榜` | 累计度数 TOP5 |
96
+ | `zaptop` | `被电榜` | 受电次数 TOP5(括号标失败数) |
97
+ | `zapmax` | `峰值榜` | 单次最高度数 TOP5 |
98
+ | `zapking` | `电王榜` | 成功施电次数 + 首电 × 2 |
99
+ | `zapinfo [@目标]` | `电档` | 总次数 / 失败次数 / 今日 / 累计度 |
100
+ | `zapclear [@目标]` | — | 清除记录(管理员) |
101
+ | `zapnodo [@目标]` | `绝缘` | 免电名单开关(管理员) |
102
+ | `zapon` / `zapoff` | — | 群内启停(管理员) |
103
+
104
+ ## 规则
105
+
106
+ - 单目标每日上限 **25 次**:超出不拒绝,只记次数与失败,不加电量。
107
+ - 过载:**60 秒内 10 次** → 跳闸 **300 秒**。
108
+ - 每日施电额度默认 **不限**(`0`);冷却默认 **关闭**(`0`)。
109
+ - 统计口径:**度(kWh)**;单次同时展示电压 V 与电量 Ah。
110
+ - 电自己:0.8 倍效率,不额外占额度。
111
+
112
+ ## 配置
113
+
114
+ 字段名转大写下划线即环境变量,例如 `VOLT_RECEIVE_CAP=25`。
115
+
116
+ | 字段 | 默认 | 说明 |
117
+ | --- | --- | --- |
118
+ | `volt_receive_cap` | 25 | 单目标每日受电上限,0 不限 |
119
+ | `volt_overload_window` | 60 | 过载窗口(秒) |
120
+ | `volt_overload_threshold` | 10 | 窗口内最多施电次数 |
121
+ | `volt_overload_ban` | 300 | 跳闸时长(秒) |
122
+ | `volt_daily_quota` | 0 | 每日施电额度,0 不限 |
123
+ | `volt_cooldown` | 0 | 同目标冷却秒数,0 关闭 |
124
+ | `volt_crit_prob` | 0.15 | 暴击概率 |
125
+ | `volt_self_efficiency` | 0.8 | 电自己的效率 |
126
+ | `volt_price_per_kwh` | 0.55 | 电价,仅影响展示 |
127
+ | `volt_is_log` | false | 写逐条日志 |
128
+ | `volt_whitelist` | `[]` | 免电名单初始值 |
129
+
130
+ ## 数据
131
+
132
+ 两边用同一套文件格式:
133
+
134
+ - `zap.json` —— 群用电账本(原子写)
135
+ - `zap_log.jsonl` —— 逐条审计(`volt_is_log` 为真时)
136
+ - `zap_whitelist.json` —— 免电名单
137
+
138
+ nonebot 版放在 localstore 插件数据目录;AstrBot 版放在 `data/plugin_data/<插件名>/`。
139
+ 两边的账本可以直接对拷(群 key 的前缀不同,需要少量改名,见 `doc/Agent_notes.md`)。
140
+
141
+ ## 开发
142
+
143
+ ```bash
144
+ pip install -e ".[dev]"
145
+ pytest # 32 个内核用例
146
+ ```
147
+
148
+ 冒烟测试需要真实的 nonebot 项目:把仓库根加进 `sys.path` 后
149
+ `nonebot.load_plugin("nonebot_plugin_volt_toy")` 即可(`/zap @某人` 实测通过)。
150
+ 注意 **editable 安装的插件可能无法被 nonebot 识别**:PEP 660 的 finder 会绕过
151
+ nonebot 的 `PluginFinder`,模块因而没有 `__plugin__`。用普通安装、或把插件目录放进
152
+ `plugin_dirs`,或手动把仓库根加进 `sys.path`。
153
+
154
+ ## 发布(PyPI)
155
+
156
+ 版本号在 `nonebot_plugin_volt_toy/__init__.py` 的 `__version__`,打包用 hatchling:
157
+
158
+ ```bash
159
+ python -m build # 产出 dist/*.whl 与 dist/*.tar.gz
160
+ pip install dist/*.whl # 本地验证
161
+ ```
162
+
163
+ 推 `vX.Y.Z` tag 会触发 `.github/workflows/pypi-publish.yml`:校验 tag 与 `__version__`
164
+ 一致、构建、检查 wheel 内容,再用 Trusted Publishing 上传(首次需在 PyPI 配一次 publisher)。
165
+
166
+ ## 免责
167
+
168
+ 这是熟人局玩具,不涉及任何真实惩罚。请勿用于骚扰陌生人。
@@ -0,0 +1,142 @@
1
+ # Volt-Toy
2
+
3
+ 群聊电击玩具。**v0.1 只做手动电**:群友互相电、电自己,记录次数、失败次数与度数,配一套「供电局」口吻的文案。图片检测留了挂点,暂不实现。
4
+
5
+ ## 目录
6
+
7
+ ```
8
+ main.py AstrBot 适配入口(仓库根目录即 AstrBot 插件目录)
9
+ metadata.yaml AstrBot 插件元数据
10
+ _conf_schema.json AstrBot 配置面板 Schema
11
+ volt_toy_core/ 框架无关内核(纯标准库)
12
+ model.py 三步抽样:档位 → 能量 → 拆电压/电量
13
+ records.py 受电账本:成功/失败/峰值/首电
14
+ texts.py 文案池与严格渲染
15
+ storage.py 原子写 JSON 账本 + JSONL 日志
16
+ state.py 热状态:冷却/连击/额度/跳闸
17
+ service.py 编排:校验 → 抽取 → 记账 → 文案
18
+ rankings.py 榜单聚合
19
+ render.py 榜单/档案文本(两框架共用)
20
+ settings.py 参数默认值
21
+ nonebot_plugin_volt_toy/ nonebot2 适配(Alconna + Uninfo + localstore)
22
+ config.py pydantic 配置(volt_* 字段)
23
+ runtime.py 配置/状态/服务单例
24
+ store.py localstore 数据文件
25
+ platform.py 跨协议会话:群 key / 名字 / 管理员 / 头像
26
+ commands.py Alconna 指令
27
+ tests/ 内核单测
28
+ doc/Agent_notes.md 开发笔记:决策、风险、待验证项
29
+ pyproject.toml nonebot 插件发布用
30
+ ```
31
+
32
+ ## 快速开始(nonebot2)
33
+
34
+ ```bash
35
+ pip install nonebot-plugin-volt-toy
36
+ # 或者从源码:
37
+ pip install .
38
+ ```
39
+
40
+ 在 bot 里加载插件:
41
+
42
+ ```python
43
+ nonebot.load_plugin("nonebot_plugin_volt_toy")
44
+ ```
45
+
46
+ 依赖:`nonebot-plugin-alconna`(多协议指令解析)、`nonebot-plugin-uninfo`(跨协议会话信息)、`nonebot-plugin-localstore`(数据目录)。三个都会在插件加载时用 `require()` 声明。
47
+
48
+ ## 快速开始(AstrBot)
49
+
50
+ 整个仓库就是 AstrBot 插件:把它放到 AstrBot 的 `data/plugins/` 下,重载插件即可。`main.py` 与 `volt_toy_core` 同级,不需要额外安装依赖。
51
+
52
+ ```bash
53
+ cd AstrBot/data/plugins
54
+ git clone https://github.com/Funny1Potato/Volt-Toy
55
+ ```
56
+
57
+ 配置项在 WebUI 的插件配置页中调整,由 `_conf_schema.json` 定义。
58
+
59
+ 插件市场发布:仓库根目录已带 `metadata.yaml` 与 `main.py`,仓库体积约 50KB(远低于 16MB 上限),
60
+ 可直接在 [AstrBot Cloud 发布页](https://cloud.astrbot.app/publish) 提交。
61
+ `metadata.yaml` 声明的支持平台是 QQ 系三个(aiocqhttp / qq_official / qq_official_webhook);
62
+ 文本指令在其它平台理论上可用,但未实测,故未声明。
63
+
64
+ ## 命令
65
+
66
+ | 命令 | 别名 | 说明 |
67
+ | --- | --- | --- |
68
+ | `zap [@目标]` | `电` `电击` `雷` | 施电;不 @ 则电自己(0.8 倍) |
69
+ | `zapkwh` | `度数榜` `电费榜` | 累计度数 TOP5 |
70
+ | `zaptop` | `被电榜` | 受电次数 TOP5(括号标失败数) |
71
+ | `zapmax` | `峰值榜` | 单次最高度数 TOP5 |
72
+ | `zapking` | `电王榜` | 成功施电次数 + 首电 × 2 |
73
+ | `zapinfo [@目标]` | `电档` | 总次数 / 失败次数 / 今日 / 累计度 |
74
+ | `zapclear [@目标]` | — | 清除记录(管理员) |
75
+ | `zapnodo [@目标]` | `绝缘` | 免电名单开关(管理员) |
76
+ | `zapon` / `zapoff` | — | 群内启停(管理员) |
77
+
78
+ ## 规则
79
+
80
+ - 单目标每日上限 **25 次**:超出不拒绝,只记次数与失败,不加电量。
81
+ - 过载:**60 秒内 10 次** → 跳闸 **300 秒**。
82
+ - 每日施电额度默认 **不限**(`0`);冷却默认 **关闭**(`0`)。
83
+ - 统计口径:**度(kWh)**;单次同时展示电压 V 与电量 Ah。
84
+ - 电自己:0.8 倍效率,不额外占额度。
85
+
86
+ ## 配置
87
+
88
+ 字段名转大写下划线即环境变量,例如 `VOLT_RECEIVE_CAP=25`。
89
+
90
+ | 字段 | 默认 | 说明 |
91
+ | --- | --- | --- |
92
+ | `volt_receive_cap` | 25 | 单目标每日受电上限,0 不限 |
93
+ | `volt_overload_window` | 60 | 过载窗口(秒) |
94
+ | `volt_overload_threshold` | 10 | 窗口内最多施电次数 |
95
+ | `volt_overload_ban` | 300 | 跳闸时长(秒) |
96
+ | `volt_daily_quota` | 0 | 每日施电额度,0 不限 |
97
+ | `volt_cooldown` | 0 | 同目标冷却秒数,0 关闭 |
98
+ | `volt_crit_prob` | 0.15 | 暴击概率 |
99
+ | `volt_self_efficiency` | 0.8 | 电自己的效率 |
100
+ | `volt_price_per_kwh` | 0.55 | 电价,仅影响展示 |
101
+ | `volt_is_log` | false | 写逐条日志 |
102
+ | `volt_whitelist` | `[]` | 免电名单初始值 |
103
+
104
+ ## 数据
105
+
106
+ 两边用同一套文件格式:
107
+
108
+ - `zap.json` —— 群用电账本(原子写)
109
+ - `zap_log.jsonl` —— 逐条审计(`volt_is_log` 为真时)
110
+ - `zap_whitelist.json` —— 免电名单
111
+
112
+ nonebot 版放在 localstore 插件数据目录;AstrBot 版放在 `data/plugin_data/<插件名>/`。
113
+ 两边的账本可以直接对拷(群 key 的前缀不同,需要少量改名,见 `doc/Agent_notes.md`)。
114
+
115
+ ## 开发
116
+
117
+ ```bash
118
+ pip install -e ".[dev]"
119
+ pytest # 32 个内核用例
120
+ ```
121
+
122
+ 冒烟测试需要真实的 nonebot 项目:把仓库根加进 `sys.path` 后
123
+ `nonebot.load_plugin("nonebot_plugin_volt_toy")` 即可(`/zap @某人` 实测通过)。
124
+ 注意 **editable 安装的插件可能无法被 nonebot 识别**:PEP 660 的 finder 会绕过
125
+ nonebot 的 `PluginFinder`,模块因而没有 `__plugin__`。用普通安装、或把插件目录放进
126
+ `plugin_dirs`,或手动把仓库根加进 `sys.path`。
127
+
128
+ ## 发布(PyPI)
129
+
130
+ 版本号在 `nonebot_plugin_volt_toy/__init__.py` 的 `__version__`,打包用 hatchling:
131
+
132
+ ```bash
133
+ python -m build # 产出 dist/*.whl 与 dist/*.tar.gz
134
+ pip install dist/*.whl # 本地验证
135
+ ```
136
+
137
+ 推 `vX.Y.Z` tag 会触发 `.github/workflows/pypi-publish.yml`:校验 tag 与 `__version__`
138
+ 一致、构建、检查 wheel 内容,再用 Trusted Publishing 上传(首次需在 PyPI 配一次 publisher)。
139
+
140
+ ## 免责
141
+
142
+ 这是熟人局玩具,不涉及任何真实惩罚。请勿用于骚扰陌生人。
@@ -0,0 +1,8 @@
1
+ """让测试在未安装包时也能直接 import volt_toy_core。"""
2
+
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ ROOT = Path(__file__).parent
7
+ if str(ROOT) not in sys.path:
8
+ sys.path.insert(0, str(ROOT))
@@ -0,0 +1,41 @@
1
+ """Volt-Toy —— 电击群友。
2
+
3
+ v0.1 只做手动电:施电、记账、榜单、管理。
4
+ 图片检测留了挂点,暂不实现。
5
+ """
6
+
7
+ __version__ = "0.1.0"
8
+
9
+ from nonebot import require
10
+
11
+ # require 必须先于任何 import:否则这两个库会以「被普通 import」的方式装载,
12
+ # require 会判定它们不是插件并抛错。
13
+ require("nonebot_plugin_localstore")
14
+ require("nonebot_plugin_alconna")
15
+ require("nonebot_plugin_uninfo")
16
+
17
+ from nonebot.plugin import PluginMetadata, inherit_supported_adapters # noqa: E402
18
+
19
+ from .config import PluginConfig # noqa: E402
20
+
21
+ __plugin_meta__ = PluginMetadata(
22
+ name="Volt-Toy 电击群友",
23
+ description="用指令电群友:电压 / 电量 / 度数记账,失败计数,供电局文案。",
24
+ usage=(
25
+ "zap [@目标] —— 施电,不 @ 则电自己\n"
26
+ "zapkwh / zaptop / zapmax / zapking —— 度数 / 次数 / 峰值 / 电王榜\n"
27
+ "zapinfo [@目标] —— 个人用电档案\n"
28
+ "zapclear / zapnodo / zapon / zapoff —— 管理"
29
+ ),
30
+ type="application",
31
+ config=PluginConfig,
32
+ # 收发走 alconna 的 uniseg、会话信息走 uninfo,因此声明两者共同支持的适配器
33
+ supported_adapters=inherit_supported_adapters(
34
+ "nonebot_plugin_alconna",
35
+ "nonebot_plugin_uninfo",
36
+ ),
37
+ homepage="https://github.com/Funny1Potato/Volt-Toy",
38
+ extra={"License": "MIT", "Author": "Funny1Potato"},
39
+ )
40
+
41
+ from . import commands as _commands # noqa: E402,F401