Exemple #1
0
def new_push():
    try:
        msg_type = request.json.get('msg_type')
        if not msg_type:
            raise ValidationError('no msg type')

        device_id = request.json.get('device_id')
        if not device_id:
            raise ValidationError('no device id')

        device = Device.query.get(device_id)
        if not device:
            raise ValidationError('wrong device id')

        content = request.json.get('content')

        ret = push_message_to_device(device.device_name, content, msg_type)

        return jsonify(BaseApi.api_success(ret))
    except Exception as e:
        db.session.rollback()
        app.logger.exception('info')
        return jsonify(BaseApi.api_system_error(e.message))
Exemple #2
0
def allot_device():
    restore_device_ids = []
    idle_device = None
    user_id = None
    try:
        user_id = g.current_user.id
        game_id = request.json.get('game_id')

        num_left = User.redis_incr_ext_info(user_id, app.config['ALLOT_NUM_LIMIT_NAME'], -1)
        if num_left < 0:
            raise MyException(message='exceed the max allot num error', code=ERR_CODE_EXCEED_ALLOT_NUM_ERROR)

        if user_id is None or user_id == '':
            raise ValidationError('does not have a user id')
        if game_id is None or game_id == '':
            raise ValidationError('does not have a game id')

        game = Game.query.get(game_id)
        if not game:
            raise ValidationError('game does not exists')

        if game.allow_allot != 1:
            raise ValidationError('game is Off the shelf')

        retry_times = 0
        while True:
            device_id = Device.pop_redis_set()
            if not device_id:
                break
            device = Device.query.get(device_id)
            if not device or device.state != DEVICE_STATE_IDLE:
                continue
            if device_available(device):
                idle_device = device
                break
            else:
                # put device_id back
                restore_device_ids.append(device_id)
                retry_times += 1
            if retry_times > ALLOT_RETRY:
                break

        # restore device ids
        for restore_device_id in restore_device_ids:
            Device.push_redis_set(restore_device_id)

        if idle_device is None:
            raise MyException(message='no free device', code=ERR_CODE_NO_DEVICE)

        # push start game command to device
        try:
            if not app.config['DEBUG']:
                push_message_to_device(idle_device.device_name, game.package_name, MSG_TYPE_START_APP)
        except BaseException, e:
            pass
            # Device.push_redis_set(idle_device.id)
            # raise e

        address_map = Device.set_device_map(idle_device.device_name)

        agent_record = AgentRecord()
        agent_record.address_map = address_map
        agent_record.game_id = game_id
        agent_record.user_id = user_id
        agent_record.device_id = idle_device.id
        agent_record.type = RECORD_TYPE_START
        agent_record.record_time = datetime.now()
        agent_record.start_time = datetime.now()

        idle_device.state = DEVICE_STATE_BUSY
        db.session.add(idle_device)
        db.session.add(agent_record)
        db.session.commit()

        # increase user's allot device num
        User.redis_incr_ext_info(user_id, app.config['ALLOT_NUM_NAME'], 1)

        # record info into redis
        start_use_device(idle_device.id)

        ret = {
            "record_id": agent_record.id,
            "game_id": game_id,
            "address": address_map,
            "music_url": game.music_url,
            "device": idle_device.to_json(),
            "game_icon": game.icon_url,
            "game_name": game.game_name
        }
        Device.incr_allot("1.0", ALLOT_SUCCESS)
        app.logger.error('allot success user_id : %r, game_id: %r, device_id: %r' % (user_id, game_id, idle_device.id))
        return jsonify(BaseApi.api_success(ret))
