From 3adb928948583db8ee01752c487fca3352efcafc Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Mon, 8 Feb 2021 19:25:22 +0800 Subject: [PATCH] optimise code --- src/plugins/hk_reporter/config_manager.py | 15 ++--- src/plugins/hk_reporter/platform/__init__.py | 4 ++ src/plugins/hk_reporter/platform/utils.py | 33 +++++++++- src/plugins/hk_reporter/scheduler.py | 65 ++------------------ src/plugins/hk_reporter/send.py | 19 ++++-- src/plugins/hk_reporter/utils.py | 1 + 6 files changed, 60 insertions(+), 77 deletions(-) diff --git a/src/plugins/hk_reporter/config_manager.py b/src/plugins/hk_reporter/config_manager.py index b69a937..3fcbc7b 100644 --- a/src/plugins/hk_reporter/config_manager.py +++ b/src/plugins/hk_reporter/config_manager.py @@ -10,25 +10,20 @@ from .config import Config, NoSuchSubscribeException from .utils import parse_text from .send import send_msgs -async def check_is_owner_or_admin(bot: Bot, event: Event): - return await (GROUP_ADMIN | GROUP_OWNER)(bot, event) - -# add_sub = on_command("添加订阅", rule=to_me(), permission=Permission(check_is_owner_or_admin), priority=5) add_sub = on_command("添加订阅", rule=to_me(), permission=GROUP_ADMIN | GROUP_OWNER, priority=5) -# add_sub = on_command("添加订阅", rule=to_me() & check_is_owner_or_admin, priority=5) @add_sub.handle() async def _(bot: Bot, event: Event, state: T_State): args = str(event.get_message()).strip().split() if len(args) != 2: - await add_sub.reject("使用方法为: 添加订阅 平台 id") + await add_sub.finish("使用方法为: 添加订阅 平台 id") return target_type, target = args - if (name := await check_sub_target(target_type, target)): + if name := await check_sub_target(target_type, target): config: Config = Config() config.add_subscribe(event.group_id, "group", target, name, target_type) await add_sub.finish("成功添加 {}".format(name)) else: - await add_sub.reject("平台或者id不存在") + await add_sub.finish("平台或者id不存在") query_sub = on_command("查询订阅", rule=to_me(), priority=5) @query_sub.handle() @@ -46,13 +41,13 @@ del_sub = on_command("删除订阅", rule=to_me(), permission=GROUP_ADMIN | GROU async def _(bot: Bot, event: Event, state: T_State): args = str(event.get_message()).strip().split() if len(args) != 2: - await del_sub.reject("使用方法为: 删除订阅 平台 id") + await del_sub.finish("使用方法为: 删除订阅 平台 id") return target_type, target = args config = Config() try: config.del_subscribe(event.group_id, "group", target, target_type) except NoSuchSubscribeException: - await del_sub.reject('平台或id不存在') + await del_sub.finish('平台或id不存在') await del_sub.finish('删除成功') diff --git a/src/plugins/hk_reporter/platform/__init__.py b/src/plugins/hk_reporter/platform/__init__.py index e69de29..4c591db 100644 --- a/src/plugins/hk_reporter/platform/__init__.py +++ b/src/plugins/hk_reporter/platform/__init__.py @@ -0,0 +1,4 @@ +from .bilibili import Bilibili +from .rss import Rss +from .weibo import Weibo +from .utils import check_sub_target diff --git a/src/plugins/hk_reporter/platform/utils.py b/src/plugins/hk_reporter/platform/utils.py index 7e4d78e..215cae4 100644 --- a/src/plugins/hk_reporter/platform/utils.py +++ b/src/plugins/hk_reporter/platform/utils.py @@ -1,9 +1,14 @@ import time import asyncio +import nonebot +from nonebot import logger from collections import defaultdict from .weibo import Weibo, get_user_info as weibo_user_info -from .bilibili import get_user_info as bilibili_user_info -from .rss import get_rss_info as rss_info +from .bilibili import Bilibili, get_user_info as bilibili_user_info +from .rss import Rss, get_rss_info as rss_info +from ..config import Config +from ..post import Post +from ..send import send_msgs async def check_sub_target(target_type, target): if target_type == 'weibo': @@ -24,3 +29,27 @@ async def scheduler(fun, target_type): if (wait_time := time.time() - scheduler_last_run[target_type]) < platform_interval[target_type]: await asyncio.sleep(wait_time) await fun() + +async def fetch_and_send(target_type: str): + config = Config() + platform_manager = { + 'bilibili': Bilibili(), + 'weibo': Weibo(), + 'rss': Rss() + } + target = config.get_next_target(target_type) + if not target: + return + logger.debug('try to fecth new posts from {}, target: {}'.format(target_type, target)) + new_posts: list[Post] = await platform_manager[target_type].fetch_new_post(target) + send_list = config.target_user_cache[target_type][target] + bot_list = list(nonebot.get_bots().values()) + bot = bot_list[0] if bot_list else None + for new_post in new_posts: + logger.warning('get new {} dynamic: {}'.format(target_type, new_post.url)) + logger.warning(new_post) + if not bot: + logger.warning('no bot connected') + else: + for to_send in send_list: + send_msgs(bot, to_send['user'], to_send['user_type'], await new_post.generate_messages()) diff --git a/src/plugins/hk_reporter/scheduler.py b/src/plugins/hk_reporter/scheduler.py index e89e5b2..0e36534 100644 --- a/src/plugins/hk_reporter/scheduler.py +++ b/src/plugins/hk_reporter/scheduler.py @@ -1,75 +1,22 @@ -import nonebot -from .config import Config from nonebot import require -from nonebot import logger -from .platform.bilibili import Bilibili -from .platform.weibo import Weibo -from .platform.rss import Rss -from .post import Post -from .send import send_msgs, do_send_msgs +from .send import do_send_msgs +from .platform.utils import fetch_and_send from apscheduler.schedulers.asyncio import AsyncIOScheduler scheduler: AsyncIOScheduler = require('nonebot_plugin_apscheduler').scheduler -config: Config = Config() -weibo: Weibo = Weibo() -bilibili: Bilibili = Bilibili() -rss: Rss = Rss() @scheduler.scheduled_job('interval', seconds=10) async def weibo_check(): - target = config.get_next_target('weibo') - if not target: - return - logger.debug('try to fecth new posts from weibo, target: {}'.format(target)) - new_weibos: list[Post] = await weibo.fetch_new_post(target) - send_list = config.target_user_cache['weibo'][target] - bot_list = list(nonebot.get_bots().values()) - bot = bot_list[0] if bot_list else None - for new_weibo in new_weibos: - logger.warning('get new weibo post: {}'.format(new_weibo.url)) - if not bot: - logger.warning('no bot connected') - else: - for to_send in send_list: - send_msgs(bot, to_send['user'], to_send['user_type'], await new_weibo.generate_messages()) + await fetch_and_send('weibo') @scheduler.scheduled_job('interval', seconds=10) async def bilibili_check(): - target = config.get_next_target('bilibili') - if not target: - return - logger.debug('try to fecth new posts from bilibili, target: {}'.format(target)) - new_posts: list[Post] = await bilibili.fetch_new_post(target) - send_list = config.target_user_cache['bilibili'][target] - bot_list = list(nonebot.get_bots().values()) - bot = bot_list[0] if bot_list else None - for new_post in new_posts: - logger.warning('get new bilibili dynamic: {}'.format(new_post.url)) - logger.warning(new_post) - if not bot: - logger.warning('no bot connected') - else: - for to_send in send_list: - send_msgs(bot, to_send['user'], to_send['user_type'], await new_post.generate_messages()) + await fetch_and_send('bilibili') + @scheduler.scheduled_job('interval', seconds=30) async def rss_check(): - target = config.get_next_target('rss') - if not target: - return - logger.debug('try to fecth new posts from rss, target: {}'.format(target)) - new_posts: list[Post] = await rss.fetch_new_post(target) - send_list = config.target_user_cache['rss'][target] - bot_list = list(nonebot.get_bots().values()) - bot = bot_list[0] if bot_list else None - for new_post in new_posts: - logger.warning('get new rss entry: {}'.format(new_post.url)) - logger.warning(new_post) - if not bot: - logger.warning('no bot connected') - else: - for to_send in send_list: - send_msgs(bot, to_send['user'], to_send['user_type'], await new_post.generate_messages()) + await fetch_and_send('rss') @scheduler.scheduled_job('interval', seconds=1) async def _(): diff --git a/src/plugins/hk_reporter/send.py b/src/plugins/hk_reporter/send.py index 8362c91..4401842 100644 --- a/src/plugins/hk_reporter/send.py +++ b/src/plugins/hk_reporter/send.py @@ -1,5 +1,6 @@ from nonebot.adapters.cqhttp import Bot import nonebot +from nonebot import logger import time import asyncio @@ -12,15 +13,21 @@ async def do_send_msgs(): if time.time() - LAST_SEND_TIME < 1.4: return if QUEUE: - bot, user, user_type, msg = QUEUE.pop(0) - if user_type == 'group': - await bot.call_api('send_group_msg', group_id=user, message=msg) - elif user_type == 'private': - await bot.call_api('send_private_msg', user_id=user, message=msg) + bot, user, user_type, msg, retry_time = QUEUE.pop(0) + try: + if user_type == 'group': + await bot.call_api('send_group_msg', group_id=user, message=msg) + elif user_type == 'private': + await bot.call_api('send_private_msg', user_id=user, message=msg) + except: + if retry_time > 0: + QUEUE.insert(0, (bot, user, user_type, msg, retry_time - 1)) + else: + logger.warning('send msg err {}'.format(msg)) LAST_SEND_TIME = time.time() def send_msgs(bot, user, user_type, msgs): for msg in msgs: - QUEUE.append((bot, user, user_type, msg)) + QUEUE.append((bot, user, user_type, msg, 3)) diff --git a/src/plugins/hk_reporter/utils.py b/src/plugins/hk_reporter/utils.py index fafba03..02a4d1f 100644 --- a/src/plugins/hk_reporter/utils.py +++ b/src/plugins/hk_reporter/utils.py @@ -58,3 +58,4 @@ async def parse_text(text: str): else: return text +