156 lines
5.9 KiB
Python
156 lines
5.9 KiB
Python
import json
|
||
from pathlib import Path
|
||
|
||
import aiofiles
|
||
from nonebot import get_driver
|
||
from nonebot.log import logger
|
||
from pydantic import BaseSettings, validator
|
||
from pydantic.fields import ModelField
|
||
|
||
jsonpath = Path("data/novelai/config.json").resolve()
|
||
nickname = list(get_driver().config.nickname)[0] if len(
|
||
get_driver().config.nickname) else "nonebot-plugin-novelai"
|
||
|
||
|
||
class Config(BaseSettings):
|
||
# 服务器设置
|
||
novelai_token: str = "" # 官网的token
|
||
# novelai: dict = {"novelai":""}# 你的服务器地址(包含端口),不包含http头,例:127.0.0.1:6969
|
||
novelai_mode: str = "novelai"
|
||
novelai_site: str = ""
|
||
# 后台设置
|
||
novelai_save: int = 1 # 是否保存图片至本地,0为不保存,1保存,2同时保存追踪信息
|
||
novelai_paid: int = 0 # 0为禁用付费模式,1为点数制,2为不限制
|
||
novelai_pure: bool = False # 是否启用简洁返回模式(只返回图片,不返回tag等数据)
|
||
novelai_limit: bool = True # 是否开启限速
|
||
novelai_daylimit: int = 0 # 每日次数限制,0为禁用
|
||
novelai_h: bool = False # 是否允许H
|
||
novelai_antireport: bool = True # 玄学选项。开启后,合并消息内发送者将会显示为调用指令的人而不是bot
|
||
novelai_max: int = 3 # 每次能够生成的最大数量
|
||
# 允许生成的图片最大分辨率,对应(值)^2.默认为1024(即1024*1024)。如果服务器比较寄,建议改成640(640*640)或者根据能够承受的情况修改。naifu和novelai会分别限制最大长宽为1024
|
||
novelai_size: int = 1024
|
||
# 可运行更改的设置
|
||
novelai_tags: str = "" # 内置的tag
|
||
novelai_ntags: str = "" # 内置的反tag
|
||
novelai_cd: int = 60 # 默认的cd
|
||
novelai_on: bool = True # 是否全局开启
|
||
novelai_revoke: int = 0 # 是否自动撤回,该值不为0时,则为撤回时间
|
||
# 翻译API设置
|
||
bing_key: str = None # bing的翻译key
|
||
deepl_key: str = None # deepL的翻译key
|
||
|
||
# 允许单群设置的设置
|
||
def keys(cls):
|
||
return ("novelai_cd", "novelai_tags", "novelai_on", "novelai_ntags", "novelai_revoke")
|
||
|
||
def __getitem__(cls, item):
|
||
return getattr(cls, item)
|
||
|
||
@validator("novelai_cd", "novelai_max")
|
||
def non_negative(cls, v: int, field: ModelField):
|
||
if v < 1:
|
||
return field.default
|
||
return v
|
||
|
||
@validator("novelai_paid")
|
||
def paid(cls, v: int, field: ModelField):
|
||
if v < 0:
|
||
return field.default
|
||
elif v > 3:
|
||
return field.default
|
||
return v
|
||
|
||
class Config:
|
||
extra = "ignore"
|
||
|
||
async def set_enable(cls, group_id, enable):
|
||
# 设置分群启用
|
||
await cls.__init_json()
|
||
now = await cls.get_value(group_id, "on")
|
||
logger.debug(now)
|
||
if now:
|
||
if enable:
|
||
return f"aidraw已经处于启动状态"
|
||
else:
|
||
if await cls.set_value(group_id, "on", "false"):
|
||
return f"aidraw已关闭"
|
||
else:
|
||
if enable:
|
||
if await cls.set_value(group_id, "on", "true"):
|
||
return f"aidraw开始运行"
|
||
else:
|
||
return f"aidraw已经处于关闭状态"
|
||
|
||
async def __init_json(cls):
|
||
# 初始化设置文件
|
||
if not jsonpath.exists():
|
||
jsonpath.parent.mkdir(parents=True, exist_ok=True)
|
||
async with aiofiles.open(jsonpath, "w+") as f:
|
||
await f.write("{}")
|
||
|
||
async def get_value(cls, group_id, arg: str):
|
||
# 获取设置值
|
||
group_id = str(group_id)
|
||
arg_ = arg if arg.startswith("novelai_") else "novelai_" + arg
|
||
if arg_ in cls.keys():
|
||
await cls.__init_json()
|
||
async with aiofiles.open(jsonpath, "r") as f:
|
||
jsonraw = await f.read()
|
||
configdict: dict = json.loads(jsonraw)
|
||
return configdict.get(group_id, {}).get(arg_, dict(cls)[arg_])
|
||
else:
|
||
return None
|
||
|
||
async def get_groupconfig(cls, group_id):
|
||
# 获取当群所有设置值
|
||
group_id = str(group_id)
|
||
await cls.__init_json()
|
||
async with aiofiles.open(jsonpath, "r") as f:
|
||
jsonraw = await f.read()
|
||
configdict: dict = json.loads(jsonraw)
|
||
baseconfig = {}
|
||
for i in cls.keys():
|
||
value = configdict.get(group_id, {}).get(
|
||
i, dict(cls)[i])
|
||
baseconfig[i] = value
|
||
logger.debug(baseconfig)
|
||
return baseconfig
|
||
|
||
async def set_value(cls, group_id, arg: str, value: str):
|
||
"""设置当群设置值"""
|
||
# 将值转化为bool和int
|
||
if value.isdigit():
|
||
value: int = int(value)
|
||
elif value.lower() == "false":
|
||
value = False
|
||
elif value.lower() == "true":
|
||
value = True
|
||
group_id = str(group_id)
|
||
arg_ = arg if arg.startswith("novelai_") else "novelai_" + arg
|
||
# 判断是否合法
|
||
if arg_ in cls.keys() and isinstance(value, type(dict(cls)[arg_])):
|
||
await cls.__init_json()
|
||
# 读取文件
|
||
async with aiofiles.open(jsonpath, "r") as f:
|
||
jsonraw = await f.read()
|
||
configdict: dict = json.loads(jsonraw)
|
||
# 设置值
|
||
groupdict = configdict.get(group_id, {})
|
||
if value == "default":
|
||
groupdict[arg_] = False
|
||
else:
|
||
groupdict[arg_] = value
|
||
configdict[group_id] = groupdict
|
||
# 写入文件
|
||
async with aiofiles.open(jsonpath, "w") as f:
|
||
jsonnew = json.dumps(configdict)
|
||
await f.write(jsonnew)
|
||
return True
|
||
else:
|
||
logger.debug(f"不正确的赋值,{arg_},{value},{type(value)}")
|
||
return False
|
||
|
||
|
||
config = Config(**get_driver().config.dict())
|
||
logger.info(f"加载config完成" + str(config))
|