コード例 #1
0
ファイル: hallnewnotify.py プロジェクト: luningcowboy/tuyoo
    def __init__(self, argd):
        self.argd = argd
        self._alive = False

        if self.argd['ntimeId'] == NOTIFY_TIME_ATONCE_ID:
            self.startTimer = FTTimer(0, self.start)
            ftlog.hinfo('Notify.__init__ atonce', self.argd)
        else:
            ntime = [0, 1]
            if self.argd['ntimeId'] == NOTIFY_TIME_TIMER_ID:
                try:
                    dtList = self.argd['ntime'].split('|')
                    ntime = map(int, dtList[1].split(':'))
                except:
                    ftlog.warn('Notify.__init__.NOTIFY_TIME_TIMER_ID error')
                    ntime = map(int, '00:01'.split(':'))
            else:
                ntime = map(int, self.argd['ntime'].split(':'))
            hm = map(int, getNowTimeStr().split(':'))

            interval = (ntime[0] * 60 * 60 +
                        ntime[1] * 60) - (hm[0] * 60 * 60 + hm[1] * 60)
            ftlog.hinfo('Notify.__init__ begin:', ntime, hm, interval,
                        (ntime[0] * 60 * 60 + ntime[1] * 60),
                        (hm[0] * 60 * 60 + hm[1] * 60))
            if interval > 0:
                self.startTimer = FTTimer(interval, self.start)

            ftlog.hinfo('Notify.__init__ end:', interval, self.argd)
コード例 #2
0
    def _notifyRobotSigninMatch(self, signer):
        if self._logger.isDebug():
            self._logger.warn('TYGroupMatchRoom._notifyRobotSigninMatch',
                              'userId=', signer.userId, 'instId=', signer.inst)

        if self.roomConf.get('hasrobot'):
            startConf = self.match.matchConf.start
            if self.roomConf['robotUserMaxCount'] == -1:
                if startConf.isTimingType():
                    minsize = startConf.userMinCount
                else:
                    minsize = startConf.userCount - 2
            else:
                minsize = self.roomConf['robotUserMaxCount']

            if signer.inst.signerCount >= minsize:
                return

            mo = MsgPack()
            mo.setCmd('robotmgr')
            mo.setAction('callmatch')
            mo.setParam('gameId', self.gameId)
            mo.setParam('roomId', self.bigRoomId)
            mo.setParam('robotCount', 4)
            router.sendRobotServer(mo, signer.userId)

            func = functools.partial(self._notifyRobotSigninMatch, signer)
            FTTimer(15, func)
