102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
import hashlib
|
|
import os
|
|
from abc import ABCMeta, abstractmethod
|
|
import traceback
|
|
import arrow
|
|
from setting import logger
|
|
|
|
from setting import settings
|
|
|
|
|
|
class Handler(metaclass=ABCMeta):
|
|
game_config = None
|
|
g_mdb = None
|
|
|
|
def __init__(self, data):
|
|
self._data = data
|
|
appid = data['appid']
|
|
self._event = self._data['event']
|
|
self._game = self._data['project']
|
|
self._type = self._data['type']
|
|
Handler._init_game_config()
|
|
Handler._init_mdb(f'{settings.DB_PREFIX}_{Handler.game_config[appid]["id_name"]}')
|
|
self.secret_token = Handler.game_config[appid].get('secret_token', '')
|
|
self._nt = arrow.now(tz=Handler.game_config[appid].get('timezone', 'local')).timestamp
|
|
|
|
print(Handler.game_config)
|
|
|
|
@classmethod
|
|
def _init_mdb(cls, dbname):
|
|
if not cls.g_mdb:
|
|
cls.g_mdb = settings.mdb_clint[dbname]
|
|
return cls.g_mdb
|
|
|
|
def set_handle(self):
|
|
"""
|
|
设置数据 更新数据 没有的话创建数据
|
|
|
|
:return:
|
|
"""
|
|
where = self.get_where()
|
|
coll = self.get_coll()
|
|
update_data = self._data.get('props', {})
|
|
if update_data:
|
|
update_data.update({
|
|
'_ut': self._nt,
|
|
})
|
|
coll.update_one(where, {'$set': update_data}, upsert=True)
|
|
|
|
@classmethod
|
|
def _init_game_config(cls):
|
|
if not cls.game_config:
|
|
topic_list = settings.kafka_setting['topic_name']
|
|
data = settings.admin_game_coll.find({'appid': {'$in': topic_list}}, {'_id': False})
|
|
cls.game_config = {item['appid']:item for item in data}
|
|
return cls.game_config
|
|
|
|
def handler_event(self):
|
|
fun_name = f'{self._event}_handle'
|
|
if not hasattr(self, fun_name):
|
|
return
|
|
fun_name = getattr(self, fun_name)
|
|
fun_name()
|
|
|
|
def get_where(self):
|
|
pass
|
|
|
|
@classmethod
|
|
@abstractmethod
|
|
def get_coll(cls, *args, **kwargs):
|
|
pass
|
|
|
|
def run(self):
|
|
try:
|
|
if not self._check_data():
|
|
logger.warning('签名错误')
|
|
return
|
|
self.handler_event()
|
|
except Exception as e:
|
|
traceback.print_exc()
|
|
logger.error(e)
|
|
|
|
def _check_data(self):
|
|
if not isinstance(self._data, dict):
|
|
return False
|
|
if 'sign' not in self._data or 'timestamp' not in self._data:
|
|
return False
|
|
sign = self._data.get('sign', '')
|
|
appid = self._data.get('appid', '')
|
|
project = self._data.get('project', '')
|
|
|
|
type_ = self._data.get('type', '')
|
|
event_act = self._data.get('event_act', '')
|
|
event = self._data.get('event', '')
|
|
timestamp = self._data.get('timestamp', '')
|
|
m = hashlib.md5()
|
|
m.update((str(appid) + project + type_ + event + event_act + str(timestamp) + self.secret_token).encode('utf8'))
|
|
local_sign = m.hexdigest()
|
|
if sign != local_sign:
|
|
logger.warning(str(appid) + project + type_ + event + event_act + str(timestamp) + self.secret_token)
|
|
return False
|
|
return True
|