diff --git a/LittlePaimon/config/plugin/model.py b/LittlePaimon/config/plugin/model.py index c4914282..c716865c 100644 --- a/LittlePaimon/config/plugin/model.py +++ b/LittlePaimon/config/plugin/model.py @@ -6,9 +6,9 @@ class MatcherInfo(BaseModel): pm_name: str """命令名称""" - pm_description: Optional[str] + pm_description: Optional[str] = None """命令描述""" - pm_usage: Optional[str] + pm_usage: Optional[str] = None """命令用法""" pm_priority: int = 99 """命令优先级""" @@ -21,11 +21,11 @@ class PluginInfo(BaseModel): """插件名称""" module_name: str """插件模块名称""" - description: Optional[str] + description: Optional[str] = None """插件描述""" - usage: Optional[str] + usage: Optional[str] = None """插件用法""" - status: Optional[bool] + status: Optional[bool] = None """插件状态(无用项)""" show: bool = True """是否展示""" diff --git a/LittlePaimon/database/models/player_info.py b/LittlePaimon/database/models/player_info.py index 7e5a03fb..babf37b5 100644 --- a/LittlePaimon/database/models/player_info.py +++ b/LittlePaimon/database/models/player_info.py @@ -22,35 +22,35 @@ class PlayerBaseInfo(BaseModel): """ 玩家基础数据信息,比如神瞳数、宝箱数等 """ - activate_days: Optional[int] + activate_days: Optional[int] = None """活跃天数""" - achievements: Optional[int] + achievements: Optional[int] = None """成就数""" - abyss_floor: Optional[str] + abyss_floor: Optional[str] = None """深渊到达层数""" - way_point: Optional[int] + way_point: Optional[int] = None """传送点解锁数""" - domain_num: Optional[int] + domain_num: Optional[int] = None """秘境解锁数""" - anemoculus: Optional[int] + anemoculus: Optional[int] = None """风神瞳收集数""" - geoculus: Optional[int] + geoculus: Optional[int] = None """岩神瞳收集数""" - electroculus: Optional[int] + electroculus: Optional[int] = None """雷神瞳收集数""" - dendroculus: Optional[int] + dendroculus: Optional[int] = None """草神瞳收集数""" - character_num: Optional[int] + character_num: Optional[int] = None """角色收集数数""" - luxurious_chest: Optional[int] + luxurious_chest: Optional[int] = None """华丽宝箱收集数""" - precious_chest: Optional[int] + precious_chest: Optional[int] = None """珍贵宝箱收集数""" - exquisite_chest: Optional[int] + exquisite_chest: Optional[int] = None """精致宝箱收集数""" - common_chest: Optional[int] + common_chest: Optional[int] = None """普通宝箱收集数""" - magic_chest: Optional[int] + magic_chest: Optional[int] = None """奇馈宝箱收集数""" @@ -62,32 +62,32 @@ class PlayerWorldInfo(BaseModel): """地区名称""" unlock: bool """是否解锁""" - percent: Optional[int] + percent: Optional[int] = None """探索度,100%以1000显示,注意转换""" - level: Optional[int] + level: Optional[int] = None """声望等级""" - tree_level: Optional[int] + tree_level: Optional[int] = None """神樱树或忍冬之树等级""" - stone_level: Optional[int] + stone_level: Optional[int] = None """流明石等级""" class PlayerWorldInfos(BaseModel): - MengDe: Optional[PlayerWorldInfo] + MengDe: Optional[PlayerWorldInfo] = None """蒙德""" - LiYue: Optional[PlayerWorldInfo] + LiYue: Optional[PlayerWorldInfo] = None """璃月""" - DaoQi: Optional[PlayerWorldInfo] + DaoQi: Optional[PlayerWorldInfo] = None """稻妻""" - SnowMountain: Optional[PlayerWorldInfo] + SnowMountain: Optional[PlayerWorldInfo] = None """龙脊雪山""" - ChasmsMaw: Optional[PlayerWorldInfo] + ChasmsMaw: Optional[PlayerWorldInfo] = None """层岩巨渊""" - ChasmsMawBelow: Optional[PlayerWorldInfo] + ChasmsMawBelow: Optional[PlayerWorldInfo] = None """层岩巨渊地下""" - Enkanomiya: Optional[PlayerWorldInfo] + Enkanomiya: Optional[PlayerWorldInfo] = None """渊下宫""" - Xumi: Optional[PlayerWorldInfo] + Xumi: Optional[PlayerWorldInfo] = None """须弥""" def list(self): diff --git a/LittlePaimon/plugins/Paimon_Abyss/youchuang/models.py b/LittlePaimon/plugins/Paimon_Abyss/youchuang/models.py index d824a21f..248f52ea 100644 --- a/LittlePaimon/plugins/Paimon_Abyss/youchuang/models.py +++ b/LittlePaimon/plugins/Paimon_Abyss/youchuang/models.py @@ -1,6 +1,6 @@ from typing import List, Optional -from pydantic import BaseModel, validator +from pydantic import field_validator, BaseModel class Member(BaseModel): @@ -12,9 +12,10 @@ class Member(BaseModel): class TeamRate(BaseModel): rate: float formation: List[Member] - ownerNum: Optional[int] + ownerNum: Optional[int] = None - @validator('rate', pre=True) + @field_validator('rate', mode="before") + @classmethod def str2float(cls, v): return float(v.replace('%', '')) / 100.0 if isinstance(v, str) else v diff --git a/LittlePaimon/plugins/Paimon_Gacha_Log/models.py b/LittlePaimon/plugins/Paimon_Gacha_Log/models.py index 69aeaae6..3fc02a54 100644 --- a/LittlePaimon/plugins/Paimon_Gacha_Log/models.py +++ b/LittlePaimon/plugins/Paimon_Gacha_Log/models.py @@ -10,14 +10,14 @@ class FiveStarItem(BaseModel): name: str - icon: Optional[str] + icon: Optional[str] = None count: int type: str class FourStarItem(BaseModel): name: str - icon: Optional[str] + icon: Optional[str] = None type: str num: Dict[str, int] = { '角色祈愿': 0, diff --git a/LittlePaimon/plugins/Paimon_Wiki/SereniteaPot/models.py b/LittlePaimon/plugins/Paimon_Wiki/SereniteaPot/models.py index b10f1222..c4f1a1b5 100644 --- a/LittlePaimon/plugins/Paimon_Wiki/SereniteaPot/models.py +++ b/LittlePaimon/plugins/Paimon_Wiki/SereniteaPot/models.py @@ -6,8 +6,8 @@ class Item(BaseModel): id: int name: str - icon: Optional[str] + icon: Optional[str] = None num: int - wiki_url: Optional[str] + wiki_url: Optional[str] = None level: int icon_url: str diff --git a/LittlePaimon/plugins/Paimon_Wiki/genshinmap/models.py b/LittlePaimon/plugins/Paimon_Wiki/genshinmap/models.py index 67d0eb57..476d1097 100644 --- a/LittlePaimon/plugins/Paimon_Wiki/genshinmap/models.py +++ b/LittlePaimon/plugins/Paimon_Wiki/genshinmap/models.py @@ -3,7 +3,7 @@ from enum import IntEnum from typing import List, Tuple, Optional, NamedTuple -from pydantic import HttpUrl, BaseModel, validator +from pydantic import field_validator, HttpUrl, BaseModel class MapID(IntEnum): @@ -71,7 +71,8 @@ class Maps(BaseModel): total_size: List[int] padding: List[int] - @validator("slices", pre=True) + @field_validator("slices", mode="before") + @classmethod def slices_to_list(cls, v): urls: List[str] = [] for i in v: @@ -87,10 +88,11 @@ class MapInfo(BaseModel): detail: Maps node_type: int children: list - icon: Optional[HttpUrl] - ch_ext: Optional[str] + icon: Optional[HttpUrl] = None + ch_ext: Optional[str] = None - @validator("detail", pre=True) + @field_validator("detail", mode="before") + @classmethod def detail_str_to_maps(cls, v): return Maps.parse_raw(v) @@ -173,15 +175,17 @@ class PageLabel(BaseModel): map_id: int jump_url: str jump_type: str - center: Optional[Tuple[float, float]] - zoom: Optional[float] + center: Optional[Tuple[float, float]] = None + zoom: Optional[float] = None - @validator("center", pre=True) + @field_validator("center", mode="before") + @classmethod def center_str_to_tuple(cls, v: str) -> Optional[Tuple[float, float]]: if v and (splitted := v.split(",")): return tuple(map(float, splitted)) - @validator("zoom", pre=True) + @field_validator("zoom", mode="before") + @classmethod def zoom_str_to_float(cls, v: str): if v: return float(v) diff --git a/LittlePaimon/plugins/star_rail_info/models.py b/LittlePaimon/plugins/star_rail_info/models.py index 1df4e986..7efda5c4 100644 --- a/LittlePaimon/plugins/star_rail_info/models.py +++ b/LittlePaimon/plugins/star_rail_info/models.py @@ -65,7 +65,7 @@ class Skill(BaseModel): name: str level: int max_level: int - element: Optional[Element] + element: Optional[Element] = None type: SkillType type_text: str effect: str diff --git a/LittlePaimon/utils/scheduler.py b/LittlePaimon/utils/scheduler.py index 9af253eb..c51c143e 100644 --- a/LittlePaimon/utils/scheduler.py +++ b/LittlePaimon/utils/scheduler.py @@ -3,7 +3,8 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler from nonebot import get_driver from nonebot.log import LoguruHandler, logger -from pydantic import Field, BaseSettings +from pydantic import Field +from pydantic_settings import BaseSettings, SettingsConfigDict class Config(BaseSettings): @@ -12,9 +13,7 @@ class Config(BaseSettings): apscheduler_config: dict = Field( default_factory=lambda: {"apscheduler.timezone": "Asia/Shanghai"} ) - - class Config: - extra = "ignore" + model_config = SettingsConfigDict(extra="ignore") driver = get_driver() diff --git a/LittlePaimon/utils/typing.py b/LittlePaimon/utils/typing.py index 552f67be..59524032 100644 --- a/LittlePaimon/utils/typing.py +++ b/LittlePaimon/utils/typing.py @@ -1,7 +1,7 @@ import re from typing import Literal, List -from pydantic import BaseModel, parse_raw_as +from pydantic.v1 import BaseModel, parse_raw_as try: import ujson as json diff --git a/LittlePaimon/web/api/cookie.py b/LittlePaimon/web/api/cookie.py index 9f4030df..feb05eb5 100644 --- a/LittlePaimon/web/api/cookie.py +++ b/LittlePaimon/web/api/cookie.py @@ -14,12 +14,12 @@ class BindCookie(BaseModel): - id: Optional[int] - user_id: Optional[int] - uid: Optional[int] - mys_id: Optional[int] + id: Optional[int] = None + user_id: Optional[int] = None + uid: Optional[int] = None + mys_id: Optional[int] = None cookie: str - stoken: Optional[str] + stoken: Optional[str] = None