示例#1
0
def get_event(evt):
    event = Event.query.get(evt)
    log.info("Querying event")
    if event is None:
        return not_found()
    results = event_schema.dump(event)
    return jsonify({'event': results.data})
示例#2
0
def sell_basegood(bg):
    current_user = User.query.get(1)
    basegood = BaseGood.query.get(bg)
    pmap = current_user.season.pmap
    if basegood is None:
        return not_found()
    log.info("Selling {}".format(basegood.name))
    if basegood in current_user.inv_expanded():
        inv = Inventory.query.\
                            filter(Inventory.user_id == current_user.id).\
                            filter(Inventory.basegood_id == basegood.id).\
                            first()
        Inventory.query.filter_by(id=inv.id).delete()
        # .delete() is designed to bulk delete
        # .limit() does not work
        # .first() does not work
        # how to savely delete only one item? this is bad..
        try:
            current_user.balance += basegood.price
            if pmap:
                corresp_map_object = [map_o for map_o in pmap if map_o.basegood.name == basegood.name][0]
            corresp_map_object.ammount += 1
            results = basegood_schema.dump(basegood)
            db_session.commit()
            corresponding_map_object = [ x for x in pmap if x.id == bg ][0]
            new_price = calculations.new_price_test1(corresponding_map_object.initial_ammount, corresponding_map_object.ammount, basegood.initprice)
            basegood.price = new_price
            calculate_new_prod_price(basegood.producable)
            db_session.commit()
            return jsonify({'message': 'sold',
                            'basegood': results.data})
        except:
            return service_unavailable()
    else:
        return not_in_inv()
示例#3
0
def get_technology(tcn):
    tech = Technology.query.get(tcn)
    log.info("Querying technology")
    if tech is None:
        return not_found()
    results = technology_schema.dump(tech)
    return jsonify({'technology': results.data})
示例#4
0
def get_basegood(bg):
    log.info("Querying basegood")
    basegood = BaseGood.query.get(bg)
    if basegood is None:
        return not_found()
    basegood_result = basegood_schema.dump(basegood)
    return jsonify({'basegood': basegood_result.data})
示例#5
0
def get_buildqueue(usr):
    current_user = User.query.get(usr)
    if current_user is None:
        return not_found(basegood_idbasegood_id  )
    log.info("Querying buildqueue for user {}".format(current_user.name))
    results = buildqueue_schema.dump(current_user.buildqueue)
    return jsonify({'buildqueue': results.data})
示例#6
0
def get_effect(efc):
    effect = Effect.query.get(efc)
    log.info("Querying effect")
    if effect is None:
        return not_found()
    results = effect_schema.dump(effect)
    return jsonify({'effect': results.data})
示例#7
0
def get_user(usr):
    user = User.query.get(usr)
    log.info("Querying user")
    if user is None:
        return not_found()
    results = user_schema.dump(user)
    return jsonify({'user': results.data})
示例#8
0
def get_producable(pr):
    producable = Producable.query.get(pr)
    if producable is None:
        return not_found()
    else:
        log.info("Querying producable")
        result = producable_schema.dump(producable)
        return jsonify({'producable': result.data})
示例#9
0
def get_inventory(usr):
    current_user = User.query.get(usr)
    if current_user is None:
        return not_found()
    log.info("Querying inventory for user {}".format(current_user.name))
    results = inventory_schema.dump(current_user.inventory)
    
    return jsonify({'inventory': results.data})
示例#10
0
def get_capabilities(bg):
    basegood = BaseGood.query.get(bg)
    if basegood is None:
        return not_found()
    else:
        log.info("Querying capabilities for basegood {}".format(basegood.name))
        result = capabilities_schema.dump(basegood)
        return jsonify({'basegood': result.data})
示例#11
0
def get_inventory_for_basegood(usr, bg):
    current_user = User.query.get(usr)
    bg = BaseGood.query.get(bg)
    if current_user is None or bg is None:
        return not_found()
    log.info("Querying inventory for user {} and basegood {}".format(current_user.name, bg.name))
    inv = Inventory.query.\
                filter(Inventory.user_id == current_user.id).\
                filter(Inventory.basegood_id == bg.id).all()
    return jsonify({'basegood': basegood_schema.dump(bg), 'ammount': len(inv)})
