diff --git a/src/plugins/github/apis/auth.py b/src/plugins/github/apis/auth.py index 795534c..fc6894c 100644 --- a/src/plugins/github/apis/auth.py +++ b/src/plugins/github/apis/auth.py @@ -4,7 +4,7 @@ @Author : yanyongyu @Date : 2021-03-15 20:18:19 @LastEditors : yanyongyu -@LastEditTime : 2021-03-15 22:50:28 +@LastEditTime : 2021-06-14 01:25:35 @Description : None @GitHub : https://github.com/yanyongyu """ @@ -13,19 +13,22 @@ __author__ = "yanyongyu" import nonebot from fastapi import FastAPI -from ..libs.auth import _decode_state, get_token_by_code, set_user_token +try: + from ..libs.auth import _decode_state, get_token_by_code, set_user_token +except ImportError: + pass +else: -app: FastAPI = nonebot.get_driver().server_app + app: FastAPI = nonebot.get_driver().server_app - -@app.get("/api/github/auth") -async def auth(code: str, state: str): - try: - username = _decode_state(state) - except Exception: - return {"message": "invalid state"} - if not username: - return {"message": "oauth session expired"} - token = await get_token_by_code(code) - set_user_token(username, token) - return {"message": "ok"} + @app.get("/api/github/auth") + async def auth(code: str, state: str): + try: + username = _decode_state(state) + except Exception: + return {"message": "invalid state"} + if not username: + return {"message": "oauth session expired"} + token = await get_token_by_code(code) + set_user_token(username, token) + return {"message": "ok"} diff --git a/src/plugins/github/plugins/github_auth/__init__.py b/src/plugins/github/plugins/github_auth/__init__.py index 5696d6f..ed5cd2e 100644 --- a/src/plugins/github/plugins/github_auth/__init__.py +++ b/src/plugins/github/plugins/github_auth/__init__.py @@ -4,30 +4,34 @@ @Author : yanyongyu @Date : 2021-03-09 16:06:34 @LastEditors : yanyongyu -@LastEditTime : 2021-03-15 22:16:23 +@LastEditTime : 2021-06-14 01:28:43 @Description : None @GitHub : https://github.com/yanyongyu """ __author__ = "yanyongyu" +from nonebot.log import logger from nonebot import on_command from nonebot.adapters.cqhttp import Bot, PrivateMessageEvent, GroupMessageEvent -from ...libs.auth import get_auth_link from ... import github_config as config -auth = on_command("auth", priority=config.github_command_priority) -auth.__doc__ = """ -/auth -授权 github 账号 -""" +try: + from ...libs.auth import get_auth_link +except ImportError: + logger.warning("Plugin github auth is disabled!") +else: + auth = on_command("auth", priority=config.github_command_priority) + auth.__doc__ = """ + /auth + 授权 github 账号 + """ -@auth.handle() -async def handle_private(bot: Bot, event: PrivateMessageEvent): - await auth.finish("请前往以下链接进行授权:\n" + get_auth_link(event.get_user_id())) + @auth.handle() + async def handle_private(bot: Bot, event: PrivateMessageEvent): + await auth.finish("请前往以下链接进行授权:\n" + get_auth_link(event.get_user_id())) - -@auth.handle() -async def handle_group(bot: Bot, event: GroupMessageEvent): - await auth.finish("请私聊我并使用 /auth 命令授权你的 GitHub 账号") + @auth.handle() + async def handle_group(bot: Bot, event: GroupMessageEvent): + await auth.finish("请私聊我并使用 /auth 命令授权你的 GitHub 账号") diff --git a/src/plugins/github/plugins/github_subscribe/__init__.py b/src/plugins/github/plugins/github_subscribe/__init__.py index 76e4fd2..d236dfe 100644 --- a/src/plugins/github/plugins/github_subscribe/__init__.py +++ b/src/plugins/github/plugins/github_subscribe/__init__.py @@ -4,7 +4,7 @@ @Author : yanyongyu @Date : 2021-03-15 23:14:16 @LastEditors : yanyongyu -@LastEditTime : 2021-05-30 21:05:44 +@LastEditTime : 2021-06-14 01:27:27 @Description : None @GitHub : https://github.com/yanyongyu """ @@ -22,67 +22,71 @@ from nonebot.adapters.cqhttp import GROUP_ADMIN, GROUP_OWNER, PRIVATE_FRIEND from src.utils import allow_cancel from ... import github_config as config -from ...libs.auth import get_user_token -from ...libs.hook import create_hook, has_hook, create_hook_url -REPO_REGEX: str = r"^(?P[a-zA-Z0-9][a-zA-Z0-9\-]*)/(?P[a-zA-Z0-9_\-\.]+)$" +# disable plugin if token not provided +try: + from ...libs.auth import get_user_token + from ...libs.hook import create_hook, has_hook, create_hook_url +except ImportError: + logger.warning("Plugin github subscribe disabled!") +else: -subscribe = on_command("subscribe", - priority=config.github_command_priority, - permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | - PRIVATE_FRIEND) -subscribe.__doc__ = """ -/subscribe owner/repo -订阅仓库事件(需要权限) -""" + REPO_REGEX: str = r"^(?P[a-zA-Z0-9][a-zA-Z0-9\-]*)/(?P[a-zA-Z0-9_\-\.]+)$" -subscribe.args_parser(allow_cancel) + subscribe = on_command("subscribe", + priority=config.github_command_priority, + permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | + PRIVATE_FRIEND) + subscribe.__doc__ = """ + /subscribe owner/repo + 订阅仓库事件(需要权限) + """ + subscribe.args_parser(allow_cancel) -@subscribe.handle() -async def handle_arg(bot: Bot, event: MessageEvent, state: T_State): - arg = event.get_plaintext().strip() - if arg: - state["full_name"] = arg + @subscribe.handle() + async def handle_arg(bot: Bot, event: MessageEvent, state: T_State): + arg = event.get_plaintext().strip() + if arg: + state["full_name"] = arg + @subscribe.got("full_name", prompt="订阅仓库的全名?(e.g. owner/repo)") + async def process_repo(bot: Bot, event: MessageEvent, state: T_State): + name = state["full_name"] + matched = re.match(REPO_REGEX, name) + if not matched: + await subscribe.reject(f"仓库名 {name} 不合法!请重新发送或取消") + owner = matched.group("owner") + repo_name = matched.group("repo") -@subscribe.got("full_name", prompt="订阅仓库的全名?(e.g. owner/repo)") -async def process_repo(bot: Bot, event: MessageEvent, state: T_State): - name = state["full_name"] - matched = re.match(REPO_REGEX, name) - if not matched: - await subscribe.reject(f"仓库名 {name} 不合法!请重新发送或取消") - owner = matched.group("owner") - repo_name = matched.group("repo") - - token = get_user_token(event.get_user_id()) - if not token: - await subscribe.finish(f"请先使用 /auth 命令授权你的 GitHub 账号") - return - - try: - if not await has_hook(f"{owner}/{repo_name}", token): - url = create_hook_url(f"{owner}/{repo_name}") - await create_hook( - f"{owner}/{repo_name}", { - "url": url, - "content_type": "json", - "insecure_ssl": not config.github_self_ssl - }, token, ["issues", "issue_comment", "pull_request"]) - except TimeoutException: - await subscribe.finish(f"获取仓库数据超时!请尝试重试") - return - except HTTPStatusError as e: - if e.response.status_code == 403: - await subscribe.finish(f"你无权操作仓库 {owner}/{repo_name}!") + token = get_user_token(event.get_user_id()) + if not token: + await subscribe.finish(f"请先使用 /auth 命令授权你的 GitHub 账号") return - elif e.response.status_code == 404: - await subscribe.reject(f"仓库名 {owner}/{repo_name} 不存在!请重新发送或取消") - return - logger.opt(colors=True, - exception=e).error(f"github_subscribe: create_hook") - await subscribe.finish("订阅仓库时发生错误,请联系开发者或重试") - return - # TODO: subscribe repo with (repo, user, bot) info - await subscribe.finish(f"成功订阅仓库 {owner}/{repo_name}!") + try: + if not await has_hook(f"{owner}/{repo_name}", token): + url = create_hook_url(f"{owner}/{repo_name}") + await create_hook( + f"{owner}/{repo_name}", { + "url": url, + "content_type": "json", + "insecure_ssl": not config.github_self_ssl + }, token, ["issues", "issue_comment", "pull_request"]) + except TimeoutException: + await subscribe.finish(f"获取仓库数据超时!请尝试重试") + return + except HTTPStatusError as e: + if e.response.status_code == 403: + await subscribe.finish(f"你无权操作仓库 {owner}/{repo_name}!") + return + elif e.response.status_code == 404: + await subscribe.reject(f"仓库名 {owner}/{repo_name} 不存在!请重新发送或取消") + return + logger.opt(colors=True, + exception=e).error(f"github_subscribe: create_hook") + await subscribe.finish("订阅仓库时发生错误,请联系开发者或重试") + return + + # TODO: subscribe repo with (repo, user, bot) info + await subscribe.finish(f"成功订阅仓库 {owner}/{repo_name}!")