예제 #1
0
    def HandleServerStart(self):
        # Connect to the MongoDB
        self.database = DBManager(host="localhost", port=27017, testing=True)

        address = self.server.address
        logger.info("Server started in address %s:%d", *address)

        self.admin_user = User(name="admin", user="******")

        self.room_manager = RoomManager()
        self.room_manager.CreateRoom("default", self.admin_user)

        self.logged_users = Connect.SafeList()
예제 #2
0
def run(stdscr):
    stdscr = curses.initscr()
    curses.noecho()
    curses.cbreak()
    curses.start_color()
    curses.initscr()
    curses.use_default_colors()
    curses.init_pair(1, -1, 246)
    curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_RED)
    db = DB()
    rm = RoomManager()
    rm.add_room(TitleRoom(stdscr, rm, VERSION, AUTHOR))
    rm.add_room(TableRoom(stdscr, rm, db))
    rm.add_room(HelpRoom(stdscr, rm))
    rm.start()
예제 #3
0
class Sokoban(Scene):
    """Main class of game that creates all 
    the other classes and stores the pygame display"""
    def __init__(self, screenRes=(640, 480)):
        self.running = True
        self.surfaceManager = SurfaceManager(screenRes, "Assets/northpole.jpg")
        self.roomManager = RoomManager(
            screenRes
        )  #Sokoban needs an extra manager for all the levels that contain sprites
        self.uiManager = SokobanUIManager(
            {
                "room": Text("Room: 1", (0, 255, 0), 30, 440),
                "totalMoves": Text("Total Moves: 0", (0, 255, 0), 130, 440),
                "moves": Text("Moves: 0", (0, 255, 0), 230, 440)
            }, {
                "Reset":
                Button("Reset", (32, 32, 32), (0, 140, 0), 400, 440,
                       screenRes[0] * 0.1, screenRes[1] * 0.05)
            }, screenRes)
        self.eventHandlers = SokobanEventHandlers(self)
        self.eventManager = SokobanEventManager(
            self.eventHandlers, self.roomManager.eventHandlers,
            self.roomManager.currentRoom.eventHandlers,
            self.uiManager.eventHandlers)
        self.surfaceManager.setObjects([self.roomManager, self.uiManager])

    def getTotalScore(self):
        return self.roomManager.getTotalMoves()
예제 #4
0
 def __init__(self, host, port, maxclients, maxdown, maxup):
     
     self.room_manager = RoomManager()
     Client.connected.connect(self.room_manager.on_client_connected)
     
     if port == "*":
         use_port = 0
     else:
         use_port = int(port)
         
     if host == "*":
         use_host = None
     else:
         use_host = host
         
     address = enet.Address(use_host, use_port)
     maxclients = int(maxclients)
     maxdown = int(maxdown)
     maxup = int(maxup)
         
     self._enet_host = enet.Host(address, maxclients, 3, maxdown, maxup)
     
     ClientBase.cn_pool.extend(list(range(maxclients)))
     
     self.clients = {}
     
     self._running = True
예제 #5
0
 def __init__(self, screenRes=(640, 480)):
     self.running = True
     self.surfaceManager = SurfaceManager(screenRes, "Assets/northpole.jpg")
     self.roomManager = RoomManager(screenRes)
     self.uiManager = ScoreUIManager(
         {"Total Moves": Text("Total Moves: 0", (0, 255, 0), 130, 440)}, {
             "Restart":
             Button("Restart", (32, 32, 32), (0, 140, 0), 560, 440, 130, 40)
         }, screenRes)
     self.eventManager = ScoreEventManager(self.uiManager.eventHandlers)
     self.surfaceManager.setObjects([self.uiManager])
