diff --git a/nonebot_bison/sub_manager/__init__.py b/nonebot_bison/sub_manager/__init__.py index 14a924b..39dc323 100644 --- a/nonebot_bison/sub_manager/__init__.py +++ b/nonebot_bison/sub_manager/__init__.py @@ -47,7 +47,7 @@ do_del_sub(del_sub_matcher) add_cookie_matcher = on_command( "添加cookie", aliases={"添加Cookie"}, - rule=configurable_to_me, + rule=to_me(), permission=SUPERUSER, priority=5, block=True, @@ -57,7 +57,7 @@ do_add_cookie(add_cookie_matcher) add_cookie_target_matcher = on_command( "关联cookie", aliases={"关联Cookie"}, - rule=configurable_to_me, + rule=to_me(), permission=SUPERUSER, priority=5, block=True, @@ -67,7 +67,7 @@ do_add_cookie_target(add_cookie_target_matcher) del_cookie_target_matcher = on_command( "取消关联cookie", aliases={"取消关联Cookie"}, - rule=configurable_to_me, + rule=to_me(), permission=SUPERUSER, priority=5, block=True, @@ -77,7 +77,7 @@ do_del_cookie_target(del_cookie_target_matcher) del_cookie_matcher = on_command( "删除cookie", aliases={"删除Cookie"}, - rule=configurable_to_me, + rule=to_me(), permission=SUPERUSER, priority=5, block=True, @@ -167,4 +167,8 @@ __all__ = [ "del_sub_matcher", "group_manage_matcher", "no_permission_matcher", + "add_cookie_matcher", + "add_cookie_target_matcher", + "del_cookie_target_matcher", + "del_cookie_matcher", ] diff --git a/nonebot_bison/sub_manager/add_cookie.py b/nonebot_bison/sub_manager/add_cookie.py index 20aa004..235c65b 100644 --- a/nonebot_bison/sub_manager/add_cookie.py +++ b/nonebot_bison/sub_manager/add_cookie.py @@ -57,7 +57,7 @@ def do_add_cookie(add_cookie: type[Matcher]): ) cookie_text = cookie.extract_plain_text() if not await client_mgr.validate_cookie(cookie_text): - await add_cookie.reject("无效的 Cookie,请检查后重新输入,详情见<待添加的文档>") + await add_cookie.reject(state["site"].cookie_format_prompt) state["cookie"] = cookie_text @add_cookie.handle() diff --git a/nonebot_bison/utils/site.py b/nonebot_bison/utils/site.py index b934cf4..54716c9 100644 --- a/nonebot_bison/utils/site.py +++ b/nonebot_bison/utils/site.py @@ -156,6 +156,7 @@ class Site(metaclass=RegistryMeta, base=True): client_mgr: type[ClientManager] = DefaultClientManager require_browser: bool = False registry: list[type["Site"]] + cookie_format_prompt = "无效的 Cookie,请检查后重新输入,详情见<待添加的文档>" def __str__(self): return f"[{self.name}]-{self.name}-{self.schedule_setting}" diff --git a/tests/sub_manager/test_add_cookie.py b/tests/sub_manager/test_add_cookie.py new file mode 100644 index 0000000..28c2317 --- /dev/null +++ b/tests/sub_manager/test_add_cookie.py @@ -0,0 +1,212 @@ +import json + +from nonebug.app import App +from pytest_mock import MockerFixture + +from ..utils import BotReply, fake_superuser, fake_admin_user, fake_private_message_event + + +async def test_add_cookie_rule(app: App, mocker: MockerFixture): + from nonebot.adapters.onebot.v11.bot import Bot + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.plugin_config import plugin_config + from nonebot_bison.sub_manager import add_cookie_matcher + + mocker.patch.object(plugin_config, "bison_to_me", True) + + async with app.test_matcher(add_cookie_matcher) as ctx: + bot = ctx.create_bot(base=Bot) + event = fake_private_message_event(message=Message("添加cookie"), sender=fake_superuser) + ctx.receive_event(bot, event) + ctx.should_pass_rule() + ctx.should_pass_permission() + + async with app.test_matcher(add_cookie_matcher) as ctx: + bot = ctx.create_bot(base=Bot) + event = fake_private_message_event(message=Message("添加cookie"), sender=fake_admin_user) + ctx.receive_event(bot, event) + ctx.should_not_pass_rule() + ctx.should_pass_permission() + + +async def test_add_cookie_target_no_cookie(app: App, mocker: MockerFixture): + from nonebot.adapters.onebot.v11.bot import Bot + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.sub_manager import add_cookie_target_matcher + + async with app.test_matcher(add_cookie_target_matcher) as ctx: + bot = ctx.create_bot(base=Bot) + from nonebug_saa import should_send_saa + from nonebot_plugin_saa import TargetQQGroup, MessageFactory + + from nonebot_bison.config import config + from nonebot_bison.types import Target as T_Target + + target = T_Target("weibo_id") + platform_name = "weibo" + await config.add_subscribe( + TargetQQGroup(group_id=123), + target=target, + target_name="weibo_name", + platform_name=platform_name, + cats=[], + tags=[], + ) + + event_1 = fake_private_message_event( + message=Message("关联cookie"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_1) + ctx.should_pass_rule() + should_send_saa( + ctx, + MessageFactory( + "订阅的帐号为:\n1 weibo weibo_name weibo_id\n []\n请输入要关联 cookie 的订阅的序号\n输入'取消'中止" + ), + bot, + event=event_1, + ) + event_2 = fake_private_message_event( + message=Message("1"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_2) + ctx.should_pass_rule() + ctx.should_call_send( + event_2, + "当前平台暂无可关联的 Cookie,请使用“添加cookie”命令添加或检查已关联的 Cookie", + True, + ) + + +async def test_add_cookie(app: App, mocker: MockerFixture): + from nonebot.adapters.onebot.v11.bot import Bot + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.platform import platform_manager + from nonebot_bison.sub_manager import common_platform, add_cookie_matcher, add_cookie_target_matcher + + async with app.test_matcher(add_cookie_matcher) as ctx: + bot = ctx.create_bot(base=Bot) + event_1 = fake_private_message_event( + message=Message("添加Cookie"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_1) + ctx.should_pass_rule() + ctx.should_call_send( + event_1, + BotReply.add_reply_on_add_cookie(platform_manager, common_platform), + True, + ) + event_2 = fake_private_message_event( + message=Message("全部"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_2) + ctx.should_pass_rule() + ctx.should_rejected() + ctx.should_call_send( + event_2, + BotReply.add_reply_on_add_cookie_input_allplatform(platform_manager), + True, + ) + event_3 = fake_private_message_event( + message=Message("weibo"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_3) + ctx.should_pass_rule() + ctx.should_call_send(event_3, BotReply.add_reply_on_input_cookie) + event_4_err = fake_private_message_event( + message=Message("test"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_4_err) + ctx.should_call_send(event_4_err, "无效的 Cookie,请检查后重新输入,详情见<待添加的文档>", True) + ctx.should_rejected() + event_4_ok = fake_private_message_event( + message=Message(json.dumps({"cookie": "test"})), + sender=fake_superuser, + to_me=True, + user_id=fake_superuser.user_id, + ) + ctx.receive_event(bot, event_4_ok) + ctx.should_pass_rule() + ctx.should_call_send( + event_4_ok, '已添加 Cookie: {"cookie": "test"} 到平台 weibo\n请使用“关联cookie”为 Cookie 关联订阅', True + ) + + async with app.test_matcher(add_cookie_target_matcher) as ctx: + from nonebug_saa import should_send_saa + from nonebot_plugin_saa import TargetQQGroup, MessageFactory + + from nonebot_bison.config import config + from nonebot_bison.types import Target as T_Target + + target = T_Target("weibo_id") + platform_name = "weibo" + await config.add_subscribe( + TargetQQGroup(group_id=123), + target=target, + target_name="weibo_name", + platform_name=platform_name, + cats=[], + tags=[], + ) + bot = ctx.create_bot(base=Bot) + event_1 = fake_private_message_event( + message=Message("关联cookie"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_1) + ctx.should_pass_rule() + should_send_saa( + ctx, + MessageFactory( + "订阅的帐号为:\n1 weibo weibo_name weibo_id\n []\n请输入要关联 cookie 的订阅的序号\n输入'取消'中止" + ), + bot, + event=event_1, + ) + event_2_err = fake_private_message_event( + message=Message("2"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_2_err) + ctx.should_call_send(event_2_err, "序号错误", True) + ctx.should_rejected() + event_2_ok = fake_private_message_event( + message=Message("1"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_2_ok) + ctx.should_pass_rule() + ctx.should_call_send(event_2_ok, '请选择一个 Cookie,已关联的 Cookie 不会显示\n1. weibo.com [{"cookie":]', True) + event_3_err = fake_private_message_event( + message=Message("2"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_3_err) + ctx.should_call_send(event_3_err, "序号错误", True) + ctx.should_rejected() + event_3_ok = fake_private_message_event( + message=Message("1"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_3_ok) + ctx.should_pass_rule() + ctx.should_call_send(event_3_ok, '已关联 Cookie: weibo.com [{"cookie":] 到订阅 weibo.com weibo_id', True) + + +async def test_add_cookie_target_no_target(app: App, mocker: MockerFixture): + + from nonebot.adapters.onebot.v11.bot import Bot + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.sub_manager import add_cookie_target_matcher + + async with app.test_matcher(add_cookie_target_matcher) as ctx: + bot = ctx.create_bot(base=Bot) + event_1 = fake_private_message_event( + message=Message("关联cookie"), sender=fake_superuser, to_me=True, user_id=fake_superuser.user_id + ) + ctx.receive_event(bot, event_1) + ctx.should_pass_rule() + ctx.should_call_send( + event_1, + "暂无已订阅账号\n请使用“添加订阅”命令添加订阅", + True, + ) diff --git a/tests/utils.py b/tests/utils.py index 04efad5..24f459e 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -89,6 +89,7 @@ add_reply_on_id_input_search = ( class BotReply: + @staticmethod def add_reply_on_platform(platform_manager, common_platform): return ( @@ -159,3 +160,33 @@ class BotReply: add_reply_on_tags_need_more_info = "订阅标签直接输入标签内容\n屏蔽标签请在标签名称前添加~号\n详见https://nonebot-bison.netlify.app/usage/#%E5%B9%B3%E5%8F%B0%E8%AE%A2%E9%98%85%E6%A0%87%E7%AD%BE-tag" add_reply_abort = "已中止订阅" no_permission = "您没有权限进行此操作,请联系 Bot 管理员" + + @staticmethod + def add_reply_on_add_cookie(platform_manager, common_platform): + from nonebot_bison.utils.site import is_cookie_client_manager + + return ( + "请输入想要添加 Cookie 的平台,目前支持,请输入冒号左边的名称:\n" + + "".join( + [ + f"{platform_name}: {platform_manager[platform_name].name}\n" + for platform_name in common_platform + if is_cookie_client_manager(platform_manager[platform_name].site.client_mgr) + ] + ) + + "要查看全部平台请输入:“全部”\n中止添加cookie过程请输入:“取消”" + ) + + @staticmethod + def add_reply_on_add_cookie_input_allplatform(platform_manager): + from nonebot_bison.utils.site import is_cookie_client_manager + + return "全部平台\n" + "\n".join( + [ + f"{platform_name}: {platform.name}" + for platform_name, platform in platform_manager.items() + if is_cookie_client_manager(platform.site.client_mgr) + ] + ) + + add_reply_on_input_cookie = "请输入 Cookie"