示例#1
0
def sendFreeChipTodoTask(userid, gameId, cache = False, direct = True):
    """ 推送 免费金币  added by nick.kai.lee

    Args:
        userid: 玩家userid
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None

    ftlog.debug('sendFreeChipTodoTask:', userid)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder


    task = MahjongTodoTaskBuilder.dict_free_chip(userid, cache)

    if not task:
        return False, None

    ftlog.debug('sendFreeChipTodoTask:', task)
    if False == direct:
        return True, task

    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userid)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userid)
    return True, None
示例#2
0
def sendBuyDiamondTodoTask(userId, gameId, clientId, pay_order):
    """ 幸运大抽奖,钻石购买
    @param         pay_order        挑选商品模板
    """
    if not TYPlayer.isHuman(userId):
        return

    product, _ = hallstore.findProductByPayOrder(gameId, userId, clientId,
                                                 pay_order)
    if not product:
        ftlog.error('userId =', userId, 'clientId =', clientId, 'pay_order =',
                    pay_order, 'can not find suitable product!')
        return
    try:
        product = product.clone()
    except:
        product = strutil.cloneData(product)
    desc = u'您的钻石不够哦~\n现在' + unicode(product.price) + u'元立得' + unicode(
        product.priceDiamond) + u'钻石!'
    product.content.desc = str(product.priceDiamond) + '钻石'
    client_ver = sessiondata.getClientIdVer(userId)
    if client_ver < 3.74:  # 客户端bug,小于3.74的版本转换一下
        product.priceDiamond = product.price
    todotasks = TodoTaskOrderShow.makeByProduct(desc, '', product)
    TodoTaskHelper.sendTodoTask(gameId, userId, todotasks)
示例#3
0
def sendMasterGiftTodoTask(userId, gameId, clientId, pic, pay_order, roomId):
    """ 推送高手礼包弹窗
    @param         pay_order        挑选商品模板
    """
    if not TYPlayer.isHuman(userId):
        return
    product, _ = hallstore.findProductByPayOrder(gameId, userId, clientId,
                                                 pay_order)
    if not product:
        ftlog.error('userId =', userId, 'clientId =', clientId, 'pay_order =',
                    pay_order, 'can not find suitable product!')
        return
    todotask = TodoTaskPayOrder(product)
    task = {
        'action': 'cache_wnd_gaoshou',
        'params': {
            'pic': pic,
            'tasks': [todotask.toDict()]
        }
    }
    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userId)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userId)
示例#4
0
def sendTodoTaskInviteFriends(userId, gameId, invite_uids, play_mode, roomId,
                              tableId, info_str, purl):
    """ 邀请好友来牌桌
    @param        name        发送邀请的用户名
    @param        invite_uids 被邀请的玩家uid列表
    @param        table       牌桌对象
    """
    ftlog.debug('userId =', userId, 'roomId =', roomId, 'tableId =', tableId,
                'invite_uids =', invite_uids, 'info_str =', info_str)
    if not TYPlayer.isHuman(userId):
        ftlog.debug('robot is not supported!')
        return

    for uid in invite_uids:
        last_gameId = onlinedata.getLastGameId(uid)
        if last_gameId == gameId:  # 如果玩家在麻将里
            sendFriendInviteTodotask(uid, userId, gameId, play_mode, roomId,
                                     tableId, info_str, purl)
        elif last_gameId == 9999:  # 如果玩家在大厅主界面
            sendFriendInviteEnterGameTodotask(uid, gameId, play_mode, roomId,
                                              tableId, info_str)
        else:  # 在其它游戏里,直接忽略
            ftlog.debug('last_gameId is not 7 or 9999', 'last_gameId =',
                        last_gameId)
            return
        from majiang2.entity import util
        util.sendPrivateMessage(uid, info_str)
示例#5
0
def sendMarketEstimateTodoTask(userid,
                               gameId,
                               url,
                               des,
                               cache=False,
                               direct=True):
    """ 推送麻将五星好评Cache
    发送五星好评的数据,客户端缓存,什么时候激活五星好评由客户端实现
    @param         des        五星好评内容
    """
    if not TYPlayer.isHuman(userid):
        return False, None
    ftlog.debug('sendMarketEstimateTodoTask:', userid, url, des, cache, direct)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder

    task = MahjongTodoTaskBuilder.dict_market_estimate(userid, url, des, cache)
    if not task:
        return False, None

    if True == direct:
        mo = MsgPack()
        mo.setCmd('majiang_todotasks')
        mo.setResult('gameId', gameId)
        mo.setResult('userId', userid)
        mo.setResult('tasks', [task])
        router.sendToUser(mo, userid)
        return True, None
    else:
        return True, task
示例#6
0
def sendFreeChipTodoTask(userid, gameId, cache=False, direct=True):
    """ 推送 免费金币  added by nick.kai.lee

    Args:
        userid: 玩家userid
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None

    ftlog.debug('sendFreeChipTodoTask:', userid)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder

    task = MahjongTodoTaskBuilder.dict_free_chip(userid, cache)

    if not task:
        return False, None

    ftlog.debug('sendFreeChipTodoTask:', task)
    if False == direct:
        return True, task

    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userid)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userid)
    return True, None
    def doCallDizhuTimeOut(self, player):
        '''
        叫地主超时
        '''
        ftlog.debug('doCallDizhuTimeOut...')

        if not player or self.table.status.state != DizhuState.TABLE_STATE_CALLING:
            ftlog.warn('ERROR !!, doCallDizhuTimeOut table.status=',
                       self.table.status, player)
            return

        assert (self.table.status.callGrade < 3)

        if TYPlayer.isHuman(player.userId):
            # 真实玩家超时默认不叫地主
            call = 0
        else:
            # AI必须叫地主
            if self.table.status.callGrade <= 0:
                call = 1
            else:
                call = self.table.status.callGrade + 1

        # 系统主动替玩家进行叫地主, 1分
        self.doCallDizhu(player, -1, call, DizhuPlayer.TUGUAN_TYPE_TIMEOUT)
示例#8
0
def sendMasterGiftTodoTask(userId, gameId, clientId, pic, pay_order, roomId):
    """ 推送高手礼包弹窗
    @param         pay_order        挑选商品模板
    """
    if not TYPlayer.isHuman(userId):
        return
    product, _ = hallstore.findProductByPayOrder(gameId, userId, clientId, pay_order)
    if not product:
        ftlog.error('userId =', userId, 'clientId =', clientId, 'pay_order =', pay_order,
                    'can not find suitable product!')
        return
    todotask = TodoTaskPayOrder(product)
    task = {
            'action':   'cache_wnd_gaoshou',
            'params':   {
                         'pic':     pic,
                         'tasks':   [todotask.toDict()]
                         }
            }
    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userId)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userId)
 def doSignin(self, userId, feeIndex=0):
     """
     比赛报名
     """
     if self.match.matchConf.discountTime:
         startTime = util.getTimestampFromStr(self.match.matchConf.discountTime[0])
         endTime = util.getTimestampFromStr(self.match.matchConf.discountTime[1])
         if startTime <= int(time.time()) <= endTime:
             feeIndex = 1
     if self._logger.isDebug():
         self._logger.debug("doSignin", "userId=", userId, "feeIndex=", feeIndex)
     mo = MsgPack()
     mo.setCmd("m_signin")
     mo.setResult("gameId", self.gameId)
     mo.setResult("roomId", self.roomId)
     mo.setResult("userId", userId)
     try:
         if userId > config.ROBOT_MAX_USER_ID:
             self.matchPlugin.ensureCanSignInMatch(self, userId, mo)
         signer = self.match.signin(userId, feeIndex)
         if signer:
             mo.setResult("signin", 1)
             mo.setResult("signinPlayerCount", self.match.signerCount)
             if userId > config.ROBOT_MAX_USER_ID:
                 self.reportBiGameEvent("MATCH_SIGN_UP", userId, self.roomId, 0, 0, 0, 0, 0, [], "match_signin")
         else:
             raise SigninException()
         router.sendToUser(mo, userId)
         if TYPlayer.isHuman(userId):
             self._notifyRobotSigninMatch(signer)
     except MatchException, e:
         self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#10
