Beispiel #1
0
 def run(self):
     self.sock.setblocking(True)
     with Heartbeat(self, frequency=self.heartbeat_freq):
         s = self.stream
         try:
             self.opened()
             while not self.terminated:
                 if not self._input.empty():
                     item = self._input.get()
                     self.send(item)
                 if not self.once():
                     print("Breaking")
                     break
         finally:
             print("terminating")
             self.terminate()
Beispiel #2
0
    def _keep_alive(self):
        '''Send a keep-alive packet to Firebase'''

        Timer(10.0, lambda: Heartbeat(self.connection.data, 2).start()).start()
Beispiel #3
0
 def __init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=30.0):
     WebSocket.__init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=heartbeat_freq)
     self.hb = Heartbeat(self, 30.0)
     self.hb.setDaemon(True)
     self.hb.start()
Beispiel #4
0
class ChatWebSocketHandler(WebSocket):
    room_list = []
    socket_user_map = {}

    def __init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=30.0):
        WebSocket.__init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=heartbeat_freq)
        self.hb = Heartbeat(self, 30.0)
        self.hb.setDaemon(True)
        self.hb.start()

    def opened(self):
        self.socket_user_map[self] = None

    def closed(self, code, reason="A client left the room without a proper explanation."):
        cherrypy.engine.publish('websocket-broadcast', TextMessage(reason))
        username = self.socket_user_map[self]
        del self.socket_user_map[self]
        if username in self.room_list:
            self.room_list.remove(username)

    def broadcast_room_list(self):
        room_list_msg = {
            "type": "INFO",
            "info": "ROOM_LIST",
            "data": self.room_list
        }

        broadast_message(room_list_msg)

    def received_message(self, m):
        try:
            return_msg = msg = json.loads(m.data)
            cherrypy.log("Recieved: %s" % msg)

            if msg['type'] != 'CODE':
                bad_string = '<script'
                for k in msg:
                    if bad_string in msg[k]:
                        return

            # eventually this if thing should be a pub/sub or some other event/factory pattern
            if msg['type'] == "CMD":
                if msg['command'] == "NAME_CHANGE":
                    self.room_list[self.room_list.index(msg['username'])] =  msg['new_name']
                    self.room_list.sort()
                    self.broadcast_room_list()
                    self.socket_user_map[self] = msg['new_name']

                    return_msg = {
                        "type": "EVENT",
                        "event": "NAME_CHANGED",
                        "username": msg['username'],
                        "new_name": msg['new_name']
                    }
            elif msg['type'] == "EVENT":
                if msg['event'] == "FIRST_SIGN_ON":
                    userid = 'User%d' % (random.randrange(0,100))
                    if 'username' in msg:
                        userid = msg['username']

                    if userid in self.room_list:
                        userid += str((random.randrange(0,100)))

                    msg['username'] = userid
                    msg['title'] = 'MockingJay'
                    msg['room_list'] = self.room_list
                    msg['history'] = LAST_MSGS

                    self.send(json.dumps(msg), False)

                    self.room_list.append(userid)
                    self.room_list.sort()
                    self.broadcast_room_list()
                    self.socket_user_map[self] = userid

                    return_msg = {
                        "type": 'EVENT',
                        "event": 'SIGN_ON',
                        "username": userid
                    }
                elif msg ['event'] == "RESIGN_ON":
                    userid = msg['username']
                    self.socket_user_map[self] = userid
                    if userid not in self.room_list:
                        self.room_list.append(userid)
                    self.broadcast_room_list()
                    return
                elif msg['event'] == "SIGN_OFF":
                    username = msg['username']
                    if username in self.room_list:
                        self.room_list.remove(username)

                    self.broadcast_room_list()
                    return_msg = {
                        "type": 'EVENT',
                        "event": 'SIGN_OFF',
                        "username": msg['username']
                    }

            broadast_message(return_msg)
        except Exception, e:
            cherrypy.log(str(e), severity=logging.ERROR, traceback=True)