Example #1
0
 def _showPlayerMatchSetupGUI(self):
     self._setupGUI = MatchSetupDialog(self._setupObj, self.sendChatMsg)
     self._setupGUI.buildMatchControlGUI()
     self._setupGUI.enableWidgets(0)
     self._setupGUI.buildCommPanel()
     self._setupGUI.addButtons(starttext="Ready", canceltext="Disconnect", disconnect=1)
     self._showSetupGUI()
Example #2
0
    def _showHostMatchSetupGUI(self):
        trueItems = ("Stop Network Game", "Stop Server")
        falseItems = ("Start Network Game", "Connect To Server")
        self._sendMessage("ENABLE_MENUS", menuname="NetworkMenu",
                          trueitems=trueItems, falseitems=falseItems)

        trueItems = []
        falseItems = ("Run Match")
        self._sendMessage("ENABLE_MENUS", menuname="RunMenu",
                          trueitems=trueItems, falseitems=falseItems)

        self._setupGUI = MatchSetupDialog(self._setupObj, self.sendChatMsg)
        self._setupGUI.buildMatchControlGUI()
        self._setupGUI.enableWidgetEvents()
        self._setupGUI.enableWidgets()
        self._setupGUI.buildCommPanel()
        self._setupGUI.addButtons(canceltext="Stop Server", disconnect=1)
        self._showSetupGUI()
