新增gs开启自动留影叙佳期 (#563)

This commit is contained in:
Wuyi无疑 2023-06-30 00:34:19 +08:00
parent db543a46da
commit 7a2a123b7f
5 changed files with 147 additions and 6 deletions

View File

@ -29,6 +29,9 @@ CONIFG_DEFAULT: Dict[str, GSC] = {
'BBSTaskTime': GsListStrConfig( 'BBSTaskTime': GsListStrConfig(
'每晚米游社任务时间设置', '每晚米游社任务时间设置(时,分)', ['1', '41'] '每晚米游社任务时间设置', '每晚米游社任务时间设置(时,分)', ['1', '41']
), ),
'GetDrawTaskTime': GsListStrConfig(
'每晚留影叙佳期任务时间设置', '每晚留影叙佳期任务时间设置(时,分)', ['3', '25']
),
'MhyBBSCoinReport': GsBoolConfig( 'MhyBBSCoinReport': GsBoolConfig(
'米游币推送', '米游币推送',
'开启后会私聊每个用户当前米游币任务完成情况', '开启后会私聊每个用户当前米游币任务完成情况',
@ -59,6 +62,11 @@ CONIFG_DEFAULT: Dict[str, GSC] = {
'开启后每晚01:16将开始自动米游币任务', '开启后每晚01:16将开始自动米游币任务',
True, True,
), ),
'SchedGetDraw': GsBoolConfig(
'定时留影叙佳期',
'开启后每晚03:25将开始自动米游币任务',
True,
),
'CrazyNotice': GsBoolConfig( 'CrazyNotice': GsBoolConfig(
'催命模式', '催命模式',
'开启后当达到推送阈值将会一直推送', '开启后当达到推送阈值将会一直推送',

View File

@ -16,6 +16,7 @@ PRIV_MAP = {
'自动签到': 'sign', '自动签到': 'sign',
'自动米游币': 'bbs', '自动米游币': 'bbs',
'推送': 'push', '推送': 'push',
'自动留影叙佳期': 'draw',
} }

View File

@ -1,12 +1,18 @@
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.aps import scheduler
from gsuid_core.utils.error_reply import UID_HINT from gsuid_core.utils.error_reply import UID_HINT
from .get_draw import post_my_draw from .get_draw import post_my_draw
from ..utils.database import get_sqla 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 = 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: if uid is None:
return UID_HINT return UID_HINT
await bot.send(await post_my_draw(uid)) 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()

View File

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

View File

@ -5,15 +5,12 @@ from gsuid_core.utils.error_reply import get_error_img
from ..utils.mys_api import mys_api 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) bs_index = await mys_api.get_bs_index(uid)
calendar = await mys_api.get_draw_calendar(uid)
# 错误检查 # 错误检查
if isinstance(bs_index, int): if isinstance(bs_index, int):
return await get_error_img(bs_index) return await get_error_img(bs_index)
if isinstance(calendar, int):
return await get_error_img(calendar)
im_list = [] im_list = []
@ -32,7 +29,7 @@ async def post_my_draw(uid) -> Union[str, bytes]:
) )
im_list.append(message) im_list.append(message)
else: else:
im_list.append(f'UID{uid}成功获取{role["name"]}的画片!') im_list.append(f'[留影叙佳期] UID{uid}成功获取{role["name"]}的画片!')
if im_list == []: if im_list == []:
im_list.append(f'UID{uid}没有需要获取的画片了~') im_list.append(f'[留影叙佳期]UID{uid}没有需要获取的画片了~')
return '\n'.join(im_list) return '\n'.join(im_list)