diff --git a/GenshinUID/genshinuid_config/config_default.py b/GenshinUID/genshinuid_config/config_default.py index 04ecad99..da3bf19d 100644 --- a/GenshinUID/genshinuid_config/config_default.py +++ b/GenshinUID/genshinuid_config/config_default.py @@ -29,6 +29,9 @@ CONIFG_DEFAULT: Dict[str, GSC] = { 'BBSTaskTime': GsListStrConfig( '每晚米游社任务时间设置', '每晚米游社任务时间设置(时,分)', ['1', '41'] ), + 'GetDrawTaskTime': GsListStrConfig( + '每晚留影叙佳期任务时间设置', '每晚留影叙佳期任务时间设置(时,分)', ['3', '25'] + ), 'MhyBBSCoinReport': GsBoolConfig( '米游币推送', '开启后会私聊每个用户当前米游币任务完成情况', @@ -59,6 +62,11 @@ CONIFG_DEFAULT: Dict[str, GSC] = { '开启后每晚01:16将开始自动米游币任务', True, ), + 'SchedGetDraw': GsBoolConfig( + '定时留影叙佳期', + '开启后每晚03:25将开始自动米游币任务', + True, + ), 'CrazyNotice': GsBoolConfig( '催命模式', '开启后当达到推送阈值将会一直推送', diff --git a/GenshinUID/genshinuid_config/set_config.py b/GenshinUID/genshinuid_config/set_config.py index a4b5745e..819b510f 100644 --- a/GenshinUID/genshinuid_config/set_config.py +++ b/GenshinUID/genshinuid_config/set_config.py @@ -16,6 +16,7 @@ PRIV_MAP = { '自动签到': 'sign', '自动米游币': 'bbs', '推送': 'push', + '自动留影叙佳期': 'draw', } diff --git a/GenshinUID/genshinuid_postdraw/__init__.py b/GenshinUID/genshinuid_postdraw/__init__.py index 92d6dc71..ae9dd6ef 100644 --- a/GenshinUID/genshinuid_postdraw/__init__.py +++ b/GenshinUID/genshinuid_postdraw/__init__.py @@ -1,12 +1,18 @@ from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event +from gsuid_core.aps import scheduler from gsuid_core.utils.error_reply import UID_HINT from .get_draw import post_my_draw from ..utils.database import get_sqla +from .daily_check_draw import daily_get_draw +from ..genshinuid_config.gs_config import gsconfig sv_post_my_draw = SV('留影叙佳期') +sv_post_my_draw_admin = SV('自动留影叙佳期', pm=1) + +DRAW_TIME = gsconfig.get_config('GetDrawTaskTime').data # 群聊内 每月统计 功能 @@ -17,3 +23,15 @@ async def send_postdraw_data(bot: Bot, ev: Event): if uid is None: return UID_HINT await bot.send(await post_my_draw(uid)) + + +@sv_post_my_draw_admin.on_fullmatch(('强制进行自动留影叙佳期')) +async def send_all_postdraw_data(bot: Bot, ev: Event): + await daily_get_draw() + + +# 执行自动留影叙佳期 +@scheduler.scheduled_job('cron', hour=DRAW_TIME[0], minute=DRAW_TIME[1]) +async def sign_at_night(): + if gsconfig.get_config('SchedGetDraw').data: + await daily_get_draw() diff --git a/GenshinUID/genshinuid_postdraw/daily_check_draw.py b/GenshinUID/genshinuid_postdraw/daily_check_draw.py new file mode 100644 index 00000000..07a65fe2 --- /dev/null +++ b/GenshinUID/genshinuid_postdraw/daily_check_draw.py @@ -0,0 +1,117 @@ +import random +import asyncio +import datetime +from copy import deepcopy +from typing import List, Optional + +from gsuid_core.gss import gss +from gsuid_core.logger import logger +from gsuid_core.utils.api.mys.models import RoleCalendar, RolesCalendar + +from .get_draw import post_my_draw +from ..utils.mys_api import mys_api +from ..utils.database import get_sqla + +private_msg_list = {} +group_msg_list = {} +calendar: RolesCalendar = None +is_got: Optional[bool] = None +today = datetime.datetime.now().day + + +async def check_today(uid: str) -> bool: + global calendar + global is_got + global today + if calendar is None: + calendar = await mys_api.get_draw_calendar(uid) + + now = datetime.datetime.now() + + if today == now.day and is_got is not None: + return is_got + else: + today = now.day + + month = now.month + calendar_role: List[RoleCalendar] = calendar['calendar_role_infos'][ + str(month) + ]['calendar_role'] + + assert isinstance(calendar_role, List) + + for char in calendar_role: + char_day = char['role_birthday'] + day = now.day + if char_day == f'{month}/{day}': + is_got = True + logger.info('[自动留影叙佳期] 今日有可获取角色,开启任务...') + break + else: + is_got = False + logger.info('[自动留影叙佳期] 今日无可获取角色,自动取消任务...') + + return is_got + + +async def single_get_draw(bot_id: str, uid: str, gid: str, qid: str): + if is_got is not None and not is_got: + return + elif not await check_today(uid): + return + + im = await post_my_draw(uid) + + if '没有需要获取' in im: + return + + if gid == 'on': + if qid not in private_msg_list: + private_msg_list[qid] = [] + private_msg_list[qid].append({'bot_id': bot_id, 'uid': uid, 'msg': im}) + else: + # 向群消息推送列表添加这个群 + if gid not in group_msg_list: + group_msg_list[gid] = { + 'bot_id': bot_id, + 'success': 0, + 'failed': 0, + } + + # 如果失败, 则添加到推送列表 + if isinstance(im, bytes): + group_msg_list[gid]['failed'] += 1 + else: + group_msg_list[gid]['success'] += 1 + + +async def daily_get_draw(): + tasks = [] + for bot_id in gss.active_bot: + sqla = get_sqla(bot_id) + user_list = await sqla.get_all_user() + for user in user_list: + if user.draw_switch != 'off': + tasks.append( + single_get_draw( + user.bot_id, user.uid, user.sign_switch, user.user_id + ) + ) + if len(tasks) >= 1: + await asyncio.gather(*tasks) + delay = 50 + random.randint(3, 45) + logger.info(f'[自动留影叙佳期] 已完成{len(tasks)}个用户, 等待{delay}秒进行下一次获取') + tasks.clear() + await asyncio.sleep(delay) + + await asyncio.gather(*tasks) + tasks.clear() + result = { + 'private_msg_list': deepcopy(private_msg_list), + 'group_msg_list': deepcopy(group_msg_list), + } + private_msg_list.clear() + group_msg_list.clear() + logger.info(result) + logger.info('[自动留影叙佳期] 已结束') + return result diff --git a/GenshinUID/genshinuid_postdraw/get_draw.py b/GenshinUID/genshinuid_postdraw/get_draw.py index c68131c7..4e690a7a 100644 --- a/GenshinUID/genshinuid_postdraw/get_draw.py +++ b/GenshinUID/genshinuid_postdraw/get_draw.py @@ -5,15 +5,12 @@ from gsuid_core.utils.error_reply import get_error_img from ..utils.mys_api import mys_api -async def post_my_draw(uid) -> Union[str, bytes]: +async def post_my_draw(uid: str) -> Union[str, bytes]: bs_index = await mys_api.get_bs_index(uid) - calendar = await mys_api.get_draw_calendar(uid) # 错误检查 if isinstance(bs_index, int): return await get_error_img(bs_index) - if isinstance(calendar, int): - return await get_error_img(calendar) im_list = [] @@ -32,7 +29,7 @@ async def post_my_draw(uid) -> Union[str, bytes]: ) im_list.append(message) else: - im_list.append(f'UID{uid}成功获取{role["name"]}的画片!') + im_list.append(f'[留影叙佳期] UID{uid}成功获取{role["name"]}的画片!') if im_list == []: - im_list.append(f'UID{uid}没有需要获取的画片了~') + im_list.append(f'[留影叙佳期]UID{uid}没有需要获取的画片了~') return '\n'.join(im_list)