-- 
Johan Euphrosine <pro...@aminche.com>
--- Begin Message ---
---------- Forwarded message ----------
From: Xavier <xavier....@gmail.com>
Date: 2009/8/31
Subject: 2 new Features Time before you can rebuy and Simultaneous tables by
user
To: Pokersource Users <pokersource-users@gna.org>


Hey

This patch run with rev 6206

it contains tests and it's compatible with jspoker

Enjoy :)

Xavier
UPDATE server SET version = '2.0.0';

-- max tables allowed , no check if -1
ALTER TABLE `users` ADD `tables_max` INT UNSIGNED DEFAULT -1;


Index: debian/python-poker-network.links
===================================================================
--- debian/python-poker-network.links	(révision 6203)
+++ 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 6203)
+++ 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,17 +1865,19 @@
        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)
Index: pokernetwork/pokerservice.py
===================================================================
--- pokernetwork/pokerservice.py	(révision 6206)
+++ 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')
@@ -1901,6 +1917,7 @@
                                             name = "anonymous",
                                             url= "random",
                                             outfit = "random",
+                                            tables_max = -1,
                                             # FIXME_PokerPlayerInfoLocale:
                                             # (see also sr #2262 )
                                             # this sets locale but
@@ -1916,19 +1933,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 6203)
+++ pokernetwork/pokeravatar.py	(copie de travail)
@@ -127,6 +127,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:
@@ -136,10 +137,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
@@ -220,6 +222,9 @@
     def getName(self):
         return self.user.name
 
+    def getTablesMax(self):
+        return self.user.tablesMax
+
     def getUrl(self):
         return self.user.url
 
@@ -970,7 +975,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 6203)
+++ 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,23 @@
             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(PacketPokerMessage(string = "You have reached the maximum number of tables available by the server (%d)" % (self.factory.simultaneous )))                    
             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(PacketPokerMessage(string = "You have reached the maximum number of tables available with your access (%d)" % (avatar.getTablesMax() )))                    
+            return False
 
+
         #
         # Player is now an observer, unless he is seated
         # at the table.
@@ -1335,6 +1358,16 @@
             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(PacketPokerMessage(string = "You can't for the next %d secondes buyin less than %d " % (rest, self.serial2leavetime[avatar.getSerial()][1] ) ))                
+                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 6203)
+++ 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 6203)
+++ 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 6203)
+++ tests/test-pokeravatar.py.in	(copie de travail)
@@ -1164,7 +1164,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)
@@ -1200,7 +1200,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),
@@ -1783,7 +1783,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:
@@ -1815,7 +1816,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:
@@ -2234,7 +2236,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():
@@ -2289,7 +2291,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():
@@ -3901,6 +3903,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 6203)
+++ 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 6203)
+++ tests/conf/poker.server.xml.in	(copie de travail)
@@ -8,6 +8,8 @@
 	chat="yes" >
 
   <delays autodeal="3" round="2" position="1" showdown="5" finish="3" />
+    <!-- remaining buy-in -->
+  <remaining-buy-in activate="yes" period="1800" />
   
   <table name="One"	variant="holdem" betting_structure="2-4-limit" seats="10" timeout="60" custom_money="0" />
   <table name="Two"	variant="holdem" betting_structure="10-15-limit" seats="10" timeout="60" custom_money="0" />
Index: tests/test-pokertable.py.in
===================================================================
--- tests/test-pokertable.py.in	(révision 6203)
+++ tests/test-pokertable.py.in	(copie de travail)
@@ -62,6 +62,8 @@
 <server verbose="4" autodeal="yes" max_missed_round="5">
   <delays autodeal_tournament_min="2" autodeal="2" autodeal_max="2" autodeal_check="0" round="0" position="0" showdown="0" finish="0" />
 
+  <time-before-you-can-rebuy-min activate="yes" period="1" /> 
+  
   <path>@POKER_ENGINE_PKGSYSCONFDIR@ @POKER_NETWORK_PKGSYSCONFDIR@</path>
   <users temporary="BOT"/>
 </server>
@@ -70,6 +72,8 @@
 <server verbose="4" autodeal="no" >
   <delays autodeal_tournament_min="2" autodeal="2" autodeal_max="2" autodeal_check="0" round="0" position="0" showdown="0" finish="0" />
 
+  <time-before-you-can-rebuy-min activate="yes" period="1" /> 
+  
   <decks>
     <deck>9c 9d 9h Ts Tc Td Th Ts Jc Jd Jh Js Qc Qd Qh Qs Kc Kd Kh Ks Ac Ad Ah As</deck>
   </decks>
@@ -152,6 +156,9 @@
         self.joined_max = 1000
         self.chat_messages = []
 
+    def setSimultaneous(self, tables_max):
+        self.simultaneous = tables_max
+        
     def getMissedRoundMax(self):
         return 5  # if you change this, change it in settings_xml above
 
@@ -330,6 +337,7 @@
         self.user = MockClient.User()
         self.testObject = testObject
         self.reasonExpected = expectedReason
+        self.tables_max = -1
 
     def __str__(self):
         return "MockClient of Player%d" % self.serial
