nonebot-plugin-werewolf 1.1.8__py3-none-any.whl → 1.1.9__py3-none-any.whl

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 (29) hide show
  1. nonebot_plugin_werewolf/__init__.py +1 -1
  2. nonebot_plugin_werewolf/config.py +1 -0
  3. nonebot_plugin_werewolf/constant.py +6 -1
  4. nonebot_plugin_werewolf/game.py +61 -50
  5. nonebot_plugin_werewolf/matchers/edit_behavior.py +14 -2
  6. nonebot_plugin_werewolf/matchers/poke/chronocat_poke.py +2 -2
  7. nonebot_plugin_werewolf/matchers/poke/ob11_poke.py +2 -2
  8. nonebot_plugin_werewolf/matchers/start_game.py +31 -30
  9. nonebot_plugin_werewolf/models.py +15 -3
  10. nonebot_plugin_werewolf/{players/player.py → player.py} +148 -70
  11. nonebot_plugin_werewolf/player_set.py +39 -23
  12. nonebot_plugin_werewolf/players/__init__.py +0 -1
  13. nonebot_plugin_werewolf/players/civilian.py +3 -3
  14. nonebot_plugin_werewolf/players/guard.py +20 -15
  15. nonebot_plugin_werewolf/players/hunter.py +6 -5
  16. nonebot_plugin_werewolf/players/idiot.py +25 -17
  17. nonebot_plugin_werewolf/players/jester.py +22 -17
  18. nonebot_plugin_werewolf/players/prophet.py +13 -8
  19. nonebot_plugin_werewolf/players/{can_shoot.py → shooter.py} +10 -10
  20. nonebot_plugin_werewolf/players/werewolf.py +69 -45
  21. nonebot_plugin_werewolf/players/witch.py +30 -23
  22. nonebot_plugin_werewolf/players/wolfking.py +14 -8
  23. nonebot_plugin_werewolf/utils.py +6 -6
  24. {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.9.dist-info}/METADATA +9 -2
  25. nonebot_plugin_werewolf-1.1.9.dist-info/RECORD +35 -0
  26. {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.9.dist-info}/WHEEL +1 -1
  27. nonebot_plugin_werewolf-1.1.8.dist-info/RECORD +0 -35
  28. {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.9.dist-info/licenses}/LICENSE +0 -0
  29. {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.9.dist-info}/top_level.txt +0 -0
@@ -2,15 +2,14 @@ from typing_extensions import override
2
2
 
3
3
  from ..constant import stop_command_prompt
4
4
  from ..models import Role, RoleGroup
5
- from .player import Player
5
+ from ..player import InteractProvider, Player
6
6
 
7
7
 
8
- @Player.register_role(Role.PROPHET, RoleGroup.GOODGUY)
9
- class Prophet(Player):
8
+ class ProphetInteractProvider(InteractProvider["Prophet"]):
10
9
  @override
