diff --git a/zhenxun/models/task_info.py b/zhenxun/models/task_info.py index 7e02a3d0..7ed1c1c5 100644 --- a/zhenxun/models/task_info.py +++ b/zhenxun/models/task_info.py @@ -2,6 +2,8 @@ from tortoise import fields from zhenxun.services.db_context import Model +from .group_console import GroupConsole + class TaskInfo(Model): id = fields.IntField(pk=True, generated=True, auto_increment=True) @@ -20,3 +22,21 @@ class TaskInfo(Model): class Meta: table = "task_info" table_description = "被动技能基本信息" + + @classmethod + async def is_block(cls, module: str, group_id: str | None) -> bool: + """判断被动技能是否被禁用 + + 参数: + module: 被动技能模块名 + group_id: 群组id + + 返回: + bool: 是否被禁用 + """ + if task := await cls.get_or_none(module=module): + if task.status: + return True + if group_id: + return await GroupConsole.is_block_task(group_id, module) + return False diff --git a/zhenxun/plugins/russian/__init__.py b/zhenxun/plugins/russian/__init__.py index b5396843..2734b704 100644 --- a/zhenxun/plugins/russian/__init__.py +++ b/zhenxun/plugins/russian/__init__.py @@ -2,7 +2,7 @@ from nonebot.adapters import Bot from nonebot.plugin import PluginMetadata from nonebot_plugin_alconna import Arparma from nonebot_plugin_alconna import At as alcAt -from nonebot_plugin_alconna import Match +from nonebot_plugin_alconna import Match, UniMsg from nonebot_plugin_saa import Image, Text from nonebot_plugin_session import EventSession @@ -64,10 +64,13 @@ async def _(money: int, num: Match[int], at_user: Match[alcAt]): _russian_matcher.set_path_arg("at_user", at_user.result.target) -@_russian_matcher.got_path("num", prompt="请输入装填子弹的数量!(最多6颗)") +@_russian_matcher.got_path( + "num", prompt="请输入装填子弹的数量!(最多6颗,输入取消来取消装弹)" +) async def _( bot: Bot, session: EventSession, + message: UniMsg, arparma: Arparma, money: int, num: int, @@ -75,10 +78,16 @@ async def _( uname: str = UserName(), ): gid = session.id2 + if message.extract_plain_text() == "取消": + await Text("已取消装弹...").finish() if not session.id1: await Text("用户id为空...").finish() if not gid: await Text("群组id为空...").finish() + if money <= 0: + await Text("赌注金额必须大于0!").finish(reply=True) + if num < 0 or num > 6: + await Text("子弹数量必须在1-6之间!").finish(reply=True) _at_user = at_user.result.target if at_user.available else None rus = Russian( at_user=_at_user, player1=(session.id1, uname), money=money, bullet_num=num @@ -94,7 +103,6 @@ async def _( @_accept_matcher.handle() async def _(session: EventSession, arparma: Arparma, uname: str = UserName()): - global a gid = session.id2 if not session.id1: await Text("用户id为空...").finish() diff --git a/zhenxun/plugins/russian/data_source.py b/zhenxun/plugins/russian/data_source.py index 4d1f4568..d7d0c333 100644 --- a/zhenxun/plugins/russian/data_source.py +++ b/zhenxun/plugins/russian/data_source.py @@ -77,6 +77,17 @@ class RussianManage: bullet_list[i] = 1 return bullet_list + def __remove_job(self, group_id: str): + """移除定时任务 + + 参数: + group_id: 群组id + """ + try: + scheduler.remove_job(f"russian_job_{group_id}") + except JobLookupError: + pass + def __build_job( self, bot: Bot, group_id: str, is_add: bool = False, platform: str | None = None ): @@ -88,10 +99,7 @@ class RussianManage: is_add: 是否添加新定时任务. platform: 平台 """ - try: - scheduler.remove_job(f"russian_job_{group_id}") - except JobLookupError: - pass + self.__remove_job(group_id) if is_add: date = datetime.now() + timedelta(seconds=31) scheduler.add_job( @@ -164,7 +172,7 @@ class RussianManage: else: message_list = [ Text( - "若30秒内无人接受挑战则此次对决作废【首次游玩请发送 ’俄罗斯轮盘帮助‘ 来查看命令】" + "若30秒内无人接受挑战则此次对决作废【首次游玩请at我发送 ’帮助俄罗斯轮盘‘ 来查看命令】" ) ] result = Text( @@ -191,6 +199,8 @@ class RussianManage: return Text("又不是找你决斗,你接受什么啊!气!") if russian.player2: return Text("当前决斗已被其他玩家接受!请等待下局对决!") + if russian.player1[0] == user_id: + return Text("你发起的对决,你接受什么啊!气!") russian.player2 = (user_id, uname) russian.next_user = russian.player1[0] return MessageFactory( @@ -321,11 +331,11 @@ class RussianManage: del self._data[group_id] return Text("规定时间内还未有人接受决斗,当前决斗过期...") return Text("决斗还未开始,,无法结算哦...") - if user_id and user_id not in [russian.player1[0], russian.player1[0]]: - return Text("吃瓜群众不要捣乱!黄牌警告!") + if user_id and user_id not in [russian.player1[0], russian.player2[0]]: + return Text(f"吃瓜群众不要捣乱!黄牌警告!") if not self.__check_is_timeout(group_id): return Text( - f"{russian.player1[1]} 和 {russian.player1[1]} 比赛并未超时,请继续比赛..." + f"{russian.player1[1]} 和 {russian.player2[1]} 比赛并未超时,请继续比赛..." ) win_user = None lose_user = None @@ -379,6 +389,7 @@ class RussianManage: padding=10, color="#f9f6f2", ) + self.__remove_job(group_id) result.append(Image(image.pic2bytes())) del self._data[group_id] return MessageFactory(result)