예제 #6
0
 def __init__(self, screenRes=(640, 480)):
     self.running = True
     self.surfaceManager = SurfaceManager(screenRes, "Assets/northpole.jpg")
     self.roomManager = RoomManager(
         screenRes
     )  #Sokoban needs an extra manager for all the levels that contain sprites
     self.uiManager = SokobanUIManager(
         {
             "room": Text("Room: 1", (0, 255, 0), 30, 440),
             "totalMoves": Text("Total Moves: 0", (0, 255, 0), 130, 440),
             "moves": Text("Moves: 0", (0, 255, 0), 230, 440)
         }, {
             "Reset":
             Button("Reset", (32, 32, 32), (0, 140, 0), 400, 440,
                    screenRes[0] * 0.1, screenRes[1] * 0.05)
         }, screenRes)
     self.eventHandlers = SokobanEventHandlers(self)
     self.eventManager = SokobanEventManager(
         self.eventHandlers, self.roomManager.eventHandlers,
         self.roomManager.currentRoom.eventHandlers,
         self.uiManager.eventHandlers)
     self.surfaceManager.setObjects([self.roomManager, self.uiManager])
예제 #7
0
class ChatServerHandler(Connect.BaseServerHandler):
    def HandleServerStart(self):
        # Connect to the MongoDB
        self.database = DBManager(host="localhost", port=27017, testing=True)

        address = self.server.address
        logger.info("Server started in address %s:%d", *address)

        self.admin_user = User(name="admin", user="******")

        self.room_manager = RoomManager()
        self.room_manager.CreateRoom("default", self.admin_user)

        self.logged_users = Connect.SafeList()

    def HandleNewConnection(self, socket_manager):
        logger.info(
            "New connection from {}:{}".format(*socket_manager.address))

    def HandleClientRequest(self, socket_manager):
        msg = socket_manager.Receive()
        if msg is None or not IsValidMessage(msg):
            self.SendResponse(msg.type, ResponseCode.INVALID_MESSAGE,
                              socket_manager)
            return

        if msg.type == MessageType.CHAT:
            self.ProcessChatMessage(msg, socket_manager)
        elif (msg.type == MessageType.LOGIN):
            self.ProcessLoginMessage(msg, socket_manager)
        elif (msg.type == MessageType.REGISTER):
            self.ProcessRegisterMessage(msg, socket_manager)
        elif (msg.type == MessageType.CREATE_ROOM):
            self.ProcessCreateRoomMessage(msg, socket_manager)
        elif (msg.type == MessageType.REMOVE_ROOM):
            self.ProcessRemoveRoomMessage(msg, socket_manager)

    def HandleClientClose(self, socket_manager):
        logger.info("Closed conection {}:{}".format(*socket_manager.address))
        if socket_manager in self.logged_users:
            self.logged_users.remove(socket_manager)

    def HandleServerClose(self):
        msg = Connect.Message(MessageType.SERVER_CLOSE)
        self.ServerBroadcast(msg, self.server.clients)
        logger.info("Server Closed.")

    def ProcessChatMessage(self, msg, socket_manager):
        logger.debug(msg.content.get("message"))
        self.SendResponse(MessageType.CHAT, ResponseCode.OK, socket_manager)
        broadcast = Connect.Message(MessageType.NEW_CHAT, msg.content)
        self.ServerBroadcast(broadcast, self.logged_users)

    def ProcessLoginMessage(self, msg, socket_manager):
        user = self.database.GetUser(msg.content.get("user"))
        if user is None or user.password != msg.content.get("password"):
            self.SendResponse(msg.type, ResponseCode.INVALID_LOGIN_INFO,
                              socket_manager)
        else:
            self.logged_users.append(socket_manager)
            logger.debug("New login from user %s.", user.user)
            self.SendResponse(msg.type, ResponseCode.OK, socket_manager,
                              self.room_manager.GetRoomList())

    def ProcessRegisterMessage(self, msg, socket_manager):
        # Check for an invalid user
        match = re.fullmatch("^[a-zA-Z][a-zA-Z0-9_.]+$",
                             msg.content.get("user"))
        if match is None:
            self.SendResponse(msg.type, ResponseCode.INVALID_USERNAME,
                              socket_manager)

        user = User(**msg.content)

        result = self.database.Insert(user)
        if result:
            logger.debug("New user created with username: %s.", user.user)
            self.SendResponse(msg.type, ResponseCode.OK, socket_manager)
        else:
            self.SendResponse(msg.type, ResponseCode.USER_ALREADY_REGISTERED,
                              socket_manager)

    def ProcessCreateRoomMessage(self, msg, socket_manager):
        room_name = msg.content.get("name")
        user = self.database.GetUser(msg.content.get("owner"))
        if user is not None:
            result = self.room_manager.CreateRoom(room_name, user)
            if result is not None:
                self.SendResponse(msg.type, ResponseCode.OK, socket_manager)
                broadcast = Connect.Message(MessageType.NEW_ROOM, msg.content)
                self.ServerBroadcast(broadcast, self.logged_users)
            else:
                self.SendResponse(msg.type, ResponseCode.ROOM_ALREADY_CREATED,
                                  socket_manager)
        else:
            self.SendResponse(msg.type, ResponseCode.NON_EXISTING_USER,
                              socket_manager)

    def ProcessRemoveRoomMessage(self, msg, socket_manager):
        room_name = msg.content.get("name")
        user = self.database.GetUser(msg.content.get("owner"))
        if user is not None:
            result = self.room_manager.RemoveRoom(room_name, user)
            if result == 0:
                self.SendResponse(msg.type, ResponseCode.OK, socket_manager)
                broadcast = Connect.Message(MessageType.DELETE_ROOM,
                                            {"name": room_name})
                self.ServerBroadcast(broadcast, self.logged_users)
            elif result == 1:
                self.SendResponse(msg.type, ResponseCode.NON_EXISTING_ROOM,
                                  socket_manager)
            elif result == 2:
                self.SendResponse(msg.type, ResponseCode.NOT_ROOM_OWNER,
                                  socket_manager)
        else:
            self.SendResponse(msg.type, ResponseCode.NON_EXISTING_USER,
                              socket_manager)

    def SendResponse(self,
                     msg_type,
                     response_code,
                     socket_manager,
                     content=None):
        response_content = {
            "type": msg_type,
            "code": response_code,
            "content": content
        }
        response = Connect.Message(MessageType.RESPONSE, response_content)
        socket_manager.Send(response)

    def ServerBroadcast(self, msg, users):
        for socket_manager in users:
            try:
                socket_manager.Send(msg)
            except:
                pass