0
文件: todotask.py 项目: zhaozw/hall37
def sendLocalPushTodoTask(userid, gameId, hour, minute, second, direct=True):
    """ 推送 本地推送push  added by nick.kai.lee
    向客户端推送闹钟push的注册,比如每次客户端登录时都会推送一次"本地推送的功能"

    Args:
        userid: 玩家userid
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None

    ftlog.debug('sendLocalPushTodoTask:', userid)
    from difang.majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder

    from datetime import datetime
    now = datetime.now()
    # alarm3个元素,days,seconds,microseconds, seconds遇到过去的时间会自动获得明天这个时间点的时间差
    alarm = datetime(datetime.now().year, datetime.now().month, datetime.now().day, hour, minute, second)

    # 推送内容
    import random
    content = random.choice([
        "还记得上次在拜雀神中抽取的大奖么?机会又来了!",
        "修复老年痴呆,拯救弱智儿童,途游麻将提高智商值得你拥有!",
        "主人,您的任务奖励还没领取呢,去看看吧!",
        "优惠降临!充值送豪礼,下班来放松玩玩吧!",
        "幸运大抽奖可以免费领取金币了,快来领取吧!",
        "您有一份礼包未签收,快去活动中心看看吧!",
        "点我速领500金币~",
        "工作一天了,让麻将小莲帮你放松放松~",
        "亲,每隔10分钟1场免费定时赛,100奖券随便拿!",
        "您可以领取每日奖励了,它将会很快过期,快回到途游麻将领取吧!",
        "雀神爷爷说马上就要发红包了,你准备好了么?",
        "您获取的奖券兑换话费了嘛?",
        "大哥,您的贵宾桌我们已经为您准备好了!静候您的光临!",
        "您的好友邀请您一起对战途游麻将!"
    ])

    task = MahjongTodoTaskBuilder.dict_reg_push_alarm(userid, content, (alarm - now).seconds,
                                                      [True, False, True, False, True, False], "", {}, 3)

    if not task:
        return False, None

    ftlog.debug('sendLocalPushTodoTask:', task)
    if False == direct:
        return True, task

    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userid)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userid)
    return True, None
示例#11
0
def sendLocalPushTodoTask(userid, gameId, hour, minute, second, direct = True):
    """ 推送 本地推送push  added by nick.kai.lee
    向客户端推送闹钟push的注册,比如每次客户端登录时都会推送一次"本地推送的功能"

    Args:
        userid: 玩家userid
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None

    ftlog.debug('sendLocalPushTodoTask:', userid)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder

    from datetime import datetime
    now = datetime.now()
    #alarm3个元素,days,seconds,microseconds, seconds遇到过去的时间会自动获得明天这个时间点的时间差
    alarm = datetime(datetime.now().year, datetime.now().month, datetime.now().day, hour, minute, second)

    # 推送内容
    import random
    content = random.choice([
        "还记得上次在拜雀神中抽取的大奖么?机会又来了!",
        "修复老年痴呆,拯救弱智儿童,途游麻将提高智商值得你拥有!",
        "主人,您的任务奖励还没领取呢,去看看吧!",
        "优惠降临!充值送豪礼,下班来放松玩玩吧!",
        "幸运大抽奖可以免费领取金币了,快来领取吧!",
        "您有一份礼包未签收,快去活动中心看看吧!",
        "点我速领500金币~",
        "工作一天了,让麻将小莲帮你放松放松~",
        "亲,每隔10分钟1场免费定时赛,100奖券随便拿!",
        "您可以领取每日奖励了,它将会很快过期,快回到途游麻将领取吧!",
        "雀神爷爷说马上就要发红包了,你准备好了么?",
        "您获取的奖券兑换话费了嘛?",
        "大哥,您的贵宾桌我们已经为您准备好了!静候您的光临!",
        "您的好友邀请您一起对战途游麻将!"
	])

    task = MahjongTodoTaskBuilder.dict_reg_push_alarm(userid, content, (alarm-now).seconds, [True, False, True, False, True, False], "", {}, 3 )

    if not task:
        return False, None

    ftlog.debug('sendLocalPushTodoTask:', task)
    if False == direct:
        return True, task

    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userid)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userid)
    return True, None
示例#12
0
 def doSignin(self, userId, feeIndex=0):
     """
     比赛报名,扣费
     """
     if self.match.matchConf.discountTime:
         startTime = util.getTimestampFromStr(
             self.match.matchConf.discountTime[0])
         endTime = util.getTimestampFromStr(
             self.match.matchConf.discountTime[1])
         if startTime <= int(time.time()) <= endTime:
             feeIndex = 1
     if self._logger.isDebug():
         self._logger.debug("doSignin", "userId=", userId, "feeIndex=",
                            feeIndex, "status=", self.runStatus)
     mo = MsgPack()
     mo.setCmd("m_signin")
     mo.setResult("gameId", self.gameId)
     mo.setResult("roomId", self.roomId)
     mo.setResult("userId", userId)
     mo.setResult("matchType", "point")
     try:
         if self.runStatus != self.ROOM_STATUS_RUN:
             raise MaintenanceException()
         else:
             playedTimes = self.matchMaster.userPlayedTimes.get(userId, 0)
             maxGameTimes = self.match.matchConf.start.maxGameTimes
             if playedTimes >= maxGameTimes > -1:
                 raise RunOutSigninChanceException()
             else:
                 isIn, _, _, _ = util.isInFishTable(userId)
                 if isIn:
                     raise SigninException()
                 else:
                     if userId > config.ROBOT_MAX_USER_ID:
                         self.matchPlugin.ensureCanSignInMatch(
                             self, userId, mo)
                     signer = self.match.signin(userId, feeIndex)
                     if signer:
                         mo.setResult("signin", 1)
                         mo.setResult("signinPlayerCount",
                                      self.match.signerCount)
                         if userId > config.ROBOT_MAX_USER_ID:
                             self.reportBiGameEvent("MATCH_SIGN_UP", userId,
                                                    self.roomId, 0, 0, 0, 0,
                                                    0, [], "match_signin")
                     else:
                         raise SigninException()
                     router.sendToUser(mo, userId)
                     if TYPlayer.isHuman(userId):
                         self._notifyRobotSigninMatch(signer)
     except MatchException, e:
         self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#13
