nonebot-plugin-werewolf 1.1.3__tar.gz → 1.1.6__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 (54) hide show
  1. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/PKG-INFO +78 -66
  2. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/README.md +75 -65
  3. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/__init__.py +3 -1
  4. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/config.py +45 -0
  5. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/constant.py +74 -0
  6. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/exception.py +1 -1
  7. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/game.py +499 -0
  8. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/matchers/__init__.py +2 -0
  9. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/depends.py +50 -0
  10. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/edit_preset.py +263 -0
  11. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/message_in_game.py +30 -0
  12. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/poke/__init__.py +8 -0
  13. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/poke/chronocat_poke.py +117 -0
  14. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/matchers/ob11_ext.py → nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/poke/ob11_poke.py +21 -19
  15. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/start_game.py +294 -0
  16. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/matchers/superuser_ops.py +24 -0
  17. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/models.py +73 -0
  18. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/player_set.py +84 -0
  19. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/players/can_shoot.py +15 -20
  20. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/players/civilian.py +7 -0
  21. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/players/guard.py +31 -0
  22. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/players/hunter.py +8 -0
  23. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/players/idiot.py +4 -4
  24. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/players/joker.py +8 -4
  25. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/players/player.py +224 -0
  26. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/players/prophet.py +23 -0
  27. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/players/werewolf.py +91 -0
  28. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/players/witch.py +67 -0
  29. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/players/wolfking.py +3 -3
  30. nonebot_plugin_werewolf-1.1.6/nonebot_plugin_werewolf/utils.py +150 -0
  31. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf.egg-info/PKG-INFO +78 -66
  32. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf.egg-info/SOURCES.txt +7 -2
  33. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf.egg-info/requires.txt +2 -0
  34. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/pyproject.toml +5 -2
  35. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/_timeout.py +0 -110
  36. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/config.py +0 -82
  37. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/constant.py +0 -112
  38. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/game.py +0 -458
  39. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/matchers/message_in_game.py +0 -15
  40. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/matchers/start_game.py +0 -56
  41. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/player_set.py +0 -85
  42. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/players/civilian.py +0 -7
  43. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/players/guard.py +0 -37
  44. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/players/hunter.py +0 -8
  45. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/players/player.py +0 -161
  46. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/players/prophet.py +0 -30
  47. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/players/werewolf.py +0 -67
  48. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/players/witch.py +0 -72
  49. nonebot_plugin_werewolf-1.1.3/nonebot_plugin_werewolf/utils.py +0 -220
  50. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/LICENSE +0 -0
  51. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf/players/__init__.py +0 -0
  52. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf.egg-info/dependency_links.txt +0 -0
  53. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/nonebot_plugin_werewolf.egg-info/top_level.txt +0 -0
  54. {nonebot_plugin_werewolf-1.1.3 → nonebot_plugin_werewolf-1.1.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nonebot-plugin-werewolf
3
- Version: 1.1.3
3
+ Version: 1.1.6
4
4
  Summary: 适用于 Nonebot2 的狼人杀插件
5
5
  Author-email: wyf7685 <wyf7685@163.com>
6
6
  License: MIT
@@ -12,8 +12,10 @@ Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
13
  Requires-Dist: nonebot2>=2.3.3
14
14
  Requires-Dist: nonebot-plugin-alconna>=0.52.1
15
+ Requires-Dist: nonebot-plugin-localstore>=0.7.1
15
16
  Requires-Dist: nonebot-plugin-uninfo>=0.4.0
16
17
  Requires-Dist: nonebot-plugin-waiter>=0.7.1
18
+ Requires-Dist: anyio>=4.6.0
17
19
 
18
20
  <div align="center">
19
21
  <a href="https://v2.nonebot.dev/store">
@@ -42,6 +44,8 @@ _✨ 简单的狼人杀插件 ✨_
42
44
  [![pyright](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pyright.yml/badge.svg?branch=master&event=push)](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pyright.yml)
43
45
  [![publish](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pypi-publish.yml/badge.svg)](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pypi-publish.yml)
44
46
 
47
+ <!-- https://github.com/lgc2333/nonebot-registry-badge -->
48
+
45
49
  [![NoneBot Registry](https://img.shields.io/endpoint?url=https%3A%2F%2Fnbbdg.lgc2333.top%2Fplugin%2Fnonebot-plugin-werewolf)](https://registry.nonebot.dev/plugin/nonebot-plugin-werewolf:nonebot_plugin_werewolf)
46
50
  [![Supported Adapters](https://img.shields.io/endpoint?url=https%3A%2F%2Fnbbdg.lgc2333.top%2Fplugin-adapters%2Fnonebot-plugin-werewolf)](https://registry.nonebot.dev/plugin/nonebot-plugin-werewolf:nonebot_plugin_werewolf)
47
51
 
@@ -54,7 +58,7 @@ _✨ 简单的狼人杀插件 ✨_
54
58
  ## 💿 安装
55
59
 
56
60
  > [!note]
57
- >
61
+ >
58
62
  > 请确保 NoneBot2 使用的 Python 解释器版本 >=3.10
59
63
 
60
64
  <details open>
@@ -102,17 +106,16 @@ _✨ 简单的狼人杀插件 ✨_
102
106
 
103
107
  ## ⚙️ 配置
104
108
 
105
- 在 nonebot2 项目的 `.env` 文件中添加如下配置
109
+ 在 nonebot2 项目的 `.env` 文件中添加如下配置:
110
+
111
+ | 配置项 | 必填 | 默认值 | 说明 |
112
+ | :-----------------------: | :---: | :-----: | :------------------------: |
113
+ | `werewolf__enable_poke` | 否 | `True` | 是否使用戳一戳简化操作流程 |
114
+ | `werewolf__enable_button` | 否 | `False` | 是否在交互中添加按钮 |
106
115
 
107
- | 配置项 | 必填 | 默认值 | 说明 |
108
- | :-----------------------------: | :--: | :----: | :-----------------------------------------------------------: |
109
- | `werewolf__enable_poke` | 否 | `True` | 是否使用戳一戳简化操作流程<br/>仅在 `OneBot V11` 适配器下生效 |
110
- | `werewolf__role_preset` | 否 | - | 覆写插件内置的职业预设 |
111
- | `werewolf__werewolf_priority` | 否 | - | 自定义狼人职业优先级 |
112
- | `werewolf__priesthood_proirity` | 否 | - | 自定义神职职业优先级 |
113
- | `werewolf__joker_probability` | 否 | `0.0` | 小丑职业替换平民的概率, 范围`[0,1]` |
116
+ `werewolf__enable_poke` 仅在 `OneBot V11` 适配器 / `Satori/chronocat` 下生效
114
117
 
115
- `werewolf__role_preset`, `werewolf__werewolf_priority`, `werewolf__priesthood_proirity` 的配置格式请参考 [`游戏内容`](#游戏内容) 部分
118
+ `werewolf__enable_button` 仅在 `Telegram` 适配器下通过测试,不保证在其他适配器的可用性。如有疑问欢迎提出。
116
119
 
117
120
  ## 🎉 使用
118
121
 
@@ -131,24 +134,31 @@ _✨ 简单的狼人杀插件 ✨_
131
134
 
132
135
  而对于野生机器人,现有协议端通常不支持或不建议使用临时私聊消息。
133
136
 
134
- 在使用本插件前,应当确保机器人可以正常向玩家发送私聊消息。
137
+ 在使用本插件前,应当确保机器人可以正常向玩家发送私聊消息。~~即保证机器人与玩家为好友关系~~
135
138
 
136
139
  </details>
137
140
 
138
141
  ### 指令表
139
142
 
140
- | 指令 | 权限 | 需要@ | 范围 | 说明 |
141
- | :-----------------: | :--------: | :---: | :--: | :---------------------------------: |
142
- | `werewolf`/`狼人杀` | 群员 | 是 | 群聊 | 发起游戏 (进入准备阶段) |
143
- | `开始游戏` | 游戏发起者 | | 群聊 | _[准备阶段]_ 游戏发起者开始游戏 |
144
- | `结束游戏` | 游戏发起者 | | 群聊 | _[准备阶段]_ 游戏发起者结束游戏 |
145
- | `当前玩家` | 群员 | | 群聊 | _[准备阶段]_ 列出参与游戏的玩家列表 |
146
- | `加入游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家加入游戏 |
147
- | `退出游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家退出游戏 |
143
+ | 指令 | 权限 | 需要@ | 范围 | 说明 |
144
+ | :-----------------: | :-----------------: | :---: | :---: | :---------------------------------------: |
145
+ | `werewolf`/`狼人杀` | 群员 | 是 | 群聊 | 发起游戏 (进入准备阶段) |
146
+ | `开始游戏` | 游戏发起者 | | 群聊 | _[准备阶段]_ 游戏发起者开始游戏 |
147
+ | `结束游戏` | 游戏发起者/超级用户 | | 群聊 | _[准备阶段]_ 游戏发起者/超级用户 结束游戏 |
148
+ | `当前玩家` | 群员 | | 群聊 | _[准备阶段]_ 列出参与游戏的玩家列表 |
149
+ | `加入游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家加入游戏 |
150
+ | `退出游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家退出游戏 |
151
+ | `中止游戏` | 超级用户 | 是 | 群聊 | _[游戏内]_ 超级用户强制中止游戏 |
152
+ | `狼人杀预设` | 超级用户 | 否 | 任意 | _[游戏外]_ 超级用户编辑游戏预设 |
153
+
154
+ - 发起游戏时添加 `restart`/`重开`, 可加载上一次游戏的玩家列表, 快速发起游戏。例: `werewolf restart`/`狼人杀 重开`
155
+
156
+ - `狼人杀预设` 命令用法可通过 `狼人杀预设 --help` 获取,或参考 [游戏内容](#游戏内容) 部分的介绍
148
157
 
149
- _其他交互参考游戏内提示_
158
+ - 对于 `OneBot V11` 适配器和 `Satori` 适配器的 `chronocat`, 启用配置项 `werewolf__enable_poke` 后, 可以使用戳一戳代替 _准备阶段_ 的 `加入游戏` 操作 和 游戏内的 `stop` 命令
159
+
160
+ - _其他交互参考游戏内提示_
150
161
 
151
- 对于 `OneBot V11` 适配器, 启用配置项 `werewolf__enable_poke` 后, 可以使用戳一戳代替 _准备阶段_ 的 `加入游戏` 操作 和 游戏内的 `/stop` 命令
152
162
 
153
163
  ### 游戏内容
154
164
 
@@ -162,31 +172,22 @@ _其他交互参考游戏内提示_
162
172
 
163
173
  | 总人数 | 狼人 | 神职 | 平民 |
164
174
  | ------ | ---- | ---- | ---- |
165
- | 6     | 1  | 2   | 3   |
166
- | 7     | 2  | 2   | 3   |
167
- | 8     | 2  | 3   | 3   |
168
- | 9     | 2  | 4   | 3   |
169
- | 10   | 3  | 4   | 3   |
170
- | 11   | 3  | 5   | 3   |
171
- | 12   | 4  | 5   | 3   |
175
+ | 6 | 1 | 2 | 3 |
176
+ | 7 | 2 | 2 | 3 |
177
+ | 8 | 2 | 3 | 3 |
178
+ | 9 | 2 | 4 | 3 |
179
+ | 10 | 3 | 4 | 3 |
180
+ | 11 | 3 | 5 | 3 |
181
+ | 12 | 4 | 5 | 3 |
172
182
 
173
- 职业预设可以通过配置项 `werewolf__role_preset` 修改
183
+ 职业预设可以通过命令 `狼人杀预设 职业 ...` 修改
174
184
 
175
185
  <details>
176
186
  <summary>示例</summary>
177
187
 
178
- 配置项 `werewolf__role_preset`
179
-
180
- ```env
181
- werewolf__role_preset='
182
- [
183
- [6, 1, 3, 2],
184
- [7, 2, 3, 2]
185
- ]
186
- '
187
- ```
188
+ - 命令: `狼人杀预设 职业 6 1 3 2`
188
189
 
189
- 上述配置中,`[6, 1, 3, 2]` 表示当总人数为 6 时,狼人、神职、平民的数量分别为 1、3、2
190
+ - 上述命令指定当总人数为 6 时,狼人、神职、平民的数量分别为 1、3、2
190
191
 
191
192
  </details>
192
193
  <br/>
@@ -196,45 +197,43 @@ werewolf__role_preset='
196
197
  - `狼人`: `狼人`, `狼人`, `狼王`, `狼人`
197
198
  - `神职`: `女巫`, `预言家`, `猎人`, `守卫`, `白痴`
198
199
 
199
- 职业分配优先级可以通过配置项 `werewolf__werewolf_priority` `werewolf__priesthood_proirity` 修改
200
+ 职业分配优先级可以通过命令 `狼人杀预设 狼人/神职` 修改
200
201
 
201
202
  <details>
202
203
  <summary>示例</summary>
203
204
 
204
- #### 配置项 `werewolf__werewolf_priority`
205
+ #### 命令 `狼人杀预设 狼人`
206
+
207
+ - 命令: `狼人杀预设 狼人 狼 狼王 狼 狼`
205
208
 
206
- ```env
207
- werewolf__werewolf_priority=[1, 2, 1, 1]
208
- ```
209
+ - 上述命令指定狼人的职业优先级为 `狼人`, `狼王`, `狼人`, `狼人`
209
210
 
210
- 上述配置中,`[1, 2, 1, 1]` 表示狼人的职业优先级为 `狼人`, `狼王`, `狼人`, `狼人`
211
+ #### 命令 `狼人杀预设 神职`
211
212
 
212
- #### 配置项 `werewolf__priesthood_proirity`
213
+ - 命令: `狼人杀预设 神职 预言家 女巫 猎人 守卫 白痴`
213
214
 
214
- ```env
215
- werewolf__priesthood_proirity=[11, 12, 13, 14, 15]
216
- ```
215
+ - 上述命令指定狼人的职业优先级为 `预言家`, `女巫`, `猎人`, `守卫`, `白痴`
216
+
217
+ > [!note]
218
+ >
219
+ > 以上两条命令均支持交互式输入
220
+ >
221
+ > 例:向机器人发送命令 `狼人杀预设 狼人`,在接下来的一条消息中发送 `狼人 狼王 狼人 狼人`
222
+ >
223
+ > 其效果等同于以上描述中的单条命令 `狼人杀预设 狼人 狼人 狼王 狼人 狼人`
217
224
 
218
- 上述配置中,`[11, 12, 13, 14, 15]` 表示神职的职业优先级为 `预言家`, `女巫`, `猎人`, `守卫`, `白痴`
225
+ </details>
226
+ <br/>
219
227
 
220
- #### 职业与数字的对应关系
228
+ 对于 `小丑` 职业,当预设中的平民数量大于或等于 2 时,将有 *一定概率* 将其中一个平民替换为小丑。
221
229
 
222
- 上述配置示例中有大量~~意义不明的~~数字, 其对应的是 [`这里`](./nonebot_plugin_werewolf/constant.py) 的枚举类 `Role` 的值
230
+ 小丑属于第三方阵营,胜利条件为在投票阶段被票出,在预言家查验及游戏进程判断时视作平民。
223
231
 
224
- 以下列出目前的枚举值供参考
232
+ 小丑生成概率可以通过命令 `狼人杀预设 小丑 <概率>` 设置,默认值为 0 (不生成小丑)。
225
233
 
226
- | 职业 | 枚举值 |
227
- | -------- | ------ |
228
- | `狼人` | `1` |
229
- | `狼王` | `2` |
230
- | `预言家` | `11` |
231
- | `女巫` | `12` |
232
- | `猎人` | `13` |
233
- | `守卫` | `14` |
234
- | `白痴` | `15` |
235
- | `平民` | `0` |
234
+ ### 已知问题
236
235
 
237
- </details>
236
+ - 截止 chronocat v0.2.19, 调用 [`guild.member.get`](https://github.com/chrononeko/chronocat/blob/8558ad9ff4319395d86abbfda22136939bf66780/packages/engine-chronocat-api/src/api/guild/member/get.ts) / [`user.get`](https://github.com/chrononeko/chronocat/blob/8558ad9ff4319395d86abbfda22136939bf66780/packages/engine-chronocat-api/src/api/user/get.ts) 均无法获取用户名,这将导致在交互过程中的玩家名显示为用户 ID
238
237
 
239
238
  ## 📝 更新日志
240
239
 
@@ -243,6 +242,19 @@ werewolf__priesthood_proirity=[11, 12, 13, 14, 15]
243
242
 
244
243
  <!-- CHANGELOG -->
245
244
 
245
+ - 2024.10.31 v1.1.6
246
+
247
+ - 新增超级用户中止游戏 (#7)
248
+ - 新增快速发起上次游戏 (#8)
249
+ - 准备阶段添加可选的交互按钮
250
+ - 新增超级用户修改游戏预设 (#9)
251
+
252
+ - 2024.10.23 v1.1.5
253
+
254
+ - 添加对 chronocat:poke 的支持
255
+ - 游戏内 stop 命令使用 COMMAND_START
256
+ - 使用 `anyio` 重写并发逻辑
257
+
246
258
  - 2024.10.06 v1.1.3
247
259
 
248
260
  - 使用 `RF-Tar-Railt/nonebot-plugin-uninfo` 获取用户数据
@@ -25,6 +25,8 @@ _✨ 简单的狼人杀插件 ✨_
25
25
  [![pyright](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pyright.yml/badge.svg?branch=master&event=push)](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pyright.yml)
26
26
  [![publish](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pypi-publish.yml/badge.svg)](https://github.com/wyf7685/nonebot-plugin-werewolf/actions/workflows/pypi-publish.yml)
27
27
 
28
+ <!-- https://github.com/lgc2333/nonebot-registry-badge -->
29
+
28
30
  [![NoneBot Registry](https://img.shields.io/endpoint?url=https%3A%2F%2Fnbbdg.lgc2333.top%2Fplugin%2Fnonebot-plugin-werewolf)](https://registry.nonebot.dev/plugin/nonebot-plugin-werewolf:nonebot_plugin_werewolf)
29
31
  [![Supported Adapters](https://img.shields.io/endpoint?url=https%3A%2F%2Fnbbdg.lgc2333.top%2Fplugin-adapters%2Fnonebot-plugin-werewolf)](https://registry.nonebot.dev/plugin/nonebot-plugin-werewolf:nonebot_plugin_werewolf)
30
32
 
@@ -37,7 +39,7 @@ _✨ 简单的狼人杀插件 ✨_
37
39
  ## 💿 安装
38
40
 
39
41
  > [!note]
40
- >
42
+ >
41
43
  > 请确保 NoneBot2 使用的 Python 解释器版本 >=3.10
42
44
 
43
45
  <details open>
@@ -85,17 +87,16 @@ _✨ 简单的狼人杀插件 ✨_
85
87
 
86
88
  ## ⚙️ 配置
87
89
 
88
- 在 nonebot2 项目的 `.env` 文件中添加如下配置
90
+ 在 nonebot2 项目的 `.env` 文件中添加如下配置:
91
+
92
+ | 配置项 | 必填 | 默认值 | 说明 |
93
+ | :-----------------------: | :---: | :-----: | :------------------------: |
94
+ | `werewolf__enable_poke` | 否 | `True` | 是否使用戳一戳简化操作流程 |
95
+ | `werewolf__enable_button` | 否 | `False` | 是否在交互中添加按钮 |
89
96
 
90
- | 配置项 | 必填 | 默认值 | 说明 |
91
- | :-----------------------------: | :--: | :----: | :-----------------------------------------------------------: |
92
- | `werewolf__enable_poke` | 否 | `True` | 是否使用戳一戳简化操作流程<br/>仅在 `OneBot V11` 适配器下生效 |
93
- | `werewolf__role_preset` | 否 | - | 覆写插件内置的职业预设 |
94
- | `werewolf__werewolf_priority` | 否 | - | 自定义狼人职业优先级 |
95
- | `werewolf__priesthood_proirity` | 否 | - | 自定义神职职业优先级 |
96
- | `werewolf__joker_probability` | 否 | `0.0` | 小丑职业替换平民的概率, 范围`[0,1]` |
97
+ `werewolf__enable_poke` 仅在 `OneBot V11` 适配器 / `Satori/chronocat` 下生效
97
98
 
98
- `werewolf__role_preset`, `werewolf__werewolf_priority`, `werewolf__priesthood_proirity` 的配置格式请参考 [`游戏内容`](#游戏内容) 部分
99
+ `werewolf__enable_button` 仅在 `Telegram` 适配器下通过测试,不保证在其他适配器的可用性。如有疑问欢迎提出。
99
100
 
100
101
  ## 🎉 使用
101
102
 
@@ -114,24 +115,31 @@ _✨ 简单的狼人杀插件 ✨_
114
115
 
115
116
  而对于野生机器人,现有协议端通常不支持或不建议使用临时私聊消息。
116
117
 
117
- 在使用本插件前,应当确保机器人可以正常向玩家发送私聊消息。
118
+ 在使用本插件前,应当确保机器人可以正常向玩家发送私聊消息。~~即保证机器人与玩家为好友关系~~
118
119
 
119
120
  </details>
120
121
 
121
122
  ### 指令表
122
123
 
123
- | 指令 | 权限 | 需要@ | 范围 | 说明 |
124
- | :-----------------: | :--------: | :---: | :--: | :---------------------------------: |
125
- | `werewolf`/`狼人杀` | 群员 | 是 | 群聊 | 发起游戏 (进入准备阶段) |
126
- | `开始游戏` | 游戏发起者 | | 群聊 | _[准备阶段]_ 游戏发起者开始游戏 |
127
- | `结束游戏` | 游戏发起者 | | 群聊 | _[准备阶段]_ 游戏发起者结束游戏 |
128
- | `当前玩家` | 群员 | | 群聊 | _[准备阶段]_ 列出参与游戏的玩家列表 |
129
- | `加入游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家加入游戏 |
130
- | `退出游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家退出游戏 |
124
+ | 指令 | 权限 | 需要@ | 范围 | 说明 |
125
+ | :-----------------: | :-----------------: | :---: | :---: | :---------------------------------------: |
126
+ | `werewolf`/`狼人杀` | 群员 | 是 | 群聊 | 发起游戏 (进入准备阶段) |
127
+ | `开始游戏` | 游戏发起者 | | 群聊 | _[准备阶段]_ 游戏发起者开始游戏 |
128
+ | `结束游戏` | 游戏发起者/超级用户 | | 群聊 | _[准备阶段]_ 游戏发起者/超级用户 结束游戏 |
129
+ | `当前玩家` | 群员 | | 群聊 | _[准备阶段]_ 列出参与游戏的玩家列表 |
130
+ | `加入游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家加入游戏 |
131
+ | `退出游戏` | 群员 | | 群聊 | _[准备阶段]_ 玩家退出游戏 |
132
+ | `中止游戏` | 超级用户 | 是 | 群聊 | _[游戏内]_ 超级用户强制中止游戏 |
133
+ | `狼人杀预设` | 超级用户 | 否 | 任意 | _[游戏外]_ 超级用户编辑游戏预设 |
134
+
135
+ - 发起游戏时添加 `restart`/`重开`, 可加载上一次游戏的玩家列表, 快速发起游戏。例: `werewolf restart`/`狼人杀 重开`
136
+
137
+ - `狼人杀预设` 命令用法可通过 `狼人杀预设 --help` 获取,或参考 [游戏内容](#游戏内容) 部分的介绍
131
138
 
132
- _其他交互参考游戏内提示_
139
+ - 对于 `OneBot V11` 适配器和 `Satori` 适配器的 `chronocat`, 启用配置项 `werewolf__enable_poke` 后, 可以使用戳一戳代替 _准备阶段_ 的 `加入游戏` 操作 和 游戏内的 `stop` 命令
140
+
141
+ - _其他交互参考游戏内提示_
133
142
 
134
- 对于 `OneBot V11` 适配器, 启用配置项 `werewolf__enable_poke` 后, 可以使用戳一戳代替 _准备阶段_ 的 `加入游戏` 操作 和 游戏内的 `/stop` 命令
135
143
 
136
144
  ### 游戏内容
137
145
 
@@ -145,31 +153,22 @@ _其他交互参考游戏内提示_
145
153
 
146
154
  | 总人数 | 狼人 | 神职 | 平民 |
147
155
  | ------ | ---- | ---- | ---- |
148
- | 6     | 1  | 2   | 3   |
149
- | 7     | 2  | 2   | 3   |
150
- | 8     | 2  | 3   | 3   |
151
- | 9     | 2  | 4   | 3   |
152
- | 10   | 3  | 4   | 3   |
153
- | 11   | 3  | 5   | 3   |
154
- | 12   | 4  | 5   | 3   |
156
+ | 6 | 1 | 2 | 3 |
157
+ | 7 | 2 | 2 | 3 |
158
+ | 8 | 2 | 3 | 3 |
159
+ | 9 | 2 | 4 | 3 |
160
+ | 10 | 3 | 4 | 3 |
161
+ | 11 | 3 | 5 | 3 |
162
+ | 12 | 4 | 5 | 3 |
155
163
 
156
- 职业预设可以通过配置项 `werewolf__role_preset` 修改
164
+ 职业预设可以通过命令 `狼人杀预设 职业 ...` 修改
157
165
 
158
166
  <details>
159
167
  <summary>示例</summary>
160
168
 
161
- 配置项 `werewolf__role_preset`
162
-
163
- ```env
164
- werewolf__role_preset='
165
- [
166
- [6, 1, 3, 2],
167
- [7, 2, 3, 2]
168
- ]
169
- '
170
- ```
169
+ - 命令: `狼人杀预设 职业 6 1 3 2`
171
170
 
172
- 上述配置中,`[6, 1, 3, 2]` 表示当总人数为 6 时,狼人、神职、平民的数量分别为 1、3、2
171
+ - 上述命令指定当总人数为 6 时,狼人、神职、平民的数量分别为 1、3、2
173
172
 
174
173
  </details>
175
174
  <br/>
@@ -179,45 +178,43 @@ werewolf__role_preset='
179
178
  - `狼人`: `狼人`, `狼人`, `狼王`, `狼人`
180
179
  - `神职`: `女巫`, `预言家`, `猎人`, `守卫`, `白痴`
181
180
 
182
- 职业分配优先级可以通过配置项 `werewolf__werewolf_priority` `werewolf__priesthood_proirity` 修改
181
+ 职业分配优先级可以通过命令 `狼人杀预设 狼人/神职` 修改
183
182
 
184
183
  <details>
185
184
  <summary>示例</summary>
186
185
 
187
- #### 配置项 `werewolf__werewolf_priority`
186
+ #### 命令 `狼人杀预设 狼人`
187
+
188
+ - 命令: `狼人杀预设 狼人 狼 狼王 狼 狼`
188
189
 
189
- ```env
190
- werewolf__werewolf_priority=[1, 2, 1, 1]
191
- ```
190
+ - 上述命令指定狼人的职业优先级为 `狼人`, `狼王`, `狼人`, `狼人`
192
191
 
193
- 上述配置中,`[1, 2, 1, 1]` 表示狼人的职业优先级为 `狼人`, `狼王`, `狼人`, `狼人`
192
+ #### 命令 `狼人杀预设 神职`
194
193
 
195
- #### 配置项 `werewolf__priesthood_proirity`
194
+ - 命令: `狼人杀预设 神职 预言家 女巫 猎人 守卫 白痴`
196
195
 
197
- ```env
198
- werewolf__priesthood_proirity=[11, 12, 13, 14, 15]
199
- ```
196
+ - 上述命令指定狼人的职业优先级为 `预言家`, `女巫`, `猎人`, `守卫`, `白痴`
197
+
198
+ > [!note]
199
+ >
200
+ > 以上两条命令均支持交互式输入
201
+ >
202
+ > 例:向机器人发送命令 `狼人杀预设 狼人`,在接下来的一条消息中发送 `狼人 狼王 狼人 狼人`
203
+ >
204
+ > 其效果等同于以上描述中的单条命令 `狼人杀预设 狼人 狼人 狼王 狼人 狼人`
200
205
 
201
- 上述配置中,`[11, 12, 13, 14, 15]` 表示神职的职业优先级为 `预言家`, `女巫`, `猎人`, `守卫`, `白痴`
206
+ </details>
207
+ <br/>
202
208
 
203
- #### 职业与数字的对应关系
209
+ 对于 `小丑` 职业,当预设中的平民数量大于或等于 2 时,将有 *一定概率* 将其中一个平民替换为小丑。
204
210
 
205
- 上述配置示例中有大量~~意义不明的~~数字, 其对应的是 [`这里`](./nonebot_plugin_werewolf/constant.py) 的枚举类 `Role` 的值
211
+ 小丑属于第三方阵营,胜利条件为在投票阶段被票出,在预言家查验及游戏进程判断时视作平民。
206
212
 
207
- 以下列出目前的枚举值供参考
213
+ 小丑生成概率可以通过命令 `狼人杀预设 小丑 <概率>` 设置,默认值为 0 (不生成小丑)。
208
214
 
209
- | 职业 | 枚举值 |
210
- | -------- | ------ |
211
- | `狼人` | `1` |
212
- | `狼王` | `2` |
213
- | `预言家` | `11` |
214
- | `女巫` | `12` |
215
- | `猎人` | `13` |
216
- | `守卫` | `14` |
217
- | `白痴` | `15` |
218
- | `平民` | `0` |
215
+ ### 已知问题
219
216
 
220
- </details>
217
+ - 截止 chronocat v0.2.19, 调用 [`guild.member.get`](https://github.com/chrononeko/chronocat/blob/8558ad9ff4319395d86abbfda22136939bf66780/packages/engine-chronocat-api/src/api/guild/member/get.ts) / [`user.get`](https://github.com/chrononeko/chronocat/blob/8558ad9ff4319395d86abbfda22136939bf66780/packages/engine-chronocat-api/src/api/user/get.ts) 均无法获取用户名,这将导致在交互过程中的玩家名显示为用户 ID
221
218
 
222
219
  ## 📝 更新日志
223
220
 
@@ -226,6 +223,19 @@ werewolf__priesthood_proirity=[11, 12, 13, 14, 15]
226
223
 
227
224
  <!-- CHANGELOG -->
228
225
 
226
+ - 2024.10.31 v1.1.6
227
+
228
+ - 新增超级用户中止游戏 (#7)
229
+ - 新增快速发起上次游戏 (#8)
230
+ - 准备阶段添加可选的交互按钮
231
+ - 新增超级用户修改游戏预设 (#9)
232
+
233
+ - 2024.10.23 v1.1.5
234
+
235
+ - 添加对 chronocat:poke 的支持
236
+ - 游戏内 stop 命令使用 COMMAND_START
237
+ - 使用 `anyio` 重写并发逻辑
238
+
229
239
  - 2024.10.06 v1.1.3
230
240
 
231
241
  - 使用 `RF-Tar-Railt/nonebot-plugin-uninfo` 获取用户数据
@@ -2,6 +2,7 @@ from nonebot import require
2
2
  from nonebot.plugin import PluginMetadata, inherit_supported_adapters
3
3
 
4
4
  require("nonebot_plugin_alconna")
5
+ require("nonebot_plugin_localstore")
5
6
  require("nonebot_plugin_uninfo")
6
7
  require("nonebot_plugin_waiter")
7
8
 
@@ -9,7 +10,7 @@ from . import matchers as matchers
9
10
  from . import players as players
10
11
  from .config import Config
11
12
 
12
- __version__ = "1.1.3"
13
+ __version__ = "1.1.6"
13
14
  __plugin_meta__ = PluginMetadata(
14
15
  name="狼人杀",
15
16
  description="适用于 Nonebot2 的狼人杀插件",
@@ -24,6 +25,7 @@ __plugin_meta__ = PluginMetadata(
24
25
  ),
25
26
  extra={
26
27
  "Author": "wyf7685",
28
+ "Version": __version__,
27
29
  "Bug Tracker": "https://github.com/wyf7685/nonebot-plugin-werewolf/issues",
28
30
  },
29
31
  )
@@ -0,0 +1,45 @@
1
+ import json
2
+
3
+ from nonebot import get_plugin_config, logger
4
+ from nonebot.compat import model_dump, type_validate_json
5
+ from nonebot_plugin_localstore import get_plugin_data_file
6
+ from pydantic import BaseModel, Field
7
+ from typing_extensions import Self
8
+
9
+ from .constant import (
10
+ default_priesthood_proirity,
11
+ default_role_preset,
12
+ default_werewolf_priority,
13
+ )
14
+ from .models import Role
15
+
16
+
17
+ class PresetData(BaseModel):
18
+ role_preset: dict[int, tuple[int, int, int]] = default_role_preset.copy()
19
+ werewolf_priority: list[Role] = default_werewolf_priority.copy()
20
+ priesthood_proirity: list[Role] = default_priesthood_proirity.copy()
21
+ joker_probability: float = Field(default=0.0, ge=0.0, le=1.0)
22
+
23
+ @classmethod
24
+ def load(cls) -> Self:
25
+ return type_validate_json(cls, preset_data_file.read_text())
26
+
27
+ def save(self) -> None:
28
+ preset_data_file.write_text(json.dumps(model_dump(self)))
29
+
30
+
31
+ class PluginConfig(BaseModel):
32
+ enable_poke: bool = True
33
+ enable_button: bool = False
34
+
35
+
36
+ class Config(BaseModel):
37
+ werewolf: PluginConfig = PluginConfig()
38
+
39
+
40
+ preset_data_file = get_plugin_data_file("preset.json")
41
+ if not preset_data_file.exists():
42
+ PresetData().save()
43
+
44
+ config = get_plugin_config(Config).werewolf
45
+ logger.debug(f"加载插件配置: {config}")
@@ -0,0 +1,74 @@
1
+ import nonebot
2
+
3
+ from .models import GameStatus, KillReason, Role, RoleGroup
4
+
5
+ COMMAND_START = next(
6
+ iter(sorted(nonebot.get_driver().config.command_start, key=len)), ""
7
+ )
8
+ STOP_COMMAND_PROMPT = f"{COMMAND_START}stop"
9
+ STOP_COMMAND = "{{stop}}"
10
+
11
+
12
+ role_name_conv: dict[Role | RoleGroup, str] = {
13
+ Role.Werewolf: "狼人",
14
+ Role.WolfKing: "狼王",
15
+ Role.Prophet: "预言家",
16
+ Role.Witch: "女巫",
17
+ Role.Hunter: "猎人",
18
+ Role.Guard: "守卫",
19
+ Role.Idiot: "白痴",
20
+ Role.Joker: "小丑",
21
+ Role.Civilian: "平民",
22
+ RoleGroup.Werewolf: "狼人",
23
+ RoleGroup.GoodGuy: "好人",
24
+ RoleGroup.Others: "其他",
25
+ }
26
+
27
+ role_emoji: dict[Role, str] = {
28
+ Role.Werewolf: "🐺",
29
+ Role.WolfKing: "🐺👑",
30
+ Role.Prophet: "🔮",
31
+ Role.Witch: "🧙‍♀️",
32
+ Role.Hunter: "🕵️",
33
+ Role.Guard: "🛡️",
34
+ Role.Idiot: "👨🏻‍🦲",
35
+ Role.Joker: "🤡",
36
+ Role.Civilian: "👨🏻‍🌾",
37
+ }
38
+
39
+ game_status_conv: dict[GameStatus, str] = {
40
+ GameStatus.GoodGuy: "好人",
41
+ GameStatus.Werewolf: "狼人",
42
+ GameStatus.Joker: "小丑",
43
+ }
44
+
45
+ report_text: dict[KillReason, tuple[str, str]] = {
46
+ KillReason.Werewolf: ("🔪", "刀了"),
47
+ KillReason.Poison: ("🧪", "毒死"),
48
+ KillReason.Shoot: ("🔫", "射杀"),
49
+ KillReason.Vote: ("🗳️", "票出"),
50
+ }
51
+
52
+ default_role_preset: dict[int, tuple[int, int, int]] = {
53
+ # 总人数: (狼, 神, 民)
54
+ 6: (1, 2, 3),
55
+ 7: (2, 2, 3),
56
+ 8: (2, 3, 3),
57
+ 9: (2, 4, 3),
58
+ 10: (3, 4, 3),
59
+ 11: (3, 5, 3),
60
+ 12: (4, 5, 3),
61
+ }
62
+ default_werewolf_priority: list[Role] = [
63
+ Role.Werewolf,
64
+ Role.Werewolf,
65
+ Role.WolfKing,
66
+ Role.Werewolf,
67
+ ]
68
+ default_priesthood_proirity: list[Role] = [
69
+ Role.Witch,
70
+ Role.Prophet,
71
+ Role.Hunter,
72
+ Role.Guard,
73
+ Role.Idiot,
74
+ ]
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  if TYPE_CHECKING:
6
- from .constant import GameStatus
6
+ from .models import GameStatus
7
7
 
8
8
 
9
9
  class Error(Exception):