2023-02-16 09:38:43 +00:00
|
|
|
from datetime import datetime, timedelta
|
2023-02-16 08:47:48 +00:00
|
|
|
from typing import Dict
|
|
|
|
|
|
|
|
from telegram import Update
|
|
|
|
from telegram.constants import ChatAction
|
|
|
|
from telegram.ext import CallbackContext, MessageHandler, filters
|
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
from core.dependence.assets import AssetsService
|
|
|
|
from core.dependence.redisdb import RedisDB
|
2023-02-16 08:47:48 +00:00
|
|
|
from core.plugin import Plugin, handler
|
2023-03-14 01:27:22 +00:00
|
|
|
from core.services.template.services import TemplateService
|
2023-02-16 08:47:48 +00:00
|
|
|
from modules.apihelper.client.components.calendar import Calendar
|
|
|
|
from utils.log import logger
|
|
|
|
|
|
|
|
try:
|
|
|
|
import ujson as jsonlib
|
|
|
|
except ImportError:
|
|
|
|
import json as jsonlib
|
|
|
|
|
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
class CalendarPlugin(Plugin):
|
2023-02-16 08:47:48 +00:00
|
|
|
"""活动日历查询"""
|
|
|
|
|
|
|
|
def __init__(
|
|
|
|
self,
|
2023-03-14 01:27:22 +00:00
|
|
|
template_service: TemplateService,
|
|
|
|
assets_service: AssetsService,
|
|
|
|
redis: RedisDB,
|
2023-02-16 08:47:48 +00:00
|
|
|
):
|
|
|
|
self.template_service = template_service
|
|
|
|
self.assets_service = assets_service
|
|
|
|
self.calendar = Calendar()
|
|
|
|
self.cache = redis.client
|
|
|
|
|
|
|
|
async def _fetch_data(self) -> Dict:
|
|
|
|
if data := await self.cache.get("plugin:calendar"):
|
|
|
|
return jsonlib.loads(data.decode("utf-8"))
|
|
|
|
data = await self.calendar.get_photo_data(self.assets_service)
|
2023-02-16 09:38:43 +00:00
|
|
|
now = datetime.now()
|
|
|
|
next_hour = (now + timedelta(hours=1)).replace(minute=0, second=0, microsecond=0)
|
|
|
|
await self.cache.set("plugin:calendar", jsonlib.dumps(data, default=lambda x: x.dict()), ex=next_hour - now)
|
2023-02-16 08:47:48 +00:00
|
|
|
return data
|
|
|
|
|
|
|
|
@handler.command("calendar", block=False)
|
|
|
|
@handler(MessageHandler, filters=filters.Regex(r"^(活动)+(日历|日历列表)$"), block=False)
|
|
|
|
async def command_start(self, update: Update, _: CallbackContext) -> None:
|
|
|
|
user = update.effective_user
|
|
|
|
message = update.effective_message
|
|
|
|
mode = "list" if "列表" in message.text else "calendar"
|
|
|
|
logger.info("用户 %s[%s] 查询日历 | 模式 %s", user.full_name, user.id, mode)
|
|
|
|
await message.reply_chat_action(ChatAction.TYPING)
|
|
|
|
data = await self._fetch_data()
|
|
|
|
data["display_mode"] = mode
|
|
|
|
image = await self.template_service.render(
|
2023-05-09 11:01:45 +00:00
|
|
|
"genshin/calendar/calendar.jinja2",
|
2023-02-16 08:47:48 +00:00
|
|
|
data,
|
|
|
|
query_selector=".container",
|
|
|
|
)
|
|
|
|
await message.reply_chat_action(ChatAction.UPLOAD_PHOTO)
|
|
|
|
await image.reply_photo(message)
|