Ejemplo n.º 1
0
 def connection_made(self, transport):
     self.transport = transport
     self.dataHandler = DataHandler(transport)
     self.peername = self.transport.get_extra_info('peername')
     printx('Connection from:{}'.format(self.peername))
     self.game = EscapeRoomGame(output=self.sendGameResPkt)
     self.game.create_game()
     self.payStatus = False
     self.bankManager = BankManager()
     self.timer = None
     self.tasks = []
Ejemplo n.º 2
0
    def data_received(self,data):

        self.dataHandler = DataHandler(self.transport) # TODO: del this

        pkts = self.dataHandler.recvPktSaveFile(data)
        # # save ptk to json
        #     #jsonData = json.dump(pkts)
        #     #f.write(pkts)
        #     json.dump(pkts,f)

        for pkt in pkts:
            self.dataHandler.recvPktSaveFile(pkt.data)
Ejemplo n.º 3
0
class protocol_factory(VNICDumpProtocol):
    def __init__(self,loop):
        self.loop = loop

    # BUG: 
    # def super().connection_made(self,transport):
    #     printx("connection_made to {}".format(transport.get_extra_info("peername")))
    #     self.transport = transport

    def data_received(self,data):

        self.dataHandler = DataHandler(self.transport) # TODO: del this

        pkts = self.dataHandler.recvPktSaveFile(data)
        # # save ptk to json
        #     #jsonData = json.dump(pkts)
        #     #f.write(pkts)
        #     json.dump(pkts,f)

        for pkt in pkts:
            self.dataHandler.recvPktSaveFile(pkt.data)
Ejemplo n.º 4
0
class ServerProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        self.transport = transport
        self.dataHandler = DataHandler(transport)
        self.peername = self.transport.get_extra_info('peername')
        printx('Connection from:{}'.format(self.peername))
        self.game = EscapeRoomGame(output=self.sendGameResPkt)
        self.game.create_game()
        self.payStatus = False
        self.bankManager = BankManager()
        self.timer = None
        self.tasks = []

    def data_received(self, data):
        self.resetTimer()
        self.dataHandler.printTimeAndPeerName()
        pkts = self.dataHandler.recvPkt(data)
        for pkt in pkts:
            self.data_received_helper(pkt)
        if self.game.status == "escaped":
            self.payStatus = False  # NOTE: here prevent user play multiple times
            printx('Student server side finished!')

    def data_received_helper(self, pkt):
        pktID = pkt.DEFINITION_IDENTIFIER
        # 1: respond to game init pkt, ask payment
        if pktID == GameInitPacket.DEFINITION_IDENTIFIER:
            self.unique_id = self.generateRandomString()
            self.dataHandler.printTimeAndPeerName()
            self.dataHandler.sendPkt(
                create_game_require_pay_packet(self.unique_id, MY_ACCOUNT,
                                               AMOUNT))

        # 2: respond to game payment response pkt, confirm payment and start game
        elif pktID == GamePayPacket.DEFINITION_IDENTIFIER:
            receipt, receipt_sig = process_game_pay_packet(pkt)
            if (True):
                # TODO: fix this
                # if(self.bankManager.receipt_verify(receipt,receipt_sig,MY_ACCOUNT,AMOUNT,self.unique_id)):
                printx("payment confirmed")
                self.payStatus = True
                self.game.start()
                for a in self.game.agents:
                    self.tasks.append(asyncio.create_task(a))
            else:
                printError("client's payment confirm failed")

        # 3: respond to game command pkt, send game response
        elif pktID == GameCommandPacket.DEFINITION_IDENTIFIER:
            if self.game.status != "playing":
                printError(
                    "client tried to play the game while status is not playing"
                )
                return
            elif self.payStatus == False:
                printError(
                    "client tried to play game before the payment is confirmed!"
                )
                return
            else:
                self.game.command(pkt.command)
                time.sleep(0.25)
                return
        else:
            printError("unknown pkt:" + pktID)

    def generateRandomString(self, stringLength=10):
        """ Generate a unique ID (a random string of fixed length)
        """
        return ''.join(
            random.choice(string.ascii_lowercase) for i in range(stringLength))

    def sendGameResPkt(self, string):
        """ Server as game's output, so pass this to the game
        """
        self.dataHandler.printTimeAndPeerName()
        pkt = create_game_response(string, self.game.status)
        self.dataHandler.sendPkt(pkt)

    def resetTimer(self):
        if self.timer != None:
            self.timer.cancel()
        self.timer = Timer(TIME_OUT, lambda: self.cancleTasks())
        self.timer.start()
        # sys.stdout.flush()  # for output.txt, otherwise will print when program ends

    def cancleTasks(self):
        # tell client the transport is closed
        self.dataHandler.sendPkt(
            GameResponsePacket(
                response=
                "{},You didn't response in the past {} seconds, please reconnect again"
                .format(self.peername, TIME_OUT),
                status=self.game.status))
        self.transport.close()
        for task in self.tasks:
            task.cancel()
        printx("{}, timer is up, server transport close".format(
            self.peername[0]))