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