示例#12
0
def get_inventory_for_producable(usr, pr):
    pr = Producable.query.get(pr)
    current_user = User.query.get(usr)
    if current_user is None or pr is None:
        return not_found()
    log.info("Querying inventory for user {} and producable {}".format(current_user.name, pr.name))
    inv = Inventory.query.\
                filter(Inventory.user_id == current_user.id).\
                filter(Inventory.producable_id == pr.id).all()
    return jsonify({'producable': producable_schema.dump(pr), 'ammount': len(inv)})
示例#13
0
def get_blueprint(pr):
    producable = Producable.query.get(pr)
    if producable is None:
        return not_found()
    else:
        log.info("Querying blueprint for producable {}".format(producable.name))
        result = producable.blueprint_dict()
        ret = {} 
        ret_arr = []
        for key, value in result.items():
            ret_arr.append({'basegood': basegood_schema.dump(key).data, 'ammount': value})
        return jsonify(ret_arr)
示例#14
0
def sell_producable(pr):
    current_user = User.query.get(1)
    producable = Producable.query.get(pr)
    if producable is None:
        return not_found()
    if producable in current_user.inv_expanded():
        log.info("Selling {}".format(producable.name))
        inv = Inventory.query.\
                            filter(Inventory.user_id == current_user.id).\
                            filter(Inventory.producable_id == producable.id).\
                            first()
        Inventory.query.filter_by(id=inv.id).delete()
        try:
            db_session.commit()
            current_user.balance += producable.price
            results = producable_schema.dump(producable)
            return jsonify({'message': 'sold',
                            'producable': results.data})
        except:
            return service_unavailable()
    else:
        return not_in_inv()
示例#15
0
def trigger_build(pr):
    current_user = User.query.get(1)
    producable = Producable.query.get(pr)
    if producable is None:
        return not_found()
    log.info("Triggering build for {}".format(producable.name))
    inv = current_user.inv_expanded()
    for basegood in producable.blueprint():
        if basegood in inv:
            # dont know if thats the best option ?
            # just count the respective len and ask the DB
            inv.remove(basegood)
        else:
            return insufficient_funds()
    for basegood in producable.blueprint():
        # .delete() is designed to bulk delete
        # .limit() does not work
        # .first() does not work
        # how to savely delete only one item? this is bad..
        inv = Inventory.query.\
                             filter(Inventory.user_id == current_user.id).\
                             filter(Inventory.basegood_id == basegood.id).\
                             first()
        Inventory.query.filter_by(id=inv.id).delete()
    try:
        build_queue = BuildQueue(user_id=current_user.id,
                                 producable_id=producable.id,
                                 time_start=datetime.datetime.utcnow(),
                                 time_done=datetime.datetime.utcnow() +
                                 datetime.timedelta(minutes=producable.time),
                                 active=False,
                                 processed=False)
        db_session.add(build_queue)
        db_session.commit()
        result = producable_schema.dump(producable)
        return jsonify({'message': 'production initialized',
                        'producable': result.data})
    except:
        return service_unavailable()
示例#16
0
def buy_producable(pr):
    current_user = User.query.get(1)
    producable = Producable.query.get(pr)
    if producable is None:
        return not_found()
    log.info("Buying {}".format(producable.name))
    # TODO: Only allow to buy from a CPU.
    # CPU has it's own inventory
    if current_user.has_enough_money_for(producable):
        inv = Inventory(user_id=current_user.id,
                        basegood_id=None,
                        producable_id=producable.id)
        current_user.inventory.append(inv)
        try:
            current_user.balance -= producable.price
            db_session.commit()
            results = producable_schema.dump(producable)
            return jsonify({'message': 'bought',
                            'producable': results.data})
        except:
            return service_unavailable()
    else:
        return insufficient_funds()
