Skip to content

Commit

Permalink
添加minimap_renderer功能
Browse files Browse the repository at this point in the history
  • Loading branch information
MackerelFish committed Sep 4, 2024
1 parent 31dc13f commit dee3233
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 1 deletion.
29 changes: 28 additions & 1 deletion __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@
from hikari_core.model import Hikari_Model
from hikari_core.moudle.wws_real_game import get_diff_ship
from hoshino import Service, get_bot, priv
from hoshino.typing import CQEvent, MessageSegment
from hoshino.typing import CQEvent, MessageSegment, NoticeSession
from hoshino.util import DailyNumberLimiter, FreqLimiter
from loguru import logger
from nonebot.exceptions import CQHttpError

from .data_source import config, dir_path
from .game.ocr import downlod_OcrResult, get_Random_Ocr_Pic, pic2txt_byOCR, upload_OcrResult
from .game.minimap_renderer import get_file, get_rep
from .game.pupu import get_pupu_msg
from .utils import bytes2b64

Expand Down Expand Up @@ -267,3 +268,29 @@ async def OCR_listen(bot, ev: CQEvent):
except Exception:
logger.error(traceback.format_exc())
return

@sv.on_notice('group_upload')
async def handle_group_file_upload(session: NoticeSession):
try:
if not config['minimap_renderer_on']:
return

upload_file = session.ctx.get('file')
upload_file_id = upload_file.get('id')
# 判断文件是否是需要处理的类型
if not upload_file.get('name').endswith('.wowsreplay'):
return

if 'url' in upload_file:
base64_file = await get_file(upload_file.get('url'))
await get_rep(base64_file, session)
else:
base64_file = await session.bot.get_file(file_id=upload_file_id)
if 'base64' not in base64_file:
await get_rep(base64_file['url'], session)
else:
await get_rep(base64_file['base64'], session)

except Exception:
logger.error(traceback.format_exc())
await session.send(MessageSegment.text('请求minimap_renderer服务异常'))
74 changes: 74 additions & 0 deletions game/minimap_renderer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import asyncio
import base64
import hashlib
import os

import requests
from hoshino.typing import MessageSegment, NoticeSession
from requests.auth import HTTPBasicAuth
from concurrent.futures import ThreadPoolExecutor

from ..data_source import config

minimap_renderer_url = config['minimap_renderer_url']
minimap_renderer_user_name = config['minimap_renderer_user_name']
minimap_renderer_password = config['minimap_renderer_password']

minimap_renderer_temp = "minimap_renderer_temp"
executor = ThreadPoolExecutor()


async def get_rep(wows_rep_file_base64: str, session: NoticeSession):
if wows_rep_file_base64.__contains__(".wowsreplay"):
wowsrepla_file = wows_rep_file_base64
else:
file_hex = hashlib.sha256(wows_rep_file_base64.encode('utf-8')).hexdigest()
file_bytes = base64.b64decode(wows_rep_file_base64)
file_path_temp = os.getcwd() + os.sep + minimap_renderer_temp + os.sep + file_hex
f_d = os.getcwd() + os.sep + minimap_renderer_temp
if not os.path.exists(f_d):
os.makedirs(f_d)
wowsrepla_file = file_path_temp + ".wowsreplay"
with open(wowsrepla_file, 'wb') as f:
f.write(file_bytes)
f.close()
if not os.path.exists(wowsrepla_file):
await session.send(MessageSegment.text("文件不存在,ll和nc 部署的请检查服务是否在一个服务器上,否则请开启base64功能"))
else:
await session.send(MessageSegment.text("正在处理replays文件.预计耗时1分钟"))
loop = asyncio.get_running_loop()
result = await loop.run_in_executor(executor, lambda: upload_http(wowsrepla_file))
if result is None:
await session.send(MessageSegment.text("生成视频文件异常!请检查 minimap_renderer 是否要更新."))
else:
await send_video(session, result)


def upload_http(wowsrepla_file: str):
upload_url = f'{minimap_renderer_url}/upload_replays_video_url'
with open(wowsrepla_file, 'rb') as file:
files = {'file': file}
response = requests.post(upload_url, files=files, auth=HTTPBasicAuth(minimap_renderer_user_name, minimap_renderer_password), timeout=600)
if response.status_code == 200:
return response.text
return None


async def send_video(session: NoticeSession, url: str):
# 构造视频文件消息
data = str(minimap_renderer_url + "/video_url?file_name=" + url.replace("\"", ""))
await session.send(MessageSegment.video(data))


def get_file(url: str):
response = requests.get(url)
# 确保请求成功
if response.status_code == 200:
# 获取文件内容
file_content = response.content

# 对文件内容进行 Base64 编码
encoded_content = base64.b64encode(file_content)

# 将编码后的内容转换为字符串
return encoded_content.decode('utf-8')

0 comments on commit dee3233

Please sign in to comment.