11
- async def _interact(self) -> None:
12
- players = self.game.players.alive().exclude(self)
13
- await self.send(
10
+ async def interact(self) -> None:
11
+ players = self.game.players.alive().exclude(self.p)
12
+ await self.p.send(
14
13
  "💫请选择需要查验身份的玩家:\n"
15
14
  f"{players.show()}\n\n"
16
15
  "🔮发送编号选择玩家\n"
@@ -19,6 +18,12 @@ class Prophet(Player):
19
18
  select_players=players,
20
19
  )
21
20
 
22
- if selected := await self._select_player(players, stop_btn_label="结束回合"):
21
+ if selected := await self.p.select_player(players, stop_btn_label="结束回合"):
23
22
  result = "狼人" if selected.role_group == RoleGroup.WEREWOLF else "好人"
24
- await self.send(f"✏️玩家 {selected.name} 的阵营是『{result}』")
23
+ await self.p.send(f"✏️玩家 {selected.name} 的阵营是『{result}』")
24
+
25
+
26
+ class Prophet(Player):
27
+ role = Role.PROPHET
28
+ role_group = RoleGroup.GOODGUY
29
+ interact_provider = ProphetInteractProvider
@@ -4,14 +4,14 @@ from nonebot_plugin_alconna.uniseg import UniMessage
4
4
 
5
5
  from ..constant import stop_command_prompt
6
6
  from ..models import KillReason
7
- from .player import Player
7
+ from ..player import KillProvider, Player
8
8
 
9
9
 
10
- class CanShoot(Player):
10
+ class ShooterKillProvider(KillProvider["Player"]):
11
11
  @override
12
12
  async def post_kill(self) -> None:
13
13
  if self.kill_info and self.kill_info.reason == KillReason.POISON:
14
- await self.send("⚠️你昨晚被女巫毒杀,无法使用技能")
14
+ await self.p.send("⚠️你昨晚被女巫毒杀,无法使用技能")
15
15
  return await super().post_kill()
16
16
 
17
17
  await self.game.send(
@@ -20,13 +20,13 @@ class CanShoot(Player):
20
20
  .text(" 死了\n请在私聊决定射杀目标...")
21
21
  )
22
22
 
23
- self.game.state.shoot = None
23
+ self.game.state.shooter = None
24
24
  shoot = await self.shoot()
25
25
  msg = UniMessage.text("玩家 ").at(self.user_id).text(" ")
26
26
  if shoot is not None:
27
- self.game.state.shoot = self
27
+ self.game.state.shooter = self.p
28
28
  await self.game.send("🔫" + msg.text("射杀了玩家 ").at(shoot.user_id))
29
- await shoot.kill(KillReason.SHOOT, self)
29
+ await shoot.kill(KillReason.SHOOT, self.p)
30
30
  self.selected = shoot
31
31
  else:
32
32
  await self.game.send("ℹ️" + msg.text("选择了取消技能"))
@@ -34,8 +34,8 @@ class CanShoot(Player):
34
34
  return await super().post_kill()
35
35
 
36
36
  async def shoot(self) -> Player | None:
37
- players = self.game.players.alive().exclude(self)
38
- await self.send(
37
+ players = self.game.players.alive().exclude(self.p)
38
+ await self.p.send(
39
39
  "💫请选择需要射杀的玩家:\n"
40
40
  f"{players.show()}\n\n"
41
41
  "🔫发送编号选择玩家\n"
@@ -44,11 +44,11 @@ class CanShoot(Player):
44
44
  select_players=players,
45
45
  )
46
46
 
47
- if selected := await self._select_player(
47
+ if selected := await self.p.select_player(
48
48
  players,
49
49
  on_stop="ℹ️已取消技能,回合结束",
50
50
  stop_btn_label="取消技能",
51
51
  ):
52
- await self.send(f"🎯选择射杀的玩家: {selected.name}")
52
+ await self.p.send(f"🎯选择射杀的玩家: {selected.name}")
53
53
 
54
54
  return selected
@@ -3,72 +3,56 @@ from typing import TYPE_CHECKING
3
3
  from typing_extensions import override
4
4
 
5
5
  import anyio
6
- import nonebot
7
6
  from nonebot_plugin_alconna.uniseg import UniMessage
8
7
 
9
- from ..config import GameBehavior
10
8
  from ..constant import STOP_COMMAND, stop_command_prompt
11
9
  from ..models import Role, RoleGroup
12
- from ..utils import ObjectStream, check_index
13
- from .player import Player
10
+ from ..player import InteractProvider, NotifyProvider, Player
11
+ from ..utils import ObjectStream, as_player_set, check_index
14
12
 
15
13
  if TYPE_CHECKING:
16
14
  from ..player_set import PlayerSet
17
15
 
18
- logger = nonebot.logger.opt(colors=True)
19
16
 
20
-
21
- @Player.register_role(Role.WEREWOLF, RoleGroup.WEREWOLF)
22
- class Werewolf(Player):
17
+ class WerewolfInteractProvider(InteractProvider["Werewolf"]):
23
18
  stream: ObjectStream[str | UniMessage]
24
19
 
25
- @property
26
- @override
27
- def interact_timeout(self) -> float:
28
- return GameBehavior.get().timeout.werewolf
29
-
30
20
  @override
31
- async def notify_role(self) -> None:
32
- await super().notify_role()
33
- partners = self.game.players.alive().select(RoleGroup.WEREWOLF).exclude(self)
34
- if partners:
35
- await self.send(
36
- "🐺你的队友:\n"
37
- + "\n".join(f" {p.role_name}: {p.name}" for p in partners)
38
- )
21
+ async def before(self) -> None:
22
+ self.game.state.werewolf_start()
39
23
 
40
- async def _handle_interact(self, players: "PlayerSet") -> None:
24
+ async def handle_interact(self, players: "PlayerSet") -> None:
41
25
  self.selected = None
42
26
 
43
27
  while True:
44
- input_msg = await self.receive()
28
+ input_msg = await self.p.receive()
45
29
  text = input_msg.extract_plain_text()
46
30
  index = check_index(text, len(players))
47
31
  if index is not None:
48
32
  self.selected = players[index - 1]
49
33
  msg = f"当前选择玩家: {self.selected.name}"
50
- await self.send(
34
+ await self.p.send(
51
35
  f"🎯{msg}\n发送 “{stop_command_prompt()}” 结束回合",
52
36
  stop_btn_label="结束回合",
53
37
  select_players=players,
54
38
  )
55
- await self.stream.send(f"📝队友 {self.name} {msg}")
39
+ await self.stream.send(f"📝队友 {self.p.name} {msg}")
56
40
  if text == STOP_COMMAND:
57
41
  if self.selected is not None:
58
- await self.send("✅你已结束当前回合")
59
- await self.stream.send(f"📝队友 {self.name} 结束当前回合")
42
+ await self.p.send("✅你已结束当前回合")
43
+ await self.stream.send(f"📝队友 {self.p.name} 结束当前回合")
60
44
  self.stream.close()
61
45
  return
62
- await self.send(
46
+ await self.p.send(
63
47
  "⚠️当前未选择玩家,无法结束回合",
64
48
  select_players=players,
65
49
  )
66
50
  else:
67
51
  await self.stream.send(
68
- UniMessage.text(f"💬队友 {self.name}:\n") + input_msg
52
+ UniMessage.text(f"💬队友 {self.p.name}:\n") + input_msg
69
53
  )
70
54
 
71
- async def _handle_broadcast(self, partners: "PlayerSet") -> None:
55
+ async def handle_broadcast(self, partners: "PlayerSet") -> None:
72
56
  while not self.stream.closed:
73
57
  try:
74
58
  message = await self.stream.recv()
@@ -78,9 +62,9 @@ class Werewolf(Player):
78
62
  await partners.broadcast(message)
79
63
 
80
64
  @override
81
- async def _interact(self) -> None:
65
+ async def interact(self) -> None:
82
66
  players = self.game.players.alive()
83
- partners = players.select(RoleGroup.WEREWOLF).exclude(self)
67
+ partners = players.select(RoleGroup.WEREWOLF).exclude(self.p)
84
68
 
85
69
  msg = UniMessage()
86
70
  if partners:
@@ -89,7 +73,7 @@ class Werewolf(Player):
89
73
  .text("\n".join(f" {p.role_name}: {p.name}" for p in partners))
90
74
  .text("\n所有私聊消息将被转发至队友\n\n")
91
75
  )
92
- await self.send(
76
+ await self.p.send(
93
77
  msg.text("💫请选择今晚的目标:\n")
94
78
  .text(players.show())
95
79
  .text("\n\n🔪发送编号选择玩家")
@@ -102,22 +86,62 @@ class Werewolf(Player):
102
86
 
103
87
  try:
104
88
  async with anyio.create_task_group() as tg:
105
- tg.start_soon(self._handle_interact, players)
106
- tg.start_soon(self._handle_broadcast, partners)
89
+ tg.start_soon(self.handle_interact, players)
90
+ tg.start_soon(self.handle_broadcast, partners)
107
91
  finally:
108
92
  del self.stream
109
93
 
94
+ async def finalize(self) -> None:
95
+ w = self.game.players.alive().select(RoleGroup.WEREWOLF)
96
+ match w.player_selected().shuffled:
97
+ case []:
98
+ await w.broadcast("⚠️狼人未选择目标,此晚空刀")
99
+ case [killed]:
100
+ self.game.state.killed = killed
101
+ await w.broadcast(f"🔪今晚选择的目标为: {killed.name}")
102
+ case [killed, *_] if self.game.behavior.werewolf_multi_select:
103
+ self.game.state.killed = killed
104
+ await w.broadcast(
105
+ "⚠️狼人阵营意见未统一,随机选择目标\n\n"
106
+ f"🔪今晚选择的目标为: {killed.name}"
107
+ )
108
+ case players:
109
+ await w.broadcast(
110
+ f"⚠️狼人阵营意见未统一,此晚空刀\n\n"
111
+ f"📝选择的玩家:\n{as_player_set(*players).show()}"
112
+ )
113
+
110
114
  @override
111
- async def _after_interact(self) -> None:
112
- state = self.game.state
113
- if not state.werewolf_finished.is_set():
114
- state.werewolf_finished.set()
115
- w = self.game.players.alive().select(RoleGroup.WEREWOLF)
116
- if (s := w.player_selected()).size == 1:
117
- state.killed = s.pop()
118
- await w.broadcast(f"🔪今晚选择的目标为: {state.killed.name}")
119
- else:
120
- await w.broadcast("⚠️狼人阵营意见未统一,此晚空刀")
115
+ async def after(self) -> None:
116
+ if self.game.state.werewolf_end():
117
+ await self.finalize()
121
118
 
122
119
  if not self.game.players.alive().select(Role.WITCH):
123
120
  await anyio.sleep(5 + secrets.randbelow(15))
121
+
122
+
123
+ class WerewolfNotifyProvider(NotifyProvider["Werewolf"]):
124
+ @override
125
+ def message(self, message: UniMessage) -> UniMessage:
126
+ if (
127
+ partners := self.game.players.alive()
128
+ .select(RoleGroup.WEREWOLF)
129
+ .exclude(self.p)
130
+ ):
131
+ message = message.text(
132
+ "\n🐺你的队友:\n\n"
133
+ + "".join(f" {p.role_name}: {p.name}\n" for p in partners)
134
+ )
135
+ return message
136
+
137
+
138
+ class Werewolf(Player):
139
+ role = Role.WEREWOLF
140
+ role_group = RoleGroup.WEREWOLF
141
+ interact_provider = WerewolfInteractProvider
142
+ notify_provider = WerewolfNotifyProvider
143
+
144
+ @property
145
+ @override
146
+ def interact_timeout(self) -> float:
147
+ return self.game.behavior.timeout.werewolf
@@ -1,40 +1,41 @@
1
1
  from typing_extensions import override
2
2
 
3
- import nonebot
4
3
  from nonebot_plugin_alconna.uniseg import UniMessage
5
4
 
6
5
  from ..constant import stop_command_prompt
7
6
  from ..models import Role, RoleGroup
7
+ from ..player import InteractProvider, Player
8
8
  from ..utils import as_player_set
9
- from .player import Player
10
9
 
11
- logger = nonebot.logger.opt(colors=True)
12
10
 
11
+ class WitchInteractProvider(InteractProvider["Witch"]):
12
+ antidote = InteractProvider.proxy(bool)
13
+ poison = InteractProvider.proxy(bool)
13
14
 
14
- @Player.register_role(Role.WITCH, RoleGroup.GOODGUY)
15
- class Witch(Player):
16
- antidote: bool = True
17
- poison: bool = True
15
+ @override
16
+ async def before(self) -> None:
17
+ await self.p.send("ℹ️请等待狼人决定目标...")
18
+ await self.game.state.werewolf_finished.wait()
18
19
 
19
20
  async def handle_killed(self) -> bool:
20
21
  if (killed := self.game.state.killed) is None:
21
- await self.send("ℹ️今晚没有人被刀")
22
+ await self.p.send("ℹ️今晚没有人被刀")
22
23
  return False
23
24
 
24
25
  msg = UniMessage.text(f"🔪今晚 {killed.name} 被刀了\n\n")
25
26
 
26
27
  if not self.antidote:
27
- await self.send(msg.text("⚙️你已经用过解药了"))
28
+ await self.p.send(msg.text("⚙️你已经用过解药了"))
28
29
  return False
29
30
 
30
31
  msg.text(f"✏️使用解药请发送 “1”\n❌不使用解药请发送 “{stop_command_prompt()}”")
31
- await self.send(
32
+ await self.p.send(
32
33
  msg,
33
34
  stop_btn_label="不使用解药",
34
35
  select_players=as_player_set(killed),
35
36
  )
36
37
 
37
- if not await self._select_player(
38
+ if not await self.p.select_player(
38
39
  as_player_set(killed),
39
40
  on_stop=f"ℹ️你选择不对 {killed.name} 使用解药",
40
41
  on_index_error=f"⚠️输入错误: 请输入 “1” 或 “{stop_command_prompt()}”",
@@ -45,25 +46,20 @@ class Witch(Player):
45
46
  self.antidote = False
46
47
  self.selected = killed
47
48
  self.game.state.antidote.add(killed)
48
- await self.send(f"✅你对 {killed.name} 使用了解药,回合结束")
49
+ await self.p.send(f"✅你对 {killed.name} 使用了解药,回合结束")
49
50
  return True
50
51
 
51
52
  @override
52
- async def _before_interact(self) -> None:
53
- await self.send("ℹ️请等待狼人决定目标...")
54
- await self.game.state.werewolf_finished.wait()
55
-
56
- @override
57
- async def _interact(self) -> None:
53
+ async def interact(self) -> None:
58
54
  if await self.handle_killed():
59
55
  return
60
56
 
61
57
  if not self.poison:
62
- await self.send("⚙️你没有可以使用的药水,回合结束")
58
+ await self.p.send("⚙️你没有可以使用的药水,回合结束")
63
59
  return
64
60
 
65
61
  players = self.game.players.alive()
66
- await self.send(
62
+ await self.p.send(
67
63
  "💫你有一瓶毒药\n"
68
64
  "玩家列表:\n"
69
65
  f"{players.show()}\n\n"
@@ -73,12 +69,23 @@ class Witch(Player):
73
69
  select_players=players,
74
70
  )
75
71
 
76
- if selected := await self._select_player(
72
+ if selected := await self.p.select_player(
77
73
  players,
78
74
  on_stop="ℹ️你选择不使用毒药,回合结束",
79
75
  stop_btn_label="结束回合",
80
76
  ):
81
77
  self.poison = False
82
78
  self.selected = selected
83
- self.game.state.poison.add(self)
84
- await self.send(f"✅当前回合选择对玩家 {selected.name} 使用毒药\n回合结束")
79
+ self.game.state.poison.add(self.p)
80
+ await self.p.send(
81
+ f"✅当前回合选择对玩家 {selected.name} 使用毒药\n回合结束"
82
+ )
83
+
84
+
85
+ class Witch(Player):
86
+ role = Role.WITCH
87
+ role_group = RoleGroup.GOODGUY
88
+ interact_provider = WitchInteractProvider
89
+
90
+ antidote: bool = True
91
+ poison: bool = True
@@ -1,14 +1,20 @@
1
1
  from typing_extensions import override
2
2
 
3
+ from nonebot_plugin_alconna import UniMessage
4
+
3
5
  from ..models import Role, RoleGroup
4
- from .can_shoot import CanShoot
5
- from .player import Player
6
- from .werewolf import Werewolf
6
+ from .shooter import ShooterKillProvider
7
+ from .werewolf import Werewolf, WerewolfNotifyProvider
7
8
 
8
9
 
9
- @Player.register_role(Role.WOLFKING, RoleGroup.WEREWOLF)
10
- class WolfKing(CanShoot, Werewolf):
10
+ class WolfKingNotifyProvider(WerewolfNotifyProvider):
11
11
  @override
12
- async def notify_role(self) -> None:
13
- await super().notify_role()
14
- await self.send("⚙️作为狼王,你可以在死后射杀一名玩家")
12
+ def message(self, message: UniMessage) -> UniMessage:
13
+ return super().message(message).text("⚙️作为狼王,你可以在死后射杀一名玩家")
14
+
15
+
16
+ class WolfKing(Werewolf):
17
+ role = Role.WOLFKING
18
+ role_group = RoleGroup.WEREWOLF
19
+ kill_provider = ShooterKillProvider
20
+ notify_provider = WolfKingNotifyProvider
@@ -2,6 +2,7 @@ import abc
2
2
  import functools
3
3
  import itertools
4
4
  from collections import defaultdict
5
+ from collections.abc import Iterable
5
6
  from typing import TYPE_CHECKING, Any, ClassVar, Generic, ParamSpec, TypeVar
6
7
 
7
8
  import anyio
@@ -22,8 +23,8 @@ from .config import config
22
23
  from .constant import STOP_COMMAND, stop_command_prompt
23
24
 
24
25
  if TYPE_CHECKING:
26
+ from .player import Player
25
27
  from .player_set import PlayerSet
26
- from .players import Player
27
28
 
28
29
  T = TypeVar("T")
29
30
  P = ParamSpec("P")
@@ -97,7 +98,7 @@ class InputStore:
97
98
  task.set(msg)
98
99
 
99
100
  @classmethod
100
- def cleanup(cls, players: list[str], group_id: str) -> None:
101
+ def cleanup(cls, players: Iterable[str], group_id: str) -> None:
101
102
  for p, g in itertools.product(players, (group_id, None)):
102
103
  key = cls._key(p, g)
103
104
  if key in cls.locks:
@@ -181,10 +182,9 @@ def add_players_button(msg: str | UniMessage, players: "PlayerSet") -> UniMessag
181
182
  if isinstance(msg, str):
182
183
  msg = UniMessage.text(msg)
183
184
 
184
- pls = list(enumerate(players, 1))
185
- while pls:
186
- msg = msg.keyboard(*(_btn(p.name, str(i)) for i, p in pls[:3]))
187
- pls = pls[3:]
185
+ it = enumerate(players, 1)
186
+ while line := tuple(itertools.islice(it, 3)):
187
+ msg.keyboard(*(_btn(p.name, str(i)) for i, p in line))
188
188
  return msg
189
189
 
190
190
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: nonebot-plugin-werewolf
3
- Version: 1.1.8
3
+ Version: 1.1.9
4
4
  Summary: 适用于 Nonebot2 的狼人杀插件
5
5
  Author-email: wyf7685 <wyf7685@163.com>
6
6
  License: MIT
@@ -16,6 +16,7 @@ Requires-Dist: nonebot-plugin-localstore>=0.7.1
16
16
  Requires-Dist: nonebot-plugin-uninfo>=0.4.0
17
17
  Requires-Dist: nonebot-plugin-waiter>=0.7.1
18
18
  Requires-Dist: anyio>=4.6.0
19
+ Dynamic: license-file
19
20
 
20
21
  <div align="center">
21
22
  <a href="https://v2.nonebot.dev/store">
@@ -239,6 +240,12 @@ _✨ 简单的狼人杀插件 ✨_
239
240
 
240
241
  <!-- CHANGELOG -->
241
242
 
243
+ - 2025.04.15 v1.1.9
244
+
245
+ - 添加游戏行为配置 `werewolf_multi_select`
246
+ - 重构玩家类
247
+ - 添加轮流发言模式缺失的 at 消息段
248
+
242
249
  - 2025.02.13 v1.1.8
243
250
 
244
251
  - 优化交互按钮
@@ -0,0 +1,35 @@
1
+ nonebot_plugin_werewolf/__init__.py,sha256=lDOYm3Z6UA_fFXiKT9cGweOiND3X-Y3RAiKB5iqpTVc,931
2
+ nonebot_plugin_werewolf/config.py,sha256=Dlng9cRvTf8dEPFngOobeV3S-TnrVrjs9Eqje8dH1wQ,3160
3
+ nonebot_plugin_werewolf/constant.py,sha256=NVKMx4CI64hgftJJySa6VnK2K8ZBmGtrAyMxel3HS2o,2053
4
+ nonebot_plugin_werewolf/exception.py,sha256=SP9RdzsREB6PtpRfhZjxqybtvO0aw48hpN9QMU9jDZY,366
5
+ nonebot_plugin_werewolf/game.py,sha256=UL68ftCEgV9h34Xgw1sZPAUbyjIhFhGAdc70w8huWuQ,19438
6
+ nonebot_plugin_werewolf/models.py,sha256=PiQ-5_R-cUlHKWDa5G0bFnz7jv20200_kr449G9Jgjg,2300
7
+ nonebot_plugin_werewolf/player.py,sha256=EzV_In8KmlZAx0GGV-Cj9qIJjIefIf7CXzlchCTJvFo,11259
8
+ nonebot_plugin_werewolf/player_set.py,sha256=RF3aQXLZyUBPa0_G-Q48NUARictMRp6IV2WD-BKtNTQ,2913
9
+ nonebot_plugin_werewolf/utils.py,sha256=bwbBLApPWis15_perT89Mmy33gAdaHR8fKJWVnDGh9E,6803
10
+ nonebot_plugin_werewolf/matchers/__init__.py,sha256=lQ9AZDEWgtbP-W8KWvjkEYc_UfTHSUwjaGdZ7PT3z0E,219
11
+ nonebot_plugin_werewolf/matchers/depends.py,sha256=TITA2brcyHSavFA3K_HgqkoQtkwxdM8miyEKafcfZz4,1343
12
+ nonebot_plugin_werewolf/matchers/edit_behavior.py,sha256=DaxMS9wcSyYpdhnHHXb0GqRgRNm6LNr5W1vbk-B63n4,7014
13
+ nonebot_plugin_werewolf/matchers/edit_preset.py,sha256=PXABbjhQM0DiKfEqjOMKtSrJs2fKoVh91iTJlVD3hKA,8089
14
+ nonebot_plugin_werewolf/matchers/message_in_game.py,sha256=Lm9VqZcnAU023SJ6R8LH-3-tSp8KRtmOJ4x4dTZGb1o,969
15
+ nonebot_plugin_werewolf/matchers/start_game.py,sha256=cFa9KzZ3zEri5Ras1ccFyZQWK8HPcs6KRNZr2ArsdsA,11956
16
+ nonebot_plugin_werewolf/matchers/superuser_ops.py,sha256=oz-znCaraxCJS08Ox1xcbhC0X-Uy-WXeNYTH1LgT2zU,700
17
+ nonebot_plugin_werewolf/matchers/poke/__init__.py,sha256=gYysvGjztN3iDQpX6v5nkPT195FXnk7fqP9kzByTES0,220
18
+ nonebot_plugin_werewolf/matchers/poke/chronocat_poke.py,sha256=kYJfhOGbZkYWmti0S7b82yYxcoEO9baMHORCXA19cpY,4013
19
+ nonebot_plugin_werewolf/matchers/poke/ob11_poke.py,sha256=XYkEYoYqaViLp5pzRBZqyjBqanJp-sZL4595-fhfrys,2587
20
+ nonebot_plugin_werewolf/players/__init__.py,sha256=lDHCYkk6h_1Bl9DKIqF6vPAcLXNhCGlxBFQzPH4NvUQ,345
21
+ nonebot_plugin_werewolf/players/civilian.py,sha256=Y6A5yB74Ckn_U0vAOoRJhpwhm3MyG6m47TalQ2mjhtw,151
22
+ nonebot_plugin_werewolf/players/guard.py,sha256=2HE3MRG92Ujc4JUHEB86EwNB-l7PgdpNUFxCU8cDBKQ,1354
23
+ nonebot_plugin_werewolf/players/hunter.py,sha256=iYeM2srPaoncBrft2LRuyNVUeGyeBF-rs0BAHl7RP7s,228
24
+ nonebot_plugin_werewolf/players/idiot.py,sha256=OfbLuSLhXNJueB9IYheNT7OpenqaFQjKaAKBlOH3hE0,1659
25
+ nonebot_plugin_werewolf/players/jester.py,sha256=aErVfQS30hS0t2KiQSNFfTHmC2_hqtaHdQvQ4U1Ts_Y,1016
26
+ nonebot_plugin_werewolf/players/prophet.py,sha256=OlMYIdSlZppbHVpfpeO60nFwdh1YtxMVCWEuapFZSyA,1084
27
+ nonebot_plugin_werewolf/players/shooter.py,sha256=1bWkqcSFX6Crynh3IrlI-2RGrNiP6d4XJAc8_FAF2JU,1946
28
+ nonebot_plugin_werewolf/players/werewolf.py,sha256=7lAJT7FjEt42J04RNAXkfDDIN-1mQOej0NaIo0dEWMQ,5347
29
+ nonebot_plugin_werewolf/players/witch.py,sha256=flugzsDkpYiMW-BQGvvqwcXHX_UGcsryAnyYKmh07l4,3049
30
+ nonebot_plugin_werewolf/players/wolfking.py,sha256=CMZ5Tq74wupcRPjAzXHEF2Gts4z3thsD57q64uGp_-c,628
31
+ nonebot_plugin_werewolf-1.1.9.dist-info/licenses/LICENSE,sha256=B_WbEqjGr6GYVNfEJPY31T1Opik7OtgOkhRs4Ig3e2M,1064
32
+ nonebot_plugin_werewolf-1.1.9.dist-info/METADATA,sha256=ZL27XQ01QhEddypOZDVFVr5cRfB9WO5MUE19o7GA-jQ,11912
33
+ nonebot_plugin_werewolf-1.1.9.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
34
+ nonebot_plugin_werewolf-1.1.9.dist-info/top_level.txt,sha256=wLTfg8sTKbH9lLT9LtU118C9cTspEBJareLsrYM52YA,24
35
+ nonebot_plugin_werewolf-1.1.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,35 +0,0 @@
1
- nonebot_plugin_werewolf/__init__.py,sha256=LbJAHz_mAXZlSUmxAAF6dmfaiSfKnV5VRBZU0Ln2tDo,931
2
- nonebot_plugin_werewolf/config.py,sha256=yFngZVp4yoc2v5uJ_Invwu2K6a90gjBiSDnMDLtltzQ,3120
3
- nonebot_plugin_werewolf/constant.py,sha256=VU0fVdO_adbbRWaeynxoD1RQ_9GUuzUz-iuoIs8SQSE,1932
4
- nonebot_plugin_werewolf/exception.py,sha256=SP9RdzsREB6PtpRfhZjxqybtvO0aw48hpN9QMU9jDZY,366
5
- nonebot_plugin_werewolf/game.py,sha256=fak8DuWUKhPuuW3plT0Qv0D0yawAq8CTb6cBC8r1Fp0,19229
6
- nonebot_plugin_werewolf/models.py,sha256=nE8QY2tag_Jrj6oXBVa6pM4BzxDEIquuuQo5yP-ev78,1865
7
- nonebot_plugin_werewolf/player_set.py,sha256=zhri5GdE8YpQn7aK21dYifMwSFVQ2rGE-5o9EQ51THE,2604
8
- nonebot_plugin_werewolf/utils.py,sha256=ZuXN1nyI7RtxrvSmnaNmNe62BoO9cXB0aaIPiM8YiL8,6766
9
- nonebot_plugin_werewolf/matchers/__init__.py,sha256=lQ9AZDEWgtbP-W8KWvjkEYc_UfTHSUwjaGdZ7PT3z0E,219
10
- nonebot_plugin_werewolf/matchers/depends.py,sha256=TITA2brcyHSavFA3K_HgqkoQtkwxdM8miyEKafcfZz4,1343
11
- nonebot_plugin_werewolf/matchers/edit_behavior.py,sha256=9y5_JSlDgPadzRC7zRS050_L4jUvHy5dJb18_VXPVtI,6521
12
- nonebot_plugin_werewolf/matchers/edit_preset.py,sha256=PXABbjhQM0DiKfEqjOMKtSrJs2fKoVh91iTJlVD3hKA,8089
13
- nonebot_plugin_werewolf/matchers/message_in_game.py,sha256=Lm9VqZcnAU023SJ6R8LH-3-tSp8KRtmOJ4x4dTZGb1o,969
14
- nonebot_plugin_werewolf/matchers/start_game.py,sha256=C8wCpvAETNP1K3lrW6KVc23PaeiXJ_zgkJ_mk7ejamA,11951
15
- nonebot_plugin_werewolf/matchers/superuser_ops.py,sha256=oz-znCaraxCJS08Ox1xcbhC0X-Uy-WXeNYTH1LgT2zU,700
16
- nonebot_plugin_werewolf/matchers/poke/__init__.py,sha256=gYysvGjztN3iDQpX6v5nkPT195FXnk7fqP9kzByTES0,220
17
- nonebot_plugin_werewolf/matchers/poke/chronocat_poke.py,sha256=EjkJflxPLu9_rm-4vQqud9FVqDoQN68WcDJD_Ok2yH8,4082
18
- nonebot_plugin_werewolf/matchers/poke/ob11_poke.py,sha256=8jmguMaVb80Rp4Z0KmVoQrTgLW_0UB75P2xlsAhSAgQ,2656
19
- nonebot_plugin_werewolf/players/__init__.py,sha256=HvxLDkRS6mcT_IxCqEVdvFL8qh-EjBYNONpgCbM2RSw,382
20
- nonebot_plugin_werewolf/players/can_shoot.py,sha256=XWjnf2_u29ciozu7ln9CH1eX9uoc9ZbxIL3WVPsgCYE,1887
21
- nonebot_plugin_werewolf/players/civilian.py,sha256=QaDZFwgBp52VOnm5TqL0f_4JrtnS4ryHT5g2cisfjD8,155
22
- nonebot_plugin_werewolf/players/guard.py,sha256=OKafOQ7VW0si45QJsWmdfYyK1QkTNLIVNj0bMy4v8AE,1223
23
- nonebot_plugin_werewolf/players/hunter.py,sha256=E2CY7nP8UfbGh8Aj-LvuUX987YP513RM8hlZ4q-dy0g,193
24
- nonebot_plugin_werewolf/players/idiot.py,sha256=mj76o5DdCX7gPkHkxAe6OB4l-LrbjvPgP-uGASMhArQ,1431
25
- nonebot_plugin_werewolf/players/jester.py,sha256=XA_d9mCkVhdsbkrm4KEhb0hMyGFdlPEnpbTH_8Z0QGQ,828
26
- nonebot_plugin_werewolf/players/player.py,sha256=zo1Q7RTFvFiH7eLj0060ebXn5l8OAMIUGzriuc8O_4c,8819
27
- nonebot_plugin_werewolf/players/prophet.py,sha256=SbzsiaK-ty7bNwvysI5DLCNDwbZg5KyDTj37eOv7kYQ,945
28
- nonebot_plugin_werewolf/players/werewolf.py,sha256=XSeXXgtzEXMo9iSAErWhLKlM02kmUHfL4-Q0iBwy6MM,4457
29
- nonebot_plugin_werewolf/players/witch.py,sha256=gLFYN-IF1chlXs-BZiQ1g99A3o_qjg4YvftLlBx65Nw,2853
30
- nonebot_plugin_werewolf/players/wolfking.py,sha256=93_VBZJSZfnsnLHENgZwhQOCAUwgClfTP1zJxm0taWk,438
31
- nonebot_plugin_werewolf-1.1.8.dist-info/LICENSE,sha256=B_WbEqjGr6GYVNfEJPY31T1Opik7OtgOkhRs4Ig3e2M,1064
32
- nonebot_plugin_werewolf-1.1.8.dist-info/METADATA,sha256=tzbbeG-N9sF_GiFq9WU77cuzBCJoBErHc2cEDxi1Ylo,11744
33
- nonebot_plugin_werewolf-1.1.8.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
34
- nonebot_plugin_werewolf-1.1.8.dist-info/top_level.txt,sha256=wLTfg8sTKbH9lLT9LtU118C9cTspEBJareLsrYM52YA,24
35
- nonebot_plugin_werewolf-1.1.8.dist-info/RECORD,,