From cc2ed9d1de50b6445c9ad8770c5e51c27dd662e3 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 14 Mar 2021 11:25:38 +0800 Subject: [PATCH] :bug: fix github model and redis lib --- src/libs/github/models/__init__.py | 15 +++++--- src/plugins/github/libs/redis.py | 34 +++++++++++++++++++ .../github/plugins/github_bind/__init__.py | 14 ++++---- .../github/plugins/github_issue/__init__.py | 15 ++++---- 4 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 src/plugins/github/libs/redis.py diff --git a/src/libs/github/models/__init__.py b/src/libs/github/models/__init__.py index 9b30eea..8919a4a 100644 --- a/src/libs/github/models/__init__.py +++ b/src/libs/github/models/__init__.py @@ -4,14 +4,14 @@ @Author : yanyongyu @Date : 2021-03-11 01:34:31 @LastEditors : yanyongyu -@LastEditTime : 2021-03-12 13:36:57 +@LastEditTime : 2021-03-14 11:16:32 @Description : None @GitHub : https://github.com/yanyongyu """ __author__ = "yanyongyu" import inspect -from typing import Any, Type, TypeVar +from typing import Any, Type, Union, TypeVar from pydantic import BaseModel as _BaseModel, root_validator @@ -31,8 +31,15 @@ class BaseModel(_BaseModel): def apply_requester(cls, values: dict) -> dict: assert "requester" in values, "requester needed" for name, info in cls.__fields__.items(): - if name in values and inspect.isclass(info.type_) and issubclass( - info.type_, BaseModel): + is_model = inspect.isclass(info.type_) and issubclass( + info.type_, BaseModel) + is_generic = ( + hasattr(info.type_, "__origin__") and + info.type_.__origin__ is Union and # type: ignore + any(issubclass(x, BaseModel) + for x in info.type_.__args__) # type: ignore + ) + if name in values and (is_model or is_generic): if isinstance(values[name], dict): values[name]["requester"] = values["requester"] elif isinstance(values[name], list): diff --git a/src/plugins/github/libs/redis.py b/src/plugins/github/libs/redis.py new file mode 100644 index 0000000..cfbc537 --- /dev/null +++ b/src/plugins/github/libs/redis.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +@Author : yanyongyu +@Date : 2021-03-14 10:53:42 +@LastEditors : yanyongyu +@LastEditTime : 2021-03-14 11:21:05 +@Description : None +@GitHub : https://github.com/yanyongyu +""" +__author__ = "yanyongyu" + +from typing import Optional + +from .. import redis + +REDIS_KEY_FORMAT = "github_bind_{group_id}" + + +def set_group_bind_repo(group_id: int, full_name: str) -> Optional[bool]: + return redis.set(REDIS_KEY_FORMAT.format(group_id=group_id), full_name) + + +def set_group_unbind_repo(group_id: int) -> int: + return redis.delete(REDIS_KEY_FORMAT.format(group_id=group_id)) + + +def exists_group_bind_repo(group_id: int) -> int: + return redis.exists(REDIS_KEY_FORMAT.format(group_id=group_id)) + + +def get_group_bind_repo(group_id: int) -> Optional[str]: + value = redis.get(REDIS_KEY_FORMAT.format(group_id=group_id)) + return value if value is None else value.decode() diff --git a/src/plugins/github/plugins/github_bind/__init__.py b/src/plugins/github/plugins/github_bind/__init__.py index 75a285f..9cc29a3 100644 --- a/src/plugins/github/plugins/github_bind/__init__.py +++ b/src/plugins/github/plugins/github_bind/__init__.py @@ -4,7 +4,7 @@ @Author : yanyongyu @Date : 2021-03-12 15:03:23 @LastEditors : yanyongyu -@LastEditTime : 2021-03-13 16:11:26 +@LastEditTime : 2021-03-14 11:01:36 @Description : None @GitHub : https://github.com/yanyongyu """ @@ -20,12 +20,10 @@ from nonebot.adapters.cqhttp import GROUP_ADMIN, GROUP_OWNER from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from ...libs.repo import get_repo -from ... import redis, github_config as config +from ... import github_config as config from src.libs.utils import allow_cancel, only_group +from ...libs.redis import set_group_bind_repo, set_group_unbind_repo, exists_group_bind_repo -print(__name__) - -REDIS_KEY_FORMAT = "github_bind_{group_id}" REPO_REGEX: str = r"^(?P[a-zA-Z0-9][a-zA-Z0-9\-]*)/(?P[a-zA-Z0-9_\-]+)$" bind = on_command("bind", @@ -61,7 +59,7 @@ async def process_repo(bot: Bot, event: GroupMessageEvent, state: T_State): await bind.reject(f"仓库名 {owner}/{repo_name} 不存在!请重新发送或取消") return - redis.set(REDIS_KEY_FORMAT.format(group_id=event.group_id), repo.full_name) + set_group_bind_repo(event.group_id, repo.full_name) await bind.finish(f"本群成功绑定仓库 {repo.full_name} !") @@ -77,8 +75,8 @@ unbind.__doc__ = """ @unbind.handle() async def process_unbind(bot: Bot, event: GroupMessageEvent): - if redis.exists(REDIS_KEY_FORMAT.format(group_id=event.group_id)): - redis.delete(REDIS_KEY_FORMAT.format(group_id=event.group_id)) + if exists_group_bind_repo(event.group_id): + set_group_unbind_repo(event.group_id) await unbind.finish("成功解绑仓库!") else: await unbind.finish("尚未绑定仓库!") diff --git a/src/plugins/github/plugins/github_issue/__init__.py b/src/plugins/github/plugins/github_issue/__init__.py index 51e7fe7..3600c41 100644 --- a/src/plugins/github/plugins/github_issue/__init__.py +++ b/src/plugins/github/plugins/github_issue/__init__.py @@ -4,7 +4,7 @@ @Author : yanyongyu @Date : 2021-03-09 15:15:02 @LastEditors : yanyongyu -@LastEditTime : 2021-03-13 16:10:12 +@LastEditTime : 2021-03-14 11:03:44 @Description : None @GitHub : https://github.com/yanyongyu """ @@ -20,13 +20,9 @@ from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent, MessageSegment, GroupMessageEvent from src.libs.utils import only_group -from ... import redis, github_config as config +from ... import github_config as config from ...libs.issue import get_issue, issue_to_image -from ..github_bind import REDIS_KEY_FORMAT, REPO_REGEX - -from .. import github_bind - -print(__name__, github_bind.__name__) +from ...libs.redis import get_group_bind_repo # allow using api without token try: @@ -35,6 +31,7 @@ except ImportError: get_user_token = None ISSUE_REGEX = r"^#(?P\d+)$" +REPO_REGEX: str = r"^(?P[a-zA-Z0-9][a-zA-Z0-9\-]*)/(?P[a-zA-Z0-9_\-]+)$" REPO_ISSUE_REGEX = r"^(?P[a-zA-Z0-9][a-zA-Z0-9\-]*)/(?P[a-zA-Z0-9_\-]+)#(?P\d+)$" issue = on_regex(REPO_ISSUE_REGEX, priority=config.github_command_priority) @@ -77,11 +74,11 @@ issue_short.__doc__ = """ async def handle_short(bot: Bot, event: GroupMessageEvent, state: T_State): group = state["_matched_dict"] number = int(group["number"]) - full_name = redis.get(REDIS_KEY_FORMAT.format(group_id=event.group_id)) + full_name = get_group_bind_repo(event.group_id) if not full_name: await issue_short.finish("此群尚未与仓库绑定!") return - match = re.match(REPO_REGEX, full_name.decode()) + match = re.match(REPO_REGEX, full_name) if not match: await issue_short.finish("绑定的仓库名不合法!请重新尝试绑定~") owner = match.group("owner")