0
    def doSignin(self, userId, signinParams, feeIndex=0):
        ftlog.debug("<<", "|userId, roomId, signinParams:", userId, self.roomId, feeIndex, signinParams, caller=self)

        try:
            mo = MsgPack()
            mo.setCmd('m_signin')
            self.matchPlugin.ensureCanSignInMatch(self, userId, mo)
            player = self.match.signin(userId, signinParams, feeIndex)
            if TYPlayer.isHuman(userId):
                self.__notifyRobotSigninMatch(player)

            self.reportBiGameEvent("MATCH_SIGN_UP", userId, self.roomId, 0, 0, 0, 0, 0, [], 'match_signin')
        except MatchException, e:
            self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#14
0
    def doSignin(self, userId, signinParams, feeIndex=0):
        if self._logger.isDebug():
            self._logger.debug('TYErdayiMatchRoom.doSignin', 'userId=', userId,
                               'feeIndex=', feeIndex, 'signinParams=',
                               signinParams)

        try:
            mo = MsgPack()
            mo.setCmd('m_signin')
            self.matchPlugin.ensureCanSignInMatch(self, userId, mo)
            signer = self.match.signin(userId, feeIndex)
            if TYPlayer.isHuman(userId):
                self._notifyRobotSigninMatch(signer)
        except MatchException, e:
            self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#15
0
def sendAlmsTodoTask(userid, gameId, cache=False, direct=True):
    """ 推送麻将救济金Cache  added by nick.kai.lee
    发送麻将救济金数据,客户端是否缓存由cache决定,cache为True时不是立即激活,
    什么时候激活转运礼包由客户端实现

    Args:
        userid: 玩家userid
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None

    ftlog.debug('sendAlmsTodoTask:', userid, cache, direct)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder
    from hall.entity import hallbenefits
    _, userBenefits = hallbenefits.benefitsSystem.sendBenefits(gameId, userid)
    benefitsStrs = []
    benefitsStrs.append('送您%s金币翻本吧!' % (userBenefits.sendChip))
    privilegeName = userBenefits.privilege.name if userBenefits.privilege else ''
    if userBenefits.extSendChip > 0:
        benefitsStrs.append('您是%s再加赠%s金币' %
                            (privilegeName, userBenefits.extSendChip))
    benefitsStrs.append(
        '(%s每天%s次,今天第%s次)' %
        (privilegeName, userBenefits.totalMaxTimes, userBenefits.times))
    if userBenefits.privilege and userBenefits.privilege.desc:
        benefitsStrs.append('\n%s' % (userBenefits.privilege.desc))

    task = MahjongTodoTaskBuilder.dict_general_box(userid,
                                                   '\n'.join(benefitsStrs),
                                                   cache)
    if not task:
        return False, None

    # task['params']['buttons'][0]['tasks'].append({})

    ftlog.debug('sendAlmsTodoTask:', task)
    if False == direct:
        return True, task

    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userid)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userid)
    return True, None
示例#16
0
    def doSignin(self, userId, signinParams, feeIndex=0):
        if self._logger.isDebug():
            self._logger.debug('TYErdayiMatchRoom.doSignin',
                               'userId=', userId,
                               'feeIndex=', feeIndex,
                               'signinParams=', signinParams)

        try:
            mo = MsgPack()
            mo.setCmd('m_signin')
            self.matchPlugin.ensureCanSignInMatch(self, userId, mo)
            signer = self.match.signin(userId, feeIndex)
            if TYPlayer.isHuman(userId):
                self._notifyRobotSigninMatch(signer)
        except MatchException, e:
            self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#17
0
    def process_interactive_expression(cls, userId, gameId, seatId, chat_msg, target_player_uid, base_chip):
        """处理消费金币的表情"""
        config = cls.get_interactive_expression_config(base_chip)
        emoId = str(chat_msg.get('emoId', -1))
        if emoId not in config:
            ftlog.warn('chat msg illegal', chat_msg, config)
            return False

        info = config[emoId]
        # 底分限制
        chip = userchip.getChip(userId)
        if chip < info['chip_limit'] + info['cost']:
            ftlog.warn('insufficient', chip, info['chip_limit'], info['cost'])
            return False

        if TYPlayer.isHuman(userId):
            from difang.majiang2.entity.util import Util
            clientId = Util.getClientId(userId)
            trueDelta, _ = userchip.incrChip(userId
                                             , gameId
                                             , -info['cost']
                                             , 0
                                             , "EMOTICON_CONSUME"
                                             , chat_msg['emoId']
                                             , clientId
                                             )

            if trueDelta != -info['cost']:  # 失败
                ftlog.warn('coin not enougth: ', chip, info['chip_limit'], info['cost'])
                return False
            bireport.gcoin('out.interactive_expression', gameId, info['cost'])

            # 处理魅力值
        #             charm = incrCharm(userId, info['charm'])
        #             hallranking.rankingSystem.setUserByInputType(gameId
        #                     , TYRankingInputTypes.CHARM
        #                     , userId
        #                     , charm)

        #         if TYPlayer.isHuman(target_player_uid):
        #             charm = incrCharm(target_player_uid, info['ta_charm'])
        #             hallranking.rankingSystem.setUserByInputType(gameId
        #                     , TYRankingInputTypes.CHARM
        #                     , target_player_uid
        #                     , charm)

        return True
示例#18
0
    def doSignin(self, userId, signinParams, feeIndex=0):
        if self._logger.isDebug():
            self._logger.debug('TYGroupMatchRoom.doSignin',
                               'userId=', userId,
                               'feeIndex=', feeIndex,
                               'signinParams=', signinParams)

        try:
            mo = MsgPack()
            mo.setCmd('m_signin')
            self.matchPlugin.ensureCanSignInMatch(self, userId, mo)
            signer = self.match.signin(userId, signinParams, feeIndex)
            if TYPlayer.isHuman(userId):
                self._notifyRobotSigninMatch(signer)

            self.reportBiGameEvent('MATCH_SIGN_UP', userId, self.roomId, 0, 0, 0, 0, 0, [], 'match_signin')
        except MatchException, e:
            self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#19
0
    def doSignin(self, userId, signinParams, feeIndex=0):
        if self._logger.isDebug():
            self._logger.debug('TYGroupMatchRoom.doSignin', 'userId=', userId,
                               'feeIndex=', feeIndex, 'signinParams=',
                               signinParams)

        try:
            mo = MsgPack()
            mo.setCmd('m_signin')
            self.matchPlugin.ensureCanSignInMatch(self, userId, mo)
            signer = self.match.signin(userId, signinParams, feeIndex)
            if TYPlayer.isHuman(userId):
                self._notifyRobotSigninMatch(signer)

            self.reportBiGameEvent('MATCH_SIGN_UP', userId, self.roomId, 0, 0,
                                   0, 0, 0, [], 'match_signin')
        except MatchException, e:
            self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#20
0
    def process_interactive_expression(cls, userId, gameId, seatId, chat_msg,
                                       target_player_uid, base_chip):
        """处理消费金币的表情"""
        config = cls.get_interactive_expression_config(base_chip)
        emoId = str(chat_msg.get('emoId', -1))
        if emoId not in config:
            ftlog.warn('chat msg illegal', chat_msg, config)
            return False

        info = config[emoId]
        # 底分限制
        chip = userchip.getChip(userId)
        if chip < info['chip_limit'] + info['cost']:
            ftlog.warn('insufficient', chip, info['chip_limit'], info['cost'])
            return False

        if TYPlayer.isHuman(userId):
            from difang.majiang2.entity.util import Util
            clientId = Util.getClientId(userId)
            trueDelta, _ = userchip.incrChip(userId, gameId, -info['cost'], 0,
                                             "EMOTICON_CONSUME",
                                             chat_msg['emoId'], clientId)

            if trueDelta != -info['cost']:  # 失败
                ftlog.warn('coin not enougth: ', chip, info['chip_limit'],
                           info['cost'])
                return False
            bireport.gcoin('out.interactive_expression', gameId, info['cost'])

            # 处理魅力值
        #             charm = incrCharm(userId, info['charm'])
        #             hallranking.rankingSystem.setUserByInputType(gameId
        #                     , TYRankingInputTypes.CHARM
        #                     , userId
        #                     , charm)

        #         if TYPlayer.isHuman(target_player_uid):
        #             charm = incrCharm(target_player_uid, info['ta_charm'])
        #             hallranking.rankingSystem.setUserByInputType(gameId
        #                     , TYRankingInputTypes.CHARM
        #                     , target_player_uid
        #                     , charm)

        return True
示例#21
0
def sendChangeFortuneTodoTask(userid,
                              gameId,
                              roomid,
                              insert,
                              cache=False,
                              direct=True):
    """ 推送麻将转运礼包Cache added by nick.kai.lee
    发送转运礼包的数据,客户端是否缓存由cache决定,cache为True时不是立即激活,
    什么时候激活转运礼包由客户端实现

    Args:
        userid: 玩家userid
        roomid: 房间id
        insert: 插入的task dict类型
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None
    ftlog.debug('sendChangeFortuneTodoTask:', userid, roomid, insert, cache,
                direct)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder

    task = MahjongTodoTaskBuilder.dict_change_fortune(userid, gameId, roomid,
                                                      cache)
    if not task:
        return False, None

    if isinstance(insert, dict):
        task['params']['buttons'][1]['tasks'].append(insert)

    ftlog.debug('sendChangeFortuneTodoTask:', task)

    if True == direct:
        mo = MsgPack()
        mo.setCmd('majiang_todotasks')
        mo.setResult('gameId', gameId)
        mo.setResult('userId', userid)
        mo.setResult('tasks', [task])
        router.sendToUser(mo, userid)
        return True, None
    else:
        return True, task