예제 #8
0
class Engine(object):
    clients = {}
    room_manager = None
    _running = False
    _enet_host = None
    
    def __init__(self, host, port, maxclients, maxdown, maxup):
        
        self.room_manager = RoomManager()
        Client.connected.connect(self.room_manager.on_client_connected)
        
        if port == "*":
            use_port = 0
        else:
            use_port = int(port)
            
        if host == "*":
            use_host = None
        else:
            use_host = host
            
        address = enet.Address(use_host, use_port)
        maxclients = int(maxclients)
        maxdown = int(maxdown)
        maxup = int(maxup)
            
        self._enet_host = enet.Host(address, maxclients, 3, maxdown, maxup)
        
        ClientBase.cn_pool.extend(list(range(maxclients)))
        
        self.clients = {}
        
        self._running = True
        
    def stop(self):
        self._running = False
        
    def getpeerid(self, event):
        return (event.peer.address.host, event.peer.address.port)
        
    def service_host(self):
        try:
            event = self._enet_host.service(5)
        except KeyboardInterrupt:
            raise
        
        if event.type == enet.EVENT_TYPE_CONNECT:
            print("%s: CONNECT" % event.peer.address)
            self.clients[self.getpeerid(event)] = Client(event.peer)
            
        elif event.type == enet.EVENT_TYPE_DISCONNECT:
            print("%s: DISCONNECT" % event.peer.address)
            
            if self.getpeerid(event) in self.clients.keys():
                client = self.clients[self.getpeerid(event)]
                del self.clients[self.getpeerid(event)]
                client.on_disconnect()
                
        elif event.type == enet.EVENT_TYPE_RECEIVE:
            if self.getpeerid(event) in self.clients.keys():
                self.clients[self.getpeerid(event)].on_receive_event(event.channelID, event.packet.data)
        
    def run(self):
        while self._running:
            try:
                self.room_manager.update_rooms()
                self.service_host()
                if self.room_manager.sendpackets():
                    self._enet_host.flush()
            except:
                exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
                if exceptionType == KeyboardInterrupt:
                    print ""
                    return
                
                print "Uncaught exception occurred in server engine mainloop."
                print traceback.format_exc()