2022-07-26 10:07:31 +00:00
|
|
|
from typing import List, Optional
|
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
from core.base_service import BaseService
|
|
|
|
from core.services.game.cache import GameCacheForMaterial, GameCacheForStrategy
|
2022-12-10 12:37:43 +00:00
|
|
|
from modules.apihelper.client.components.hyperion import Hyperion
|
2022-07-26 10:07:31 +00:00
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
__all__ = ("GameMaterialService", "GameStrategyService")
|
2022-07-26 10:07:31 +00:00
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
|
|
|
|
class GameStrategyService(BaseService):
|
|
|
|
def __init__(self, cache: GameCacheForStrategy, collections: Optional[List[int]] = None):
|
2022-07-26 10:07:31 +00:00
|
|
|
self._cache = cache
|
|
|
|
self._hyperion = Hyperion()
|
|
|
|
if collections is None:
|
2022-09-16 13:03:32 +00:00
|
|
|
self._collections = [839176, 839179, 839181, 1180811]
|
2022-07-26 10:07:31 +00:00
|
|
|
else:
|
|
|
|
self._collections = collections
|
2022-11-20 05:59:16 +00:00
|
|
|
self._special_posts = {"达达利亚": "21272578"}
|
2022-07-26 10:07:31 +00:00
|
|
|
|
|
|
|
async def _get_strategy_from_hyperion(self, collection_id: int, character_name: str) -> int:
|
2022-11-20 05:59:16 +00:00
|
|
|
if character_name in self._special_posts:
|
|
|
|
return self._special_posts[character_name]
|
2022-07-26 10:07:31 +00:00
|
|
|
post_id: int = -1
|
|
|
|
post_full_in_collection = await self._hyperion.get_post_full_in_collection(collection_id)
|
2022-10-08 00:59:08 +00:00
|
|
|
for post_data in post_full_in_collection["posts"]:
|
2022-10-14 13:17:53 +00:00
|
|
|
title = post_data["post"]["subject"]
|
2022-07-26 10:07:31 +00:00
|
|
|
topics = post_data["topics"]
|
|
|
|
for topic in topics:
|
|
|
|
if character_name == topic["name"]:
|
|
|
|
post_id = int(post_data["post"]["post_id"])
|
|
|
|
break
|
2022-10-14 13:17:53 +00:00
|
|
|
if post_id == -1 and title and character_name in title:
|
|
|
|
post_id = int(post_data["post"]["post_id"])
|
2022-07-26 10:07:31 +00:00
|
|
|
if post_id != -1:
|
|
|
|
break
|
|
|
|
return post_id
|
|
|
|
|
|
|
|
async def get_strategy(self, character_name: str) -> str:
|
|
|
|
cache = await self._cache.get_url_list(character_name)
|
|
|
|
if len(cache) >= 1:
|
2022-11-20 05:59:16 +00:00
|
|
|
return cache[0]
|
2022-07-26 10:07:31 +00:00
|
|
|
|
|
|
|
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 ""
|
|
|
|
|
2022-10-08 00:59:08 +00:00
|
|
|
artwork_info = await self._hyperion.get_post_info(2, post_id)
|
|
|
|
await self._cache.set_url_list(character_name, artwork_info.image_urls)
|
|
|
|
return artwork_info.image_urls[0]
|
2022-08-31 06:48:15 +00:00
|
|
|
|
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
class GameMaterialService(BaseService):
|
|
|
|
def __init__(self, cache: GameCacheForMaterial, collections: Optional[List[int]] = None):
|
2022-08-31 11:24:02 +00:00
|
|
|
self._cache = cache
|
|
|
|
self._hyperion = Hyperion()
|
2022-08-31 06:48:15 +00:00
|
|
|
self._collections = [428421, 1164644] if collections is None else collections
|
2022-10-10 11:07:28 +00:00
|
|
|
self._special = ["雷电将军", "珊瑚宫心海", "菲谢尔", "托马", "八重神子", "九条裟罗", "辛焱", "神里绫华"]
|
2022-08-31 06:48:15 +00:00
|
|
|
|
2022-08-31 11:24:02 +00:00
|
|
|
async def _get_material_from_hyperion(self, collection_id: int, character_name: str) -> int:
|
|
|
|
post_id: int = -1
|
|
|
|
post_full_in_collection = await self._hyperion.get_post_full_in_collection(collection_id)
|
2022-10-08 00:59:08 +00:00
|
|
|
for post_data in post_full_in_collection["posts"]:
|
2022-08-31 11:24:02 +00:00
|
|
|
topics = post_data["topics"]
|
|
|
|
for topic in topics:
|
|
|
|
if character_name == topic["name"]:
|
|
|
|
post_id = int(post_data["post"]["post_id"])
|
|
|
|
break
|
|
|
|
if post_id != -1:
|
|
|
|
break
|
|
|
|
subject = post_data["post"]["subject"]
|
|
|
|
if character_name in subject:
|
|
|
|
post_id = int(post_data["post"]["post_id"])
|
|
|
|
if post_id != -1:
|
|
|
|
break
|
|
|
|
return post_id
|
|
|
|
|
2022-08-31 06:48:15 +00:00
|
|
|
async def get_material(self, character_name: str) -> str:
|
|
|
|
cache = await self._cache.get_url_list(character_name)
|
|
|
|
if len(cache) >= 1:
|
2022-11-20 05:59:16 +00:00
|
|
|
image_url_list = cache
|
2022-08-31 06:48:15 +00:00
|
|
|
else:
|
2022-11-20 05:59:16 +00:00
|
|
|
for collection_id in self._collections:
|
|
|
|
post_id = await self._get_material_from_hyperion(collection_id, character_name)
|
|
|
|
if post_id != -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
return ""
|
2022-08-31 06:48:15 +00:00
|
|
|
|
2022-11-20 05:59:16 +00:00
|
|
|
artwork_info = await self._hyperion.get_post_info(2, post_id)
|
|
|
|
image_url_list = artwork_info.image_urls
|
|
|
|
await self._cache.set_url_list(character_name, image_url_list)
|
2022-08-31 11:24:02 +00:00
|
|
|
if len(image_url_list) == 0:
|
|
|
|
return ""
|
2023-03-14 01:27:22 +00:00
|
|
|
if len(image_url_list) == 1:
|
2022-08-31 11:24:02 +00:00
|
|
|
return image_url_list[0]
|
2023-03-14 01:27:22 +00:00
|
|
|
if character_name in self._special:
|
2022-08-31 11:24:02 +00:00
|
|
|
return image_url_list[2]
|
2023-03-14 01:27:22 +00:00
|
|
|
return image_url_list[1]
|