#! -*- coding:utf-8 -*-
# Author: qianyong
# Created: 2016.06.17 14.09
from freetime.util import log as ftlog
from poker.entity.dao import onlinedata
from poker.entity.game.rooms.room import TYRoom
from poker.entity.game.tables.table import TYTable
from cars.entity import const
from cars.entity import carschip
from cars.entity import carsconf
from cars.entity import carsled
from cars.entity.util import UtilFunc
from cars.gameplays.bet import BetSystem
from cars.gameplays.chat import Chat
from cars.gameplays.debug import Debug
from cars.gameplays.fire import Fire
from cars.gameplays.kingweek import KingWeek
from cars.gameplays.lottery import Lottery
from cars.gameplays.pool import Pool
from cars.gametable.carsplayer import CarsPlayer
from cars.gametable.carssender import Sender
import time
from poker.util import strutil
class CarsTable(TYTable):
''''''
CHECK_KING_LED_PERIOD = 60 # LED, 60
def __init__(self, room, tableId):
''''''
super(CarsTable, self).__init__(room, tableId)
self._sender = Sender(self) #
self._fire = Fire(self) #
self._chat = Chat(self) #
self._bet = BetSystem(self) #
self._users = {} #
# 60,king
UtilFunc.callLater(self.CHECK_KING_LED_PERIOD, self._loopLedYesterdayKing)
@property
def users(self):
return self._users
@property
def chat(self):
return self._chat
@property
def fire(self):
return self._fire
def _doSit(self, msg, userId, seatId, clientId):
''', '''
# ,,. ,
rejoin = False
betsInfo = None #
if userId in self._bet.bettingUsers:
user = self._bet.bettingUsers[userId]
user.clientId = clientId # clientId, , clientId
betsInfo = user.bets #
rejoin = True #
else:
vipLevel = UtilFunc.getUserVipLevel(userId)
name, purl = UtilFunc.getUserNameAndPurl(userId)
user = CarsPlayer(self, userId, name, vipLevel, clientId)
now = int(time.time())
# ,7
fruitsOpenTimeLeft = strutil.cloneData(Lottery.getFruitsLastOpenTime())
for fruitId in fruitsOpenTimeLeft:
if fruitsOpenTimeLeft[fruitId] == 0:
fruitsOpenTimeLeft[fruitId] = -1 # -1
else:
fruitsOpenTimeLeft[fruitId] = now - fruitsOpenTimeLeft[fruitId]
#
lotteryTimeLeft = max(0, self._bet.nextLotteryAt - now)
# ,
uchip = UtilFunc.getUserChip(userId)
poolChip = Pool.getPoolChip()
# onlineLoc, , GR, GRGT
onlinedata.addOnlineLoc(userId, self.roomId, self.tableId, const.FAKE_SEAT_ID)
self._sender.sendQuickStartRes(userId, clientId, {"isOK": True, 'reason': TYRoom.ENTER_ROOM_REASON_OK})
historyMaxLen = carsconf.getHistoryConf().get('simple_num', 0)
self._sender.sendInfoMsg(user, clientId,
Lottery.getOpenFruitsHistory(const.FAKE_TABLE_ID)[:historyMaxLen],
fruitsOpenTimeLeft,
lotteryTimeLeft,
uchip,
poolChip,
rejoin,
betsInfo,
self._bet.issueNum,
now)
# info, "", infofruit_lottery
self._users[userId] = user
# BI
ftlog.info('BI.Info userId=', userId, 'vipLevel=', user.vipLevel)
def _doLeave(self, msg, userId, clientId):
'''
,
_doLeave
'''
ftlog.debug('_doLeave, userId=', userId)
self._doLeaveCars(userId, TYRoom.LEAVE_ROOM_REASON_ACTIVE)
def _doStandUp(self, msg, userId, seatId, reason, clientId):
'''
,
userIdseatId
'''
ftlog.debug('_doStandUp, userId=', userId)
self._doLeaveCars(userId, TYRoom.LEAVE_ROOM_REASON_ACTIVE)
def _doTableManage(self, msg, action):
'''table_manage'''
result = {'action': action, 'isOK': True}
if action == 'leave':
userId = msg.getParam('userId')
reason = msg.getParam('reason')
self._doLeaveCars(userId, reason)
ftlog.debug('_doTableManage user', userId, 'leave table, total users count', len(self._users), 'reason=', reason)
return result
def _doLeaveCars(self, userId, reason):
''''''
#
if userId in self._users:
user = self._users[userId]
timeval = time.time() - user.enterGameAt
UtilFunc.incrPlayerGameTime(userId, timeval)
# ; ,
del self._users[userId]
self._sender.sendLeaveMsg(userId)
# onlineLoc
onlinedata.removeOnlineLoc(userId, self.roomId, self.tableId)
ftlog.info('_doLeaveCars user', userId, 'leave table, total users count', len(self._users), 'reason=', reason)
def getUser(self, userId):
'''userIduser'''
if userId in self._users:
return self._users[userId]
return None
def _doTableCall(self, msg, userId, seatId, action, clientId):
'''
table_call
_doTableCall
userIdseatId
'''
if ftlog.is_debug():
ftlog.debug('self._doTableCall action=', action, 'userId=', userId, 'msg=', msg)
# table_call
if action == 'sys_fruit_fire': #
return self.doSysFire()
elif action == 'sys_chat_define_msg': #
text = msg.getParam('text')
return self.doSysChatDefineMsg(text)
elif action == 'sys_set_bet_status_ready':
return self.doSetBetStatusReady()
elif action == 'sys_set_bet_status_seal': #
return self.doSetBetStatusSeal()
elif action == 'sys_set_bet_status_lottery': #
return self.doSetBetStatusLottery()
elif action == 'sys_broadcast_fruit_betting': #
return self.doBroadcastFruitBetting()
# table_call
# table_callquick_start, self._users
if userId not in self._users:
if action == 'leave' or 'cars_leave': # leave
self._sender.sendLeaveMsg(userId)
ftlog.warn('tablecall logic error', userId, 'not in self._users')
return self._sender.sendUserErrorMsg(userId, action, u',!')
user = self._users[userId]
if action == 'cars_bet':
bets = msg.getParam('bets')
issueNum = msg.getParam('issueNum')
return self.doBet(userId, issueNum, bets)
elif action == 'cars_leave':
return self._doLeaveCars(userId, TYRoom.LEAVE_ROOM_REASON_ACTIVE)
elif action == 'cars_claim_king_reward':
return self.doClaimKingReward(userId)
elif action == 'cars_fire_buy':
index = msg.getParam('index')
return self.doFireBuy(userId, index)
elif action == 'cars_claim_firework_prize':
fireId = msg.getParam('fireId', 0)
fireId = int(fireId)
return self._fire.claimFireReward(user, fireId)
elif action == 'new_table_chat':
chatType = msg.getParam('type')
chatMsg = msg.getParam('msg')
return self.doChat(userId, chatType, chatMsg)
elif action == 'cars_pool_list':
return self.doGetPoolList(userId)
elif action == 'cars_history_detail':
return self.doGetHistoryDetail(user)
elif action == 'click_more_game':
UtilFunc.reportGameEvent(const.EVENT_OPEN_MORE_GAMES, userId, user.clientId, self.roomId, self.tableId)
return Sender.sendClickMoreGameMsg(userId)
elif action == 'switch_game':
switchGameId = msg.getParam('switchGameId')
UtilFunc.reportGameEvent(const.EVENT_SWITCH_GAME, userId, user.clientId, self.roomId, self.tableId,
deltaChip=switchGameId)
return Sender.sendSwitchGameMsg(userId)
def doBet(self, userId, issueNum, bets):
''''''
self._bet.doBet(userId, issueNum, bets)
def doClaimKingReward(self, userId):
''''''
status = KingWeek.getUserClaimStatus(userId)
if not status['canClaim']:
return Sender.sendUserErrorMsg(userId, 'cars_claim_king_reward', 'can not claim')
KingWeek.setUserClaimedStatus(userId, True)
reward = carsconf.getKingConf().get('reward', 0)
user = self._users[userId]
# ,
uchip = carschip.dnChipUpdate(userId, const.EVENT_KING_REWARD, reward, user.clientId)
self._sender.sendClaimKingRewardMsg(userId, uchip)
def doFireBuy(self, userId, index):
''''''
user = self._users[userId]
self._fire.buyFire(user, index, user.clientId)
def doChat(self, userId, chatType, msg):
''''''
self._chat.userChat(userId, chatType, msg)
def doGetPoolList(self, userId):
''''''
poolList = Pool.getPoolList()
Sender.sendPoolListMsg(userId, poolList)
def doGetHistoryDetail(self, user):
''''''
history = Lottery.getOpenFruitsHistory(const.FAKE_TABLE_ID)
history = history[:]
for item in history:
issueNum = item['issueNum']
if issueNum in user.winHistory:
item['winChip'] = user.winHistory[issueNum]
else:
item['winChip'] = 0
Sender.sendHistoryDetail(user.userId, history)
def doSysFire(self):
''''''
self._fire.sysFire()
def doSysChatDefineMsg(self, text):
''''''
self._chat.broadcastSysChat(text, const.CHAT_LABLE_NOMAL_TYPE)
def doSetBetStatusReady(self):
''''''
return self._bet.setTableReadyState()
def doSetBetStatusSeal(self):
''''''
return self._bet.setTableSealState()
def doSetBetStatusLottery(self):
''''''
return self._bet.setTableLotteryState()
def doBroadcastFruitBetting(self):
''''''
return self._bet.doBroadCastFruitBetting()
def _loopLedYesterdayKing(self):
'''LED'''
# ,LED
now = time.time()
st = time.localtime(now)
if st.tm_min == carsconf.getLedKingAtMinute():
user = KingWeek.getSpecificDayKing(now - const.ONE_DAY_SEC) #
if user is not None:
ftlog.debug('sendKingLed', user)
carsled.sendKingLed(user['userId'], user['name'], carsconf.getKingConf().get('reward', 0))
#
UtilFunc.callLater(self.CHECK_KING_LED_PERIOD, self._loopLedYesterdayKing)
def doDebug(self, msg):
'''debug'''
Debug.doDebug(msg)