58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
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(distinct_id+account_id+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("distinct_id")}{values.get("account_id", "")}{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):
|
|
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'}
|
|
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)
|
|
|
|
|
|
|