# -*- coding: utf-8 -*-
"""
All functionality related to the lobby where information about running games,
players etc. is presented.
"""
from __future__ import print_function, absolute_import, division
from . import pokerth_pb2
from .player import Player
__author__ = 'Florian Wilhelm'
__copyright__ = 'Florian Wilhelm'
[docs]class GameInfo(object):
"""
Wrapper object for :obj:`pokerth_pb2.PNetGameInfo`
This object is needed in order to create an own game.
"""
def __init__(self, gameName=None):
self._gameName = gameName
self._netGameType = pokerth_pb2.NetGameInfo.normalGame
self._maxNumPlayers = 10
self._raiseIntervalMode = pokerth_pb2.NetGameInfo.raiseOnHandNum
self._raiseEveryHands = 8
self._endRaiseMode = pokerth_pb2.NetGameInfo.doubleBlinds
self._endRaiseSmallBlindValue = 0
self._proposedGuiSpeed = 4
self._delayBetweenHands = 7
self._playerActionTimeout = 20
self._firstSmallBlind = 10
self._startMoney = 3000
self._allowSpectators = True
self._gameId = None
self._gameMode = None
self._isPrivate = None
self._adminPlayerId = None
self._manualBlinds = []
self._players = []
self._fillWithComputerPlayers = None
@property
def gameName(self):
return self._gameName
@property
def netGameType(self):
return self._netGameType
@property
def maxNumPlayers(self):
return self._maxNumPlayers
@property
def raiseIntervalMode(self):
return self._raiseIntervalMode
@property
def raiseEveryHands(self):
return self._raiseEveryHands
@property
def endRaiseMode(self):
return self._endRaiseMode
@property
def endRaiseSmallBlindValue(self):
return self._endRaiseSmallBlindValue
@property
def proposedGuiSpeed(self):
return self._proposedGuiSpeed
@property
def delayBetweenHands(self):
return self._delayBetweenHands
@property
def playerActionTimeout(self):
return self._playerActionTimeout
@property
def firstSmallBlind(self):
return self._firstSmallBlind
@property
def startMoney(self):
return self._startMoney
@property
def allowSpectators(self):
return self._allowSpectators
@property
def manualBlinds(self):
return self._manualBlinds
[docs] def setInfo(self, gameInfo):
self._gameName = gameInfo.gameName
self._netGameType = gameInfo.netGameType
self._maxNumPlayers = gameInfo.maxNumPlayers
self._raiseIntervalMode = gameInfo.raiseIntervalMode
self._raiseEveryHands = gameInfo.raiseEveryHands
self._endRaiseMode = gameInfo.endRaiseMode
self._endRaiseSmallBlindValue = gameInfo.endRaiseSmallBlindValue
self._proposedGuiSpeed = gameInfo.proposedGuiSpeed
self._delayBetweenHands = gameInfo.delayBetweenHands
self._playerActionTimeout = gameInfo.playerActionTimeout
self._firstSmallBlind = gameInfo.firstSmallBlind
self._startMoney = gameInfo.startMoney
self._allowSpectators = gameInfo.allowSpectators
self._manualBlinds = gameInfo.manualBlinds
[docs] def getMsg(self):
msg = pokerth_pb2.NetGameInfo()
msg.gameName = self.gameName
msg.netGameType = self.netGameType
msg.maxNumPlayers = self.maxNumPlayers
msg.raiseIntervalMode = self.raiseIntervalMode
msg.raiseEveryHands = self.raiseEveryHands
msg.endRaiseMode = self.endRaiseMode
msg.endRaiseSmallBlindValue = self.endRaiseSmallBlindValue
msg.proposedGuiSpeed = self.proposedGuiSpeed
msg.delayBetweenHands = self.delayBetweenHands
msg.playerActionTimeout = self.playerActionTimeout
msg.firstSmallBlind = self.firstSmallBlind
msg.startMoney = self.startMoney
msg.allowSpectators = self.allowSpectators
msg.manualBlinds.extend(self.manualBlinds)
return msg
@property
def gameId(self):
return self._gameId
@gameId.setter
def gameId(self, id):
self._gameId = id
@property
def gameMode(self):
return self._gameMode
@gameMode.setter
def gameMode(self, mode):
self._gameMode = mode
@property
def isPrivate(self):
return self._isPrivate
@isPrivate.setter
def isPrivate(self, bool):
self._isPrivate = bool
@property
def adminPlayerId(self):
return self._adminPlayerId
@adminPlayerId.setter
def adminPlayerId(self, id):
self._adminPlayerId = id
@property
def players(self):
return self._players
[docs] def addPlayer(self, player):
assert isinstance(player, Player)
assert player not in self._players
self._players.append(player)
[docs] def delPlayer(self, player):
assert isinstance(player, Player)
self._players.remove(player)
@property
def fillWithComputerPlayers(self):
return self._fillWithComputerPlayers
@fillWithComputerPlayers.setter
def fillWithComputerPlayers(self, bool):
self._fillWithComputerPlayers = bool
def __eq__(self, other):
if isinstance(other, GameInfo):
return self.gameId == other.gameId
return NotImplemented
[docs]class LobbyError(Exception):
def __unicode__(self):
return unicode(self.message)
def __str__(self):
return unicode(self).encode('utf-8')
[docs]class Lobby(object):
def __init__(self):
self._players = []
self._gameInfos = []
@property
def gameInfos(self):
return self._gameInfos
[docs] def addGameInfo(self, gameInfo):
if gameInfo not in self._gameInfos:
self._gameInfos.append(gameInfo)
else:
raise LobbyError("Game is already in our list of games")
@property
def players(self):
return self._players
[docs] def addPlayer(self, playerId):
player = Player(playerId)
if player not in self._players:
self._players.append(player)
else:
raise LobbyError("Player with id {} already listed".format(
playerId))
[docs] def delPlayer(self, playerId):
player = Player(playerId)
self._players.remove(player)
[docs] def getPlayer(self, playerId):
players = [p for p in self._players if p.playerId == playerId]
if len(players) == 1:
return players[0]
else:
raise LobbyError("Player with id {} not listed".format(playerId))
[docs] def getGameInfoId(self, gameName):
ids = [g.gameId for g in self._gameInfos if g.gameName == gameName]
if len(ids) == 1:
return ids[0]
else:
raise LobbyError("No game of name {} found".format(gameName))
[docs] def getGameInfo(self, gameId):
gameInfos = [g for g in self._gameInfos if g.gameId == gameId]
if len(gameInfos) == 1:
return gameInfos[0]
else:
raise LobbyError("Game with id {} not listed".format(gameId))
[docs] def setPlayerInfo(self, playerId, infoData):
player = self.getPlayer(playerId)
player.setInfo(infoData)
[docs] def addPlayerToGame(self, playerId, gameId):
gameInfo = self.getGameInfo(gameId)
player = self.getPlayer(playerId)
gameInfo.addPlayer(player)
[docs] def delPlayerFromGame(self, playerId, gameId):
gameInfo = self.getGameInfo(gameId)
player = self.getPlayer(playerId)
gameInfo.delPlayer(player)