From e676d6e6d4d42db55a4c6811e102747eee401f6a Mon Sep 17 00:00:00 2001 From: Kyomotoi Date: Wed, 22 Jun 2022 20:28:16 +0800 Subject: =?UTF-8?q?=F0=9F=9A=B8=F0=9F=8E=A8=20=E6=8F=90=E9=AB=98=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BD=93=E9=AA=8C,=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ATRI/plugins/bilibili_dynamic/__init__.py | 87 ++++++++++++++-------------- ATRI/plugins/bilibili_dynamic/data_source.py | 33 +++++++++-- 2 files changed, 71 insertions(+), 49 deletions(-) diff --git a/ATRI/plugins/bilibili_dynamic/__init__.py b/ATRI/plugins/bilibili_dynamic/__init__.py index cbbeead..8a6a007 100644 --- a/ATRI/plugins/bilibili_dynamic/__init__.py +++ b/ATRI/plugins/bilibili_dynamic/__init__.py @@ -45,55 +45,49 @@ async def _bd_deal_add_sub( __id = int(_id) group_id = event.group_id - sub = BilibiliDynamicSubscriptor() - - up_nickname = await sub.get_up_nickname(__id) - if not up_nickname: - await add_sub.finish(f"无法获取id为 {_id} 的up主信息...操作失败了") - query_result = await sub.get_sub_list(__id, group_id) - if len(query_result): - await add_sub.finish(f"该up主[{up_nickname}]已在本群订阅列表中啦!") - - await sub.add_sub(__id, group_id) - await sub.update_sub( - __id, group_id, {"up_nickname": up_nickname, "last_update": datetime.utcnow()} - ) - await add_sub.finish(f"成功订阅名为[{up_nickname}]up主的动态~!") + result = await BilibiliDynamicSubscriptor().add_sub(__id, group_id) + await add_sub.finish(result) del_sub = BilibiliDynamicSubscriptor().cmd_as_group("del", "删除b站up主订阅") @del_sub.handle() -async def _bd_del_sub(matcher: Matcher, args: Message = CommandArg()): - msg = args.extract_plain_text() - if msg: - matcher.set_arg("bd_del_sub_id", args) +async def _bd_del_sub(event: GroupMessageEvent): + group_id = event.group_id + sub = BilibiliDynamicSubscriptor() + query_result = await sub.get_sub_list(group_id=group_id) + if not query_result: + await del_sub.finish("本群还未订阅任何up主呢...") -@del_sub.got("bd_del_sub_id", "up主id呢?速速") + subs = list() + for i in query_result: + subs.append([i.up_nickname, i.uid]) + + output = "本群订阅的up列表如下~\n" + tabulate( + subs, headers=["up主", "uid"], tablefmt="plain", showindex=True + ) + await del_sub.send(output) + + +@del_sub.got("bd_del_sub_id", "取消订阅的up主uid呢?速速\n(键入 1 以取消)") async def _bd_deal_del_sub( event: GroupMessageEvent, _id: str = ArgPlainText("bd_del_sub_id") ): patt = r"^\d+$" if not re.match(patt, _id): - await add_sub.reject("这似乎不是id呢,请重新输入:") + await add_sub.reject("这似乎不是uid呢,请重新输入:") + + if _id == "1": + await del_sub.finish("已取消操作~") __id = int(_id) group_id = event.group_id - sub = BilibiliDynamicSubscriptor() - - up_nickname = await sub.get_up_nickname(__id) - if not up_nickname: - await add_sub.finish(f"无法获取id为 {__id} 的up主信息...操作失败了") - query_result = await sub.get_sub_list(__id, group_id) - if not query_result: - await del_sub.finish(f"取消订阅失败...该up主[{up_nickname}]并不在本群订阅列表中") - - await sub.del_sub(__id, group_id) - await del_sub.finish(f"成功取消该up主[{up_nickname}]的订阅~") + result = await BilibiliDynamicSubscriptor().del_sub(__id, group_id) + await del_sub.finish(result) get_sub_list = BilibiliDynamicSubscriptor().cmd_as_group( @@ -112,11 +106,15 @@ async def _bd_get_sub_list(event: GroupMessageEvent): subs = list() for i in query_result: - tm = i.last_update.replace(tzinfo=pytz.timezone("Asia/Shanghai")) - subs.append([i.up_nickname, i.uid, tm + timedelta(hours=8)]) + raw_tm = ( + i.last_update.replace(tzinfo=pytz.timezone("Asia/Shanghai")) + + timedelta(hours=8) + ).timestamp() + tm = datetime.fromtimestamp(raw_tm).strftime("%m-%d %H:%M:%S") + subs.append([i.up_nickname, tm]) output = "本群订阅的up列表如下~\n" + tabulate( - subs, headers=["up主", "uid", "最后更新时间"], tablefmt="plain", showindex=True + subs, headers=["up主", "最后更新时间"], tablefmt="plain", showindex=True ) await get_sub_list.finish(output) @@ -176,15 +174,15 @@ async def _check_bd(): await tq.put(i) else: m: BilibiliSubscription = tq.get_nowait() - log.info(f"准备查询up主[{m.up_nickname}]的动态,队列剩余 {tq.qsize()}") + log.info(f"准备查询up主 {m.up_nickname} 的动态,队列剩余 {tq.qsize()}") - ts = int(m.last_update.timestamp()) + ts = m.last_update.timestamp() info: dict = await sub.get_up_recent_dynamic(m.uid) result = list() if info.get("cards", list()): result = sub.extract_dyanmic(info["cards"]) if not result: - log.warning(f"无法获取up主[{m.up_nickname}]的动态") + log.warning(f"无法获取up主 {m.up_nickname} 的动态") return for i in result: @@ -195,14 +193,6 @@ async def _check_bd(): bot = get_bot() await bot.send_group_msg(group_id=m.group_id, message=content) - if _pic: - pic = Message(MessageSegment.image(_pic)) - try: - await bot.send_group_msg(group_id=m.group_id, message=pic) - except Exception: - repo = "图片发送失败了..." - await bot.send_group_msg(group_id=m.group_id, message=repo) - await sub.update_sub( m.uid, m.group_id, @@ -210,4 +200,11 @@ async def _check_bd(): "last_update": timestamp2datetime(i["timestamp"]), }, ) + if _pic: + pic = Message(MessageSegment.image(_pic)) + try: + await bot.send_group_msg(group_id=m.group_id, message=pic) + except Exception: + repo = "图片发送失败了..." + await bot.send_group_msg(group_id=m.group_id, message=repo) break diff --git a/ATRI/plugins/bilibili_dynamic/data_source.py b/ATRI/plugins/bilibili_dynamic/data_source.py index 64045e3..780f41c 100644 --- a/ATRI/plugins/bilibili_dynamic/data_source.py +++ b/ATRI/plugins/bilibili_dynamic/data_source.py @@ -1,8 +1,8 @@ import json +from datetime import datetime from operator import itemgetter from nonebot.permission import SUPERUSER -from nonebot.adapters.onebot.v11 import MessageSegment from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN from ATRI.service import Service @@ -33,7 +33,7 @@ class BilibiliDynamicSubscriptor(Service): main_cmd="/bd", ) - async def add_sub(self, uid: int, group_id: int): + async def __add_sub(self, uid: int, group_id: int): try: async with DB() as db: await db.add_sub(uid, group_id) @@ -47,7 +47,7 @@ class BilibiliDynamicSubscriptor(Service): except Exception: raise BilibiliDynamicError("更新订阅失败") - async def del_sub(self, uid: int, group_id: int): + async def __del_sub(self, uid: int, group_id: int): try: async with DB() as db: await db.del_sub({"uid": uid, "group_id": group_id}) @@ -73,7 +73,7 @@ class BilibiliDynamicSubscriptor(Service): except Exception: raise BilibiliDynamicError("获取全部订阅列表失败") - async def get_up_nickname(self, uid: int) -> str: + async def __get_up_nickname(self, uid: int) -> str: api = API(uid) resp = await api.get_user_info() data = resp.get("data", dict()) @@ -170,3 +170,28 @@ class BilibiliDynamicSubscriptor(Service): .replace("http://", str()), up_dy_link="https://t.bilibili.com/" + str(data["dynamic_id"]), ) + + async def add_sub(self, uid: int, group_id: int) -> str: + up_nickname = await self.__get_up_nickname(uid) + if not up_nickname: + return f"无法获取id为 {uid} 的up主信息...操作失败了" + + query_result = await self.get_sub_list(uid, group_id) + if query_result: + return f"该up主 {up_nickname} 已在本群订阅列表中啦!" + + await self.__add_sub(uid, group_id) + await self.update_sub( + uid, + group_id, + {"up_nickname": up_nickname, "last_update": datetime.utcnow()}, + ) + return f"成功订阅名为 {up_nickname} up主的动态~!" + + async def del_sub(self, uid: int, group_id: int) -> str: + query_result = await self.get_sub_list(uid, group_id) + if not query_result: + return f"该uid: {uid} 未在本群订阅列表中啦!" + + await self.__del_sub(uid, group_id) + return f"成功取消订阅uid为 {uid} up主的动态~!" -- cgit v1.2.3