Files
LoveACE-EndF/provider/aufe/isim/depends.py
2025-09-03 13:00:40 +08:00

117 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import Depends, HTTPException
from database.creator import get_db_session
from provider.loveac.authme import fetch_user_by_token
from provider.aufe.isim import ISIMClient
from provider.aufe.client import AUFEConnection
from database.user import User
from sqlalchemy.ext.asyncio import AsyncSession
from typing import Dict
from database.isim import ISIMRoomBinding
from sqlalchemy import select
# 全局ISIM客户端池
_isim_clients: Dict[str, ISIMClient] = {}
def get_cached_isim_client(user_id: str) -> ISIMClient:
"""
获取缓存的ISIM客户端
Args:
user_id: 用户ID
Returns:
ISIMClient: 缓存的ISIM客户端实例如果未找到则返回None
"""
return _isim_clients.get(user_id)
def cache_isim_client(user_id: str, client: ISIMClient) -> None:
"""
缓存ISIM客户端
Args:
user_id: 用户ID
client: ISIM客户端实例
"""
_isim_clients[user_id] = client
async def get_isim_client(
user: User = Depends(fetch_user_by_token),
session: AsyncSession = Depends(get_db_session),
) -> ISIMClient:
from loguru import logger
"""
获取ISIM客户端实例
Args:
user: 用户对象(通过认证令牌获取)
Returns:
ISIMClient: ISIM客户端实例
Raises:
HTTPException: 认证失败时抛出
"""
if not user:
raise HTTPException(status_code=400, detail="无效的令牌或用户不存在")
# 首先检查是否已有缓存的ISIM客户端
cached_client = get_cached_isim_client(user.userid)
if cached_client:
# 检查缓存的客户端是否仍然有效
try:
if cached_client.is_session_valid():
from loguru import logger
logger.info(f"复用缓存的ISIM客户端: user_id={user.userid}")
return cached_client
except Exception as e:
from loguru import logger
logger.warning(f"缓存的ISIM客户端无效将重新创建: {str(e)}")
# 创建或获取VPN连接
aufe = AUFEConnection.create_or_get_connection("vpn.aufe.edu.cn", user.userid)
# 检查VPN登录状态
if not aufe.login_status():
userid = user.userid
easyconnect_password = user.easyconnect_password
if not await aufe.login(userid, easyconnect_password):
raise HTTPException(
status_code=400,
detail="VPN登录失败请检查用户名和密码",
)
# 检查UAAP登录状态
if not aufe.uaap_login_status():
userid = user.userid
password = user.password
if not await aufe.uaap_login(userid, password):
raise HTTPException(
status_code=400,
detail="大学登录失败,请检查用户名和密码",
)
# 创建新的ISIM客户端
isim_client = ISIMClient(aufe)
result_query = await session.execute(
select(ISIMRoomBinding).where(ISIMRoomBinding.userid == user.userid)
)
binding_record = result_query.scalars().first()
if binding_record:
logger.info(f"找到用户({user.userid})绑定记录,进行启动再绑定")
await isim_client.bind_room(
building_code=binding_record.building_code,
floor_code=binding_record.floor_code,
room_code=binding_record.room_code,
)
# 缓存客户端
cache_isim_client(user.userid, isim_client)
logger.info(f"创建并缓存新的ISIM客户端: user_id={user.userid}")
return isim_client