mirror of
https://github.com/PaiGramTeam/PaiGram.git
synced 2024-11-16 04:35:49 +00:00
✨ 新增 角色培养素材查询 功能
This commit is contained in:
parent
65cf31e68b
commit
f27cf0d427
@ -1,11 +1,16 @@
|
||||
from utils.redisdb import RedisDB
|
||||
from utils.service.manager import listener_service
|
||||
from .cache import GameStrategyCache
|
||||
from .services import GameStrategyService
|
||||
from .cache import GameCache
|
||||
from .services import GameStrategyService, GameMaterialService
|
||||
|
||||
|
||||
@listener_service()
|
||||
def create_game_strategy_service(redis: RedisDB):
|
||||
_cache = GameStrategyCache(redis)
|
||||
_service = GameStrategyService(_cache)
|
||||
return _service
|
||||
_cache = GameCache(redis, "game:strategy")
|
||||
return GameStrategyService(_cache)
|
||||
|
||||
|
||||
@listener_service()
|
||||
def create_game_material_service(redis: RedisDB):
|
||||
_cache = GameCache(redis, "game:material")
|
||||
return GameMaterialService(_cache)
|
||||
|
@ -3,10 +3,10 @@ from typing import List
|
||||
from utils.redisdb import RedisDB
|
||||
|
||||
|
||||
class GameStrategyCache:
|
||||
def __init__(self, redis: RedisDB, ttl: int = 3600):
|
||||
class GameCache:
|
||||
def __init__(self, redis: RedisDB, qname: str, ttl: int = 3600):
|
||||
self.client = redis.client
|
||||
self.qname = "game:strategy"
|
||||
self.qname = qname
|
||||
self.ttl = ttl
|
||||
|
||||
async def get_url_list(self, character_name: str):
|
||||
|
@ -1,12 +1,11 @@
|
||||
from typing import List, Optional
|
||||
|
||||
from models.apihelper.hyperion import Hyperion
|
||||
from .cache import GameStrategyCache
|
||||
from .cache import GameCache
|
||||
|
||||
|
||||
class GameStrategyService:
|
||||
|
||||
def __init__(self, cache: GameStrategyCache, collections: Optional[List[int]] = None):
|
||||
def __init__(self, cache: GameCache, collections: Optional[List[int]] = None):
|
||||
self._cache = cache
|
||||
self._hyperion = Hyperion()
|
||||
if collections is None:
|
||||
@ -44,3 +43,27 @@ class GameStrategyService:
|
||||
artwork_info = await self._hyperion.get_artwork_info(2, post_id)
|
||||
await self._cache.set_url_list(character_name, artwork_info.results.image_url_list)
|
||||
return artwork_info.results.image_url_list[0]
|
||||
|
||||
|
||||
class GameMaterialService(GameStrategyService):
|
||||
def __init__(self, cache: GameCache, collections: Optional[List[int]] = None):
|
||||
super().__init__(cache, collections)
|
||||
self._collections = [428421, 1164644] if collections is None else collections
|
||||
self._special = ['雷电将军', '珊瑚宫心海', '菲谢尔', '托马', '八重神子', '九条裟罗', '辛焱', '神里绫华']
|
||||
|
||||
async def get_material(self, character_name: str) -> str:
|
||||
cache = await self._cache.get_url_list(character_name)
|
||||
if len(cache) >= 1:
|
||||
return cache[-1]
|
||||
|
||||
for collection_id in self._collections:
|
||||
post_id = await self._get_strategy_from_hyperion(collection_id, character_name)
|
||||
if post_id != -1:
|
||||
break
|
||||
else:
|
||||
return ""
|
||||
|
||||
artwork_info = await self._hyperion.get_artwork_info(2, post_id)
|
||||
await self._cache.set_url_list(character_name, artwork_info.results.image_url_list)
|
||||
image_url_list = artwork_info.results.image_url_list
|
||||
return image_url_list[2] if character_name in self._special else image_url_list[1]
|
||||
|
65
plugins/genshin/material.py
Normal file
65
plugins/genshin/material.py
Normal file
@ -0,0 +1,65 @@
|
||||
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
|
||||
from telegram.constants import ChatAction, ParseMode
|
||||
from telegram.ext import filters, ConversationHandler, CommandHandler, MessageHandler, CallbackContext
|
||||
|
||||
from core.game.services import GameMaterialService
|
||||
from logger import Log
|
||||
from plugins.base import BasePlugins
|
||||
from utils.bot import get_all_args
|
||||
from utils.decorators.error import error_callable
|
||||
from utils.decorators.restricts import restricts
|
||||
from utils.helpers import url_to_file
|
||||
from utils.plugins.manager import listener_plugins_class
|
||||
from utils.service.inject import inject
|
||||
|
||||
|
||||
@listener_plugins_class()
|
||||
class Material(BasePlugins):
|
||||
"""角色培养素材查询"""
|
||||
|
||||
KEYBOARD = [[InlineKeyboardButton(
|
||||
text="查看角色培养素材列表并查询",
|
||||
switch_inline_query_current_chat="查看角色培养素材列表并查询")]]
|
||||
|
||||
@inject
|
||||
def __init__(self, game_material_service: GameMaterialService = None):
|
||||
self.game_material_service = game_material_service
|
||||
|
||||
@classmethod
|
||||
def create_handlers(cls) -> list:
|
||||
material = cls()
|
||||
return [
|
||||
CommandHandler("material", material.command_start, block=False),
|
||||
MessageHandler(filters.Regex("^角色培养素材查询(.*)"), material.command_start, block=False),
|
||||
]
|
||||
|
||||
@error_callable
|
||||
@restricts(return_data=ConversationHandler.END)
|
||||
async def command_start(self, update: Update, context: CallbackContext) -> None:
|
||||
message = update.message
|
||||
user = update.effective_user
|
||||
args = get_all_args(context)
|
||||
if len(args) >= 1:
|
||||
character_name = args[0]
|
||||
else:
|
||||
reply_message = await message.reply_text("请回复你要查询的培养素材的角色名",
|
||||
reply_markup=InlineKeyboardMarkup(self.KEYBOARD))
|
||||
if filters.ChatType.GROUPS.filter(reply_message):
|
||||
self._add_delete_message_job(context, message.chat_id, message.message_id)
|
||||
self._add_delete_message_job(context, reply_message.chat_id, reply_message.message_id)
|
||||
return
|
||||
url = await self.game_material_service.get_material(character_name)
|
||||
if not url:
|
||||
reply_message = await message.reply_text(f"没有找到 {character_name} 的培养素材",
|
||||
reply_markup=InlineKeyboardMarkup(self.KEYBOARD))
|
||||
if filters.ChatType.GROUPS.filter(reply_message):
|
||||
self._add_delete_message_job(context, message.chat_id, message.message_id)
|
||||
self._add_delete_message_job(context, reply_message.chat_id, reply_message.message_id)
|
||||
return
|
||||
Log.info(f"用户 {user.full_name}[{user.id}] 查询角色培养素材命令请求 || 参数 {character_name}")
|
||||
await message.reply_chat_action(ChatAction.UPLOAD_PHOTO)
|
||||
file_path = await url_to_file(url, "")
|
||||
caption = "Form 米游社 友人A " \
|
||||
f"查看 [原图]({url})"
|
||||
await message.reply_photo(photo=open(file_path, "rb"), caption=caption, filename=f"{character_name}.png",
|
||||
allow_sending_without_reply=True, parse_mode=ParseMode.MARKDOWN_V2)
|
@ -50,8 +50,19 @@ class Inline:
|
||||
input_message_content=InputTextMessageContent(f"角色攻略查询{role_name}",
|
||||
parse_mode=ParseMode.MARKDOWN_V2)
|
||||
))
|
||||
elif "查看角色培养素材列表并查询" == args[0]:
|
||||
characters_list = await self.wiki_service.get_characters_name_list()
|
||||
for role_name in characters_list:
|
||||
results_list.append(
|
||||
InlineQueryResultArticle(
|
||||
id=str(uuid4()),
|
||||
title=role_name,
|
||||
description=f"查看角色培养素材列表并查询 {role_name}",
|
||||
input_message_content=InputTextMessageContent(f"角色培养素材查询{role_name}",
|
||||
parse_mode=ParseMode.MARKDOWN_V2)
|
||||
))
|
||||
|
||||
if len(results_list) == 0:
|
||||
if not results_list:
|
||||
results_list.append(
|
||||
InlineQueryResultArticle(
|
||||
id=str(uuid4()),
|
||||
|
Loading…
Reference in New Issue
Block a user