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

View File

@ -10,25 +10,20 @@ from .config import Config, NoSuchSubscribeException
from .utils import parse_text from .utils import parse_text
from .send import send_msgs 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(), permission=GROUP_ADMIN | GROUP_OWNER, priority=5)
# add_sub = on_command("添加订阅", rule=to_me() & check_is_owner_or_admin, priority=5)
@add_sub.handle() @add_sub.handle()
async def _(bot: Bot, event: Event, state: T_State): async def _(bot: Bot, event: Event, state: T_State):
args = str(event.get_message()).strip().split() args = str(event.get_message()).strip().split()
if len(args) != 2: if len(args) != 2:
await add_sub.reject("使用方法为: 添加订阅 平台 id") await add_sub.finish("使用方法为: 添加订阅 平台 id")
return return
target_type, target = args 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: Config = Config()
config.add_subscribe(event.group_id, "group", target, name, target_type) config.add_subscribe(event.group_id, "group", target, name, target_type)
await add_sub.finish("成功添加 {}".format(name)) await add_sub.finish("成功添加 {}".format(name))
else: else:
await add_sub.reject("平台或者id不存在") await add_sub.finish("平台或者id不存在")
query_sub = on_command("查询订阅", rule=to_me(), priority=5) query_sub = on_command("查询订阅", rule=to_me(), priority=5)
@query_sub.handle() @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): async def _(bot: Bot, event: Event, state: T_State):
args = str(event.get_message()).strip().split() args = str(event.get_message()).strip().split()
if len(args) != 2: if len(args) != 2:
await del_sub.reject("使用方法为: 删除订阅 平台 id") await del_sub.finish("使用方法为: 删除订阅 平台 id")
return return
target_type, target = args target_type, target = args
config = Config() config = Config()
try: try:
config.del_subscribe(event.group_id, "group", target, target_type) config.del_subscribe(event.group_id, "group", target, target_type)
except NoSuchSubscribeException: except NoSuchSubscribeException:
await del_sub.reject('平台或id不存在') await del_sub.finish('平台或id不存在')
await del_sub.finish('删除成功') await del_sub.finish('删除成功')

View File

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

View File

@ -1,9 +1,14 @@
import time import time
import asyncio import asyncio
import nonebot
from nonebot import logger
from collections import defaultdict from collections import defaultdict
from .weibo import Weibo, get_user_info as weibo_user_info from .weibo import Weibo, get_user_info as weibo_user_info
from .bilibili import get_user_info as bilibili_user_info from .bilibili import Bilibili, get_user_info as bilibili_user_info
from .rss import get_rss_info as rss_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): async def check_sub_target(target_type, target):
if target_type == 'weibo': 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]: if (wait_time := time.time() - scheduler_last_run[target_type]) < platform_interval[target_type]:
await asyncio.sleep(wait_time) await asyncio.sleep(wait_time)
await fun() 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())

View File

@ -1,75 +1,22 @@
import nonebot
from .config import Config
from nonebot import require from nonebot import require
from nonebot import logger from .send import do_send_msgs
from .platform.bilibili import Bilibili from .platform.utils import fetch_and_send
from .platform.weibo import Weibo
from .platform.rss import Rss
from .post import Post
from .send import send_msgs, do_send_msgs
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
scheduler: AsyncIOScheduler = require('nonebot_plugin_apscheduler').scheduler 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) @scheduler.scheduled_job('interval', seconds=10)
async def weibo_check(): async def weibo_check():
target = config.get_next_target('weibo') await fetch_and_send('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())
@scheduler.scheduled_job('interval', seconds=10) @scheduler.scheduled_job('interval', seconds=10)
async def bilibili_check(): async def bilibili_check():
target = config.get_next_target('bilibili') await fetch_and_send('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())
@scheduler.scheduled_job('interval', seconds=30) @scheduler.scheduled_job('interval', seconds=30)
async def rss_check(): async def rss_check():
target = config.get_next_target('rss') await fetch_and_send('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())
@scheduler.scheduled_job('interval', seconds=1) @scheduler.scheduled_job('interval', seconds=1)
async def _(): async def _():

View File

@ -1,5 +1,6 @@
from nonebot.adapters.cqhttp import Bot from nonebot.adapters.cqhttp import Bot
import nonebot import nonebot
from nonebot import logger
import time import time
import asyncio import asyncio
@ -12,15 +13,21 @@ async def do_send_msgs():
if time.time() - LAST_SEND_TIME < 1.4: if time.time() - LAST_SEND_TIME < 1.4:
return return
if QUEUE: if QUEUE:
bot, user, user_type, msg = QUEUE.pop(0) bot, user, user_type, msg, retry_time = QUEUE.pop(0)
try:
if user_type == 'group': if user_type == 'group':
await bot.call_api('send_group_msg', group_id=user, message=msg) await bot.call_api('send_group_msg', group_id=user, message=msg)
elif user_type == 'private': elif user_type == 'private':
await bot.call_api('send_private_msg', user_id=user, message=msg) 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() LAST_SEND_TIME = time.time()
def send_msgs(bot, user, user_type, msgs): def send_msgs(bot, user, user_type, msgs):
for msg in msgs: for msg in msgs:
QUEUE.append((bot, user, user_type, msg)) QUEUE.append((bot, user, user_type, msg, 3))

View File

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