Skip to content

Commit 6c74d4c

Browse files
authoredSep 3, 2024··
Merge pull request #59 from JustOneSummer/master
以http服务支持minimap_renderer小地图渲染
2 parents d73daa4 + 51d686f commit 6c74d4c

File tree

5 files changed

+71
-2318
lines changed

5 files changed

+71
-2318
lines changed
 

‎.env

+4
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,9 @@ proxy = http://localhost:7890 #代理地址,如果上面选项开启,这
2626
ocr_on = true #是否开启ocr(识图指令)
2727
ocr_offline = false #是否只使用hash验证,即设置为true后只能识别服务器已记录的图片,如果群较多(>300)导致响应延迟较高可以开启
2828
ocr_url = http://ocr.benx1n.com:23338 #默认ocr地址,一般不用动
29+
minimap_renderer_on = false # 是否启用
30+
minimap_renderer_url = http://localhost:9876 # minimap_renderer地址
31+
minimap_renderer_user_name = yuyuko # 鉴权用户名 参考minimap_renderer的token.json文件
32+
minimap_renderer_password = yuyuko # 鉴权用户密码 参考minimap_renderer的token.json文件
2933
http2 = true #是否开启http2,默认开启,如果有问题请设置为false
3034
battle_listen_time = 1 #监控刷新时间,分钟级,如果性能或流量不够可以适当延长,推荐在5分钟以内

‎.env.prod-example

+4
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,9 @@ proxy = http://localhost:7890 #代理地址,如果上面选项开启,这
2626
ocr_on = true #是否开启ocr(识图指令)
2727
ocr_offline = false #是否只使用hash验证,即设置为true后只能识别服务器已记录的图片,如果群较多(>300)导致响应延迟较高可以开启
2828
ocr_url = http://ocr.benx1n.com:23338 #默认ocr地址,一般不用动
29+
minimap_renderer_on = false # 是否启用
30+
minimap_renderer_url = http://localhost:9876 # minimap_renderer地址
31+
minimap_renderer_user_name = yuyuko # 鉴权用户名 参考minimap_renderer的token.json文件
32+
minimap_renderer_password = yuyuko # 鉴权用户密码 参考minimap_renderer的token.json文件
2933
http2 = true #是否开启http2,默认开启,如果有问题请设置为false
3034
battle_listen_time = 1 #监控刷新时间,分钟级,如果性能或流量不够可以适当延长,推荐在5分钟以内

‎poetry.lock

-2,317
This file was deleted.

‎src/plugins/hikari_bot/__init__.py

+26-1
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,18 @@
1919
GroupMessageEvent,
2020
Message,
2121
MessageEvent,
22+
NoticeEvent,
2223
MessageSegment,
2324
PrivateMessageEvent,
2425
)
2526
from nonebot.log import logger
2627
from nonebot.params import CommandArg
2728
from nonebot.permission import SUPERUSER
29+
from nonebot.plugin.on import on_notice
2830
from nonebot_plugin_guild_patch import GuildMessageEvent
2931

3032
from .data_source import dir_path, nb2_file, template_path
33+
from .game.minimap_renderer import get_rep
3134
from .game.ocr import (
3235
downlod_OcrResult,
3336
get_Random_Ocr_Pic,
@@ -52,6 +55,7 @@
5255
bot_pupu = on_fullmatch('噗噗', block=False, priority=5)
5356
bot_listen = on_message(priority=5, block=False)
5457
ocr_listen = on_message(priority=6, block=False)
58+
group_file_listen = on_notice(priority=6, block=False)
5559
driver = get_driver()
5660

5761
_proxy = None
@@ -74,7 +78,8 @@
7478
async def main(bot: Bot, ev: MessageEvent, matchmsg: Message = CommandArg()): # noqa: B008, PLR0915
7579
try:
7680
server_type = None
77-
if isinstance(ev, PrivateMessageEvent) and (driver.config.private or str(ev.user_id) in driver.config.superusers): # 私聊事件,superusers默认不受影响
81+
if isinstance(ev, PrivateMessageEvent) and (
82+
driver.config.private or str(ev.user_id) in driver.config.superusers): # 私聊事件,superusers默认不受影响
7883
server_type = 'QQ'
7984
elif isinstance(ev, GroupMessageEvent) and driver.config.group and ev.group_id not in driver.config.ban_group_list: # 群聊事件
8085
server_type = 'QQ'
@@ -173,6 +178,26 @@ async def wait_to_select(hikari):
173178
return hikari.error('已超时退出')
174179

175180

181+
@group_file_listen.handle()
182+
async def GROUP_FILE_listen(bot: Bot, ev: NoticeEvent):
183+
try:
184+
if not driver.config.minimap_renderer_on:
185+
return
186+
noticeType = str(ev.notice_type)
187+
if not noticeType == 'group_upload':
188+
return
189+
if not str(ev.file.name).endswith('.wowsreplay'):
190+
return
191+
#
192+
base64_file = await bot.get_image(file=ev.file.id)
193+
# 调用接口转换
194+
await get_rep(base64_file['base64'], bot, ev)
195+
except Exception:
196+
logger.error(traceback.format_exc())
197+
await bot.send(ev, MessageSegment.text("请求minimap_renderer服务异常"))
198+
return
199+
200+
176201
@ocr_listen.handle()
177202
async def OCR_listen(bot: Bot, ev: MessageEvent):
178203
try:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import base64
2+
import hashlib
3+
import os
4+
5+
import requests
6+
from nonebot import get_driver
7+
from nonebot.adapters.onebot.v11 import Bot, MessageSegment, NoticeEvent
8+
from requests.auth import HTTPBasicAuth
9+
10+
driver = get_driver()
11+
minimap_renderer_temp = "minimap_renderer_temp"
12+
13+
14+
async def get_rep(wows_rep_file_base64: str, bot: Bot, ev: NoticeEvent):
15+
file_hex = hashlib.sha256(wows_rep_file_base64.encode('utf-8')).hexdigest()
16+
file_bytes = base64.b64decode(wows_rep_file_base64)
17+
18+
file_path_temp = os.getcwd() + os.sep + minimap_renderer_temp + os.sep + file_hex
19+
wowsrepla_file = file_path_temp + ".wowsreplay"
20+
if not os.path.exists(wowsrepla_file):
21+
with open(wowsrepla_file, 'wb') as f:
22+
f.write(file_bytes)
23+
await bot.send(ev, MessageSegment.text("正在处理replays文件.预计耗时1分钟"))
24+
upload_url = driver.config.minimap_renderer_url + "/upload_replays_video_url"
25+
with open(wowsrepla_file, 'rb') as file:
26+
files = {'file': file}
27+
response = requests.post(upload_url, files=files, auth=HTTPBasicAuth(driver.config.minimap_renderer_user_name, driver.config.minimap_renderer_password), timeout=600)
28+
if response.status_code == 200:
29+
await send_video(bot, ev, response.text)
30+
else:
31+
await bot.send(ev, MessageSegment.text("生成视频文件异常!请检查 minimap_renderer 是否要更新."))
32+
33+
34+
async def send_video(bot: Bot, ev: NoticeEvent, url: str):
35+
# 构造视频文件消息
36+
data = str(driver.config.minimap_renderer_url + "/video_url?file_name=" + url.replace("\"", ""))
37+
await bot.send(ev, MessageSegment.video(data))

0 commit comments

Comments
 (0)
Please sign in to comment.