示例#22
0
def sendAlmsTodoTask(userid, gameId, cache = False, direct = True):
    """ 推送麻将救济金Cache  added by nick.kai.lee
    发送麻将救济金数据,客户端是否缓存由cache决定,cache为True时不是立即激活,
    什么时候激活转运礼包由客户端实现

    Args:
        userid: 玩家userid
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None

    ftlog.debug('sendAlmsTodoTask:', userid, cache, direct)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder
    from hall.entity import hallbenefits
    _, userBenefits = hallbenefits.benefitsSystem.sendBenefits(gameId, userid)
    benefitsStrs = []
    benefitsStrs.append('送您%s金币翻本吧!' % (userBenefits.sendChip))
    privilegeName = userBenefits.privilege.name if userBenefits.privilege else ''
    if userBenefits.extSendChip > 0:
        benefitsStrs.append('您是%s再加赠%s金币' % (privilegeName, userBenefits.extSendChip))
    benefitsStrs.append('(%s每天%s次,今天第%s次)' % (privilegeName, userBenefits.totalMaxTimes, userBenefits.times))
    if userBenefits.privilege and userBenefits.privilege.desc:
        benefitsStrs.append('\n%s' % (userBenefits.privilege.desc))

    task = MahjongTodoTaskBuilder.dict_general_box(userid, '\n'.join(benefitsStrs), cache)
    if not task:
        return False, None

    # task['params']['buttons'][0]['tasks'].append({})

    ftlog.debug('sendAlmsTodoTask:', task)
    if False == direct:
        return True, task

    mo = MsgPack()
    mo.setCmd('majiang_todotasks')
    mo.setResult('gameId', gameId)
    mo.setResult('userId', userid)
    mo.setResult('tasks', [task])
    router.sendToUser(mo, userid)
    return True, None
示例#23
0
    def doSignin(self, userId, signinParams, feeIndex=0):
        ftlog.debug("<<",
                    "|userId, roomId, signinParams:",
                    userId,
                    self.roomId,
                    feeIndex,
                    signinParams,
                    caller=self)

        try:
            mo = MsgPack()
            mo.setCmd('m_signin')
            self.matchPlugin.ensureCanSignInMatch(self, userId, mo)
            player = self.match.signin(userId, signinParams, feeIndex)
            if TYPlayer.isHuman(userId):
                self.__notifyRobotSigninMatch(player)

            self.reportBiGameEvent("MATCH_SIGN_UP", userId, self.roomId, 0, 0,
                                   0, 0, 0, [], 'match_signin')
        except MatchException, e:
            self.matchPlugin.handleMatchException(self, e, userId, mo)
示例#24
0
def sendTodoTaskInviteFriends(userId, gameId, invite_uids, play_mode, roomId, tableId, info_str, purl):
    """ 邀请好友来牌桌
    @param        name        发送邀请的用户名
    @param        invite_uids 被邀请的玩家uid列表
    @param        table       牌桌对象
    """
    ftlog.debug('userId =', userId, 'roomId =', roomId, 'tableId =', tableId,
                'invite_uids =', invite_uids, 'info_str =', info_str)
    if not TYPlayer.isHuman(userId):
        ftlog.debug('robot is not supported!')
        return

    for uid in invite_uids:
        last_gameId = onlinedata.getLastGameId(uid)
        if last_gameId == gameId:     # 如果玩家在麻将里
            sendFriendInviteTodotask(uid, userId, gameId, play_mode, roomId, tableId, info_str, purl)
        elif last_gameId == 9999:                       # 如果玩家在大厅主界面
            sendFriendInviteEnterGameTodotask(uid, gameId, play_mode, roomId, tableId, info_str)
        else:                                           # 在其它游戏里,直接忽略
            ftlog.debug('last_gameId is not 7 or 9999', 'last_gameId =', last_gameId)
            return
        from majiang2.entity import util
        util.sendPrivateMessage(uid, info_str)
示例#25
0
def sendBuyDiamondTodoTask(userId, gameId, clientId, pay_order):
    """ 幸运大抽奖,钻石购买
    @param         pay_order        挑选商品模板
    """
    if not TYPlayer.isHuman(userId):
        return
    
    product, _ = hallstore.findProductByPayOrder(gameId, userId, clientId, pay_order)
    if not product:
        ftlog.error('userId =', userId, 'clientId =', clientId, 'pay_order =', pay_order,
                    'can not find suitable product!')
        return
    try:
        product = product.clone()
    except:
        product = strutil.cloneData(product)
    desc = u'您的钻石不够哦~\n现在' + unicode(product.price) +u'元立得' + unicode(product.priceDiamond) +u'钻石!'
    product.content.desc = str(product.priceDiamond) + '钻石'
    client_ver = sessiondata.getClientIdVer(userId)
    if client_ver < 3.74:   # 客户端bug,小于3.74的版本转换一下
        product.priceDiamond = product.price
    todotasks = TodoTaskOrderShow.makeByProduct(desc, '', product)
    TodoTaskHelper.sendTodoTask(gameId, userId, todotasks)
示例#26
0
def sendMarketEstimateTodoTask(userid, gameId, url, des, cache = False, direct = True):
    """ 推送麻将五星好评Cache
    发送五星好评的数据,客户端缓存,什么时候激活五星好评由客户端实现
    @param         des        五星好评内容
    """
    if not TYPlayer.isHuman(userid):
        return False, None
    ftlog.debug('sendMarketEstimateTodoTask:', userid, url, des, cache, direct)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder

    task = MahjongTodoTaskBuilder.dict_market_estimate(userid, url, des, cache)
    if not task:
        return False, None

    if True == direct:
        mo = MsgPack()
        mo.setCmd('majiang_todotasks')
        mo.setResult('gameId', gameId)
        mo.setResult('userId', userid)
        mo.setResult('tasks', [task])
        router.sendToUser(mo, userid)
        return True, None
    else:
        return True, task
示例#27
0
def sendChangeFortuneTodoTask(userid, gameId, roomid, insert, cache = False, direct = True):
    """ 推送麻将转运礼包Cache added by nick.kai.lee
    发送转运礼包的数据,客户端是否缓存由cache决定,cache为True时不是立即激活,
    什么时候激活转运礼包由客户端实现

    Args:
        userid: 玩家userid
        roomid: 房间id
        insert: 插入的task dict类型
        cache: action命名是否是缓存形式,默认不缓存
        direct: 是否直接发送,False则return dict
    """
    if not TYPlayer.isHuman(userid):
        return False, None
    ftlog.debug('sendChangeFortuneTodoTask:', userid, roomid, insert, cache, direct)
    from majiang2.entity.todotasks_builder.todotasks_builder import MahjongTodoTaskBuilder

    task = MahjongTodoTaskBuilder.dict_change_fortune(userid, gameId, roomid, cache)
    if not task:
        return False, None

    if isinstance(insert, dict):
        task['params']['buttons'][1]['tasks'].append(insert)

    ftlog.debug('sendChangeFortuneTodoTask:', task)

    if True == direct:
        mo = MsgPack()
        mo.setCmd('majiang_todotasks')
        mo.setResult('gameId', gameId)
        mo.setResult('userId', userid)
        mo.setResult('tasks', [task])
        router.sendToUser(mo, userid)
        return True, None
    else:
        return True, task
示例#28
0
    def _doTableCall(self, msg, userId, seatId, action, clientId):
        """
        继承父类,处理table_call消息
        单独处理自建桌的分享/解散
        """
        if not self.CheckSeatId(seatId, userId):
            ftlog.warn("MajiangFriendTable.doTableCall, delay msg action:", action
                       , ' seatId:', seatId
                       , ' messange:', msg)
            return

        if action == 'next_round':
            if self.logic_table.isStart():
                return
            self.logic_table.sendMsgTableInfo(seatId)
            beginGame = self.logic_table.playerReady(seatId, True)
            self.logic_table.msgProcessor.create_table_succ_response(userId, seatId, 'ready',
                                                                     1 if (userId == self.__table_owner) else 0,
                                                                     self.logic_table.getBroadCastUIDs())
            for player in self.logic_table.player:
                if not player:
                    continue

                if not TYPlayer.isHuman(player.userId):
                    beginGame = self.logic_table.playerReady(player.curSeatId, True)

            if beginGame:
                # 纪录上一局的日志 给GM使用
                # addOneResult(tableNo, seats, deltaScore, totalScore, curRound, totalRound, gameId, roomId, tableId)
                if self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] > 1:
                    roundResult = self.logic_table.tableResult.results[-1]
                    deltaScore = roundResult.score
                    totalScore = self.logic_table.tableResult.score
                    curRound = self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] - 1
                    totalRound = self.logic_table.tableConfig[MFTDefine.ROUND_COUNT]
                    seats = self.logic_table.getSeats()
                    ftlog.debug('MajiangFriendTable.doTableCall nextRound stat tableNo', self.ftId, 'seats', seats,
                                'deltaScore:',
                                deltaScore, 'totalScore:', totalScore, 'gameId:', self.gameId, 'roomId:', self.roomId,
                                'tableId', self.tableId)
                    hall_friend_table.addOneResult(self.ftId, seats, deltaScore, totalScore, curRound, totalRound,
                                                   self.gameId, self.roomId, self.tableId)
                else:
                    ftlog.debug('MajiangFriendTable.doTableCall nextRound stat log error')
            else:
                ftlog.debug('MajiangFriendTable.doTableCall nextRound stat log error not begin')
        elif action == 'ready':
            # 返回房主建房成功消息,准备状态
            # 玩家准备结束 游戏正式开始
            beginGame = self.logic_table.playerReady(seatId, True)
            self.logic_table.msgProcessor.create_table_succ_response(userId, seatId, 'ready',
                                                                     1 if (userId == self.__table_owner) else 0,
                                                                     self.logic_table.getBroadCastUIDs())
            if beginGame and self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] > 0:
                # 纪录开局日志 gameBegin(tableNo, seats, gameId, roomId, tableId)
                seats = self.logic_table.getSeats()
                ftlog.debug('MajiangFriendTable._doTableCall log game begin tableNo:', self.__ftId, 'seats:', seats,
                            'gameId:', self.gameId, 'roomId:', self.roomId, 'tableId', self.tableId)
                hall_friend_table.gameBegin(self.__ftId, seats, self.gameId, self.gameId, self.tableId)
            else:
                ftlog.debug('MajiangFriendTable._doTableCall log game begin not ready cur round:',
                            self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT])
        elif action == 'create_table_user_leave':
            if (self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] > 0):
                util.sendPopTipMsg(userId, "游戏已开始,不能解散")
                return

            # 房主解散,由前端主动发送,存在隐患,后续修改。房主建房后,掉线,房主的房间状态将不对,TODO
            if userId == self.__table_owner:
                ftlog.debug('MajiangFriendTable.create_table_user_leave owner leave...')
                # 解散时,给大家提示
                for player in self.logic_table.player:
                    if not player:
                        continue
                    # 通知
                    util.sendPopTipMsg(player.userId, "房主解散房间")

                # 归还剩余房卡道具
                ftlog.debug('MajiangFriendTable.doTableCall leftCardCount:',
                            self.logic_table.tableConfig[MFTDefine.LEFT_CARD_COUNT]
                            , ' tableOwner:', self.__table_owner)
                if self.logic_table.tableConfig[MFTDefine.LEFT_CARD_COUNT] > 0:
                    itemId = self.room.roomConf.get('create_item', None)
                    if itemId:
                        user_remote.resumeItemFromTable(self.__table_owner
                                                        , self.gameId
                                                        , itemId
                                                        , self.logic_table.tableConfig[MFTDefine.LEFT_CARD_COUNT]
                                                        , self.roomId
                                                        , self.tableId)
                # 解散牌桌
                self.clearTable(True)
            else:
                ftlog.debug('MajiangFriendTable.create_table_user_leave player leave...')
                util.sendPopTipMsg(userId, "您已退出房间")
                self.kickOffUser(userId, seatId, True)
        elif action == 'create_table_dissolution':
            if self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] == 0:
                ftlog.debug(
                    'MajiangFriendTable._doTableCall create_table_dissolution game not start, can not dissolved...')
                return

            # 投票解散牌桌
            if self.voteHost != MTDefine.INVALID_SEAT:
                ftlog.debug('MajiangFriendTable._doTableCall create_table_dissolution ', self.voteHost,
                            ' already dissolved...')
                return

            self.__vote_host = seatId
            self.__vote_info[seatId] = {'userId': userId, 'seatId': seatId, 'vote': self.DISSOLVE_AGREE}
            self.__vote_time_out = self.getTableConfig('dissolve_vote_time_out', 60)
            ftlog.debug('MajiangFriendTable.create_table_dissolution voteInfo:', self.voteInfo)

            # 广播解散投票消息
            self.logic_table.msgProcessor.create_table_dissolve_vote(userId
                                                                     , seatId
                                                                     , self.maxSeatN
                                                                     , self.get_leave_vote_info()
                                                                     , self.get_leave_vote_info_detail()
                                                                     , self.logic_table.player[seatId].name
                                                                     , self.__vote_time_out
                                                                     , self.logic_table.getBroadCastUIDs())
        elif action == 'user_leave_vote':
            ftlog.debug('MajiangFriendTable._doTableCall voteInfo:', self.voteInfo)
            if self.voteHost == MTDefine.INVALID_SEAT:
                ftlog.debug(
                    'MajiangFriendTable._doTableCall user_leave_vote, voteHost is invalid, no need process this message...')
                return

            vote = msg.getParam('vote', 0)
            self.__vote_info[seatId] = {'userId': userId, 'seatId': seatId, 'vote': vote}
            self.logic_table.msgProcessor.create_table_dissolve_vote(userId
                                                                     , seatId
                                                                     , self.maxSeatN
                                                                     , self.get_leave_vote_info()
                                                                     , self.get_leave_vote_info_detail()
                                                                     , self.logic_table.player[self.voteHost].name
                                                                     , self.__vote_time_out
                                                                     , self.logic_table.getBroadCastUIDs())
            # 计算投票结果
            self.dissolveDecision()

        elif action == 'create_friend_invite':  # 微信邀请todotask下发
            contentStr = ','.join(self.__params_desc)
            util.sendTableInviteShareTodoTask(userId
                                              , self.gameId
                                              , self.ftId
                                              , self.playMode
                                              , self.logic_table.tableConfig[MFTDefine.CARD_COUNT]
                                              , contentStr)
        elif action == 'friend_table_ready_time_out':
            # 准备超时,回收牌桌
            self.clearTable(True)
        else:
            super(MajiangFriendTable, self)._doTableCall(msg, userId, seatId, action, clientId)
示例#29
0
    def _doNext(self, isFirst):
        ftlog.debug('_doNext-->isFirst=', isFirst,
                    'self.table.status.nowOper=', self.table.status.nowOper)
        # 查找下一个出牌的玩家座位ID
        if isFirst == 0:
            # 非第一次出牌, 查找
            nsid = self._findNextPlayerSeatId()
        else:
            # 第一次, 出牌, 固定为地主出牌
            self.table.status.nowOper = self.table.status.diZhu
            nsid = self.table.status.nowOper
        if nsid <= 0:
            ftlog.warn('doNext can not found next player...')
            return
        ftlog.debug('_doNext-->isFirst=', isFirst, 'nsid=', nsid)
        # 出牌的简单的crc校验码处理
        self.table.status.cardCrc += 1
        self.table.status.nowOper = nsid
        # 出牌计时器处理
        tuoGuanType = DizhuPlayer.TUGUAN_TYPE_USERACT
        autocard = 0
        seat = self.table.seats[nsid - 1]
        opTime = self.table.runConfig.optimeFirst if isFirst else self.table.runConfig.optime
        opTime -= self.opTimePunishMatch(seat)

        if (seat.isRobot == 1) and TYPlayer.isHuman(seat.userId):
            # 如果是托管状态, 那么最短时间超时, 由超时处理中,处理是否出牌
            tuoGuanType = DizhuPlayer.TUGUAN_TYPE_ALREADY_TUOGUAN
            latetime = self.table.runConfig.optimeAlreadyTuoGuan
            ftlog.debug('autocard 1...')
            autocard = 1
        else:
            # 正常出牌超时控制
            tuoGuanType = DizhuPlayer.TUGUAN_TYPE_TIMEOUT
            latetime = opTime

        # 只剩一张牌时,自动出牌
        if len(seat.cards) == 1:
            tuoGuanType = DizhuPlayer.TUGUAN_TYPE_SYS_FAST_CARD
            latetime = self.table.runConfig.optimeOnlyOneCard
            ftlog.debug('autocard 2...')
            autocard = 1

        # 如果上家出的是火箭, 那么自动不出牌
        if nsid in self._doubleKingNoCard:
            tuoGuanType = DizhuPlayer.TUGUAN_TYPE_SYS_FAST_CARD
            latetime = self.table.runConfig.optimeDoubleKing
            ftlog.debug('autocard 3...')
            autocard = 1
            del self._doubleKingNoCard[nsid]

        params = {
            'tuoGuanType': tuoGuanType,
            'seatId': nsid,
            'userId': seat.userId,
            'ccrc': self.table.status.cardCrc
        }
        ftlog.debug('params:', params, ' latetime:', latetime, ' autocard:',
                    autocard)
        if autocard or (not TYPlayer.isRobot(seat.userId)):
            # 真实玩家启动出牌超时计时器
            self.table.tableTimer.setup(latetime, 'CL_TIMEUP', params)

        # 牌局记录器处理
        self.table.gameRound.next(nsid - 1, 0, opTime)
        if autocard:
            # 自动出牌, 不发送next消息
            return
        # 发送下一个出牌的消息至客户端
        self.sender.sendChuPaiNextRes(nsid, opTime)
示例#30
0
    def doSitDown(self, userId, seatId, msg, clientId):
        """
        用户坐到某个桌子上,逻辑处理:如果是非重连用户,将用户坐下的消息广播给
        其它已经坐下的用户,然后将当前的桌子信息发送给新来用户
        继承自table类
        这是的seatId为游戏的座位号
        
        返回值:
        1)是否做下
        2)是否断线重连
        """
        ftlog.debug('>>MajiangQuickTable.doSitDown seatId =', seatId, ', userId = ', userId, ' tableId:', self.tableId)

        if (seatId != -1) and (userId != self.seats[seatId][TYSeat.INDEX_SEATE_USERID]):
            onlinedata.removeOnlineLoc(userId, self.roomId, self.tableId)
            ftlog.warn('reconnecting user id is not matched', 'seats =', self.seats, ' tableId:', self.tableId)
            return False

        frameSeatId = self.findIdleSeat(userId)
        ftlog.debug('MajiangQuickTable.doSitDown userId:', userId, ' findSeatId:', frameSeatId)

        sitRe = True
        if 0 == frameSeatId:
            ftlog.debug('MajiangQuickTable.doSitDown now seats:', self.seats)
            sendPopTipMsg(userId, '对不起,该房间已满员')
            self.logic_table.msgProcessor.quick_start_err(userId)
            sitRe = False
        elif 0 > frameSeatId:
            # 补发tableInfo
            seatId = self.getSeatIdByUserId(userId)
            if seatId < 0:
                onlinedata.removeOnlineLoc(userId, self.roomId, self.tableId)
            else:
                self.sendMsgTableInfo(msg, userId, seatId, True)
        elif frameSeatId > 0:
            isReady = self.getTableConfig(MTDefine.READY_AFTER_SIT, 0)
            gameSeatId = self.changeFrameSeatToMJSeatId(frameSeatId)
            # 设置座位的状态
            self.seats[gameSeatId][TYSeat.INDEX_SEATE_USERID] = userId
            # 快速桌用户坐下就是准备状态
            self.seats[gameSeatId][
                TYSeat.INDEX_SEATE_STATE] = TYSeat.SEAT_STATE_READY if isReady else TYSeat.SEAT_STATE_WAIT
            # 添加玩家
            tPlayer = TYPlayer(self, gameSeatId)
            self.players[gameSeatId] = tPlayer
            ftlog.debug('MajiangQuickTable.doSitDown user:'******' seat in:', gameSeatId
                        , ' now seats:', self.seats
                        , ' now playersNum:', self.playersNum)

            # 向牌桌添加用户:联网/机器人
            if TYPlayer.isHuman(userId):
                locResult = onlinedata.addOnlineLoc(userId, self.roomId, self.tableId, frameSeatId)
                ftlog.info('MajiangQuickTable.doSitDown, add online loc userId:', userId
                           , ' roomId:', self.roomId
                           , ' tableId:', self.tableId
                           , ' frameSeatId:', frameSeatId
                           , ' locResult:', locResult)

                _name, _purl, _sex, _coin = userdata.getAttrs(userId, ['name', 'purl', 'sex', 'coin'])
                player = MPlayer(_name, _sex, userId, 0, _purl, _coin, clientId)
                # 快速桌 默认坐下就是准备状态 默认非托管状态
                self.logic_table.addPlayer(player, gameSeatId, isReady, False)
                # 发送location消息
                self.logic_table.msgProcessor.send_location_message(gameSeatId, userId)
            else:
                from difang.majiang2.resource import resource
                robot = resource.getRobotByUserId(userId)
                if robot:
                    player = MPlayer(robot['name'], robot['sex'], userId, 0, robot['purl'], robot['coin'])
                    # 机器人默认准备 默认托管状态
                    self.logic_table.addPlayer(player, gameSeatId, True, True)

            # 座位号调整,框架返回时进行了加1的操作,调整还原
            self.room.updateTableScore(self.getTableScore(), self.tableId)
            self.sendMsgTableInfo(msg, userId, self.getSeatIdByUserId(userId), False)
            if self.playersNum != self.maxSeatN:
                # 一次召唤一个机器人
                self.setTimerOfDispatchRobot()
                uids = self.logic_table.getBroadCastUIDs()
                self.logic_table.msgProcessor.sendTableEvent(self.playersNum, userId, gameSeatId, uids)
            else:
                # 人满了,启动定时器
                self.setTimerHandleAutoDecideAction()

        return sitRe
示例#31
0
    def _doMatchQuickStart(self):
        '''
        牌桌开始
        初始化牌桌玩家
        
        如果是机器人,根据需求初始化机器人信息
        '''
        robots = [1, 2]
        tableInfo = self._match_table_info
        userInfos = tableInfo['users']
        userIds = []
        userSeatList = []

        for i, userInfo in enumerate(userInfos):
            if userInfo['type'] == 'robot':
                userInfo['userId'] = robots.pop()

            this_seat = self.seats[i]
            userIds.append(userInfo['userId'])
            this_seat.userId = userInfo['userId']
            this_seat.state = TYSeat.SEAT_STATE_WAIT
            this_seat.call123 = -1
            userSeatList.append((userInfo['userId'], i + 1))

        # 初始化用户数据
        from dizhu.wx_resource import wx_resource
        wx_resource.initRobotSetting()
        robotCount = wx_resource.getRobotCount()
        robotRange = range(0, robotCount)
        robots = random.sample(robotRange, 3)
        for x in xrange(len(self.players)):
            self.players[x].initUser(0, 1, robots[x])

        for userId, seatId in userSeatList:
            if TYPlayer.isRobot(userId):
                continue

            onlinedata.addOnlineLoc(userId, self.roomId, self.tableId, seatId)
            if ftlog.is_debug():
                ftlog.debug("|locList:",
                            onlinedata.getOnlineLocList(userId),
                            caller=self)

        # 做一个延迟
        delayConf = dizhuconf.getPublic().get('matchAnimationDelay', '')
        inter = delayConf.get('waitToNextMatch', 3)
        FTTasklet.getCurrentFTTasklet().sleepNb(inter)

        for x in xrange(len(self.seats)):
            this_seat = self.seats[x]
            if TYPlayer.isHuman(this_seat.userId):
                mq = MsgPack()
                mq.setCmd('quick_start')
                mq.setResult('userId', this_seat.userId)
                mq.setResult('gameId', self.gameId)
                mq.setResult('roomId', self.roomId)
                mq.setResult('tableId', self.tableId)
                mq.setResult('seatId', x + 1)
                mq.setResult('isOK', True)
                # 发送用户的quick_start
                router.sendToUser(mq, this_seat.userId)

        # 发送table_info
        self.gamePlay.sender.sendTableInfoResAll()

        delay = self._playAnimation(userInfos)

        if delay > 0:
            FTTasklet.getCurrentFTTasklet().sleepNb(delay)

        for x in xrange(len(self.players)):
            self.gamePlay.doReady(self.players[x], False)

        self._sendRanks(userInfos)
示例#32
0
    def _doTableCall(self, msg, userId, seatId, action, clientId):
        """
        继承父类,处理table_call消息
        单独处理自建桌的分享/解散
        """
        if not self.CheckSeatId(seatId, userId):
            ftlog.warn("MajiangFriendTable.doTableCall, delay msg action:",
                       action, ' seatId:', seatId, ' messange:', msg)
            return

        if action == 'next_round':
            if self.logic_table.isStart():
                return
            self.logic_table.sendMsgTableInfo(seatId)
            beginGame = self.logic_table.playerReady(seatId, True)
            self.logic_table.msgProcessor.create_table_succ_response(
                userId, seatId, 'ready', 1 if
                (userId == self.__table_owner) else 0,
                self.logic_table.getBroadCastUIDs())
            for player in self.logic_table.player:
                if not player:
                    continue

                if not TYPlayer.isHuman(player.userId):
                    beginGame = self.logic_table.playerReady(
                        player.curSeatId, True)

            if beginGame:
                # 纪录上一局的日志 给GM使用
                # addOneResult(tableNo, seats, deltaScore, totalScore, curRound, totalRound, gameId, roomId, tableId)
                if self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] > 1:
                    roundResult = self.logic_table.tableResult.results[-1]
                    deltaScore = roundResult.score
                    totalScore = self.logic_table.tableResult.score
                    curRound = self.logic_table.tableConfig[
                        MFTDefine.CUR_ROUND_COUNT] - 1
                    totalRound = self.logic_table.tableConfig[
                        MFTDefine.ROUND_COUNT]
                    seats = self.logic_table.getSeats()
                    ftlog.debug(
                        'MajiangFriendTable.doTableCall nextRound stat tableNo',
                        self.ftId, 'seats', seats, 'deltaScore:', deltaScore,
                        'totalScore:', totalScore, 'gameId:', self.gameId,
                        'roomId:', self.roomId, 'tableId', self.tableId)
                    hall_friend_table.addOneResult(self.ftId, seats,
                                                   deltaScore, totalScore,
                                                   curRound, totalRound,
                                                   self.gameId, self.roomId,
                                                   self.tableId)
                else:
                    ftlog.debug(
                        'MajiangFriendTable.doTableCall nextRound stat log error'
                    )
            else:
                ftlog.debug(
                    'MajiangFriendTable.doTableCall nextRound stat log error not begin'
                )
        elif action == 'ready':
            # 返回房主建房成功消息,准备状态
            # 玩家准备结束 游戏正式开始
            beginGame = self.logic_table.playerReady(seatId, True)
            self.logic_table.msgProcessor.create_table_succ_response(
                userId, seatId, 'ready', 1 if
                (userId == self.__table_owner) else 0,
                self.logic_table.getBroadCastUIDs())
            if beginGame and self.logic_table.tableConfig[
                    MFTDefine.CUR_ROUND_COUNT] > 0:
                # 纪录开局日志 gameBegin(tableNo, seats, gameId, roomId, tableId)
                seats = self.logic_table.getSeats()
                ftlog.debug(
                    'MajiangFriendTable._doTableCall log game begin tableNo:',
                    self.__ftId, 'seats:', seats, 'gameId:', self.gameId,
                    'roomId:', self.roomId, 'tableId', self.tableId)
                hall_friend_table.gameBegin(self.__ftId, seats, self.gameId,
                                            self.gameId, self.tableId)
            else:
                ftlog.debug(
                    'MajiangFriendTable._doTableCall log game begin not ready cur round:',
                    self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT])
        elif action == 'create_table_user_leave':
            if (self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] > 0):
                util.sendPopTipMsg(userId, "游戏已开始,不能解散")
                return

            # 房主解散,由前端主动发送,存在隐患,后续修改。房主建房后,掉线,房主的房间状态将不对,TODO
            if userId == self.__table_owner:
                ftlog.debug(
                    'MajiangFriendTable.create_table_user_leave owner leave...'
                )
                # 解散时,给大家提示
                for player in self.logic_table.player:
                    if not player:
                        continue
                    # 通知
                    util.sendPopTipMsg(player.userId, "房主解散房间")

                # 归还剩余房卡道具
                ftlog.debug(
                    'MajiangFriendTable.doTableCall leftCardCount:',
                    self.logic_table.tableConfig[MFTDefine.LEFT_CARD_COUNT],
                    ' tableOwner:', self.__table_owner)
                if self.logic_table.tableConfig[MFTDefine.LEFT_CARD_COUNT] > 0:
                    itemId = self.room.roomConf.get('create_item', None)
                    if itemId:
                        user_remote.resumeItemFromTable(
                            self.__table_owner, self.gameId, itemId,
                            self.logic_table.tableConfig[
                                MFTDefine.LEFT_CARD_COUNT], self.roomId,
                            self.tableId)
                # 解散牌桌
                self.clearTable(True)
            else:
                ftlog.debug(
                    'MajiangFriendTable.create_table_user_leave player leave...'
                )
                util.sendPopTipMsg(userId, "您已退出房间")
                self.kickOffUser(userId, seatId, True)
        elif action == 'create_table_dissolution':
            if self.logic_table.tableConfig[MFTDefine.CUR_ROUND_COUNT] == 0:
                ftlog.debug(
                    'MajiangFriendTable._doTableCall create_table_dissolution game not start, can not dissolved...'
                )
                return

            # 投票解散牌桌
            if self.voteHost != MTDefine.INVALID_SEAT:
                ftlog.debug(
                    'MajiangFriendTable._doTableCall create_table_dissolution ',
                    self.voteHost, ' already dissolved...')
                return

            self.__vote_host = seatId
            self.__vote_info[seatId] = {
                'userId': userId,
                'seatId': seatId,
                'vote': self.DISSOLVE_AGREE
            }
            self.__vote_time_out = self.getTableConfig(
                'dissolve_vote_time_out', 60)
            ftlog.debug(
                'MajiangFriendTable.create_table_dissolution voteInfo:',
                self.voteInfo)

            # 广播解散投票消息
            self.logic_table.msgProcessor.create_table_dissolve_vote(
                userId, seatId, self.maxSeatN, self.get_leave_vote_info(),
                self.get_leave_vote_info_detail(),
                self.logic_table.player[seatId].name, self.__vote_time_out,
                self.logic_table.getBroadCastUIDs())
        elif action == 'user_leave_vote':
            ftlog.debug('MajiangFriendTable._doTableCall voteInfo:',
                        self.voteInfo)
            if self.voteHost == MTDefine.INVALID_SEAT:
                ftlog.debug(
                    'MajiangFriendTable._doTableCall user_leave_vote, voteHost is invalid, no need process this message...'
                )
                return

            vote = msg.getParam('vote', 0)
            self.__vote_info[seatId] = {
                'userId': userId,
                'seatId': seatId,
                'vote': vote
            }
            self.logic_table.msgProcessor.create_table_dissolve_vote(
                userId, seatId, self.maxSeatN, self.get_leave_vote_info(),
                self.get_leave_vote_info_detail(),
                self.logic_table.player[self.voteHost].name,
                self.__vote_time_out, self.logic_table.getBroadCastUIDs())
            # 计算投票结果
            self.dissolveDecision()

        elif action == 'create_friend_invite':  # 微信邀请todotask下发
            contentStr = ','.join(self.__params_desc)
            util.sendTableInviteShareTodoTask(
                userId, self.gameId, self.ftId, self.playMode,
                self.logic_table.tableConfig[MFTDefine.CARD_COUNT], contentStr)
        elif action == 'friend_table_ready_time_out':
            # 准备超时,回收牌桌
            self.clearTable(True)
        else:
            super(MajiangFriendTable,
                  self)._doTableCall(msg, userId, seatId, action, clientId)