示例#17
0
def buy_basegood(bg):
    current_user = User.query.get(1)
    basegood = BaseGood.query.get(bg)
    if basegood is None:
        return not_found()
    log.info("Buying {}".format(basegood.name))
    pmap = current_user.season.pmap
    # Find the map object that has pmap.basegood.name => basegood.name
    if pmap:
        corresp_map_object = [map_o for map_o in pmap if map_o.basegood.name == basegood.name][0]
        if current_user.has_enough_money_for(basegood):
            # and if basegood is still available -> check map_resoources
            # Change when bulk buys are implemented
            if corresp_map_object.ammount < 1:
                return resource_exceeded()
            corresp_map_object.ammount -= 1
            inv = Inventory(user_id=current_user.id,
                            basegood_id=basegood.id,
                            producable_id=None)
            current_user.inventory.append(inv)
            current_user.balance -= basegood.price
            try:
                db_session.commit()
                results = basegood_schema.dump(basegood)
                corresponding_map_object = [ x for x in pmap if x.id == bg ][0]
                new_price = calculations.new_price_test1(corresponding_map_object.initial_ammount, corresponding_map_object.ammount, basegood.initprice)
                basegood.price = new_price
                db_session.commit()
                calculate_new_prod_price(basegood.producable)
                return jsonify({'message': 'bought',
                                'basegood': results.data})
            except:
                return service_unavailable()
        else:
            return insufficient_funds()
    else:
            return resource_exceeded()
示例#18
0
def process_buildqueue():
    while (1):
        prs = Producable.query.all()
        for pr in prs:
            log.debug("Checking buildqueue for {}".format(pr.name))
            queue = BuildQueue.query.filter(BuildQueue.active == True).filter(
                BuildQueue.producable_id == pr.id)
            itm = queue.first()
            if not itm:
                # add a 'done' callback that compares time_done and datetime.now
                log.info(
                    "Getting BuildQueue items with criteria: Not active, Not Processed"
                )
                all_possible_new = BuildQueue.query.filter(
                    BuildQueue.active == False).filter(
                        BuildQueue.processed == False).filter(
                            BuildQueue.producable_id == pr.id)
                if len(
                        all_possible_new.filter(BuildQueue.time_done > datetime
                                                .datetime.now()).all()) > 0:
                    log.info(
                        "Found items that have not been processed although they are done."
                    )
                    log.info("Do something")
                apn = all_possible_new.all()
                if len(apn) >= 1:
                    apn[0].active = True
                    db_session.commit()
                    log.info("Setting item {} to active".format(apn[0].id))
                else:
                    log.info("No items in buildqueue for Producable {}".format(
                        pr.name))
            if itm:
                log.info("#{} has an active flag".format(itm.id))
                now = datetime.datetime.now()
                if itm.time_done <= now:
                    inv = Inventory(basegood_id=None,
                                    producable_id=itm.producable_id,
                                    user_id=itm.user_id)
                    prod_name = Producable.query.get(itm.producable_id).name
                    user_name = User.query.get(itm.user_id).name
                    log.info("{} finished building.".format(prod_name))
                    log.info("Adding {} to {}'s inventory".format(
                        prod_name, user_name))
                    itm.active = False
                    itm.processed = True
                    log.info("Marking #{} as processed and Non-active".format(
                        itm.id))
                    db_session.add(inv)
                    db_session.commit()
                else:
                    d1_ts = time.mktime(now.timetuple())
                    d2_ts = time.mktime(itm.time_done.timetuple())
                    minutes_left = int(d2_ts - d1_ts) / 60
                    log.info(
                        "#{} is not ready yet. Takes {} minutes more.".format(
                            itm.id, minutes_left))
            time.sleep(3)
示例#19
0
def get_events():
    log.info("Querying events")
    events = Event.query.all()
    results = events_schema.dump(events)
    return jsonify({'events': results.data})
示例#20
0
def get_effects():
    log.info("Querying effects")
    effects = Effect.query.all()
    results = effects_schema.dump(effects)
    return jsonify({'effects': results.data})
示例#21
0
def get_technologies():
    log.info("Querying technolgies")
    technologies = Technology.query.all()
    results = technologies_schema.dump(technologies)
    return jsonify({'techonologies': results.data})
示例#22
0
def get_basegoods():
    log.info("Querying basegoods")
    basegoods = BaseGood.query.all()
    results = basegoods_schema.dump(basegoods)
    return jsonify({'basegoods': results.data})
示例#23
0
def get_producables():
    log.info("Querying producables")
    producables = Producable.query.all()
    results = producables_schema.dump(producables)
    return jsonify({'producables': results.data})