import asyncio import hashlib from fastapi import APIRouter, Request from pydantic import BaseModel, validator from handler_data import HandlerUser, HandlerEvent from settings import settings router = APIRouter() class Item(BaseModel): # sign = md5(game+act+ts+salt) distinct_id: str game: str account_id: str act: str event_name: str = None properties: dict ts: int sign: str @validator('sign') def sign_validator(cls, v: str, values: dict): s = f'{values.get("game")}{values.get("act", "")}{values.get("ts", "")}{settings.SALT}' if hashlib.md5(s.encode()).hexdigest() == v: return v raise ValueError(f'签名 {hashlib.md5(s.encode()).hexdigest()}') @router.post("/point/") async def point(request: Request, item: Item): ip = request.client.host ta = getattr(request.app.state.ta, item.act) # 将不同游戏发送到不同 topic_name request.app.state.ta.consumer.topic_name = item.game rdb = request.app.state.redis if ta and item.event_name and item.act == 'track': await asyncio.gather(*map(lambda o: asyncio.create_task(o(rdb, item)), HandlerEvent.handler_link)) await track(ta, item) else: await asyncio.gather(*map(lambda o: asyncio.create_task(o(rdb, item)), HandlerUser.handler_link)) await user_set(ta, item) results = {"code": 0, 'msg': 'ok','ip':ip} return results async def track(ta, item): ta(item.distinct_id, item.account_id, item.event_name, item.properties) async def user_set(ta, item): ta(item.distinct_id, item.account_id, item.properties)