nonebot_plugin_novelai/config.py

156 lines
5.9 KiB
Python
Raw Permalink Normal View History

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。如果服务器比较寄建议改成640640*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))