コード例 #1
0
ファイル: videomeet.py プロジェクト: bowu8/anwen
def handle_message(room_key, user, message):
    message_obj = json.loads(message)
    room = Room.by_room_key(room_key)
    other_user = room.get_other_user(user) if room else None
    if message_obj['type'] == 'bye':
        # This would remove the other_user in loopback test too.
        # So check its availability before forwarding Bye message.
        delete_saved_messages(make_client_id(room_key, user))
        room.remove_user(user)
        logging.info('User ' + user + ' quit from room ' + room_key)
        logging.info('Room ' + room_key + ' has state ' + str(room))

        if other_user and other_user != user:
            # channel_send_message(
            #     make_client_id(room, other_user), '{"type":"bye"}')
            logging.info('Sent BYE to ' + other_user)
        return 'bye'
    if other_user or room_key == '1':
        if message_obj['type'] == 'offer':
            # Special case the loopback scenario.
            if other_user == user or room_key == '1':
                message = make_loopback_answer(message)
                return message
            # Workaround Chrome bug.
            # Insert a=crypto line into offer from FireFox.
            # TODO(juberti): Remove this call.
            message = maybe_add_fake_crypto(message)
            message = message.replace("\"offer\"", "\"answer\"")
        if room_key == '1':
            return message
        if other_user:
            on_message(room_key, other_user, message)
        client_id = make_client_id(room_key, user)
        messages = get_saved_messages(client_id)
        message = ''
        for i in messages:
            message = i.msg
        logger.debug(message)
        return message
コード例 #2
0
ファイル: videomeet.py プロジェクト: bowu8/anwen
 def post(self):
     message = self.request.body
     check = self.get_argument('check', None)
     room_key = self.get_argument('r')
     user = self.get_argument('u')
     logging.info('message is ' + message)
     logging.info('room_key is ' + room_key)
     logging.info('user is ' + user)
     with LOCK:
         room = Room.by_room_key(room_key)
         if check:
             if room_key == '1':
                 status = 'True'
             else:
                 status = str(room.has_user(user) and room.get_occupancy() == 2)
             self.write(status)
         elif room_key:
             message = handle_message(room_key, user, message)
             info = 'echo message %s' % message
             logger.debug(info)
             self.write(message)
         else:
             logging.warning('Unknown room ' + room_key)
コード例 #3
0
ファイル: videomeet.py プロジェクト: bowu8/anwen
    def get(self):
        """Renders the main page. When this page is shown, we create a new
        channel to push asynchronous updates to the client."""
        room_key = sanitize(self.get_argument('r', None))
        debug = self.get_argument('debug', None)
        unittest = self.get_argument('unittest', None)
        stun_server = self.get_argument('ss', None)
        turn_server = self.get_argument('ts', None)
        hd_video = self.get_argument('hd', 'true')
        ts_pwd = self.get_argument('tp', None)
        # set compat to true by default.
        compat = self.get_argument('compat', 'true')
        if debug == 'loopback':
        # set compat to false as DTLS does not work for loopback.
            compat = 'false'

        # token_timeout for channel creation, default 30min, max 2 days, min 3min.
        # token_timeout = self.request.get_range('tt',
        #                                        min_value = 3,
        #                                        max_value = 3000,
        #                                        default = 30)
        if unittest:
            # Always create a new room for the unit tests.
            room_key = generate_random(8)

        if not room_key:
            room_key = generate_random(8)
            redirect = '?r=' + room_key
            redirect = append_url_arguments(self.request, redirect)
            self.redirect(redirect)
            logging.info('Redirecting visitor to base URL to ' + redirect)
            return

        user = None
        initiator = 0
        with LOCK:
            # room = None
            room = Room.by_room_key(room_key)
            if not room and debug != "full":
                # New room.
                user = generate_random(8)
                if debug == 'loopback':
                    initiator = 1
                    info = 'user0 %s added to test room %s' % (user, room_key)
                    logger.debug(info)
                else:
                    initiator = 0
                    room = Room.new({'room_key': room_key})
                    room.add_user(user)
                    info = 'user1 %s added to new room %s' % (user, room_key)
                    logger.debug(info)
            elif room and room.get_occupancy() == 1 and debug != 'full':
                # 1 occupant.
                user = generate_random(8)
                room.add_user(user)
                info = 'user2 %s added to room %s' % (user, room_key)
                logger.debug(info)
                initiator = 1
            else:
                # 2 occupants (full).
                template = jinja_environment.get_template('full.html')
                self.write(
                    template.render({'room_key': room_key}))
                info = 'room %s is full' % (room_key)
                logger.debug(info)
                return
        room_link = 'http://%s/videomeet?r=%s' % (self.request.host, room_key)
        room_link = append_url_arguments(self.request, room_link)
        pc_config = make_pc_config(stun_server, turn_server, ts_pwd)
        pc_constraints = make_pc_constraints(compat)
        offer_constraints = make_offer_constraints(compat)
        media_constraints = make_media_constraints(hd_video)
        template_values = {
            'me': user,
            'room_key': room_key,
            'room_link': room_link,
            'initiator': initiator,
            'pc_config': json.dumps(pc_config),
            'pc_constraints': json.dumps(pc_constraints),
            'offer_constraints': json.dumps(offer_constraints),
            'media_constraints': json.dumps(media_constraints)
        }
        if unittest:
            target_page = 'test/test_' + unittest + '.html'
        else:
            target_page = 'videomeet.html'

        template = jinja_environment.get_template(target_page)
        self.write(template.render(template_values))