This commit is contained in:
2025-03-12 09:36:26 +08:00
parent b98464d8b5
commit 6053fba1da
22 changed files with 286 additions and 228 deletions
+7 -19
View File
@@ -34,7 +34,7 @@ def dict2obj(dictObj):
return d
async def createToken(alter: str, equVersion: str, expire=86400 / 24 * 2, redis=None, env=''):
def createToken(alter: str, equVersion: str, redis = None, expire=86400 / 24 * 2)->str:
ts_str = str(time.time() + expire)
ts_byte = ts_str.encode('utf-8')
sha1_tshex_str = hmac.new(alter.encode('utf-8'), ts_byte, 'sha1').hexdigest()
@@ -42,15 +42,16 @@ async def createToken(alter: str, equVersion: str, expire=86400 / 24 * 2, redis=
token = base64.urlsafe_b64encode(token.encode('utf-8')).decode('utf-8')
# character = createCharacter(alter)
character = {}
await redis.set(f'token:{token}', json.dumps(AlterState(alter, token, character, equVersion).to_dict()), int(expire))
redis.set(f'token:{token}', json.dumps(AlterState(alter, token, character, equVersion).to_dict()), int(expire))
return token
async def readToken(token: str, redis, env) -> AlterState:
def readToken(token: str, redis) -> AlterState:
info = None
try:
info = dict2obj(json.loads(await redis.get(f'token:{token}')))
except Exception:
info = dict2obj(json.loads(redis.get(f'token:{token}')))
except Exception as ex:
print(ex)
ResponseException('登录过期或无效Token,请刷新后重试')
if info is None:
raise ResponseException('登录过期或无效Token,请刷新后重试')
@@ -62,20 +63,7 @@ def deleteToken(token, redis, env):
return token
async def authorize(request: Request, access_token: Optional[str] = Header(None)):
if access_token is not None:
info = await readToken(access_token, request.app.state.redis, request.app.state.env)
return info
else:
raise ResponseException('登录过期或无效Token,请刷新后重试')
def unauthorize(request: Request, access_token: Optional[str] = Header(None)):
if access_token is not None:
return deleteToken(access_token, request.app.state.redis, request.app.state.env)
async def uid(request: Request, access_uid: Optional[str] = Header(None)):
def uid(access_uid: Optional[str] = Header(None)):
try:
return int(access_uid)
except Exception:
+19 -2
View File
@@ -1,9 +1,26 @@
from typing import Annotated
from typing import Annotated, Optional
from redis import Redis
from sqlalchemy.orm import Session
from fastapi import Depends
from fastapi import Depends, Header
from api.core.exception import ResponseException
from database.connect import get_db,get_redis
from api.core.Auth import AlterState, deleteToken, readToken
SessionDep = Annotated[Session, Depends(get_db)]
RedisDep = Annotated[Redis, Depends(get_redis)]
def authorize(redis:RedisDep, access_token: Optional[str] = Header(None)):
if access_token is not None:
info = readToken(access_token, redis)
return info
else:
raise ResponseException('登录过期或无效Token,请刷新后重试')
def unauthorize(redis:RedisDep, access_token: Optional[str] = Header(None)):
if access_token is not None:
return deleteToken(access_token, redis)
AltersDep = Annotated[AlterState, Depends(authorize)]
+17 -18
View File
@@ -4,7 +4,8 @@ import json
from fastapi import APIRouter,Request
from api.core.Response import Return, response
from api.core.Redis import get_redis_info
from api.dp import RedisDep
from api.dp import RedisDep,AltersDep
from core.basic.character import createCharacter
router = APIRouter()
@@ -20,22 +21,20 @@ async def get_adventure_info(request: Request,redis:RedisDep):
return response(data=adventure_info)
@router.get('/equipment/list')
async def get_equipment_list(request: Request,redis:RedisDep):
def get_equipment_list():
with open('./dataFiles/equipment-list.json', encoding='utf-8') as fp:
return json.load(fp)
equipment_list = get_redis_info(redis, 'dcalc:equipment', get_equipment_list)
return response(data=equipment_list)
@router.get("/token/get/{alter}", response_model=Return[str])
async def getToken(
alter: str, request: Request, version: str = None, equVersion: str = ""
@router.get("/token/get/{alter}")
async def getToken(redis:RedisDep,
alter: str, request: Request, version: str = None, equVersion: str = "0"
):
if version is not None and version != "default" and version != "":
alter = version + "." + alter
token = createToken(
alter, equVersion, redis=request.app.state.redis, env=request.app.state.env
)
token = createToken(alter, equVersion, redis)
return response(data=token)
@router.get("/character")
async def get_character_info(
request: Request, state: AltersDep ,redis:RedisDep
):
character = createCharacter(state.alter, state.equVersion)
def get_character():
return character.getInfo()
info = get_redis_info(redis, f"dcalc:character:{state.alter}", get_character)
return response(data=info)
+3 -1
View File
@@ -569,7 +569,9 @@ class Character:
def createCharacter(alter: str, equVersion: str = '0'):
character: Character = None
module_name = 'core.characters.' + alter
module_name = 'core.character.' + alter
if equVersion is None or equVersion == '':
equVersion = '0'
try:
character = importlib.import_module(module_name).classChange(equVersion)
except Exception as ex:
+1 -1
View File
@@ -77,7 +77,7 @@ class Skill:
icon = icon.replace('$common', '/characters/common')
icon = icon.replace('$name', f'{self.name}')
icon = icon.replace('$id', f'{self.id}')
return icon
return f'{icon}.png'
def _calculate_lv(self):
return min(int((characterLv - self.learnLv) / self.rangeLv + 1), self.masterLv) if self._lv == 0 else self._lv
+68 -68
View File
@@ -3,32 +3,32 @@
"name": "swordman_male",
"title": "鬼剑士(男)",
"children": [
{ "title": "极诣·剑魂", "name": "weapon_master", "open": true },
{ "name": "soul_bender", "title": "极诣·鬼泣", "open": true },
{ "name": "berserker", "title": "极诣·狂战士", "open": true },
{ "name": "asura", "title": "极诣·阿修罗", "open": true },
{ "name": "ghostblade", "title": "极诣·剑影", "open": true }
{ "title": "极诣·剑魂", "name": "weapon_master", "open": false },
{ "name": "soul_bender", "title": "极诣·鬼泣", "open": false },
{ "name": "berserker", "title": "极诣·狂战士", "open": false },
{ "name": "asura", "title": "极诣·阿修罗", "open": false },
{ "name": "ghostblade", "title": "极诣·剑影", "open": false }
]
},
{
"name": "swordman_female",
"title": "鬼剑士(女)",
"children": [
{ "name": "sword_master", "title": "极诣·驭剑士", "open": true },
{ "name": "dark_templar", "title": "极诣·暗殿骑士", "open": true },
{ "name": "demon_slayer", "title": "极诣·契魔者", "open": true },
{ "name": "vegabond", "title": "极诣·流浪武士", "open": true },
{ "name": "spectre", "title": "极诣·刃影", "open": true }
{ "name": "sword_master", "title": "极诣·驭剑士", "open": false },
{ "name": "dark_templar", "title": "极诣·暗殿骑士", "open": false },
{ "name": "demon_slayer", "title": "极诣·契魔者", "open": false },
{ "name": "vegabond", "title": "极诣·流浪武士", "open": false },
{ "name": "spectre", "title": "极诣·刃影", "open": false }
]
},
{
"name": "fighter_male",
"title": "格斗家(男)",
"children": [
{ "name": "nenmaster_male", "title": "归元·气功师", "open": true },
{ "name": "striker_male", "title": "归元·散打", "open": true },
{ "name": "brawler_male", "title": "归元·街霸", "open": true },
{ "name": "grappler_male", "title": "归元·柔道家", "open": true },
{ "name": "nenmaster_male", "title": "归元·气功师", "open": false },
{ "name": "striker_male", "title": "归元·散打", "open": false },
{ "name": "brawler_male", "title": "归元·街霸", "open": false },
{ "name": "grappler_male", "title": "归元·柔道家", "open": false },
{ "name": "empty", "title": "", "comment": "首页" }
]
},
@@ -36,10 +36,10 @@
"name": "fighter_female",
"title": "格斗家(女)",
"children": [
{ "name": "nenmaster_female", "title": "归元·气功师", "open": true },
{ "name": "striker_female", "title": "归元·散打", "open": true },
{ "name": "brawler_female", "title": "归元·街霸", "open": true },
{ "name": "grappler_female", "title": "归元·柔道家", "open": true },
{ "name": "nenmaster_female", "title": "归元·气功师", "open": false },
{ "name": "striker_female", "title": "归元·散打", "open": false },
{ "name": "brawler_female", "title": "归元·街霸", "open": false },
{ "name": "grappler_female", "title": "归元·柔道家", "open": false },
{ "name": "empty", "title": "", "comment": "设置" }
]
},
@@ -47,26 +47,26 @@
"name": "gunner_male",
"title": "神枪手(男)",
"children": [
{ "name": "ranger_male", "title": "重霄·漫游枪手", "open": true },
{ "name": "launcher_male", "title": "重霄·枪炮师", "open": true },
{ "name": "mechanic_male", "title": "重霄·机械师", "open": true },
{ "name": "spitfire_male", "title": "重霄·弹药专家", "open": true },
{ "name": "assault", "title": "重霄·合金战士", "open": true }
{ "name": "ranger_male", "title": "重霄·漫游枪手", "open": false },
{ "name": "launcher_male", "title": "重霄·枪炮师", "open": false },
{ "name": "mechanic_male", "title": "重霄·机械师", "open": false },
{ "name": "spitfire_male", "title": "重霄·弹药专家", "open": false },
{ "name": "assault", "title": "重霄·合金战士", "open": false }
]
},
{
"name": "gunner_female",
"title": "神枪手(女)",
"children": [
{ "name": "ranger_female", "title": "重霄·漫游枪手", "open": true },
{ "name": "launcher_female", "title": "重霄·枪炮师", "open": true },
{ "name": "mechanic_female", "title": "重霄·机械师", "open": true },
{ "name": "spitfire_female", "title": "重霄·弹药专家", "open": true },
{ "name": "ranger_female", "title": "重霄·漫游枪手", "open": false },
{ "name": "launcher_female", "title": "重霄·枪炮师", "open": false },
{ "name": "mechanic_female", "title": "重霄·机械师", "open": false },
{ "name": "spitfire_female", "title": "重霄·弹药专家", "open": true, "class": "GF.gunner_female.spitfire_female" },
{
"name": "sponsor",
"url": "https://bbs.colg.cn",
"title": "",
"open": true
"open": false
}
]
},
@@ -74,25 +74,25 @@
"name": "mage_male",
"title": "魔法师(男)",
"children": [
{ "name": "elemental_bomber", "title": "知源·元素爆破师", "open": true },
{ "name": "glacial_master", "title": "知源·冰结师", "open": true },
{ "name": "blood_mage", "title": "知源·血法师", "open": true },
{ "name": "swift_master", "title": "知源·逐风者", "open": true },
{ "name": "dimension_walker", "title": "知源·次元行者", "open": true }
{ "name": "elemental_bomber", "title": "知源·元素爆破师", "open": false },
{ "name": "glacial_master", "title": "知源·冰结师", "open": false },
{ "name": "blood_mage", "title": "知源·血法师", "open": false },
{ "name": "swift_master", "title": "知源·逐风者", "open": false },
{ "name": "dimension_walker", "title": "知源·次元行者", "open": false }
]
},
{
"name": "mage_female",
"title": "魔法师(女)",
"children": [
{ "name": "elementalist", "title": "知源·元素师", "open": true },
{ "name": "summoner", "title": "知源·召唤师", "open": true },
{ "name": "battle_mage", "title": "知源·战斗法师", "open": true },
{ "name": "witch", "title": "知源·魔道学者", "open": true },
{ "name": "elementalist", "title": "知源·元素师", "open": false },
{ "name": "summoner", "title": "知源·召唤师", "open": false },
{ "name": "battle_mage", "title": "知源·战斗法师", "open": false },
{ "name": "witch", "title": "知源·魔道学者", "open": false },
{
"name": "enchantress",
"title": "知源·小魔女",
"open": true,
"open": false,
"options": [
{ "name": "default", "title": "奶", "class": "enchantress" },
{ "name": "default", "title": "输出", "class": "enchantress_carry" }
@@ -107,15 +107,15 @@
{
"name": "crusader_male",
"title": "神启·圣骑士",
"open": true,
"open": false,
"options": [
{ "name": "default", "title": "奶", "class": "crusader_male" },
{ "name": "default", "title": "审判", "class": "crusader_male_carry" }
]
},
{ "name": "infighter", "title": "神启·蓝拳圣使", "open": true },
{ "name": "exorcist", "title": "神启·驱魔师", "open": true },
{ "name": "avenger", "title": "神启·复仇者", "open": true },
{ "name": "infighter", "title": "神启·蓝拳圣使", "open": false },
{ "name": "exorcist", "title": "神启·驱魔师", "open": false },
{ "name": "avenger", "title": "神启·复仇者", "open": false },
{ "name": "empty", "title": "" }
]
},
@@ -126,7 +126,7 @@
{
"name": "crusader_female",
"title": "神启·圣骑士",
"open": true,
"open": false,
"options": [
{ "name": "default", "title": "奶", "class": "crusader_female" },
{
@@ -136,9 +136,9 @@
}
]
},
{ "name": "inquistor", "title": "神启·异端审判者", "open": true },
{ "name": "sorceress", "title": "神启·巫女", "open": true },
{ "name": "mistress", "title": "神启·诱魔者", "open": true },
{ "name": "inquistor", "title": "神启·异端审判者", "open": false },
{ "name": "sorceress", "title": "神启·巫女", "open": false },
{ "name": "mistress", "title": "神启·诱魔者", "open": false },
{ "name": "empty", "title": "" }
]
},
@@ -146,10 +146,10 @@
"name": "thief",
"title": "暗夜使者",
"children": [
{ "name": "rogue", "title": "隐夜·刺客", "open": true },
{ "name": "necro", "title": "隐夜·死灵术士", "open": true },
{ "name": "kunoichi", "title": "隐夜·忍者", "open": true },
{ "name": "shadow_dancer", "title": "隐夜·影舞者", "open": true },
{ "name": "rogue", "title": "隐夜·刺客", "open": false },
{ "name": "necro", "title": "隐夜·死灵术士", "open": false },
{ "name": "kunoichi", "title": "隐夜·忍者", "open": false },
{ "name": "shadow_dancer", "title": "隐夜·影舞者", "open": false },
{ "name": "empty", "title": "" }
]
},
@@ -157,10 +157,10 @@
"name": "knight",
"title": "守护者",
"children": [
{ "name": "elven_knight", "title": "皓曦·精灵骑士", "open": true },
{ "name": "chaos", "title": "皓曦·混沌魔灵", "open": true },
{ "name": "paladin", "title": "皓曦·帕拉丁", "open": true },
{ "name": "dragon_knight", "title": "皓曦·龙骑士", "open": true },
{ "name": "elven_knight", "title": "皓曦·精灵骑士", "open": false },
{ "name": "chaos", "title": "皓曦·混沌魔灵", "open": false },
{ "name": "paladin", "title": "皓曦·帕拉丁", "open": false },
{ "name": "dragon_knight", "title": "皓曦·龙骑士", "open": false },
{ "name": "empty", "title": "" }
]
},
@@ -168,10 +168,10 @@
"name": "demonic_lancer",
"title": "魔枪士",
"children": [
{ "name": "vanguard", "title": "千魂·征战者", "open": true },
{ "name": "skirmisher", "title": "千魂·决战者", "open": true },
{ "name": "dragoon", "title": "千魂·狩猎者", "open": true },
{ "name": "impaler", "title": "千魂·暗枪士", "open": true },
{ "name": "vanguard", "title": "千魂·征战者", "open": false },
{ "name": "skirmisher", "title": "千魂·决战者", "open": false },
{ "name": "dragoon", "title": "千魂·狩猎者", "open": false },
{ "name": "impaler", "title": "千魂·暗枪士", "open": false },
{ "name": "empty", "title": "" }
]
},
@@ -179,10 +179,10 @@
"name": "gunblader",
"title": "枪剑士",
"children": [
{ "name": "hitman", "title": "苍暮·暗刃", "open": true },
{ "name": "agent", "title": "苍暮·特工", "open": true },
{ "name": "trouble_shooter", "title": "苍暮·战线佣兵", "open": true },
{ "name": "specialist", "title": "苍暮·源能专家", "open": true },
{ "name": "hitman", "title": "苍暮·暗刃", "open": false },
{ "name": "agent", "title": "苍暮·特工", "open": false },
{ "name": "trouble_shooter", "title": "苍暮·战线佣兵", "open": false },
{ "name": "specialist", "title": "苍暮·源能专家", "open": false },
{ "name": "empty", "title": "" }
]
},
@@ -190,10 +190,10 @@
"name": "archer",
"title": "弓箭手",
"children": [
{ "name": "muse", "title": "聆风·缪斯", "open": true },
{ "name": "traveler", "title": "聆风·旅人", "open": true },
{ "name": "hunter", "title": "聆风·猎人", "open": true },
{ "name": "vigilante", "title": "聆风·妖护使", "open": true },
{ "name": "muse", "title": "聆风·缪斯", "open": false },
{ "name": "traveler", "title": "聆风·旅人", "open": false },
{ "name": "hunter", "title": "聆风·猎人", "open": false },
{ "name": "vigilante", "title": "聆风·妖护使", "open": false },
{ "name": "empty", "title": "" }
]
},
@@ -201,8 +201,8 @@
"name": "extra",
"title": "外传",
"children": [
{ "name": "creator", "title": "知源·缔造者", "open": true },
{ "name": "dark_knight", "title": "极诣·黑暗武士", "open": true },
{ "name": "creator", "title": "知源·缔造者", "open": false },
{ "name": "dark_knight", "title": "极诣·黑暗武士", "open": false },
{ "name": "empty", "title": "" },
{ "name": "empty", "title": "" },
{ "name": "empty", "title": "" }
+1 -1
View File
@@ -20,6 +20,6 @@ if __name__ == '__main__':
application.include_router(api_router)
uvicorn.run(application, host='127.0.0.1', port=config.PORT)
uvicorn.run(app = application, host='127.0.0.1', port=config.PORT)