PaiGram/models/wiki/other.py
Karako 91a133b694
♻️ 重写 wiki 模块和相关插件
1. 使用 `pydantic` 重写了 wiki 模块所使用的 model
2. 添加了 weapon_level.json 用于后续计算武器升级所需的经验
3. 修改了 wiki 插件,以适应新的 model
2022-08-28 22:37:31 +08:00

133 lines
3.2 KiB
Python

from enum import Enum
from typing import Optional
from typing_extensions import Self
from models.wiki.base import SCRAPE_HOST
__all__ = [
'Element',
'WeaponType',
'AttributeType',
'Association',
]
class Element(Enum):
"""元素"""
Pyro = ''
Hydro = ''
Electro = ''
Cryo = ''
Dendro = ''
Anemo = ''
Geo = ''
Multi = '' # 主角
_WEAPON_ICON_MAP = {
'Sword': SCRAPE_HOST.join('img/s_23101.png'),
'Claymore': SCRAPE_HOST.join('img/s_163101.png'),
'Polearm': SCRAPE_HOST.join('img/s_233101.png'),
'Catalyst': SCRAPE_HOST.join('img/s_43101.png'),
'Bow': SCRAPE_HOST.join('img/s_213101.png'),
}
class WeaponType(Enum):
"""武器类型"""
Sword = '单手剑'
Claymore = '双手剑'
Polearm = '长柄武器'
Catalyst = '法器'
Bow = ''
def icon_url(self) -> str:
return str(_WEAPON_ICON_MAP.get(self.name))
_ATTR_TYPE_MAP = {
# 这个字典用于将 Honey 页面中遇到的 属性的缩写的字符 转为 AttributeType 的字符
# 例如 Honey 页面上写的 HP% 则对应 HP_p
"HP": ['Health'],
"HP_p": ['HP%', 'Health %'],
"ATK": ['Attack'],
"ATK_p": ['Atk%', 'Attack %'],
"DEF": ['Defense'],
"DEF_p": ['Def%', 'Defense %'],
"EM": ['Elemental Mastery'],
"ER": ['ER%', 'Energy Recharge %'],
"CR": ['CrR%', 'Critical Rate %', 'CritRate%'],
"CD": ['Crd%', 'Critical Damage %', 'CritDMG%'],
"PD": ['Phys%', 'Physical Damage %'],
"HB": [],
"Pyro": [],
"Hydro": [],
"Electro": [],
"Cryo": [],
"Dendro": [],
"Anemo": [],
"Geo": [],
}
class AttributeType(Enum):
"""属性枚举类。包含了武器和圣遗物的属性。"""
HP = "生命"
HP_p = "生命%"
ATK = "攻击力"
ATK_p = "攻击力%"
DEF = "防御力"
DEF_p = "防御力%"
EM = "元素精通"
ER = "元素充能效率"
CR = "暴击率"
CD = "暴击伤害"
PD = "物理伤害加成"
HB = "治疗加成"
Pyro = '火元素伤害加成'
Hydro = '水元素伤害加成'
Electro = '雷元素伤害加成'
Cryo = '冰元素伤害加成'
Dendro = '草元素伤害加成'
Anemo = '风元素伤害加成'
Geo = '岩元素伤害加成'
@classmethod
def convert(cls, string: str) -> Optional[Self]:
string = string.strip()
for k, v in _ATTR_TYPE_MAP.items():
if string == k or string in v or string.upper() == k:
return cls[k]
_ASSOCIATION_MAP = {
'Other': ['Mainactor', 'Ranger', 'Fatui'],
'Snezhnaya': [],
'Sumeru': [],
'Inazuma': [],
'Liyue': [],
'Mondstadt': [],
}
class Association(Enum):
"""角色所属地区"""
Other = '其它'
Snezhnaya = '至冬'
Sumeru = '须弥'
Inazuma = '稻妻'
Liyue = '璃月'
Mondstadt = '蒙德'
@classmethod
def convert(cls, string: str) -> Optional[Self]:
string = string.strip()
for k, v in _ASSOCIATION_MAP.items():
if string == k or string in v:
return cls[k]
string = string.lower().title()
if string == k or string in v:
return cls[k]
return cls[string]