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))
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))
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))
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))