optimise code

This commit is contained in:
felinae98 2021-02-08 19:25:22 +08:00
parent 5a33d3740d
commit 3adb928948
No known key found for this signature in database
GPG Key ID: 00C8B010587FF610
6 changed files with 60 additions and 77 deletions

@ -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('删除成功')

@ -0,0 +1,4 @@
from .bilibili import Bilibili
from .rss import Rss
from .weibo import Weibo
from .utils import check_sub_target

@ -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())

@ -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 _():

@ -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))

@ -58,3 +58,4 @@ async def parse_text(text: str):
else:
return text