from io import BytesIO from arclet.alconna import Args, Option from arclet.alconna.typing import CommandMeta from nonebot.adapters import Bot from nonebot.permission import SUPERUSER from nonebot.plugin import PluginMetadata from nonebot.rule import to_me from nonebot_plugin_alconna import ( Alconna, AlconnaQuery, Arparma, Query, on_alconna, store_true, ) from nonebot_plugin_session import EventSession from zhenxun.configs.path_config import IMAGE_PATH from zhenxun.configs.utils import PluginExtraData from zhenxun.models.fg_request import FgRequest from zhenxun.services.log import logger from zhenxun.utils.enum import PluginType, RequestHandleType, RequestType from zhenxun.utils.exception import NotFoundError from zhenxun.utils.image_utils import BuildImage from zhenxun.utils.message import MessageUtils from zhenxun.utils.utils import get_user_avatar usage = """ 查看请求 清空请求 请求处理 -fa [id] / 同意好友请求 [id] # 同意好友请求 请求处理 -fr [id] / 拒绝好友请求 [id] # 拒绝好友请求 请求处理 -fi [id] / 忽略好友请求 [id] # 忽略好友请求 请求处理 -ga [id] / 同意群组请求 [id] # 同意群聊请求 请求处理 -gr [id] / 拒绝群组请求 [id] # 拒绝群聊请求 请求处理 -gi [id] / 忽略群组请求 [id] # 忽略群聊请求 """.strip() __plugin_meta__ = PluginMetadata( name="请求处理", description="好友与邀请群组请求处理", usage=usage, extra=PluginExtraData( author="HibiKier", version="0.1", plugin_type=PluginType.SUPERUSER, ).to_dict(), ) _req_matcher = on_alconna( Alconna( "请求处理", Args["handle", ["-fa", "-fr", "-fi", "-ga", "-gr", "-gi"]]["id", int], meta=CommandMeta( description="好友/群组请求处理", usage=usage, example="同意好友请求 20", compact=True, ), ), permission=SUPERUSER, priority=1, rule=to_me(), block=True, ) _read_matcher = on_alconna( Alconna( "查看请求", Option("-f|--friend", action=store_true, help_text="查看好友请求"), Option("-g|--group", action=store_true, help_text="查看群组请求"), meta=CommandMeta( description="查看所有请求或好友群组请求", usage="查看请求\n查看请求 -f\n查看请求-g", example="查看请求 -f", compact=True, ), ), permission=SUPERUSER, priority=1, rule=to_me(), block=True, ) _clear_matcher = on_alconna( Alconna( "清空请求", Option("-f|--friend", action=store_true, help_text="清空好友请求"), Option("-g|--group", action=store_true, help_text="清空群组请求"), meta=CommandMeta( description="清空请求", usage="清空请求\n清空请求 -f\n清空请求-g", example="清空请求 -f", compact=True, ), ), permission=SUPERUSER, priority=1, rule=to_me(), block=True, ) reg_arg_list = [ (r"同意好友请求", ["-fa", "{%0}"]), (r"拒绝好友请求", ["-fr", "{%0}"]), (r"忽略好友请求", ["-fi", "{%0}"]), (r"同意群组请求", ["-ga", "{%0}"]), (r"拒绝群组请求", ["-gr", "{%0}"]), (r"忽略群组请求", ["-gi", "{%0}"]), ] for r in reg_arg_list: _req_matcher.shortcut( r[0], command="请求处理", arguments=r[1], prefix=True, ) @_req_matcher.handle() async def _( bot: Bot, session: EventSession, handle: str, id: int, arparma: Arparma, ): type_dict = { "a": RequestHandleType.APPROVE, "r": RequestHandleType.REFUSED, "i": RequestHandleType.IGNORE, } handle_type = type_dict[handle[-1]] try: if handle_type == RequestHandleType.APPROVE: await FgRequest.approve(bot, id) if handle_type == RequestHandleType.REFUSED: await FgRequest.refused(bot, id) if handle_type == RequestHandleType.IGNORE: await FgRequest.ignore(id) except NotFoundError: await MessageUtils.build_message("未发现此id的请求...").finish(reply_to=True) except Exception: await MessageUtils.build_message("其他错误, 可能flag已失效...").finish( reply_to=True ) logger.info("处理请求", arparma.header_result, session=session) await MessageUtils.build_message("成功处理请求!").finish(reply_to=True) @_read_matcher.handle() async def _( session: EventSession, arparma: Arparma, is_friend: Query[bool] = AlconnaQuery("friend.value", False), is_group: Query[bool] = AlconnaQuery("group.value", False), ): if all_request := await FgRequest.filter(handle_type__isnull=True).all(): req_list = list(all_request) req_list.reverse() friend_req: list[FgRequest] = [] group_req: list[FgRequest] = [] for req in req_list: if req.request_type == RequestType.FRIEND: friend_req.append(req) else: group_req.append(req) if is_friend.result: group_req = [] elif is_group.result: friend_req = [] req_image_list: list[BuildImage] = [] for i, req_list in enumerate([friend_req, group_req]): img_list = [] for req in req_list: content = await get_user_avatar(req.user_id) ava_img = BuildImage( 80, 80, background=BytesIO(content) if content else None ) await ava_img.circle() handle_img = BuildImage( 130, 32, font_size=15, color="#EEEFF4", font="HYWenHei-85W.ttf" ) await handle_img.text((0, 0), "同意/拒绝/忽略", center_type="center") await handle_img.circle_corner(10) background = BuildImage(500, 100, font_size=22, color=(255, 255, 255)) await background.paste(ava_img, (55, 0), center_type="height") if session.platform and session.platform != "unknown": platform_icon = BuildImage( 30, 30, background=IMAGE_PATH / "_icon" / f"{session.platform}.png", ) await background.paste(platform_icon, (46, 10)) await background.text((150, 12), req.nickname) if i == 0: comment_img = await BuildImage.build_text_image( f"对方留言:{req.comment}", size=15, font_color=(140, 140, 143) ) else: comment_img = await BuildImage.build_text_image( f"群组:{req.group_id}", size=15, font_color=(140, 140, 143) ) await background.paste(comment_img, (150, 65)) tag = await BuildImage.build_text_image( f"{req.platform}", size=13, color=(0, 167, 250), font="HYWenHei-85W.ttf", font_color=(255, 255, 255), padding=(1, 6, 1, 6), ) await tag.circle_corner(5) await background.paste(tag, (150, 42)) await background.paste(handle_img, (360, 35)) _id_img = BuildImage( 32, 32, font_size=15, color="#EEEFF4", font="HYWenHei-85W.ttf" ) await _id_img.text((0, 0), f"{req.id}", center_type="center") await _id_img.circle_corner(10) await background.paste(_id_img, (10, 0), center_type="height") img_list.append(background) if img_list: A = await BuildImage.auto_paste(img_list, 1) result_image = BuildImage( A.width, A.height + 30, color=(255, 255, 255), font_size=20 ) await result_image.paste(A, (0, 30)) _type_text = "好友请求" if i == 0 else "群组请求" await result_image.text((15, 13), _type_text, fill=(140, 140, 143)) req_image_list.append(result_image) if not req_image_list: await MessageUtils.build_message("没有任何请求喔...").finish(reply_to=True) if len(req_image_list) == 1: await MessageUtils.build_message(req_image_list[0]).finish() width = sum(img.width for img in req_image_list) height = max(img.height for img in req_image_list) background = BuildImage(width, height) await background.paste(req_image_list[0]) await req_image_list[1].line((0, 10, 1, req_image_list[1].height - 10), width=1) await background.paste(req_image_list[1], (req_image_list[1].width, 0)) logger.info("查看请求", arparma.header_result, session=session) await MessageUtils.build_message(background).finish() await MessageUtils.build_message("没有任何请求喔...").finish(reply_to=True) @_clear_matcher.handle() async def _( session: EventSession, arparma: Arparma, is_friend: Query[bool] = AlconnaQuery("friend.value", False), is_group: Query[bool] = AlconnaQuery("group.value", False), ): _type = "" if is_friend.result: _type = "好友" await FgRequest.filter( handle_type__isnull=True, request_type=RequestType.FRIEND ).update(handle_type=RequestHandleType.IGNORE) elif is_group.result: _type = "群组" await FgRequest.filter( handle_type__isnull=True, request_type=RequestType.GROUP ).update(handle_type=RequestHandleType.IGNORE) else: _type = "所有" await FgRequest.filter(handle_type__isnull=True).update( handle_type=RequestHandleType.IGNORE ) logger.info(f"清空{_type}请求", arparma.header_result, session=session) await MessageUtils.build_message(f"已清空{_type}请求!").finish()