diff --git a/StarRailUID/starrailuid_resin/__init__.py b/StarRailUID/starrailuid_resin/__init__.py index 80c6309..d23bd55 100644 --- a/StarRailUID/starrailuid_resin/__init__.py +++ b/StarRailUID/starrailuid_resin/__init__.py @@ -1,23 +1,19 @@ -# import asyncio +import asyncio from gsuid_core.sv import SV from gsuid_core.bot import Bot - -# from gsuid_core.gss import gss +from gsuid_core.gss import gss from gsuid_core.models import Event +from gsuid_core.aps import scheduler +from gsuid_core.logger import logger +from gsuid_core.segment import MessageSegment from ..utils.convert import get_uid - -# from .notice import get_notice_list +from .notice import get_notice_list from .resin_text import get_resin_text from ..utils.error_reply import UID_HINT from .draw_resin_card import get_resin_img -# from gsuid_core.aps import scheduler -# from gsuid_core.logger import logger -# from gsuid_core.segment import MessageSegment - - sv_get_resin = SV('sr查询体力') sv_get_resin_admin = SV('sr强制推送', pm=1) @@ -34,36 +30,36 @@ async def send_daily_info(bot: Bot, ev: Event): await bot.send(im) -# @sv_get_resin_admin.on_fullmatch(('sr强制推送体力提醒')) -# async def force_notice_job(bot: Bot, ev: Event): -# await bot.logger.info('开始执行[sr强制推送体力信息]') -# await notice_job() +@sv_get_resin_admin.on_fullmatch(('sr强制推送体力提醒')) +async def force_notice_job(bot: Bot, ev: Event): + await bot.logger.info('开始执行[sr强制推送体力信息]') + await notice_job() -# @scheduler.scheduled_job('cron', minute='*/30') -# async def notice_job(): -# result = await get_notice_list() -# logger.info('[推送检查]完成!等待消息推送中...') -# logger.debug(result) -# -# # 执行私聊推送 -# for bot_id in result: -# for BOT_ID in gss.active_bot: -# bot = gss.active_bot[BOT_ID] -# for user_id in result[bot_id]['direct']: -# msg = result[bot_id]['direct'][user_id] -# await bot.target_send(msg, 'direct', user_id, bot_id, '', '') -# await asyncio.sleep(0.5) -# logger.info('[推送检查] 私聊推送完成') -# for gid in result[bot_id]['group']: -# msg_list = [] -# for user_id in result[bot_id]['group'][gid]: -# msg_list.append(MessageSegment.at(user_id)) -# msg = result[bot_id]['group'][gid][user_id] -# msg_list.append(MessageSegment.text(msg)) -# await bot.target_send(msg_list, 'group', gid, bot_id, '', '') -# await asyncio.sleep(0.5) -# logger.info('[推送检查] 群聊推送完成') +@scheduler.scheduled_job('cron', minute='*/30') +async def notice_job(): + result = await get_notice_list() + logger.info('[推送检查]完成!等待消息推送中...') + logger.debug(result) + + # 执行私聊推送 + for bot_id in result: + for BOT_ID in gss.active_bot: + bot = gss.active_bot[BOT_ID] + for user_id in result[bot_id]['direct']: + msg = result[bot_id]['direct'][user_id] + await bot.target_send(msg, 'direct', user_id, bot_id, '', '') + await asyncio.sleep(0.5) + logger.info('[推送检查] 私聊推送完成') + for gid in result[bot_id]['group']: + msg_list = [] + for user_id in result[bot_id]['group'][gid]: + msg_list.append(MessageSegment.at(user_id)) + msg = result[bot_id]['group'][gid][user_id] + msg_list.append(MessageSegment.text(msg)) + await bot.target_send(msg_list, 'group', gid, bot_id, '', '') + await asyncio.sleep(0.5) + logger.info('[推送检查] 群聊推送完成') @sv_get_resin.on_fullmatch(('sr每日', 'srmr', 'sr实时便笺', 'sr便笺', 'sr便签')) diff --git a/StarRailUID/starrailuid_resin/draw_resin_card.py b/StarRailUID/starrailuid_resin/draw_resin_card.py index bcdc785..fc28413 100644 --- a/StarRailUID/starrailuid_resin/draw_resin_card.py +++ b/StarRailUID/starrailuid_resin/draw_resin_card.py @@ -12,6 +12,7 @@ from ..utils.mys_api import mys_api from ..utils.image.convert import convert_img from ..sruid_utils.api.mys.models import Expedition from ..utils.fonts.starrail_fonts import ( + sr_font_22, sr_font_24, sr_font_26, sr_font_36, @@ -55,35 +56,44 @@ async def _draw_task_img( index: int, char: Expedition, ): - expedition_name = char['name'] - remaining_time: str = seconds2hours(char['remaining_time']) - note_travel_img = note_travel_bg.copy() - for i in range(2): - avatar_url = char['avatars'][i] - image = await download_image(avatar_url) - char_pic = image.convert('RGBA').resize( - (40, 40), Image.Resampling.LANCZOS # type: ignore + if char is not None: + expedition_name = char['name'] + remaining_time: str = seconds2hours(char['remaining_time']) + note_travel_img = note_travel_bg.copy() + for i in range(2): + avatar_url = char['avatars'][i] + image = await download_image(avatar_url) + char_pic = image.convert('RGBA').resize( + (40, 40), Image.Resampling.LANCZOS # type: ignore + ) + note_travel_img.paste(char_pic, (495 + 68 * i, 20), char_pic) + img.paste(note_travel_img, (0, 790 + index * 80), note_travel_img) + if char['status'] == 'Finished': + status_mark = '待收取' + else: + status_mark = str(remaining_time) + img_draw.text( + (120, 830 + index * 80), + expedition_name, + font=sr_font_22, + fill=white_color, + anchor='lm', + ) + img_draw.text( + (380, 830 + index * 80), + status_mark, + font=sr_font_22, + fill=white_color, + anchor='mm', ) - note_travel_img.paste(char_pic, (495 + 68 * i, 20), char_pic) - img.paste(note_travel_img, (0, 790 + index * 80), note_travel_img) - if char['status'] == 'Finished': - status_mark = '待收取' else: - status_mark = str(remaining_time) - img_draw.text( - (120, 830 + index * 80), - expedition_name, - font=sr_font_24, - fill=white_color, - anchor='lm', - ) - img_draw.text( - (365, 830 + index * 80), - status_mark, - font=sr_font_24, - fill=white_color, - anchor='mm', - ) + img_draw.text( + (120, 830 + index * 80), + '等待加入探索队列...', + font=sr_font_22, + fill=white_color, + anchor='lm', + ) async def get_resin_img(bot_id: str, user_id: str): @@ -119,7 +129,7 @@ async def get_resin_img(bot_id: str, user_id: str): async def _draw_all_resin_img(img: Image.Image, uid: str, index: int): resin_img = await draw_resin_img(uid) - img.paste(resin_img, (500 * index, 0), resin_img) + img.paste(resin_img, (700 * index, 0), resin_img) async def seconds2hours_zhcn(seconds: int) -> str: @@ -176,8 +186,13 @@ async def draw_resin_img(sr_uid: str) -> Image.Image: # 派遣 task_task = [] - for index, char in enumerate(daily_data['expeditions']): - task_task.append(_draw_task_img(img, img_draw, index, char)) + for i in range(4): + char = ( + daily_data['expeditions'][i] + if i < len(daily_data['expeditions']) + else None + ) + task_task.append(_draw_task_img(img, img_draw, i, char)) await asyncio.gather(*task_task) # 绘制树脂圆环 diff --git a/StarRailUID/starrailuid_resin/notice.py b/StarRailUID/starrailuid_resin/notice.py new file mode 100644 index 0000000..b4dc139 --- /dev/null +++ b/StarRailUID/starrailuid_resin/notice.py @@ -0,0 +1,106 @@ +from typing import Dict + +from gsuid_core.gss import gss +from gsuid_core.logger import logger + +from ..utils.api import get_sqla +from ..utils.mys_api import mys_api +from ..sruid_utils.api.mys.models import DailyNoteData +from ....GenshinUID.GenshinUID.genshinuid_config.gs_config import gsconfig + +MR_NOTICE = '\n可发送[srmr]或者[sr每日]来查看更多信息!\n' + +NOTICE = { + 'resin': f'你的开拓力快满啦!{MR_NOTICE}', + 'go': f'你有派遣信息即将可收取!{MR_NOTICE}', +} + + +async def get_notice_list() -> Dict[str, Dict[str, Dict]]: + msg_dict: Dict[str, Dict[str, Dict]] = {} + for bot_id in gss.active_bot: + sqla = get_sqla(bot_id) + user_list = await sqla.get_all_push_user_list() + for user in user_list: + raw_data = await mys_api.get_daily_data(user.sr_uid) + if isinstance(raw_data, int): + logger.error(f'[sr推送提醒]获取{user.sr_uid}的数据失败!') + continue + push_data = await sqla.select_push_data(user.sr_uid) + msg_dict = await all_check( + user.bot_id, + raw_data, + push_data.__dict__, + msg_dict, + user.user_id, + user.sr_uid, + ) + return msg_dict + + +async def all_check( + bot_id: str, + raw_data: DailyNoteData, + push_data: Dict, + msg_dict: Dict[str, Dict[str, Dict]], + user_id: str, + uid: str, +) -> Dict[str, Dict[str, Dict]]: + sqla = get_sqla(bot_id) + for mode in NOTICE.keys(): + # 检查条件 + if push_data[f'{mode}_is_push'] == 'on': + if gsconfig.get_config('CrazyNotice').data: + if not await check(mode, raw_data, push_data[f'{mode}_value']): + await sqla.update_push_data( + uid, {f'{mode}_is_push': 'off'} + ) + continue + # 准备推送 + if await check(mode, raw_data, push_data[f'{mode}_value']): + if push_data[f'{mode}_push'] == 'off': + pass + # on 推送到私聊 + else: + # 初始化 + if bot_id not in msg_dict: + msg_dict[bot_id] = {'direct': {}, 'group': {}} + + if push_data[f'{mode}_push'] == 'on': + # 添加私聊信息 + if user_id not in msg_dict[bot_id]['direct']: + msg_dict[bot_id]['direct'][user_id] = NOTICE[mode] + else: + msg_dict[bot_id]['direct'][user_id] += NOTICE[mode] + await sqla.update_push_data(uid, {f'{mode}_is_push': 'on'}) + # 群号推送到群聊 + else: + # 初始化 + gid = push_data[f'{mode}_push'] + if gid not in msg_dict[bot_id]['group']: + msg_dict[bot_id]['group'][gid] = {} + + if user_id not in msg_dict[bot_id]['group'][gid]: + msg_dict[bot_id]['group'][gid][user_id] = NOTICE[mode] + else: + msg_dict[bot_id]['group'][gid][user_id] += NOTICE[mode] + await sqla.update_push_data(uid, {f'{mode}_is_push': 'on'}) + return msg_dict + + +async def check(mode: str, data: DailyNoteData, limit: int) -> bool: + if mode == 'resin': + if data['current_stamina'] >= limit: + return True + elif data['current_stamina'] >= data['max_stamina']: + return True + else: + return False + if mode == 'go': + for i in data['expeditions']: + if i['status'] == 'Ongoing': + if int(i['remaining_time']) <= limit * 60: + return True + else: + return True + return False