Пример #1
0
 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)
Пример #2
0
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)
Пример #3
0
    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
Пример #4
0
    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)
Пример #5
0
 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)
Пример #6
0
 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
Пример #7
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()
Пример #8
0
    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)
Пример #9
0
 def initPluginBefore(self):
     _dao.DaoExchangeCount.initialize()
     _dao.DaoExchangeId.initialize()
     _dao.DaoExchangeRecord.initialize()
     _dao.DaoExchangeLed.initialize()
     self._trimLedTimer = ftcore.runOnceDelay(
         600, _dao.trimLedItem)  # 每10分钟trim一次
Пример #10
0
 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)
Пример #11
0
 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)
Пример #12
0
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)
Пример #13
0
 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)
Пример #14
0
 def resetHallItemRed(cls, userId, kindGameId=0):
     ftcore.runOnceDelay(0.01, cls._resetHallItemRed, userId, kindGameId)
Пример #15
0
 def start(self):
     assert (self._state == self.ST_IDLE)
     self._state = self.ST_START
     self._timer = ftcore.runOnceDelay(self._interval, self._onTimeout)
Пример #16
0
 def startTable(self, table):
     ftlog.info('TableControllerTest.startTable')
     ftcore.runOnceDelay(1, self._winlose, table)
Пример #17
0
 def start(self):
     self._timer = ftcore.runOnceDelay(self._interval, self._onTimeout)
Пример #18
0
 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)
Пример #19
0
 def _startDelayFlushData(self):
     # 启动延迟写入计时器
     if self._flushTimer is None:
         self._flushTimer = ftcore.runOnceDelay(3, self._delayFlushData)