Index: debian/python-poker-network.links
===================================================================
--- debian/python-poker-network.links (révision 6257)
+++ debian/python-poker-network.links (copie de travail)
-1,4 +1,5 @@
usr/share/poker-network/schema.sql usr/share/dbconfig-common/data/python-poker-network/install/mysql
+usr/share/poker-network/1.7.5-2.0.0.sql usr/share/dbconfig-common/data/python-poker-network/upgrade/mysql/2.0.0
usr/share/poker-network/1.7.4-1.7.5.sql usr/share/dbconfig-common/data/python-poker-network/upgrade/mysql/1.7.5
usr/share/poker-network/1.7.3-1.7.4.sql usr/share/dbconfig-common/data/python-poker-network/upgrade/mysql/1.7.4
usr/share/poker-network/1.6.0-1.7.0.sql usr/share/dbconfig-common/data/python-poker-network/upgrade/mysql/1.7.0
Index: pokernetwork/pokerpackets.py
===================================================================
--- pokernetwork/pokerpackets.py (révision 6257)
+++ pokernetwork/pokerpackets.py (copie de travail)
-1732,6 +1732,7 @@
format = "!I"
format_size = calcsize(format)
+ TIME_BEFORE_YOU_CAN_REBUY_CODE = "1"
def __init__(self, *args, **kwargs):
self.amount = kwargs.get("amount",0)
-1849,6 +1850,7 @@
info = PacketPokerId.info + ( ('name', 'noname', 's'),
('outfit', 'random', 's'),
('url', 'random', 's'),
+ ('tables_max', -1, 'I'),
# FIXME_PokerPlayerInfoLocale:
# (see also sr #2262 )
# should "locale" be here? It's
-1863,20 +1865,22 @@
self.name = kwargs.get('name', "noname")
self.url = kwargs.get('url', "random")
self.outfit = kwargs.get('outfit',"random")
+ self.tables_max = kwargs.get('tables_max',-1)
PacketPokerId.__init__(self, *args, **kwargs)
def pack(self):
- return PacketPokerId.pack(self) + self.packstring(self.name) + self.packstring(self.outfit) + self.packstring(self.url)
+ return PacketPokerId.pack(self) + self.packstring(self.name) + self.packstring(self.outfit) + self.packstring(self.url) + pack(PacketPokerPlayerInfo.format, self.tables_max)
def unpack(self, block):
block = PacketPokerId.unpack(self, block)
(block, self.name) = self.unpackstring(block)
(block, self.outfit) = self.unpackstring(block)
(block, self.url) = self.unpackstring(block)
- return block
+ (self.tables_max,) = unpack(PacketPokerPlayerInfo.format, block[:PacketPokerPlayerInfo.format_size])
+ return block[PacketPokerPlayerInfo.format_size:]
def calcsize(self):
- return PacketPokerId.calcsize(self) + self.calcsizestring(self.name) + self.calcsizestring(self.outfit) + self.calcsizestring(self.url)
+ return PacketPokerId.calcsize(self) + self.calcsizestring(self.name) + self.calcsizestring(self.outfit) + self.calcsizestring(self.url) + PacketPokerPlayerInfo.format_size
def __str__(self):
return PacketPokerId.__str__(self) + " name = %s, url = %s, outfit = %s " % ( self.name , self.url, self.outfit )
Index: pokernetwork/pokerservice.py
===================================================================
--- pokernetwork/pokerservice.py (révision 6257)
+++ pokernetwork/pokerservice.py (copie de travail)
-102,6 +102,7 @@
UPDATE_TOURNEYS_SCHEDULE_DELAY = 10 * 60
CHECK_TOURNEYS_SCHEDULE_DELAY = 60
DELETE_OLD_TOURNEYS_DELAY = 1 * 60 * 60
+CLEANUP_SERIAL2LEAVETIME_DELAY = 1 * 60 * 60
class IPokerService(Interface):
-295,6 +296,7 @@
self.createTable(0, description)
self.cleanupTourneys()
self.updateTourneysSchedule()
+ self.cleanupSerial2leavetimeTimer()
self.messageCheck()
self.poker_auth.SetLevel(PACKET_POKER_SEAT, User.REGULAR)
self.poker_auth.SetLevel(PACKET_POKER_GET_USER_INFO, User.REGULAR)
-304,6 +306,19 @@
self.poker_auth.SetLevel(PACKET_POKER_HAND_SELECT_ALL, User.ADMIN)
service.Service.startService(self)
self.down = False
+
+
+ def cleanupSerial2leavetimeTimer(self):
+ for table in self.tables.values():
+ serialsToDelete = {}
+ for (player_serial , leavetime ) in table.serial2leavetime.iteritems():
+ if (time.time() - leavetime[0]) > table.timeBeforeYouCanRebuyMin :
+ serialsToDelete[player_serial] = player_serial;
+ for serial in serialsToDelete:
+ del table.serial2leavetime[serial]
+
+ self.timer['cleanupSerial2leavetimeTimer'] = reactor.callLater(CLEANUP_SERIAL2LEAVETIME_DELAY, self.cleanupSerial2leavetimeTimer)
+
def message(self, string):
print "PokerService: " + str(string)
-449,6 +464,7 @@
def shutdown(self):
self.shutting_down = True
+ self.cancelTimer('cleanupSerial2leavetimeTimer')
self.cancelTimer('checkTourney')
self.cancelTimer('updateTourney')
self.cancelTimer('messages')
-1905,6 +1921,7 @@
name = "anonymous",
url= "random",
outfit = "random",
+ tables_max = -1,
# FIXME_PokerPlayerInfoLocale:
# (see also sr #2262 )
# this sets locale but
-1920,19 +1937,20 @@
return placeholder
cursor = self.db.cursor()
- sql = ( "select locale,name,skin_url,skin_outfit from users where serial = " + str(serial) )
+ sql = ( "select locale,name,skin_url,skin_outfit,tables_max from users where serial = " + str(serial) )
cursor.execute(sql)
if cursor.rowcount != 1:
self.error("getPlayerInfo(%d) expected one row got %d" % ( serial, cursor.rowcount ))
return placeholder
- (locale,name,skin_url,skin_outfit) = cursor.fetchone()
+ (locale,name,skin_url,skin_outfit,tables_max) = cursor.fetchone()
if skin_outfit == None:
skin_outfit = "random"
cursor.close()
packet = PacketPokerPlayerInfo(serial = serial,
name = name,
url = skin_url,
- outfit = skin_outfit)
+ outfit = skin_outfit,
+ tables_max = tables_max)
# pokerservice generally provides playerInfo() internally to
# methods like pokeravatar.(re)?login. Since this is the central
# internal location where the query occurs, we hack in the locale
Index: pokernetwork/pokeravatar.py
===================================================================
--- pokernetwork/pokeravatar.py (révision 6257)
+++ pokernetwork/pokeravatar.py (copie de travail)
-131,6 +131,7 @@
self.user.privilege = User.REGULAR
self.user.url = player_info.url
self.user.outfit = player_info.outfit
+ self.user.tablesMax = player_info.tables_max
self._setDefaultLocale(player_info.locale)
if self.explain:
-140,10 +141,11 @@
self.loginTableUpdates(serial)
def login(self, info):
- (serial, name, privilege) = info
+ (serial, name, privilege, tables_max) = info
self.user.serial = serial
self.user.name = name
self.user.privilege = privilege
+ self.user.tablesMax = tables_max
player_info = self.service.getPlayerInfo(serial)
self.user.url = player_info.url
-224,6 +226,9 @@
def getName(self):
return self.user.name
+ def getTablesMax(self):
+ return self.user.tablesMax
+
def getUrl(self):
return self.user.url
-1061,7 +1066,8 @@
return PacketPokerPlayerInfo(serial = self.getSerial(),
name = self.getName(),
url = self.user.url,
- outfit = self.user.outfit)
+ outfit = self.user.outfit,
+ tables_max = self.user.tablesMax)
else:
return PacketError(code = PacketPokerGetPlayerInfo.NOT_LOGGED,
message = "Not logged in",
Index: pokernetwork/pokertable.py
===================================================================
--- pokernetwork/pokertable.py (révision 6257)
+++ pokernetwork/pokertable.py (copie de travail)
-35,6 +35,7 @@
from types import *
from string import split, join
import time
+import datetime
import traceback
from pokerengine.pokergame import PokerGameServer, history2messages
-132,6 +133,14 @@
self.cache = self.createCache()
self.owner = 0
self.avatar_collection = PokerAvatarCollection("Table%d" % id, factory.verbose)
+ self.timeBeforeYouCanRebuyMinProps = settings.headerGetProperties("/server/time-before-you-can-rebuy-min")
+ self.isTimeBeforeYouCanRebuyMin= False
+ if len(self.timeBeforeYouCanRebuyMinProps) != 0:
+ if self.timeBeforeYouCanRebuyMinProps[0].get("activate") == "yes":
+ self.isTimeBeforeYouCanRebuyMin= True
+ self.timeBeforeYouCanRebuyMin = int (self.timeBeforeYouCanRebuyMinProps[0].get("period", 1800))
+
+ self.serial2leavetime = {} # key : serial ; value : [ time , money ]
self.timer_info = {
"playerTimeout": None,
"playerTimeoutSerial": 0,
-973,6 +982,9 @@
#
# If not on a closed table, stand up
#
+ if(not self.game.isTournament() and self.isTimeBeforeYouCanRebuyMin and (self.game.minMoney() < self.game.serial2player[serial].money)):
+ self.serial2leavetime[serial] = [ time.time() , self.game.serial2player[serial].money ]
+
if self.isOpen():
if avatar.removePlayer(self, serial):
self.seated2observer(avatar)
-1193,12 +1205,25 @@
return False
# Next, test to see if joining this table will cause the avatar to
- # exceed the maximum permitted by the server.
- if len(avatar.tables) >= self.factory.simultaneous:
+ # exceed the maximum permitted by the server
+ clientTablesLen = len(avatar.tables)
+ if clientTablesLen >= self.factory.simultaneous:
if self.factory.verbose:
self.error("joinPlayer: %d seated at %d tables (max %d)" % ( serial, len(avatar.tables), self.factory.simultaneous ))
+ avatar.sendPacketVerbose(PacketPokerError(message = "You have reached the maximum number of tables available by the server (%d)" % (self.factory.simultaneous ),
+ code=100 ))
return False
+
+ # Next, test to see if joining this table will cause the avatar to
+ # exceed the maximum permitted by the maximum specified for him
+ if avatar.getTablesMax() != -1 and clientTablesLen >= avatar.getTablesMax():
+ if self.factory.verbose:
+ self.error("joinPlayer: %d seated at %d tables (specific user max %d)" % ( serial, len(avatar.tables), avatar.getTablesMax()))
+ avatar.sendPacketVerbose(PacketPokerError(message = "You have reached the maximum number of tables available with your access (%d)" % (avatar.getTablesMax() ),
+ code=101 ))
+ return False
+
#
# Player is now an observer, unless he is seated
# at the table.
-1335,6 +1360,17 @@
self.error("player %d already payed the buy-in" % avatar.getSerial())
return False
+ if self.isTimeBeforeYouCanRebuyMin and self.serial2leavetime.has_key(avatar.getSerial()):
+ diff = int (time.time() - self.serial2leavetime[avatar.getSerial()][0])
+ if ( diff < self.timeBeforeYouCanRebuyMin ) and self.serial2leavetime[avatar.getSerial()][1] > amount :
+ rest = self.timeBeforeYouCanRebuyMin - diff
+ self.error("player %d can't for the next %d secondes buyin less than %d " % (avatar.getSerial(), rest, self.serial2leavetime[avatar.getSerial()][1] ) )
+ avatar.sendPacketVerbose(PacketPokerError(message = "You can't for the next %d secondes buyin less than %d " % (rest, self.serial2leavetime[avatar.getSerial()][1] ),
+ code=102 ))
+ return False
+ else:
+ del self.serial2leavetime[avatar.getSerial()]
+
amount = self.factory.buyInPlayer(avatar.getSerial(), game.id, self.currency_serial, max(amount, game.buyIn()))
return avatar.setMoney(self, amount)
Index: pokernetwork/pokerauth.py
===================================================================
--- pokernetwork/pokerauth.py (révision 6257)
+++ pokernetwork/pokerauth.py (copie de travail)
-52,11 +52,12 @@
def auth(self, name, password):
cursor = self.db.cursor()
- cursor.execute("SELECT serial, password, privilege FROM users "
+ cursor.execute("SELECT serial, password, privilege, tables_max FROM users "
"WHERE name = '%s'" % name)
numrows = int(cursor.rowcount)
serial = 0
privilege = User.REGULAR
+ tables_max = -1
if numrows <= 0:
if self.auto_create_account:
if self.verbose > 1:
-73,13 +74,13 @@
cursor.close()
return ( False, "Invalid login or password" )
else:
- (serial, password_sql, privilege) = cursor.fetchone()
+ (serial, password_sql, privilege, tables_max) = cursor.fetchone()
cursor.close()
if password_sql != password:
self.message("password mismatch for %s" % name)
return ( False, "Invalid login or password" )
- return ( (serial, name, privilege), None )
+ return ( (serial, name, privilege, tables_max), None )
def userCreate(self, name, password):
if self.verbose:
Index: pokernetwork/user.py
===================================================================
--- pokernetwork/user.py (révision 6257)
+++ pokernetwork/user.py (copie de travail)
-73,6 +73,7 @@
self.url = "random"
self.outfit = "random"
self.privilege = None
+ self.tablesMax = -1
def logout(self):
self.serial = 0
-80,6 +81,7 @@
self.url = "random"
self.outfit = "random"
self.privilege = None
+ self.tablesMax = -1
def isLogged(self):
return not self.serial == 0
Index: tests/test-pokeravatar.py.in
===================================================================
--- tests/test-pokeravatar.py.in (révision 6257)
+++ tests/test-pokeravatar.py.in (copie de travail)
-1170,7 +1170,7 @@
def playerInfoUnpriv(self, (client, packet)):
return self.pingThenExpectPrivilegeFailure((client, packet),
PacketPokerPlayerInfo(serial= client.getSerial(), name = "The Naked Guy",
- outfit = "Naked", url = "http://example.org"))
+ outfit = "Naked", url = "http://example.org", tables_max = -1))
# -------------------------------------------------------------------------
def test17_4_tourneyTourneyRegisterUnpriv(self):
self.createClients(1)
-1206,7 +1206,7 @@
'packet':
PacketPokerPlayerInfo(serial = someoneElseSerial,
name = "YOU_BEEN_CRACKED",
- url = "http://example.com/myhack", outfit = "Naked") },
+ url = "http://example.com/myhack", outfit = "Naked", tables_max = -1) },
'player_image' : { 'output' :
"%sattempt to set player image%s" \
% (messageStart, forPlayerByPlayer),
-1789,7 +1789,8 @@
avatar.handlePacketLogic(PacketPokerPlayerInfo(serial= client.getSerial(),
name = "The Naked Guy",
outfit = "Naked",
- url = "http://example.org"))
+ url = "http://example.org",
+ tables_max = -1))
found = False
for packet in avatar.resetPacketsQueue():
if packet.type == PACKET_POKER_PLAYER_INFO:
-1821,7 +1822,8 @@
avatar.handlePacketLogic(PacketPokerPlayerInfo(serial= client.getSerial(),
name = "The Naked Guy",
outfit = "Naked",
- url = "http://example.org"))
+ url = "http://example.org",
+ tables_max = -1))
found = False
for packet in avatar.resetPacketsQueue():
if packet.type == PACKET_ERROR:
-2240,7 +2242,7 @@
avatar0 = self.service.avatars[0]
avatar0.logout()
table.observers.append(avatar0)
- avatar0.login((4, "user0", 32767))
+ avatar0.login((4, "user0", 32767, -1))
avatar0.queuePackets()
count = 0
for packet in avatar0.resetPacketsQueue():
-2295,7 +2297,7 @@
avatar0 = self.service.avatars[0]
avatar0.logout()
table.observers.append(avatar0)
- avatar0.login((4, "user0", 32767))
+ avatar0.login((4, "user0", 32767,-1))
avatar0.queuePackets()
count = 0
for packet in avatar0.resetPacketsQueue():
-4036,6 +4038,7 @@
mpiSelf.outfit = "naked"
mpiSelf.locale = 'mylocale'
mpiSelf.name = 'Doyle Brunson'
+ mpiSelf.tables_max = -1
class MockService:
def __init__(msSelf):
msSelf.verbose = 6
Index: tests/test-pokerclient.py.in
===================================================================
--- tests/test-pokerclient.py.in (révision 6257)
+++ tests/test-pokerclient.py.in (copie de travail)
-1097,7 +1097,8 @@
client.handlePlayerInfo(PacketPokerPlayerInfo(name = "test",
url = "http://thatisone/",
outfit = "Stablize",
- serial = client.getSerial()))
+ serial = client.getSerial(),
+ tables_max = -1))
if forceCrash:
self.assertEquals(get_messages(),
['ERROR *CRITICAL*: PACKET_POKER_PLAYER_INFO: may enter loop packet.url = http://thatisone/\n url = http://thatistwo\n url_check = http://thatisthree\npacket.outfit = Stablize\n outfit = Stablize\n outfit_check = Stablize'])
-1141,7 +1142,8 @@
client.handlePlayerInfo(PacketPokerPlayerInfo(name = "test",
url = "http://stable/",
outfit = "OutfitOne",
- serial = client.getSerial()))
+ serial = client.getSerial(),
+ tables_max = -1))
if forceCrash:
self.assertEquals(get_messages(),
['ERROR *CRITICAL*: PACKET_POKER_PLAYER_INFO: may enter loop packet.url = http://stable/\n url = http://stable/\n url_check = http://stable/\npacket.outfit = OutfitOne\n outfit = OutfitTwo\n outfit_check = OutfitThree'])
Index: tests/conf/poker.server.xml.in
===================================================================
--- tests/conf/poker.server.xml.in (révision 6257)
+++ tests/conf/poker.server.xml.in (copie de travail)
-8,6 +8,8 @@
chat="yes" >