203 lines
5.2 KiB
Python
203 lines
5.2 KiB
Python
|
|
# coding:utf-8
|
||
|
|
import sys
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
from PyQt6.QtGui import QPixmap
|
||
|
|
from qfluentwidgets import (
|
||
|
|
BoolValidator,
|
||
|
|
ConfigItem,
|
||
|
|
ConfigSerializer,
|
||
|
|
OptionsConfigItem,
|
||
|
|
OptionsValidator,
|
||
|
|
qconfig,
|
||
|
|
QConfig,
|
||
|
|
FolderValidator,
|
||
|
|
Theme,
|
||
|
|
setThemeColor,
|
||
|
|
)
|
||
|
|
|
||
|
|
from .encryption import encrypt
|
||
|
|
from .setting import CONFIG_FILE, DOWNLOAD_FOLDER
|
||
|
|
|
||
|
|
|
||
|
|
def isWin11():
|
||
|
|
return sys.platform == "win32" and sys.getwindowsversion().build >= 22000
|
||
|
|
|
||
|
|
|
||
|
|
class EncrpytionSerializer(ConfigSerializer):
|
||
|
|
"""QColor serializer"""
|
||
|
|
|
||
|
|
def serialize(self, value):
|
||
|
|
return encrypt.encrypt(value)
|
||
|
|
|
||
|
|
def deserialize(self, value):
|
||
|
|
|
||
|
|
return encrypt.decrypt(value)
|
||
|
|
|
||
|
|
|
||
|
|
class Config(QConfig):
|
||
|
|
"""Config of application"""
|
||
|
|
|
||
|
|
# TODO: ADD YOUR CONFIG GROUP HERE
|
||
|
|
|
||
|
|
# register
|
||
|
|
rememberMe = ConfigItem(
|
||
|
|
"UmVnaXN0ZXI=", "UmVtZW1iZXJNZQ==", True, serializer=EncrpytionSerializer()
|
||
|
|
)
|
||
|
|
email = ConfigItem(
|
||
|
|
"UmVnaXN0ZXI=", "RW1haWw=", "", serializer=EncrpytionSerializer()
|
||
|
|
)
|
||
|
|
activationCode = ConfigItem(
|
||
|
|
"UmVnaXN0ZXI=", "QWN0aXZhdGlvbkNvZGU=", "", serializer=EncrpytionSerializer()
|
||
|
|
)
|
||
|
|
|
||
|
|
# main window
|
||
|
|
micaEnabled = ConfigItem("MainWindow", "MicaEnabled", isWin11(), BoolValidator())
|
||
|
|
dpiScale = OptionsConfigItem(
|
||
|
|
"MainWindow",
|
||
|
|
"DpiScale",
|
||
|
|
"Auto",
|
||
|
|
OptionsValidator([1, 1.25, 1.5, 1.75, 2, "Auto"]),
|
||
|
|
restart=True,
|
||
|
|
)
|
||
|
|
|
||
|
|
# software update
|
||
|
|
checkUpdateAtStartUp = ConfigItem(
|
||
|
|
"Update", "CheckUpdateAtStartUp", True, BoolValidator()
|
||
|
|
)
|
||
|
|
|
||
|
|
# bg
|
||
|
|
customBackground = ConfigItem(
|
||
|
|
"Background",
|
||
|
|
"CustomBackground",
|
||
|
|
"app\\resource\\images\\bg0.png",
|
||
|
|
)
|
||
|
|
customOpactity = ConfigItem("Background", "Opactity", 0.2)
|
||
|
|
|
||
|
|
downloadSavePath = ConfigItem(
|
||
|
|
"Download", "SavePath", DOWNLOAD_FOLDER, validator=FolderValidator()
|
||
|
|
)
|
||
|
|
|
||
|
|
# language
|
||
|
|
language = OptionsConfigItem(
|
||
|
|
"General", "Language", "zh", OptionsValidator(["zh", "en"]), restart=False
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class UserConfig:
|
||
|
|
def __init__(self, userData):
|
||
|
|
self.userData = userData
|
||
|
|
self.token = None
|
||
|
|
self.avaterPixmap = None
|
||
|
|
|
||
|
|
@property
|
||
|
|
def userId(self):
|
||
|
|
if self.userData:
|
||
|
|
return self.userData["data"].get("id", "")
|
||
|
|
else:
|
||
|
|
return None
|
||
|
|
|
||
|
|
@property
|
||
|
|
def userAvatarURL(self):
|
||
|
|
if self.userData and "avatar" in self.userData["data"]:
|
||
|
|
return self.userData["data"].get("avatar", "")
|
||
|
|
else:
|
||
|
|
return ""
|
||
|
|
|
||
|
|
@property
|
||
|
|
def userName(self):
|
||
|
|
if self.userData:
|
||
|
|
return self.userData["data"].get("nickname", "")
|
||
|
|
else:
|
||
|
|
return ""
|
||
|
|
|
||
|
|
@property
|
||
|
|
def userEmail(self):
|
||
|
|
if self.userData:
|
||
|
|
return self.userData["data"].get("user_name", "")
|
||
|
|
else:
|
||
|
|
return ""
|
||
|
|
|
||
|
|
@property
|
||
|
|
def userGroup(self):
|
||
|
|
if self.userData:
|
||
|
|
return self.userData.get("data", {}).get("group", {}).get("name", "")
|
||
|
|
else:
|
||
|
|
return ""
|
||
|
|
|
||
|
|
@property
|
||
|
|
def userScore(self):
|
||
|
|
if self.userData:
|
||
|
|
return str(self.userData["data"].get("score", 0))
|
||
|
|
|
||
|
|
@property
|
||
|
|
def userCreatedTime(self):
|
||
|
|
if self.userData:
|
||
|
|
return self.format_date(self.userData["data"].get("created_at", ""))
|
||
|
|
|
||
|
|
def setUserAvatarPixmap(self, avaterPixmap):
|
||
|
|
self.avaterPixmap: QPixmap = avaterPixmap
|
||
|
|
|
||
|
|
def returnAvatarPixmap(self):
|
||
|
|
return self.avaterPixmap
|
||
|
|
|
||
|
|
def setToken(self, token):
|
||
|
|
"""设置JWT token"""
|
||
|
|
self.token = token
|
||
|
|
|
||
|
|
def getToken(self):
|
||
|
|
"""获取JWT token"""
|
||
|
|
return self.token
|
||
|
|
|
||
|
|
def format_date(self, date_str):
|
||
|
|
"""格式化日期时间"""
|
||
|
|
try:
|
||
|
|
# 处理带小数秒的情况
|
||
|
|
if "." in date_str:
|
||
|
|
# 分割日期和小数秒部分
|
||
|
|
date_part, fractional_part = date_str.split(".", 1)
|
||
|
|
# 去除末尾的"Z"并截取前6位小数
|
||
|
|
fractional_sec = fractional_part.rstrip("Z")[:6]
|
||
|
|
# 重新组合日期字符串
|
||
|
|
normalized_date_str = f"{date_part}.{fractional_sec}Z"
|
||
|
|
date_time = datetime.strptime(
|
||
|
|
normalized_date_str, "%Y-%m-%dT%H:%M:%S.%fZ"
|
||
|
|
)
|
||
|
|
else:
|
||
|
|
# 处理没有小数秒的情况
|
||
|
|
date_time = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ")
|
||
|
|
except ValueError:
|
||
|
|
# 如果所有格式都失败,返回原始字符串
|
||
|
|
return date_str
|
||
|
|
|
||
|
|
return date_time.strftime("%Y-%m-%d %H:%M:%S")
|
||
|
|
|
||
|
|
|
||
|
|
class PolicyConfig:
|
||
|
|
def __init__(self):
|
||
|
|
self.currentPolicy = {}
|
||
|
|
self.currentPath = "/"
|
||
|
|
|
||
|
|
def returnPolicy(self):
|
||
|
|
return self.currentPolicy
|
||
|
|
|
||
|
|
def setPolicy(self, policy):
|
||
|
|
self.currentPolicy = policy
|
||
|
|
|
||
|
|
def setCurrentPath(self, path):
|
||
|
|
self.currentPath = path
|
||
|
|
|
||
|
|
def returnCurrentPath(self):
|
||
|
|
return self.currentPath
|
||
|
|
|
||
|
|
|
||
|
|
cfg = Config()
|
||
|
|
cfg.themeMode.value = Theme.AUTO
|
||
|
|
# 设置默认主题色为蓝色 (使用RGB值)
|
||
|
|
setThemeColor('#2F80ED') # 这是一个标准的蓝色RGB值
|
||
|
|
qconfig.load(str(CONFIG_FILE.absolute()), cfg)
|
||
|
|
|
||
|
|
userConfig = UserConfig(None)
|
||
|
|
|
||
|
|
policyConfig = PolicyConfig()
|