Exemple #3
0
def free_device(page, device_id):
    try:
        start_record = get_agent_record_by_device_id(device_id)
        start_record_v2 = get_agent_record_by_device_id_v2(device_id)
        if start_record is not None:
            if start_record.address_map:
                Device.del_device_map(start_record.address_map)

            game = Game.query.get(start_record.game_id)
            agent_device = Device.query.get(device_id)

            # push start game command to device
            push_message_to_device(agent_device.device_name, game.data_file_names, 'clear')

            agent_record = AgentRecord()
            agent_record.start_id = start_record.id
            agent_record.game_id = game.id
            agent_record.user_id = start_record.user_id
            agent_record.device_id = device_id
            agent_record.server_id = start_record.server_id
            agent_record.type = RECORD_TYPE_END
            agent_record.record_time = datetime.now()
            agent_record.time_long = (agent_record.record_time - start_record.record_time).seconds
            agent_record.start_time = start_record.record_time

            agent_device.state = DEVICE_STATE_IDLE

            db.session.add(agent_device)
            db.session.add(agent_record)
            db.session.commit()

            # add device into queue
            Device.push_redis_set(agent_device.id)

            end_use_device(device_id, agent_record.time_long)

            # decrease user's allot device num
            User.redis_incr_ext_info(start_record.user_id, app.config['ALLOT_NUM_NAME'], -1)
            User.redis_incr_ext_info(start_record.user_id, app.config['ALLOT_NUM_LIMIT_NAME'], 1)
            flash("free device %s success." % device_id)
        elif start_record_v2 is not None:
            if start_record_v2.address_map:
                Device.del_device_map(start_record_v2.address_map)

            apk = Game.query.get(start_record_v2.apk_id)
            agent_device = Device.query.get(device_id)

            # push start game command to device
            push_message_to_device(agent_device.device_name, apk.data_file_names, 'clear')

            agent_record2 = AgentRecord2()
            agent_record2.start_id = start_record_v2.id
            agent_record2.apk_id = apk.id
            agent_record2.user_id = start_record_v2.user_id
            agent_record2.device_id = device_id
            agent_record2.type = RECORD_TYPE_END
            agent_record2.record_time = datetime.now()
            agent_record2.time_long = (agent_record2.record_time - start_record_v2.record_time).seconds
            agent_record2.start_time = start_record_v2.record_time

            agent_device.state = DEVICE_STATE_IDLE

            db.session.add(agent_device)
            db.session.add(agent_record2)
            db.session.commit()

            # add device into queue
            Device.push_redis_set(agent_device.id)

            end_use_device(device_id, agent_record2.time_long)

            # decrease user's allot device num
            User.redis_incr_ext_info(start_record_v2.user_id, app.config['ALLOT_NUM_NAME'], -1)
            User.redis_incr_ext_info(start_record_v2.user_id, app.config['ALLOT_NUM_LIMIT_NAME'], 1)
            flash("free device %s success." % device_id)
        else:
            raise ValidationError('already free')
    except Exception as e:
        db.session.rollback()
        flash("free device  %s fail. error: %s" % (device_id,  e.message))
    return redirect(url_for('device.device_list', page=page))
Exemple #4
0
def free_device():
    try:
        user_id = g.current_user.id
        game_id = request.json.get('game_id')
        device_id = request.json.get('device_id')
        record_id = request.json.get('record_id')

        if user_id is None or user_id == '':
            raise ValidationError('does not have a user id')
        if game_id is None or game_id == '':
            raise ValidationError('does not have a game id')
        if device_id is None or device_id == '':
            raise ValidationError('does not have a device id')
        if record_id is None or record_id == '':
            raise ValidationError('does not have a record id')
        game = Game.query.get(game_id)
        if not game:
            raise ValidationError('game does not exists, gameid: %r' % game_id)

        device = Device.query.filter_by(id=device_id).first()
        if not device:
            raise ValidationError('device does not exists, device_id: %r' % device_id)

        end_record = AgentRecord.query.filter_by(start_id=record_id).first()
        if end_record is not None or device.state == DEVICE_STATE_IDLE:
            raise ValidationError('%s already free' % device.device_name)

        start_agent_record = AgentRecord.query.filter_by(
            type=RECORD_TYPE_START,
            user_id=user_id,
            game_id=game_id,
            device_id=device_id,
            id=record_id).first()

        if start_agent_record is None:
            raise ValidationError('start record does not exists')

        # del map
        if start_agent_record.address_map:
            Device.del_device_map(start_agent_record.address_map)

        # push start game command to device
        try:
            if not app.config['DEBUG']:
                push_message_to_device(device.device_name, game.data_file_names, MSG_TYPE_CLEAR)
        except BaseException, e:
            pass
            # return jsonify(BaseApi.api_jpush_error())

        agent_rocord = AgentRecord()
        agent_rocord.start_id = record_id
        agent_rocord.game_id = game_id
        agent_rocord.user_id = user_id
        agent_rocord.device_id = device_id
        agent_rocord.type = RECORD_TYPE_END
        agent_rocord.record_time = datetime.now()
        agent_rocord.time_long = (agent_rocord.record_time - start_agent_record.record_time).seconds
        agent_rocord.start_time = start_agent_record.record_time

        device.state = DEVICE_STATE_IDLE

        db.session.add(device)
        db.session.add(agent_rocord)
        db.session.commit()

        # record some info into redis
        end_use_device(device_id, agent_rocord.time_long)

        # add device into queue
        Device.push_redis_set(device.id)

        ret = {
            "device_id": device_id,
            "device_name": device.device_name
        }

        # decrease user's allot device num
        User.redis_incr_ext_info(user_id, app.config['ALLOT_NUM_NAME'], -1)
        # increase user's allot device num limit
        User.redis_incr_ext_info(user_id, app.config['ALLOT_NUM_LIMIT_NAME'], 1)

        app.logger.error('free success user_id : %r, device_id: %r, record_id: %r' % (user_id, device_id, record_id))

        return jsonify(BaseApi.api_success(ret))