@@ -414,7 +422,15 @@
                 self.name = self.player.getName()
                 self.url = "http://fake";
                 self.outfit = None
+                self.tables_max = -1
         return MockPlayerInfo(self)
+                
+    def getTablesMax(self):
+        return self.tables_max   
+        
+    def setTablesMax(self, table_max):
+        self.tables_max = table_max        
+             
 
 if verbose < 0: redirect_messages(MockClient)
 
@@ -654,9 +670,18 @@
 
         self.assertEqual(True, self.table.rebuyPlayerRequest(player[5], \
                                               self.table.game.maxBuyIn()))
-        # finally, player5 tries to join table 2, which isn't permitted since
+        # now, player5 tries to join table 2, which isn't permitted since
         # we've set MockService.simultaneous to 1
         self.assertEqual(False, self.table2.joinPlayer(player[5], 5))
+        
+        # finally, apply simultaneous = 2, player5 tries to join table 2, which isn't permitted since
+        # we've set tablesMax for specific user to 1       
+        self.service.setSimultaneous(2) 
+        player[5].setTablesMax(1)
+        self.assertEqual(False, self.table2.joinPlayer(player[5], 5))  
+        player[5].setTablesMax(2)   
+        self.assertEqual(True, self.table2.joinPlayer(player[5], 5))    
+        
     # -------------------------------------------------------------------
     def test08_2_brokenSeatFactory(self):
         player = self.createPlayer(1, False)
@@ -1427,6 +1452,18 @@
         self.tableSave = self.table
 
         return deferredMustBeCalledBackForSuccess
+    # -------------------------------------------------------------------    
+    def test47_timeBeforeYouCanRebuyMin(self):
+        # note : createPlayer apply maxBuyIn
+        p = self.createPlayer(1)
+        self.table.quitPlayer(p, 1)
+        self.table.joinPlayer(p, p.serial)
+        self.table.seatPlayer(p, p.serial, -1)
+        if self.table.game.isTournament() == False:
+            self.assertEqual(False,self.table.buyInPlayer(p, self.table.game.minMoney()))
+            time.sleep(2)
+            self.assertEqual(True,self.table.buyInPlayer(p, self.table.game.minMoney()))
+                    
 # -------------------------------------------------------------------
 
 # I seriously considered not having *all* the same tests run with
@@ -1846,6 +1883,11 @@
         """SKIP THIS TEST IN THIS SUBCLASS
         """
         return True
+    # -------------------------------------------------------------------    
+    def test47_timeBeforeYouCanRebuyMin(self):
+        """SKIP THIS TEST IN THIS SUBCLASS
+        """
+        return True          
 # --------------------------------------------------------------------------------
 class MockServiceWithUserStats(MockService):
     def __init__(self, settings):
Index: tests/test-pokerservice.py.in
===================================================================
--- tests/test-pokerservice.py.in	(révision 6203)
+++ tests/test-pokerservice.py.in	(copie de travail)
@@ -221,9 +221,9 @@
             cursor.execute("INSERT INTO users (name, password, created) VALUES ('user%d', 'password%d', 0)" % ( user_number, user_number ))
             self.assertEqual(1, cursor.rowcount)
 
-        ( (self.user1_serial, name, privilege), message ) = self.service.auth("user1", "password1", "role1")
-        ( (self.user2_serial, name, privilege), message ) = self.service.auth("user2", "password2", "role1")
-        ( (self.user3_serial, name, privilege), message ) = self.service.auth("user3", "password3", "role1")
+        ( (self.user1_serial, name, privilege, tables_max), message ) = self.service.auth("user1", "password1", "role1")
+        ( (self.user2_serial, name, privilege, tables_max), message ) = self.service.auth("user2", "password2", "role1")
+        ( (self.user3_serial, name, privilege, tables_max), message ) = self.service.auth("user3", "password3", "role1")
 
         for user_number in (self.user1_serial, self.user2_serial, self.user3_serial):
             if self.default_money > 0 and user_number == self.user3_serial:
@@ -1310,7 +1310,7 @@
     # ----------------------------------------------------------------
     def test01_auth(self):
         self.service.startService()
-        ( (serial, name, privilege), message ) = self.service.auth("user1", "password1", "role1")
+        ( (serial, name, privilege, tables_max), message ) = self.service.auth("user1", "password1", "role1")
         self.assertEquals(None, message)
         self.assertEquals(4, serial)
         self.assertEquals("user1", name)
@@ -1333,9 +1333,9 @@
                 return "user1"
 
         self.service.startService()
-        ( (serial, name, privilege), message ) = self.service.auth("user1", "password1", sets.Set('role1'))
+        ( (serial, name, privilege, tables_max), message ) = self.service.auth("user1", "password1", sets.Set('role1'))
         self.service.avatar_collection.add(serial, Client())
-        ( (serial, name, privilege), message ) = self.service.auth("user1", "password1", sets.Set('role1'))
+        ( (serial, name, privilege, tables_max), message ) = self.service.auth("user1", "password1", sets.Set('role1'))
         self.assertEquals(None, message)
         self.assertEquals("user1", name)
 
