mirror of
https://github.com/xuthus83/LittlePaimon.git
synced 2024-12-16 13:40:53 +08:00
72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
import os
|
||
from urllib.parse import urljoin
|
||
from urllib.request import pathname2url
|
||
|
||
from nonebot import MessageSegment, get_bot
|
||
from PIL import Image
|
||
|
||
import hoshino
|
||
from hoshino import logger, util
|
||
|
||
class ResObj:
|
||
def __init__(self, res_path):
|
||
res_dir = os.path.expanduser(hoshino.config.RES_DIR)
|
||
fullpath = os.path.abspath(os.path.join(res_dir, res_path))
|
||
if not fullpath.startswith(os.path.abspath(res_dir)):
|
||
raise ValueError('Cannot access outside RESOUCE_DIR')
|
||
self.__path = os.path.normpath(res_path)
|
||
|
||
@property
|
||
def url(self):
|
||
"""资源文件的url,供酷Q(或其他远程服务)使用"""
|
||
return urljoin(hoshino.config.RES_URL, pathname2url(self.__path))
|
||
|
||
@property
|
||
def path(self):
|
||
"""资源文件的路径,供bot内部使用"""
|
||
return os.path.join(hoshino.config.RES_DIR, self.__path)
|
||
|
||
@property
|
||
def exist(self):
|
||
return os.path.exists(self.path)
|
||
|
||
|
||
class ResImg(ResObj):
|
||
@property
|
||
def cqcode(self) -> MessageSegment:
|
||
if hoshino.config.RES_PROTOCOL == 'http':
|
||
return MessageSegment.image(self.url)
|
||
elif hoshino.config.RES_PROTOCOL == 'file':
|
||
return MessageSegment.image(f'file:///{os.path.abspath(self.path)}')
|
||
else:
|
||
try:
|
||
return MessageSegment.image(util.pic2b64(self.open()))
|
||
except Exception as e:
|
||
hoshino.logger.exception(e)
|
||
return MessageSegment.text('[图片出错]')
|
||
|
||
def open(self) -> Image:
|
||
try:
|
||
return Image.open(self.path)
|
||
except FileNotFoundError:
|
||
hoshino.logger.error(f'缺少图片资源:{self.path}')
|
||
raise
|
||
|
||
|
||
class ResRec(ResObj):
|
||
@property
|
||
def cqcode(self) -> MessageSegment:
|
||
if hoshino.config.RES_PROTOCOL == 'http':
|
||
return MessageSegment.record(self.url)
|
||
elif hoshino.config.RES_PROTOCOL == 'file':
|
||
return MessageSegment.record(f'file:///{os.path.abspath(self.path)}')
|
||
|
||
|
||
def get(path, *paths):
|
||
return ResObj(os.path.join(path, *paths))
|
||
|
||
def img(path, *paths):
|
||
return ResImg(os.path.join('img', path, *paths))
|
||
|
||
def rec(path, *paths):
|
||
return ResRec(os.path.join('record', path, *paths)) |