nonebot-plugin-werewolf 1.1.8__py3-none-any.whl → 1.1.10__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.
- nonebot_plugin_werewolf/__init__.py +1 -1
- nonebot_plugin_werewolf/config.py +1 -0
- nonebot_plugin_werewolf/constant.py +6 -1
- nonebot_plugin_werewolf/game.py +73 -64
- nonebot_plugin_werewolf/matchers/edit_behavior.py +19 -3
- nonebot_plugin_werewolf/matchers/poke/chronocat_poke.py +2 -2
- nonebot_plugin_werewolf/matchers/poke/ob11_poke.py +2 -2
- nonebot_plugin_werewolf/matchers/start_game.py +31 -30
- nonebot_plugin_werewolf/models.py +15 -3
- nonebot_plugin_werewolf/{players/player.py → player.py} +149 -72
- nonebot_plugin_werewolf/player_set.py +39 -23
- nonebot_plugin_werewolf/players/__init__.py +0 -1
- nonebot_plugin_werewolf/players/civilian.py +3 -3
- nonebot_plugin_werewolf/players/guard.py +20 -15
- nonebot_plugin_werewolf/players/hunter.py +6 -5
- nonebot_plugin_werewolf/players/idiot.py +25 -17
- nonebot_plugin_werewolf/players/jester.py +22 -17
- nonebot_plugin_werewolf/players/prophet.py +13 -8
- nonebot_plugin_werewolf/players/{can_shoot.py → shooter.py} +10 -10
- nonebot_plugin_werewolf/players/werewolf.py +69 -45
- nonebot_plugin_werewolf/players/witch.py +30 -23
- nonebot_plugin_werewolf/players/wolfking.py +14 -8
- nonebot_plugin_werewolf/utils.py +18 -7
- {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.10.dist-info}/METADATA +14 -2
- nonebot_plugin_werewolf-1.1.10.dist-info/RECORD +35 -0
- {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.10.dist-info}/WHEEL +1 -1
- nonebot_plugin_werewolf-1.1.8.dist-info/RECORD +0 -35
- {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.10.dist-info/licenses}/LICENSE +0 -0
- {nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.10.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
|
5
|
+
from ..player import InteractProvider, Player
|
6
6
|
|
7
7
|
|
8
|
-
|
9
|
-
class Prophet(Player):
|
8
|
+
class ProphetInteractProvider(InteractProvider["Prophet"]):
|
10
9
|
@override
|
11
|
-
async def
|
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.
|
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
|
7
|
+
from ..player import KillProvider, Player
|
8
8
|
|
9
9
|
|
10
|
-
class
|
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.
|
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.
|
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.
|
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 ..
|
13
|
-
from
|
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
|
32
|
-
|
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
|
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
|
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
|
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.
|
106
|
-
tg.start_soon(self.
|
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
|
112
|
-
|
113
|
-
|
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
|
-
@
|
15
|
-
|
16
|
-
|
17
|
-
|
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.
|
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
|
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.
|
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(
|
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 .
|
5
|
-
from .
|
6
|
-
from .werewolf import Werewolf
|
6
|
+
from .shooter import ShooterKillProvider
|
7
|
+
from .werewolf import Werewolf, WerewolfNotifyProvider
|
7
8
|
|
8
9
|
|
9
|
-
|
10
|
-
class WolfKing(CanShoot, Werewolf):
|
10
|
+
class WolfKingNotifyProvider(WerewolfNotifyProvider):
|
11
11
|
@override
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
nonebot_plugin_werewolf/utils.py
CHANGED
@@ -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:
|
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,20 +182,27 @@ 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
|
-
|
185
|
-
while
|
186
|
-
msg
|
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
|
|
191
191
|
class SendHandler(abc.ABC, Generic[P]):
|
192
192
|
bot: Bot
|
193
|
-
target: Event | Target
|
193
|
+
target: Event | Target | None
|
194
194
|
reply_to: bool | None = None
|
195
195
|
last_msg: UniMessage | None = None
|
196
196
|
last_receipt: Receipt | None = None
|
197
197
|
|
198
|
+
def __init__(
|
199
|
+
self,
|
200
|
+
target: Event | Target | None = None,
|
201
|
+
bot: Bot | None = None,
|
202
|
+
) -> None:
|
203
|
+
self.bot = bot or current_bot.get()
|
204
|
+
self.target = target
|
205
|
+
|
198
206
|
def update(self, target: Event | Target, bot: Bot | None = None) -> None:
|
199
207
|
self.bot = bot or current_bot.get()
|
200
208
|
self.target = target
|
@@ -210,6 +218,9 @@ class SendHandler(abc.ABC, Generic[P]):
|
|
210
218
|
await last.edit(self.last_msg.exclude(Keyboard))
|
211
219
|
|
212
220
|
async def _send(self, message: UniMessage) -> None:
|
221
|
+
if self.target is None:
|
222
|
+
raise RuntimeError("Target cannot be None when sending a message.")
|
223
|
+
|
213
224
|
if not config.enable_button:
|
214
225
|
message = message.exclude(Keyboard)
|
215
226
|
receipt = await message.send(
|
{nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.10.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: nonebot-plugin-werewolf
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.10
|
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,17 @@ _✨ 简单的狼人杀插件 ✨_
|
|
239
240
|
|
240
241
|
<!-- CHANGELOG -->
|
241
242
|
|
243
|
+
- 2025.04.17 v1.1.10
|
244
|
+
|
245
|
+
- 添加狼人多选目标配置项显示
|
246
|
+
- 在游戏开始时打乱并固定轮流发言模式的发言顺序
|
247
|
+
|
248
|
+
- 2025.04.15 v1.1.9
|
249
|
+
|
250
|
+
- 添加游戏行为配置 `werewolf_multi_select`
|
251
|
+
- 重构玩家类
|
252
|
+
- 添加轮流发言模式缺失的 at 消息段
|
253
|
+
|
242
254
|
- 2025.02.13 v1.1.8
|
243
255
|
|
244
256
|
- 优化交互按钮
|
@@ -0,0 +1,35 @@
|
|
1
|
+
nonebot_plugin_werewolf/__init__.py,sha256=ed2tOFc-Q0Rw2OYZFmBVzu2NUKPtSwc2ioYVU0X-Ntk,932
|
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=iCduTjl33k-0Mk5MN57Qj-TfGtDKe96aBDvCiTU0AlU,19357
|
6
|
+
nonebot_plugin_werewolf/models.py,sha256=PiQ-5_R-cUlHKWDa5G0bFnz7jv20200_kr449G9Jgjg,2300
|
7
|
+
nonebot_plugin_werewolf/player.py,sha256=1FPsvNkt9d5D2EH7vXCXmDabdcOOAGFcI4Ky9rUe99s,11223
|
8
|
+
nonebot_plugin_werewolf/player_set.py,sha256=RF3aQXLZyUBPa0_G-Q48NUARictMRp6IV2WD-BKtNTQ,2913
|
9
|
+
nonebot_plugin_werewolf/utils.py,sha256=gV01cdGJXdbnxDcm6PWEbFYcgL1sF4rA-y5XzrYwzvU,7122
|
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=hppkSB4CJ5FYuT5mWQZ3gwIurBVO_Zz2mBOUA-oV5tU,7231
|
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.10.dist-info/licenses/LICENSE,sha256=B_WbEqjGr6GYVNfEJPY31T1Opik7OtgOkhRs4Ig3e2M,1064
|
32
|
+
nonebot_plugin_werewolf-1.1.10.dist-info/METADATA,sha256=N3PDI77wVJA-Ps6i9K_KQjDW_Ldq1LPk8qzEFYSF41I,12051
|
33
|
+
nonebot_plugin_werewolf-1.1.10.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
34
|
+
nonebot_plugin_werewolf-1.1.10.dist-info/top_level.txt,sha256=wLTfg8sTKbH9lLT9LtU118C9cTspEBJareLsrYM52YA,24
|
35
|
+
nonebot_plugin_werewolf-1.1.10.dist-info/RECORD,,
|
@@ -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,,
|
File without changes
|
{nonebot_plugin_werewolf-1.1.8.dist-info → nonebot_plugin_werewolf-1.1.10.dist-info}/top_level.txt
RENAMED
File without changes
|