def leave_channel(self, msg): """ 离开临时会话.(一方退出即终结临时会话) :param msg: :return: """ debug("ChatSrv leave_channel", msg) user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') channel_key = _get_channel_key(user_id, target_user_id) if channel_key in self.channels: del self.channels[channel_key] debug("ChatSrv clean channel", channel_key) is_friend = _check_friend(user_id, target_user_id) if not is_friend: now = current_milli_time() msg_id = get_msg_id(user_id, target_user_id, now) content = ftstr.dumps({"code": "chat", "status": "leave_channel"}) system_message = ChatMessage(user_id, target_user_id, 7, now, content) self.service.save_record(user_id, target_user_id, msg_id, system_message) # 回应对方离线 self.write(target_user_id, user_id, msg_id, system_message) # TODO 清理临时聊天消息 ftcore.runOnceDelay(0.1, self.__do_leave_game_message,user_id, target_user_id) if channel_key in self.tmp_channels: del self.tmp_channels[channel_key] debug("ChatSrv clean temp channel", channel_key)
def _doExchangeCommit(userId, exchangeId, mi, errMsg, state): if errMsg: # 有错误发生,回滚奖券数量 if mi.extabName == '_item_': # 道具列表兑换入口, 由道具的action进行处理回退处理 trueDelta, finalCount = -mi.coupon, 0 else: product_id = _conf.PRODUCT_MAP[mi.itemId] trueDelta, finalCount = pluginCross.halldata.incrCoupon( userId, mi.gameId, mi.coupon, ChipNotEnoughOpMode.NOOP, 'EXCHANGE5_ROLLBACK_COUPON', product_id) if _DEBUG: debug('_doExchangeCommit rollback coupon userId=', userId, 'couponIncr=', -mi.coupon, 'ouponDelta=', trueDelta, 'ouponFinal=', finalCount) # 更新订单状态 record = _dao.loadRecord(userId, exchangeId) record.state = state _dao.updateRecord(userId, record) # 记录兑换个数 ftcore.runOnceDelay(1, _counts.incrItemExchangeCount, mi.itemId) if _DEBUG: debug('_doExchangeCommit commit coupon userId=', userId, 'exchangeId=', exchangeId, 'state=', state)
def saveRecord(self, needUpload=True): """保存当前局的纪录 """ key = "" if needUpload == True and self.fileName: absoluteFileName = self.fileName.split("/")[-1] # 生成txt文件 fw_obj = open(absoluteFileName, 'w') fw_obj.write(json.dumps(self.msgs)) fw_obj.close() # 压缩为zip self.txt2zip(absoluteFileName, '%s.%s' % (absoluteFileName, 'zip')) # 上传zip数据 fr_obj = open('%s.%s' % (absoluteFileName, 'zip'), 'r') data = fr_obj.read() fr_obj.close() key = '%s.%s' % (self.fileName, 'zip') ftcore.runOnceDelay(SCANRATE, self.upload, key, data, 1) # 删除文件 if os.path.exists(absoluteFileName): os.remove(absoluteFileName) if os.path.exists('%s.%s' % (absoluteFileName, 'zip')): os.remove('%s.%s' % (absoluteFileName, 'zip')) # ftlog.debug("MJCreateTableRecordMsg:saveRecord========", key, data) self.reset() return key
def updateUserOrder(self, isAdd, order): ''' 记录用户的购买记录 ''' if order.product.diamondExchangeRate > 0: # 砖石换金币的商品 priceUnit = 1 # 单位:砖石 price = order.product.priceDiamond * order.count else: priceUnit = 2 # 单位:人民币 price = order.product.price * order.count if order.errorCode: state = -1 else: state = order.state datas = [ order.updateTime, order.productId, order.product.displayName, priceUnit, price, state ] DaoUserOrderList.HSET(order.userId, order.orderId, datas) if isAdd: # 延迟 ftcore.runOnceDelay(0.1, self.checkUserOrderListLimit, order.userId)
def answer_again_game(self, msg): """ 再来一局应答. :param msg: userId,targetUserId,miniGameId :return: msgId,ok """ debug("ChatGameSrv answer_again_game", msg) user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') msg_id = msg.getParamStr('msgId') code = msg.getParamStr('code') resp = MsgPack() resp.setCmd('chat') resp.setResult('action', 'answer_again_game') try: self.clean_channel(user_id,target_user_id) info = self.service.get_record(msg_id) if info: game_message = GameChatMessage.load_info(info) game_message.code = code self.service.save_record(user_id, target_user_id, msg_id, game_message) ftcore.runOnceDelay(0.1, self.__do_answer_again_game_message, user_id, target_user_id, code, msg_id) push_game_message(user_id, target_user_id, msg_id, game_message) resp.setResult('msgId', msg_id) resp.setResult('userId', user_id) resp.setResult('targetUserId', target_user_id) resp.setResult('status', 'ok') else: resp.setResult('status', 'error msgId') except TYBizException, e: resp.setResult('status', 'error') resp.setError(e.errorCode, e.message)
def asyncTrigerEvent(self, userId, eventName, eventDict): ''' 目前需要:GameDataChangedEvent、MatchOverEvent、GameOverEvent ''' cls = getattr(tygame, eventName) if cls: ftcore.runOnceDelay(0.01, self._asyncTrigerEvent, userId, cls, eventDict) return 1 return 0
def init(): """ 启动模拟环境. """ ftglobal.gameId = 9993 # 初始化环境基础变量 server_id, mn_port, conf_ip, conf_port, conf_dbid, namespace = "HU9999000001", 8400, "172.16.4.15", 8003, 3, \ "hall5" ftcore.runOnce(_initSafe, server_id, mn_port, conf_ip, int(conf_port), int(conf_dbid), namespace, None) #延迟运行测试用例 ftcore.runOnceDelay(5, testcase0) ftcore.mainloop()
def upload(self): """ 如果上传失败,每隔2*n的时间重试一次,重试4次 """ key = stackless.getcurrent()._fttask.run_argl[0] data = stackless.getcurrent()._fttask.run_argl[1] times = stackless.getcurrent()._fttask.run_argl[2] ret, _ = majiang_conf.uploadVideo(key, data) if ret == 0: ftlog.debug("MJCreateTableRecordMsg: upload the record success!!!") if ret != 0 and times <= 16: times = times * 2 ftcore.runOnceDelay(SCANRATE * times, self.upload, key, data, times)
def initPluginBefore(self): _dao.DaoExchangeCount.initialize() _dao.DaoExchangeId.initialize() _dao.DaoExchangeRecord.initialize() _dao.DaoExchangeLed.initialize() self._trimLedTimer = ftcore.runOnceDelay( 600, _dao.trimLedItem) # 每10分钟trim一次
def setup(self, interval, action, msgPackParams, cancelLastTimer=True): ''' 启动计时器 interval 倒计时的时间, 单位: 秒 action table_call命令下(params中)的action值 msgPackParams 传递的其他的参数数据集合dict, 可以在doTableCall中的msg中使用msg.getParam(key)来取得其中的参数 ''' if self._fttimer and cancelLastTimer: self._fttimer.cancel() self._interval = interval userId = msgPackParams.get('userId', 0) clientId = msgPackParams.get('clientId', None) assert(isinstance(userId, int)) assert(isinstance(action, (unicode, str))) if clientId != None: assert(isinstance(clientId, (unicode, str))) msg = MsgPack() msg.updateParam(msgPackParams) msg.setCmdAction('table_call', action) msg.setParam('gameId', self._table.gameId) msg.setParam('roomId', self._table.roomId) msg.setParam('tableId', self._table.tableId) msg.setParam('userId', userId) msg.setParam('clientId', clientId) self._fttimer = ftcore.runOnceDelay(interval, self._onTimeOut, msg)
def again_game(self, msg): """ 再来一局. TODO 并发 :param msg: userId,targetUserId,miniGameId :return: msgId,ok """ debug("ChatGameSrv again_game", msg) user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') mini_game_id = msg.getParamInt('miniGameId') resp = MsgPack() resp.setCmd('chat') resp.setResult('action', 'again_game') try: double_again,now,msg_id = self.check_channel(user_id,target_user_id) if double_again: info = self.service.get_record(msg_id) if info: game_message = GameChatMessage.load_info(info) game_message.code = "accept" self.service.save_record(user_id, target_user_id, msg_id, game_message) ftcore.runOnceDelay(0.1, self.__do_answer_again_game_message, user_id, target_user_id, "accept", msg_id) push_game_message(user_id, target_user_id, msg_id, game_message) resp.setResult('status', 'error') else: raise StrangerException() else: content = ftstr.dumps({'miniGameId': mini_game_id, 'code': 'invite'}) game_message = GameChatMessage(user_id, target_user_id, 2, now, content) self.service.save_record(user_id, target_user_id, msg_id, game_message) ftcore.runOnceDelay(0.1, self.__do_again_game_message,user_id,target_user_id,msg_id) push_game_message(user_id, target_user_id, msg_id, game_message) debug("ChatGameSrv again_game", msg_id) resp.setResult('msgId', msg_id) resp.setResult('userId', user_id) resp.setResult('targetUserId', target_user_id) resp.setResult('status', 'ok') except TYBizException, e: resp.setResult('status', 'error') resp.setError(e.errorCode, e.message)
def main(): conf = StageMatchConf(6, 6888).decodeFromDict(matchConf) roomId = 68881001 tableManager = MatchTableManager(conf.gameId, conf.tableSeatCount) tableManager.addTables(roomId, roomId * 10000, 500) tgdizhu = TGDizhuTest() # gdata.getBigRoomId = getBigRoomId # gdata._datas['tygame.instance.dict'] = {} # gdata._datas['tygame.instance.dict'][6] = tgdizhu # roomConf = {'name':'测试比赛'} # ftcon.global_config['server_id'] = 68881000 # gdata._datas['big_roomids_map'] = {6888:[68881000]} initDao() room = RoomTest(6888, roomId, 6, conf) matchMaster = MatchMaster(room, 6888, conf) matchArea = MatchArea(room, 6888, conf, None) matchArea.matchPlayerIF = MatchPlayerIFTest() matchArea.tableController = TableControllerTest() # matchArea.playerNotifier = MatchPlayerNotifierTest() matchArea.playerNotifier = PokerMatchPlayerNotifier(room) matchArea.tableManager = tableManager matchArea.matchSigninFeeIF = MatchSigninFeeIFTest() matchArea.signinRecordDao = MatchSigninRecordDaoTest() matchArea.matchRankRewardsIF = MatchRankRewardsIFTest() matchMaster.matchStatusDao = MatchStatusDaoTest() matchMaster.addAreaStub(MatchAreaStubLocal(matchMaster, matchArea)) matchArea.masterStub = MatchMasterStubLocal(matchMaster) matchArea.matchRankRewards = MatchRankRewardsIFTest() room.matchArea = matchArea matchMaster.start() matchArea.start() ftcore.runOnceDelay(5, startSignin, matchArea, matchMaster)
def _onTimeout(self): try: self._processPostTaskList() newInterval = self._handler() if newInterval is not None: self._interval = newInterval self._processPostTaskList() except: self._interval = 1 ftlog.error('MatchProcesser._onTimeout', self._handler) raise finally: if self._state == self.ST_START: self._timer = ftcore.runOnceDelay(self._interval, self._onTimeout)
def resetHallItemRed(cls, userId, kindGameId=0): ftcore.runOnceDelay(0.01, cls._resetHallItemRed, userId, kindGameId)
def start(self): assert (self._state == self.ST_IDLE) self._state = self.ST_START self._timer = ftcore.runOnceDelay(self._interval, self._onTimeout)
def startTable(self, table): ftlog.info('TableControllerTest.startTable') ftcore.runOnceDelay(1, self._winlose, table)
def start(self): self._timer = ftcore.runOnceDelay(self._interval, self._onTimeout)
def setup(self, interval, msg, cancelLastTimer=True): if self._fttimer and cancelLastTimer: self._fttimer.cancel() self._interval = interval self._fttimer = ftcore.runOnceDelay(interval, self._onTimeOut, msg)
def _startDelayFlushData(self): # 启动延迟写入计时器 if self._flushTimer is None: self._flushTimer = ftcore.runOnceDelay(3, self._delayFlushData)