xlegudata_consumer/handler/handler.py
2020-11-13 20:44:28 +08:00

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