@@ -1973,7 +1973,7 @@
     def test_refill(self):
         self.service.startService()
         refill = 10000
-        ( (serial, name, privilege), message ) = self.service.auth("user1", "password1", "role1")
+        ( (serial, name, privilege, tables_max), message ) = self.service.auth("user1", "password1", "role1")
         self.assertEquals(0, self.service.autorefill(serial))
         table_money = 1000
         table_serial = 200
@@ -4486,7 +4486,7 @@
                         found = True
                         break
                 cursorSelf.rowcount = 1
-                cursorSelf.row = ('ourlocal','ourname','ourskinurl',None)
+                cursorSelf.row = ('ourlocal','ourname','ourskinurl',None,-1)
                 self.failUnless(found)
                 return cursorSelf.rowcount
             def fetchone(cursorSelf): return cursorSelf.row
@@ -4508,6 +4508,7 @@
         self.assertEquals(pack.name, 'ourname')
         self.assertEquals(pack.url, 'ourskinurl')
         self.assertEquals(pack.outfit, 'random')
+        self.assertEquals(pack.tables_max, -1)
 
         self.service.db = oldDb
     # ----------------------------------------------------------------
@@ -5313,6 +5314,7 @@
         self.assertEquals(packet.name, "anonymous")
         self.assertEquals(packet.url, "random")
         self.assertEquals(packet.outfit, "random")
+        self.assertEquals(packet.tables_max, -1)
         # FIXME_PokerPlayerInfoLocale: (see also sr #2262 )
         # PokerService.getPlayerInfo() sends locale argument when creating
         # the PokerPlayerInfo() packet, but that argument is not used.
@@ -5328,7 +5330,7 @@
                 self.failUnless(sql.find("serial = 235") > 0, "serial wrong")
             def __init__(cursorSelf):
                 MockCursorBase.__init__(cursorSelf, self, 
-                                      ["select locale,name,skin_url,skin_outfit from users"])
+                                      ["select locale,name,skin_url,skin_outfit,tables_max from users"])
         self.service = pokerservice.PokerService(self.settings)
 
         oldDb = self.service.db
@@ -5343,6 +5345,7 @@
         self.assertEquals(packet.name, "anonymous")
         self.assertEquals(packet.url, "random")
         self.assertEquals(packet.outfit, "random")
+        self.assertEquals(packet.tables_max, -1)
         # FIXME_PokerPlayerInfoLocale: (see also sr #2262 )
         # PokerService.getPlayerInfo() sends locale argument when creating
         # the PokerPlayerInfo() packet, but that argument is not used.
Index: tests/poker.server.xml
===================================================================
--- tests/poker.server.xml	(révision 6203)
+++ tests/poker.server.xml	(copie de travail)
@@ -6,6 +6,8 @@
     verbose="3"
     chat="yes" >
 
+  <time-before-you-can-rebuy-min activate="yes" period="1800" />
+
   <delays autodeal="3" round="2" position="1" showdown="7" finish="3" />
   
   <table name="Fourty"	variant="7stud" betting_structure="ante-5-10-limit" seats="8" player_timeout="60" custom_money="0" />
Index: tests/test-tourneytablebalance.py.in
===================================================================
--- tests/test-tourneytablebalance.py.in	(révision 6203)
+++ tests/test-tourneytablebalance.py.in	(copie de travail)
@@ -121,6 +121,7 @@
                 miSelf.name =  "PLAYER INFO: %d" % self.serial
                 miSelf.url  = "http://example.org";
                 miSelf.outfit  = "naked"
+                miSelf.tables_max = -1
         return MockInfo()
 
     def sendPacket(self, packet):
Index: database/schema.sql.in
===================================================================
--- database/schema.sql.in	(révision 6203)
+++ database/schema.sql.in	(copie de travail)
@@ -60,13 +60,15 @@
   password VARCHAR(32),
   -- 1 is a regular player, 0 is an observer and cannot play, 2 is admin
   privilege INT DEFAULT 1,
+  -- max tables allowed , no check if -1
+  tables_max INT DEFAULT -1,    
   -- locale
   locale VARCHAR(32) DEFAULT "en_US",
 
   rating INT DEFAULT 1000,
   future_rating FLOAT DEFAULT 1000,
   games_count INT DEFAULT 0,
-  
+    
   PRIMARY KEY (serial),
   KEY name_idx (name),
   UNIQUE KEY email_idx (email)
Index: Makefile.am
===================================================================
--- Makefile.am	(révision 6203)
+++ Makefile.am	(copie de travail)
@@ -124,7 +124,8 @@
 	database/1.4.0-1.5.0.sql \
 	database/1.6.0-1.7.0.sql \
 	database/1.7.3-1.7.4.sql \
-	database/1.7.4-1.7.5.sql
+	database/1.7.4-1.7.5.sql \
+	database/1.7.5-2.0.0.sql
 
 pokerupgradesdir=${pkgdatadir}/upgrades
 dist_pokerupgrades_DATA = \

--- End Message ---

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
Pokersource-users mailing list
Pokersource-users@gna.org
https://mail.gna.org/listinfo/pokersource-users

Reply via email to