コード例 #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')
            FTTimer(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 doHeartBeat(self):
        if self._state == self.STATE_IDLE:
            return

        FTTimer(1, self.doHeartBeat)
        if len(self.users) == 0:
            return

        if ftlog.is_debug():
            ftlog.debug("<<", self.baseLogStr(), caller=self)
        # ftlog.debug("|first user, enter time, now, wait_time:", self.users.keys()[0], self.users[self.users.keys()[0]], time.time(), self.wait_time)
        if self._state == self.STATE_LOOP:
            if len(self.users) >= self.n_start:
                self._tryStartNewTable(self.n_start)
                return

            if time.time() - self.users[self.users.keys()
                                        [0]]["enterTime"] < self.wait_time:
                return

            if len(self.users) >= self.minTriggerLen:
                self._tryStartNewTable(self.minTriggerLen)
                return

            if TYPlayer.isRobot(self.users.keys()[0]):
                return

            if len(self.room._roomUsers) < self.n_start:
                self.notifyRobot()
コード例 #5
0
 def enqueue(self, model):
     ftlog.debug('AsyncReporter.enqueue', 'model.urlType=', model.urlType,
                 'model.params=', model.params)
     self._changed = True
     self._dao.append(model.toJson())
     if not self._timer:
         self._timer = FTTimer(0, self._onTimer)
コード例 #6
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 = FTTimer(interval, self._onTimeOut, msg)
コード例 #7
0
def _doServertHeartBeat():
    '''
    每秒钟一次的心跳事件广播, 执行之后间隔一秒再次启动, 即: 这个每秒心跳是个大约值,非准确值
    '''
    event = EventHeartBeat()
    event.count = event.count + 1
    globalEventBus.publishEvent(event)
    FTTimer(1, _doServertHeartBeat)
コード例 #8
0
    def sendGameWinRes(self, delay=0):
        mpRes = self.createMsgPackRes("table_call", 'game_win')

        if delay:
            func = functools.partial(self.sendToAllTableUser, mpRes)
            FTTimer(delay, func)
        else:
            self.sendToAllTableUser(mpRes)
コード例 #9
0
ファイル: matchtest.py プロジェクト: zhaozw/hall37
 def startTable(self, table):
     '''
     让桌子开始
     '''
     ftlog.info('MatchTableControllerTest.startTable matchId=',
                self.match.matchId, 'tableId=', table.tableId)
     timeout = random.randint(1, 5)
     FTTimer(timeout, self._winlose, table)
コード例 #10
0
def keepAlive(mysql_pool_map):
    global _keep_count, _keep_alive_seconds
#     ftlog.debug('MYSQL keepAlive', len(mysql_pool_map), _keep_count)
    _keep_count += 1
    if _keep_count == 1 :
        if len(mysql_pool_map) > 0 :
            FTTimer(_keep_alive_seconds, _keepAlive, mysql_pool_map)
        return

    sqlstr = 'select %d' % (_keep_count)
    for dbkey in mysql_pool_map.keys() :
        conn = mysql_pool_map[dbkey]
        try:
            defertool.setDefaultCallback(conn.runQuery(sqlstr), __file__, ftlog.getMethodName(), sqlstr)
        except:
            ftlog.error('ERROR MYSQL of', dbkey, 'has connection error ! close !! ')

    FTTimer(_keep_alive_seconds, _keepAlive, mysql_pool_map)
コード例 #11
0
ファイル: quickstartTest.py プロジェクト: luningcowboy/tuyoo
    def testSuit(self):
        testStartTime = 0  # seconds

        testStartTime += 1
        for _ in xrange(1):
            FTTimer(testStartTime, self.testReconnect)

        testStartTime += 1
        for _ in xrange(1):
            FTTimer(testStartTime, self.testQuickStart)

        testStartTime += 1
        for _ in xrange(1):
            FTTimer(testStartTime, self.testQuickEnterRoom)

        testStartTime += 1
        for _ in xrange(1):
            FTTimer(testStartTime, self.testQuickEnterTable)
コード例 #12
0
 def saveRecord(self):
     """保存当前局的纪录
     """
     if not self.resMsgs:
         return
     data = self.compress()
     fname = self.getKey() + "_" + str(self.table.gamePlay.gameSeq)
     func = functools.partial(self.uploadTableRecord, fname, data, 1)
     FTTimer(UPLOAD_INTERVAL, func)
     self.clear()
コード例 #13
0
    def _onLuckyMoneyPublish(self):
        if self.publishTimer:
            self.publishTimer.cancel()
            self.publishTimer = None

        # 计算下一次发布红包的剩余秒数
        seconds = self._calculateNextSeconds()
        if seconds >= 0:
            self.publishTimer = FTTimer(seconds, self._onLuckyMoneyPublish)

        # 获取当前所在的红包开放时间段,为None则代表当前不处于开放时间段
        duration = self.openList.getCurrentDurationItem()
        if ftlog.is_debug():
            ftlog.debug('LuckyMoneyPublisher._onLuckyMoneyPublish', 'poolId=',
                        self.poolId, 'seconds=', seconds,
                        'currentDuration.start', duration and duration.start)
        if not duration:
            return

        # 当前时间段的期号
        issueNumber = duration.getIssueNumber()
        # 此期红包是否已经发布(多进程情况下,争夺红包发布权,只有一个能返回True)
        isNotPublished = LuckyMoneyOperator.setPublisheFlagByIssueNumber(
            self.poolId, issueNumber)
        if isNotPublished:
            # 获取红包生成的配置
            prizesConf = Tool.dictGet(self.clientConf, 'config.server.prizes',
                                      [])
            # 生成红包列表数据
            prizeList = LuckyMoneyGenerator.generate(prizesConf)
            # 先清空数据库的红包池,防止上一期未抢完的红包污染
            LuckyMoneyOperator.clearLuckyMoneys(self.poolId)
            # 将新生成的红包数据发布到数据库中红包池里
            ok = LuckyMoneyOperator.publishLuckyMoneys(self.poolId, prizeList)
            if not ok:
                LuckyMoneyOperator.clearPublisheFlagByIssueNumber(
                    self.poolId, issueNumber)
                FTTimer(5, self._onLuckyMoneyPublish)
            ftlog.info('LuckyMoneyPublisher._onLuckyMoneyPublish:publish',
                       'poolId=', self.poolId, 'issueNumber=', issueNumber,
                       'isNotPublished=', isNotPublished,
                       'currentDuration.start=', duration and duration.start,
                       'publishLuckyMoneys—ok=', ok)
コード例 #14
0
def callLater(delay, func, *args, **keywords):
    '''
    用FTTimer实现的callLater
    '''
    if ftlog.is_debug():
        ftlog.debug('args', args)
        ftlog.debug('timedelay', delay)
        ftlog.debug('callable', callable(func))
    func = functools.partial(func, *args, **keywords)
    return FTTimer(delay, func)
コード例 #15
0
ファイル: lts_room.py プロジェクト: zhaozw/hall37
    def __initMatch(self):
        return  # 游轮赛已下线

        self.matchPlugin = gdata.games()[self.gameId].getLtsMatchPlugin()
        self.matchPlugin.initMatchConfs(self.gameId)

        serverType = gdata.serverType()
        if serverType == gdata.SRV_TYPE_TABLE:
            endTimestamp = self.matchPlugin.match_room_confs[
                self.bigRoomId]["end_timestamp"]
            FTTimer(endTimestamp - int(time.time()) + 5, self._checkMatchEnd)
コード例 #16
0
ファイル: mtt_room.py プロジェクト: zhaozw/hall37
    def __startFinalTableLater(self):
        self.state = self.MTT_STATE_FINALS

        now = datetime.now()
        finalTableStartTime = now + timedelta(seconds=self.matchPlugin.timedeltaStartFinalTable)
        if ftlog.is_debug():
            ftlog.info("__startFinalTableLater |roomId, finalTableStartTime:", self.roomId, finalTableStartTime,
                       caller=self)
        self.__sendFinalTableInfo(finalTableStartTime)

        FTTimer(self.matchPlugin.timedeltaStartFinalTable, self.scheduler.startLoop)
コード例 #17
0
ファイル: utils.py プロジェクト: zhaozw/hall37
 def _onTimer(self):
     try:
         self._timer = None
         newInterval = self._target()
         if newInterval is not None:
             self._interval = newInterval
     except:
         self._logger.error()
         self._interval = 1
     if self._state == Heartbeat.ST_START:
         self._timer = FTTimer(self._interval, self._onTimer)
コード例 #18
0
ファイル: hallnewnotify.py プロジェクト: luningcowboy/tuyoo
    def start(self):
        self.startTimer.cancel()

        if self.argd['rmTag'] == 1:
            ftlog.hinfo('Notify.start error because be removed',
                        self.argd['uuid'])
            return

        self._alive = True
        self.endTimer = FTTimer(NOTIFY_TIMER_LIFE, self.end)

        ftlog.hinfo('Notify.start', NOTIFY_TIMER_LIFE, self.argd['uuid'])
コード例 #19
0
    def doSomeLogic2(self):
        ftlog.info("MyProto do some logic in tasklet")
        #test redis aio
        ftsvr.doRedis("user01", "SET", "zx", 1)

        #Testing doHttp...
        #code, page = ftsvr.doHttp("GET", "http://www.google.com",
        #       {'User-Agent': ['Twisted']}) #test connect timeout
        #code, page = ftsvr.doHttp("GET", "http://news.sina.com.cn/",
        #       {'User-Agent': ['Twisted']}, '', 15, 0.1) #test request timeout
        #page = ftsvr.doHttp("GET", "http://news.sina.com.cn/sssss",
        #       {'User-Agent': ['Twisted']}) #test 404
        code, page = ftsvr.doHttp("POST", "http://127.0.0.1:8003/",
                                  {'User-Agent': ['Twisted']}, "HAHAHA")
        print code, page
        print "HTTP", code, len(page), page

        log_data = struct.pack("64s", "HAHAHA")
        ftlog.sendHttpLog("user01", "chip", log_data)

        #pipeline需要加锁,否则结果可能混乱,框架中已经加了lock,参见ftsvr代码
        count = 1000
        pipecount = 100
        st = time.time()
        for x in xrange(count / pipecount):
            if x % 100 == 0:
                ftlog.info(x)
            pl = ftsvr.getRedisPipe("user01")
            for y in xrange(pipecount):
                pl.set("zx", 1)
            result = ftsvr.doRedisPipe(pl)
            if len(result) != pipecount:
                ftlog.debug("ERRORPIPELINE")
        ftlog.info("SetPerS:", count / (time.time() - st))

        #test ftagent and udpquery
        ftlog.debug(ftcon.getConf("server"), caller=self)
        ftlog.debug(ftsvr.getTaskRunArg())
        ftlog.debug(ftsvr.doUdpQuery("LO01", "abcdefgh"))
        ftlog.debug(ftagent.query("GA01", "TCPTCPSENDBYAGENT"))

        #test cron
        _tstr = time.strftime('%Y%m%d', time.localtime())
        cron2 = FTCron(
            '{"times_in_day":{"first":"15:00","interval":5, "count":32},\
                        "days":{"first":"%s", "interval":"2m", "count":10}}' %
            (_tstr))
        ftlog.debug(cron2.getTimeList(), cron2.getDaysList())
        ftlog.debug("SEC=", cron2.getTodayNextLater())

        #test timer
        tr = FTTimer(3, self.timerFunc, 1, 2, 3, aaa=111)
コード例 #20
0
ファイル: bigmatchTest.py プロジェクト: luningcowboy/tuyoo
    def asyncTestSuit(self):
        ftlog.debug("=" * 30)
        testStartTime = 0  # seconds

        #         testStartTime +=1
        #         for _ in xrange(1):
        #             FTTimer(testStartTime, self.asyncTest3PlayerMatch)

        testStartTime += 1
        for _ in xrange(1):
            FTTimer(testStartTime, self.asyncTest3PlayerMatchWithRobot)

        ftlog.debug("=" * 30)
コード例 #21
0
    def testTimer(self):

        print "call %s" % getMethodName()

        def fun1(x):
            print "call %s" % getMethodName()
            print x * 10

        func = functools.partial(fun1, 1)
        timer = FTTimer(1, func)

        stackless.tasklet(mainloop)()
        stackless.run()
コード例 #22
0
    def testSuit(self):
        ftlog.debug("=" * 30)
        testStartTime = 0  # seconds

        #         testStartTime +=1
        #         for _ in xrange(10):
        #             FTTimer(testStartTime, self.asyncTestQuickStartPlayerSelectTable)

        testStartTime += 1
        for _ in xrange(10):
            FTTimer(testStartTime, self.asyncTestRoomQuickStart)

        ftlog.debug("=" * 30)
コード例 #23
0
    def asyncTestSuit(self):
        ftlog.debug("=" * 30)
        testStartTime = 0  # seconds

        #         testStartTime +=1
        #         for _ in xrange(1):
        #             FTTimer(testStartTime, self.asyncTestOldTable)

        testStartTime += 1
        for _ in xrange(1):
            FTTimer(testStartTime, self.asyncTestDoSit)

        ftlog.debug("=" * 30)
コード例 #24
0
ファイル: dizhuaccount.py プロジェクト: luningcowboy/tuyoo
def loginGame(userId, gameId, clientId, iscreate, isdayfirst):
    '''
    用户登录一个游戏, 游戏自己做一些其他的业务或数据处理
    例如: 1. IOS大厅不发启动资金的补丁, 
         2. 麻将的记录首次登录时间
         3. 游戏插件道具合并至大厅道具
    '''
    ftlog.debug('dizhu.loginGame->', userId, gameId, clientId, iscreate, isdayfirst)
    dizhutask._onUserLogin(gameId, userId, clientId, iscreate, isdayfirst)
    # if not (iscreate or hallstartchip.needSendStartChip(userId, gameId)):
    #     hallbenefits.benefitsSystem.sendBenefits(gameId, userId, pktimestamp.getCurrentTimestamp())
    if iscreate:
        dizhu_login_reward.sendLoginReward(gameId, userId, clientId, iscreate, isdayfirst)
    FTTimer(0, functools.partial(processUserBehavior, userId))
コード例 #25
0
ファイル: mtt_room.py プロジェクト: zhaozw/hall37
    def doHeartBeat(self):
        if self._state == self.STATE_IDLE:
            return

        FTTimer(1, self.doHeartBeat)

        if len(self.users) > 0:
            if ftlog.is_debug():
                ftlog.debug("<<", self.baseLogStr(), caller=self)
                #         ftlog.debug("|first user, enter time, now, wait_time:", self.users.keys()[0], self.users[self.users.keys()[0]], time.time(), self.wait_time)

        if self._state == self.STATE_LOOP:
            if len(self.users) >= self.n_start:
                self._tryStartNewTable(self.n_start)
コード例 #26
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
            FTTimer(SCANRATE * times, self.upload, key, data, times)
コード例 #27
0
ファイル: lts_room.py プロジェクト: zhaozw/hall37
    def doMatchEnd(self):
        ftlog.info("<< |roomId:", self.roomId, caller=self)

        # TODO: 向所有人发送 todotask,提示比赛已结束

        rankingKey = self.matchPlugin.rankingKey(self.bigRoomId)
        # 更新翅膀,发奖励
        userIds = daobase.executeRankCmd('ZREVRANGE', rankingKey, 0, -1)
        self.matchPlugin.rewardUsers(userIds, self)

        # 重新计算比赛时间
        self.matchPlugin.refreshMatchStartTime(
            self.bigRoomId, self.matchConf["openTime"].get("minutes", 60))
        endTimestamp = self.matchPlugin.match_room_confs[
            self.bigRoomId]["end_timestamp"]
        FTTimer(endTimestamp - int(time.time()) + 5, self._checkMatchEnd)
コード例 #28
0
ファイル: interfacedizhu.py プロジェクト: luningcowboy/tuyoo
 def notifyMatchStartDelayReport_(self):
     argl = FTTasklet.getCurrentFTTasklet().run_argl
     datas = argl[0]
     userIds = datas['userIds']
     roomId = datas['roomId']
     sequence = datas['sequence']
     index = datas['index']
     self._logger.info('PlayerNotifierDizhu.notifyMatchStartDelayReport_',
                       'index=', index, 'total=', len(userIds))
     nindex = self.notifyMatchStartDelayReport(userIds, roomId, sequence,
                                               index)
     if nindex < 0:
         self._logger.info(
             'PlayerNotifierDizhu.notifyMatchStartDelayReport_ end')
     else:
         datas['index'] = nindex
         FTTimer(0.1, self.notifyMatchStartDelayReport_, datas)
コード例 #29
0
    def _onTimer(self):
        self._changed = False
        datas = self._dao.range(0, 9)
        if not isinstance(datas, list):
            datas = []
        ftlog.debug('AsyncReporter._onTimer:', 'datas=', datas)

        for data in datas:
            model = ReportEntryModel().fromJson(data)
            ec, info = self._tryReport(model,
                                       AsyncReporter._report_max_retry_times,
                                       AsyncReporter._report_retry_interval)
            if ec != 0:
                self._reportFailed(model, ec, info)
            self._dao.pophead()
        self._timer = None
        if len(datas) >= 10 or self._changed:
            self._timer = FTTimer(0.1, self._onTimer)
コード例 #30
0
ファイル: tableproto.py プロジェクト: huazhengyang/tuyoo
    def _onGameReady(self, event):
        super(DizhuTableProtoCustomMatch, self)._onGameReady(event)
        matchTableInfo = event.table.matchTableInfo
        isStartStep = matchTableInfo['stage']['isStartStage']

        if isStartStep:
            noteInfos = []
            for seat in event.table.seats:
                note = self.buildNote(seat)
                mn = MsgPack()
                mn.setCmd('m_note')
                mn.setResult('note', note)
                self.sendToSeat(mn, seat)
                noteInfos.append((seat, seat.userId, note))
            func = functools.partial(self.sendMNoteMsg, noteInfos)
            FTTimer(3, func)
        
        for seat in event.table.seats:
            self.sendRank(seat)