Example #3
0
class JowstClient(pb.Referenceable):
    def __init__(self, usertype, ifCB, name, passwd='', hostname="localhost",
                 port=7101, host=0,
                 clientToken=None):
        self.usertype = usertype
        self.passwd = passwd
        self.hostname = hostname
        self.port = port
        self.handshakePort = None
        self.factory = pb.PBClientFactory()
        self.host = host
        self.clientToken = clientToken
        self._setupGUI = None
        self.name = name
        self._sendMessage = ifCB
        self.remoteSetupObj = None
        self.setupQueue = Queue.Queue()
        self._isConnected = False
        self.state = None

        
        if self.host:
            self.handshakeListener = Handshaker()
            self.handshakeListener.stopClientCB = self.stopClient
            self.handshakeListener.setPasswdCB = self.setHostPassword
            
    def isHost(self): return self.host
        
    def remote_addNewPlayer(self, playerName):
        self._setupGUI.addPlayer(playerName, self.name)

    def remote_setPlayerReady(self, player):
        self._setupGUI.setPlayerReady(player)
        
    def remote_updateWidget(self, widget, val):
        print "updating", widget
        self._setupGUI.controlGUI.updateControlWidget(widget, val)

    def remote_updateCPU(self, wrestler, team, val):
        print "updateCPU", wrestler, team, 1
        widget = self._setupGUI.controlGUI.teamLists[team]
        widget.Check(widget.FindString(wrestler), val)
        
    def remote_getClientName(self): return self.name
    def remote_setClientName(self, name): self.name = name
    def remote_receiveWrestlerUpdate(self, team, name, add):
        widget = self._setupGUI.controlGUI.teamLists[team]
        if add: widget.Append(name)
        else: widget.Delete(widget.FindString(name))
        
    def remote_updatePlayerTree(self, team, name, add, player):
        if add: self._setupGUI.addWrestlerToPlayerTree(player, name, team)
        else: self._setupGUI.removeWrestlerFromPlayerTree(player, name)
        
    def remote_startMatch(self, teamlist, playerWrestlers, timeLimit, dramaobj,
                          matchType, matchImage, labelData):
        print "starting match"
        self._sendMessage("CLOSE_POPUP_WIN", win_name="serverWait")
        self._sendMessage("START_MATCH", teams=teamlist, player_wrestlers=playerWrestlers,
                          timelimit=timeLimit, drama=dramaobj, network=1,
                          matchtype=matchType, matchimage=matchImage,
                          labeldata=labelData)
        return self.name

    def remote_removePlayer(self, player):
        self._setupGUI.removePlayer(player)
        
    def remote_receiveMessage(self, msg, **kw):
        kw["callback"] = self.sendResult
        self._sendMessage(msg, **kw)

    def remote_receiveChatMessage(self, player, msg):
        if self.state == MATCH_SETUP:
            self._setupGUI.handleChatMessage(player, msg)
        else:
            self._sendMessage("CHAT_MSG", playername=player, message=msg)
    
    def remote_matchEndMessage(self, text, winName):
        self._sendMessage("SHOW_POPUP_WIN", win_text=text, win_name=winName)

    def remote_restartGame(self, winName):
        self._sendMessage("CLOSE_POPUP_WIN", win_name=winName)
        self._restartNetGame(None)
            
    def remote_disconnect(self):
        # Try to destroy setup GUI if one exists
        try:
            self._setupGUI.Destroy()
        except:
            pass
        self._disconnect(None)
        self._sendMessage("CLEANUP_UI")
        return 1

    def _sendMatchSetupMsg(self, msg, *args):
        return self.remoteSetupObj.callRemote("sendMatchSetupMsg", msg, *args)
        
    def sendChatMsg(self, msg):
        self.remoteChatObj.callRemote("receiveChatMessage", msg)
            
    def sendResult(self, result):
        self.perspective.callRemote("sendPromptResult", result)
        
    def isConnected(self): return self._isConnected
    
    def _populateSetupGUI(self, valdict):
        self._setupGUI.controlGUI.timeLimitEntry.SetValue(valdict["TIME_LIMIT"])
        if valdict["TIME_LIMIT"] == NO_TIME_LIMIT:
            self._setupGUI.controlGUI.noTimeLimitChkbox.SetValue(1)
        else:
            self._setupGUI.controlGUI.noTimeLimitChkbox.SetValue(0)
        self._setupGUI.controlGUI.dqEnabled.SetValue(valdict["DQ_ENABLED"])

        dramaPause = valdict["DRAMA"].getDramaPause()
        rtpins = valdict["DRAMA"].getRealtimePins()
        rtcountouts = valdict["DRAMA"].getRealtimeCountouts()
        subdrama = valdict["DRAMA"].getSubmissionDrama()

        self._setupGUI.controlGUI.dramaticPause.SetValue(dramaPause)
        self._setupGUI.controlGUI.realtimePins.SetValue(rtpins)
        self._setupGUI.controlGUI.realtimeCountouts.SetValue(rtcountouts)
        self._setupGUI.controlGUI.submissionDrama.SetValue(subdrama)

        # Add teams to teamlists and set up their CPU status
        t = 0
        for team in valdict["TEAMS"]:
            teamCPUs = valdict["CPUS"][t]
            widget = self._setupGUI.controlGUI.teamLists[t]
            for member in team:
                widget.Append(member)
                if member in teamCPUs:
                    widget.Check(widget.FindString(member), 1)
            t += 1

        # Add Players and the wrestlers they control to the player Tree
        for player in valdict["PLAYER_MAP"].keys():
            self._setupGUI.addPlayer(player, self.name)
            for wrestler in valdict["PLAYER_MAP"][player].keys():
                self._setupGUI.addWrestlerToPlayerTree(player, wrestler,
                                                       valdict["PLAYER_MAP"][player][wrestler])
                
            
                    
    def setPerspective(self, perspective):
        self._isConnected = True
        self.perspective = perspective
        self.perspective.callRemote("joinMatchSetup").addCallback(self._setRemoteObjects)
        if self.isHost():
            self._setupObj = Interface.HostMatchSetup(self._sendMatchSetupMsg)
            self._showHostMatchSetupGUI()
        else:
            self._setupObj = Interface.ClientMatchSetup(self._sendMatchSetupMsg)
            self._showPlayerMatchSetupGUI()
        
    def _showHostMatchSetupGUI(self):
        trueItems = ("Stop Network Game", "Stop Server")
        falseItems = ("Start Network Game", "Connect To Server")
        self._sendMessage("ENABLE_MENUS", menuname="NetworkMenu",
                          trueitems=trueItems, falseitems=falseItems)

        trueItems = []
        falseItems = ("Run Match")
        self._sendMessage("ENABLE_MENUS", menuname="RunMenu",
                          trueitems=trueItems, falseitems=falseItems)

        self._setupGUI = MatchSetupDialog(self._setupObj, self.sendChatMsg)
        self._setupGUI.buildMatchControlGUI()
        self._setupGUI.enableWidgetEvents()
        self._setupGUI.enableWidgets()
        self._setupGUI.buildCommPanel()
        self._setupGUI.addButtons(canceltext="Stop Server", disconnect=1)
        self._showSetupGUI()

    def _setRemoteObjects(self, objTuple):
        if not self.remoteSetupObj:
            self.remoteSetupObj = objTuple[0]
        if objTuple[1]:
            self.remoteChatObj = objTuple[1]
        
    def _showPlayerMatchSetupGUI(self):
        self._setupGUI = MatchSetupDialog(self._setupObj, self.sendChatMsg)
        self._setupGUI.buildMatchControlGUI()
        self._setupGUI.enableWidgets(0)
        self._setupGUI.buildCommPanel()
        self._setupGUI.addButtons(starttext="Ready", canceltext="Disconnect", disconnect=1)
        self._showSetupGUI()

    def _showSetupGUI(self):
        self._setupGUI.Show(1)
        self.setupQueue.put(1)
        self.state = MATCH_SETUP
        EVT_IDLE(self._setupGUI, self._checkState)

    def _checkState(self, evt):
        """This method checks the state of the match setup GUI
           TODO: This should be moved to the MainJowstWindow class"""
        if self._setupGUI.state == READY_TO_START_MATCH:
            if self.isHost():
                self.perspective.callRemote("startMatch")
            else:
                self.remoteSetupObj.callRemote("playerReady")
                self._sendMessage("SHOW_POPUP_WIN", win_name="serverWait",
                                  win_text="Waiting for host to start match...")
            self._setupGUI.state = STARTING_MATCH
            self._setupGUI.Destroy()
            self.state = MATCH_RUNNING
        elif self._setupGUI.state == DISCONNECT:
            if self.isHost():
                d = self.perspective.callRemote("stopServer")
            else:
                d = self.perspective.callRemote("leaveServer")
            d.addCallbacks(self._disconnect, self.handleShutdownFailure)
            self._setupGUI.Destroy()
        elif not self.setupQueue.empty() and self.remoteSetupObj:
            guibuilt = self.setupQueue.get()
            # Ask for current match setup
            self.remoteSetupObj.callRemote("getCurrentSetupValues").addCallback(self._populateSetupGUI)
            
            
    def _disconnect(self, val):
        self._sendMessage("DISCONNECT_MSG", message="Disconnected from Server",
                          caption="Disconnected")
                
    def startClient(self):
        if self.isHost():
            self.handshakePort = reactor.listenTCP(7100, server.Site(self.handshakeListener),
                                                   interface='localhost')
        else: self.connectToService()

    def stopNetGame(self):
        self.perspective.callRemote("stopNetGame")       

    def disconnectFromServer(self):
        self.perspective.callRemote("leaveServer")
        self._disconnect(None)

    def stopServer(self):
        self.perspective.callRemote("stopServer").addCallbacks(self._disconnect,
                                                               self.handleShutdownFailure)
    def _restartNetGame(self, server_state):
        self._sendMessage("CLEANUP_UI", shutdown=0)
        if self.isHost():
            self._showHostMatchSetupGUI()
        else:
            self._showPlayerMatchSetupGUI()
        
    def setHostPassword(self, adminpasswd, passwd, hostPlayerName, clientToken):
        retval = 0
        if clientToken == self.clientToken:
            self.name = hostPlayerName
            self.passwd = passwd
            self.adminpasswd = adminpasswd
            self.connectToService()
            retval = 1
        return retval

    def stopClient(self, clientToken):
        retval = 0
        if clientToken == self.clientToken:
            self.handshakePort.stopListening()
            retval = 1
        return retval
            
    def connectToService(self):
        if self.handshakePort:
            self.handshakePort.stopListening()
            self.handshakePort = None
            
        reactor.connectTCP(self.hostname, self.port, self.factory)
        if self.isHost():
            self.passwd = self.adminpasswd
            
        defPer = self.factory.login(credentials.UsernamePassword(self.usertype,
                                                                 self.passwd),
                                    client=self)
        defPer.addCallback(self.setPerspective)
        defPer.addErrback(self.handleError)

    def handleError(self, failure):
        print failure
        self._sendMessage("DISCONNECT_MSG",
                          message="Unable to connect to server\nbecause the maximum\n" +\
                                  "connection limit was reached,\nthe incorrect password" +\
                                  " was entered,\nor the host was not found.",
                          caption="Unable to connect to server.")

    def handleShutdownFailure(self, failure):
        pass