コード例 #1
0
ファイル: stats_api.py プロジェクト: pythexcel/ethermon
def get_best_player_rkt(request, data):
	page_id = data['page_id']
	page_size = data['page_size']
	start_index = (page_id - 1) * page_size
	to_index = page_id * page_size

	total_record = ema_player_manager.count_total_rank()
	player_records = ema_player_manager.get_rank_data_list_rkt(start_index, to_index)

	response_data = []
	for player_record in player_records:
		monster_ids = [player_record.a0, player_record.a1, player_record.a2, player_record.s0, player_record.s1, player_record.s2]
		monster_info = [get_mon_info(mon_id) for mon_id in monster_ids]

		response_data.append({
			"username": user_manager.get_user_name(player_record.trainer),
			"address": player_record.trainer,
			"point": player_record.point,
			"monster_info": monster_info,
			"total_win": player_record.total_win,
			"total_lose": player_record.total_lose,
			"total_match": player_record.total_win + player_record.total_lose
		})

	return api_response_result(request, ResultCode.SUCCESS, {"best_players": response_data, "total_record": total_record})
コード例 #2
0
ファイル: stats_api.py プロジェクト: pythexcel/ethermon
		def update_player(player_id, new_point, ts):
			if player_id not in player_info:
				player_data = ema_player_manager.get_player_rank_by_id(player_id)
				if not player_data:
					return

				address = player_data.trainer
				name = user_manager.get_user_name(address)
				player_info[player_id] = {
					"name": name,
					"address": address,
					"point": -1,
					"rank": 0,
					"rank_info": {},
					"last_update": start_time,
				}

			old_point = player_info[player_id]["point"]
			player_info[player_id]["point"] = new_point

			if old_point >= 0:
				for i in range(len(points)):
					if points[i] == old_point:
						pos = i
						break
				# pos must exist
				points[pos] = new_point
			else:
				points.append(new_point)
				pos = len(points)-1

			cc = 0

			for i in range(pos, len(points)-1, 1):
				if points[i] <= points[i+1]:
					points[i], points[i+1] = points[i+1], points[i]
					cc += 1
				else:
					break

			for i in range(pos, 0, -1):
				if points[i] >= points[i-1]:
					points[i], points[i-1] = points[i-1], points[i]
					cc += 1
				else:
					break
			for pid, info in player_info.items():
				if (info["point"] - new_point) * (info["point"] - old_point) <= 0:
					new_rank = cal_rank(points, info["point"])
					new_update = max(info["last_update"], ts)

					old_rank = info["rank"]
					last_update = info["last_update"]
					if old_rank <= 10:
						info["rank_info"][old_rank] = info["rank_info"].get(old_rank, 0) + new_update - last_update

					info["rank"] = new_rank
					info["last_update"] = new_update
コード例 #3
0
def get_my_monster(request, data):
    # verify information
    # if not Web3.isAddress(data["trainer_address"]):
    # 	log.warn("send_to_address_invalid|data=%s", data)
    # 	return api_response_result(request, ResultCode.ERROR_PARAMS, {"error_message": "invald_send_to_address"})

    try:
        data["trainer_address"] = data["trainer_address"].lower()
        metamask_flag = data.get("metamask_flag", MetamaskFlag.DISABLE)
        response_data = {
            "username":
            user_manager.get_user_name(data["trainer_address"]),
            "total_emont":
            0,
            "total_eth":
            0,
            "total_monster":
            0,
            "total_monster_class":
            0,
            "total_monster_sold":
            0,
            "total_lending":
            0,
            "total_renting":
            0,
            "total_selling":
            0,
            "total_adventure_item":
            ema_adventure_manager.count_adventure_items(
                data["trainer_address"]),
            "current_balance":
            0,
            "hatching_egg": {},
            "monsters": {},
        }
        if metamask_flag == MetamaskFlag.DISABLE:
            infura_client = get_general_infura_client()
            emont_contract = infura_client.getEmontContract()
            world_contract = infura_client.getWorldContract()

            total_emont = emont_contract.call().balanceOf(
                data['trainer_address'])
            total_emont = (total_emont * 1.0) / 10**8
            response_data["total_emont"] = total_emont
            response_data["current_balance"] = world_contract.call(
            ).getTrainerBalance(data['trainer_address'])

            total_eth = infura_client.getCurrentEthBalance(
                data['trainer_address'])
            response_data["total_eth"] = (total_eth * 1.0) / 10**18

        # Egg
        hatching_egg = ema_egg_manager.get_hatching_egg(
            data['trainer_address'])
        if hatching_egg:
            response_data["hatching_egg"] = {
                "egg_id": hatching_egg.egg_id,
                "class_id": hatching_egg.class_id,
                "hatch_time": hatching_egg.hatch_time
            }

        on_chain_mons = list(
            ema_monster_manager.get_monster_data_by_trainer(
                data['trainer_address']))
        off_chain_mons = list(
            ema_monster_manager.get_offchain_mons(
                player_address=data['trainer_address']))
        monster_data_records = on_chain_mons + off_chain_mons
        response_data["total_monster"] = len(monster_data_records)
        monster_class_set = set()

        if response_data["total_monster"] > 0:
            for monster_record in monster_data_records:
                monster_id = -monster_record.id if not hasattr(
                    monster_record,
                    'monster_id') else monster_record.monster_id
                name = monster_record.name
                class_id = monster_record.class_id
                monster_class_set.add(class_id)
                exp = monster_record.exp
                create_index = 0 if not hasattr(
                    monster_record,
                    'create_index') else monster_record.create_index
                create_time = monster_record.create_time
                base_stats = [
                    monster_record.b0, monster_record.b1, monster_record.b2,
                    monster_record.b3, monster_record.b4, monster_record.b5
                ]
                stats, bp, level = get_stats(class_id, exp, base_stats)

                monster_market = ema_market_manager.get_monster_market(
                    monster_id)
                is_approvable = not monster_market

                monster_status = EmaMonsterStatus.Normal
                trading = {
                    "lending_price": 0,
                    "selling_price": 0,
                    "release_time": 0
                }
                if monster_market:
                    if monster_market.type == EmaMarketType.SELL:
                        trading["selling_price"] = float(
                            monster_market.price
                        ) * MARKET_PRICE_DIVISION / 10**18
                        monster_status = EmaMonsterStatus.Selling
                        response_data["total_selling"] += 1
                    else:
                        trading["lending_price"] = float(
                            monster_market.price
                        ) / MARKET_PRICE_DIVISION / 10**18
                        extra_data = json.loads(monster_market.extra_data)
                        trading["release_time"] = extra_data.get(
                            "release_time", 0)
                        if monster_market.status == EmaMarketStatus.LENT:
                            monster_status = EmaMonsterStatus.Renting
                            response_data["total_renting"] += 1
                        else:
                            monster_status = EmaMonsterStatus.Lending
                            response_data["total_lending"] += 1

                pending_exp = ema_monster_manager.get_pending_exp(monster_id)
                if pending_exp is None:
                    pending_exp = 0
                else:
                    pending_exp = pending_exp.adding_exp

                total_stats, total_bp, total_level = get_stats(
                    class_id, exp + pending_exp, base_stats)

                perfect_stats, perfect_rate = get_perfection(
                    base_stats, class_id)

                monster_data = {
                    "monster_id":
                    monster_id,
                    "class_id":
                    class_id,
                    "class_name":
                    get_class_name(class_id, data["_client_language"]),
                    "exp":
                    exp,
                    "pending_exp":
                    pending_exp,
                    "total_level":
                    total_level,
                    "level":
                    level,
                    "next_level_exp":
                    get_next_level_exp(level),
                    "bp":
                    bp,
                    "total_bp":
                    total_bp,
                    "battle_stats":
                    stats,
                    "total_battle_stats":
                    total_stats,
                    "create_index":
                    create_index,
                    "create_time":
                    create_time,
                    "user_defined_name":
                    name,
                    "status":
                    monster_status,
                    "egg_bonus":
                    0 if not hasattr(monster_record, 'egg_bonus') else
                    monster_record.egg_bonus,
                    "trading":
                    trading,
                    "approvable":
                    is_approvable,
                    "perfect_stats":
                    perfect_stats,
                    "perfect_rate":
                    perfect_rate
                }

                response_data["monsters"][monster_id] = monster_data
            response_data["total_monster_class"] = len(monster_class_set)

        # Lunar Event
        # current_ts = get_timestamp()
        # if LUNAR_19_START_TIME <= current_ts <= LUNAR_19_END_TIME:
        # 	response_data["event_data"] = {
        # 		"bonus_eggs_left": max(0, 888 - EtheremonDB.EmaEggDataTab.objects.filter(mother_id=0).filter(
        # 			create_time__gte=LUNAR_19_START_TIME).filter(create_time__lte=LUNAR_19_END_TIME).count()),
        # 		"player_purchases": max(0, EtheremonDB.EmaEggDataTab.objects.filter(mother_id=0).filter(
        # 			trainer=data["trainer_address"]).filter(create_time__gte=LUNAR_19_START_TIME).filter(
        # 			create_time__lte=LUNAR_19_END_TIME).count())
        # 	}

        return api_response_result(request, ResultCode.SUCCESS, response_data)
    except Exception as ex:
        logging.exception("get_trainer_balance_fail|data=%s", data)
        return api_response_result(request, ResultCode.ERROR_SERVER,
                                   {"error_message": ex.message})
コード例 #4
0
def start_battle(attacker_id,
                 attacker_address,
                 attacker_monster_ids,
                 defender_id,
                 defender_address,
                 defender_monster_ids,
                 battle_type,
                 add_mon_exp=True):
    attacker_monsters = [
        get_mon_info(mon_id) for mon_id in attacker_monster_ids
    ]
    defender_monsters = [
        get_mon_info(mon_id) for mon_id in defender_monster_ids
    ]

    # generate random number
    random_factors = [
        random.randint(0, MAX_RANDOM_ROUND + 2),
        random.randint(0, MAX_RANDOM_ROUND + 2),
        random.randint(0, MAX_RANDOM_ROUND + 2)
    ]
    monster_data = {
        "attacker_monsters": attacker_monsters,
        "defender_monsters": defender_monsters,
        "random_factors": random_factors
    }
    monster_data_str = to_json(monster_data)
    result, battle_details = get_battle_details(defender_monsters,
                                                attacker_monsters,
                                                random_factors, True)

    monster_exp_list = [(attacker_monsters[0]["monster_id"],
                         battle_details[0]["attacker_exp_gain"]),
                        (attacker_monsters[1]["monster_id"],
                         battle_details[1]["attacker_exp_gain"]),
                        (attacker_monsters[2]["monster_id"],
                         battle_details[2]["attacker_exp_gain"]),
                        (defender_monsters[0]["monster_id"],
                         battle_details[0]["castle_exp_gain"]),
                        (defender_monsters[1]["monster_id"],
                         battle_details[1]["castle_exp_gain"]),
                        (defender_monsters[2]["monster_id"],
                         battle_details[2]["castle_exp_gain"])]
    monster_exp_list.sort()

    # make db transaction to
    # 1. update monster exp
    # 2. add battle details
    current_ts = get_timestamp()
    with transaction.atomic():
        # add exp
        if add_mon_exp:
            for (monster_id, exp_gain) in monster_exp_list:
                ema_monster_manager.add_exp(monster_id, exp_gain)

        # add battle record
        battle_record = EtheremonDB.BattleMatchTab(
            attacker_id=attacker_id,
            attacker_address=attacker_address,
            defender_id=defender_id,
            defender_address=defender_address,
            battle_type=battle_type,
            monster_data=monster_data_str,
            before_battle_data="",
            result=result,
            after_battle_data="",
            status=0,
            extra="",
            create_time=current_ts,
            update_time=current_ts)
        battle_record.save()

        # add exp
        if add_mon_exp:
            for (monster_id, exp_gain) in monster_exp_list:
                ema_monster_manager.calculate_ema_monster_exp(monster_id)

    return {
        "battle_id":
        battle_record.id,
        "attacker_id":
        attacker_id,
        "attacker_address":
        attacker_address,
        "attacker_username":
        user_manager.get_user_name(attacker_address),
        "attacker_monsters":
        attacker_monsters,
        "defender_id":
        defender_id,
        "defender_address":
        defender_address,
        "defender_username":
        user_manager.get_user_name_with_cache(defender_address),
        "defender_monsters":
        defender_monsters,
        "random_factors":
        random_factors,
        "details":
        battle_details,
        "result":
        result,
    }
コード例 #5
0
def get_data(request, data):

    monster_ids = data["monster_ids"]
    response_data = {}

    for monster_id in monster_ids:
        if monster_id > 0:
            monster_data = ema_monster_manager.get_monster_data(monster_id)
        else:
            monster_data = ema_monster_manager.get_offchain_mon_by_id(
                -monster_id)

        if not monster_data:
            continue

        pending_exp = ema_monster_manager.get_pending_exp(monster_id)
        pending_exp = 0 if pending_exp is None else pending_exp.adding_exp

        pending_exp_record = get_pending_exp_claim(monster_id)
        pending_exp_txn = 0 if pending_exp_record is None else pending_exp_record.exp

        base_stats = [
            monster_data.b0, monster_data.b1, monster_data.b2, monster_data.b3,
            monster_data.b4, monster_data.b5
        ]

        # On-chain stats
        stats, bp, level = get_stats(
            monster_data.class_id,
            monster_data.exp,
            base_stats,
        )

        # On-chain + Off-chain stats
        total_stats, total_bp, total_level = get_stats(
            monster_data.class_id,
            monster_data.exp + pending_exp,
            base_stats,
        )

        # Perfect Stats
        perfect_stats, perfect_rate = get_perfection(base_stats,
                                                     monster_data.class_id)

        owner = monster_data.trainer

        # Market data
        monster_market = ema_market_manager.get_monster_market(monster_id)
        is_approvable = not monster_market

        monster_status = EmaMonsterStatus.Normal
        trading = {
            "lending_price": 0,
            "selling_price": 0,
            "release_time": 0,
            "borrower": "",
            "borrower_name": ""
        }
        if monster_market:
            if monster_market.type == EmaMarketType.SELL:
                trading["selling_price"] = round(
                    float(monster_market.price) * MARKET_PRICE_DIVISION /
                    ETH_UNIT, 6)
                monster_status = EmaMonsterStatus.Selling
            else:
                owner = monster_market.player
                trading["lending_price"] = round(
                    float(monster_market.price) * MARKET_PRICE_DIVISION /
                    ETH_UNIT, 6)
                extra_data = json.loads(monster_market.extra_data)
                trading["release_time"] = extra_data.get("release_time", 0)
                trading["borrower"] = extra_data.get("borrower", "")
                trading["borrower_name"] = user_manager.get_user_name(
                    trading["borrower"])

                if monster_market.status == EmaMarketStatus.LENT:
                    monster_status = EmaMonsterStatus.Renting
                else:
                    monster_status = EmaMonsterStatus.Lending

        mon_history = ema_market_manager.get_trading_history(monster_id)
        trading_history = []
        for e in mon_history:
            if e.is_sold == 1:
                trading_history.append({
                    "class_id":
                    e.class_id,
                    "seller":
                    e.seller,
                    "seller_name":
                    user_manager.get_user_name(e.seller),
                    "buyer":
                    e.buyer,
                    "buyer_name":
                    user_manager.get_user_name(e.buyer),
                    "price":
                    round(
                        float(e.price) * MARKET_PRICE_DIVISION / ETH_UNIT, 8),
                    "timestamp":
                    e.buy_time,
                    "txn":
                    e.txn_hash
                })
        type_data = _MONSTER_CLASS_STATS.get(
            monster_data.class_id).get("types") if _MONSTER_CLASS_STATS.get(
                monster_data.class_id) is not None else 0
        types = []
        monster_dat = en.i18n.I18N['en']
        for ty_data in type_data:
            types.append(monster_dat.get("monster.type." + str(ty_data)))

        response_data[monster_id] = {
            "monster_id":
            monster_id,
            "class_id":
            monster_data.class_id,
            "name":
            monster_data.name,
            "owner":
            owner,
            "owner_name":
            user_manager.get_user_name(owner),
            "exp":
            monster_data.exp,
            "pending_exp":
            pending_exp,
            "pending_exp_txn":
            pending_exp_txn,
            "description":
            Description.get("monster.desc." + str(monster_data.class_id)),
            "types":
            types,
            "trading_history":
            trading_history,
            "level":
            level,
            "total_level":
            total_level,
            "next_level_exp":
            get_next_level_exp(level),
            "bp":
            bp,
            "total_bp":
            total_bp,
            "battle_stats":
            stats,
            "total_battle_stats":
            total_stats,
            "status":
            monster_status,
            "trading":
            trading,
            "egg_bonus":
            0 if not hasattr(monster_data, 'egg_bonus') else
            monster_data.egg_bonus,
            "create_index":
            0 if not hasattr(monster_data, 'create_index') else
            monster_data.create_index,
            "create_time":
            monster_data.create_time,
            "perfect_stats":
            perfect_stats,
            "perfect_rate":
            perfect_rate,
            "burn_reward":
            burn_manager.get_reward_from_level(level, monster_data.class_id),

            # public api
            "class_name":
            get_class_name(monster_data.class_id, data["_client_language"]),
            "user_defined_name":
            monster_data.name,
            "image":
            get_class_image_url(monster_data.class_id),
            "3d_model":
            get_gltf(monster_data.class_id),
            "approvable":
            is_approvable
        }
    return api_response_result(request, ResultCode.SUCCESS, response_data)
コード例 #6
0
def get_metadata(request, data):

    monster_ids = data["monster_ids"]
    response_data = {}

    for monster_id in monster_ids:
        if monster_id > 0:
            monster_data = ema_monster_manager.get_monster_data(monster_id)
        else:
            monster_data = ema_monster_manager.get_offchain_mon_by_id(
                -monster_id)

        if monster_id > 0:
            monster_dcl_data = ema_monster_manager.get_monster_dcl_data(
                monster_id)

        if not monster_data:
            continue

        pending_exp = ema_monster_manager.get_pending_exp(monster_id)
        pending_exp = 0 if pending_exp is None else pending_exp.adding_exp

        pending_exp_record = get_pending_exp_claim(monster_id)
        pending_exp_txn = 0 if pending_exp_record is None else pending_exp_record.exp

        base_stats = [
            monster_data.b0, monster_data.b1, monster_data.b2, monster_data.b3,
            monster_data.b4, monster_data.b5
        ]

        # On-chain stats
        stats, bp, level = get_stats(
            monster_data.class_id,
            monster_data.exp,
            base_stats,
        )
        if monster_dcl_data is not None:
            dcl_level = get_level(monster_dcl_data.dxp)
        else:
            dcl_level = 0
        # On-chain + Off-chain stats
        total_stats, total_bp, total_level = get_stats(
            monster_data.class_id,
            monster_data.exp + pending_exp,
            base_stats,
        )

        # Perfect Stats
        perfect_stats, perfect_rate = get_perfection(base_stats,
                                                     monster_data.class_id)

        owner = monster_data.trainer

        # Market data
        monster_market = ema_market_manager.get_monster_market(monster_id)
        is_approvable = not monster_market

        monster_status = EmaMonsterStatus.Normal
        trading = {
            "lending_price": 0,
            "selling_price": 0,
            "release_time": 0,
            "borrower": "",
            "borrower_name": ""
        }
        if monster_market:
            if monster_market.type == EmaMarketType.SELL:
                trading["selling_price"] = round(
                    float(monster_market.price) * MARKET_PRICE_DIVISION /
                    ETH_UNIT, 6)
                monster_status = EmaMonsterStatus.Selling
            else:
                owner = monster_market.player
                trading["lending_price"] = round(
                    float(monster_market.price) * MARKET_PRICE_DIVISION /
                    ETH_UNIT, 6)
                extra_data = json.loads(monster_market.extra_data)
                trading["release_time"] = extra_data.get("release_time", 0)
                trading["borrower"] = extra_data.get("borrower", "")
                trading["borrower_name"] = user_manager.get_user_name(
                    trading["borrower"])

                if monster_market.status == EmaMarketStatus.LENT:
                    monster_status = EmaMonsterStatus.Renting
                else:
                    monster_status = EmaMonsterStatus.Lending

        mon_history = ema_market_manager.get_trading_history(monster_id)
        trading_history = []
        for e in mon_history:
            if e.is_sold == 1:
                trading_history.append({
                    "class_id":
                    e.class_id,
                    "seller":
                    e.seller,
                    "seller_name":
                    user_manager.get_user_name(e.seller),
                    "buyer":
                    e.buyer,
                    "buyer_name":
                    user_manager.get_user_name(e.buyer),
                    "price":
                    round(
                        float(e.price) * MARKET_PRICE_DIVISION / ETH_UNIT, 8),
                    "timestamp":
                    e.buy_time,
                    "txn":
                    e.txn_hash
                })
        create_index = 0 if not hasattr(
            monster_data, 'create_index') else monster_data.create_index
        if int(create_index) == 1:
            create_index_value = "Gold"
        elif int(create_index) == 2:
            create_index_value = "Silver"
        elif int(create_index) == 3:
            create_index_value = "Bronze"
        else:
            create_index_value = "-"
        traits = [{
            "trait_type":
            "Class Name",
            "value":
            get_class_name(monster_data.class_id, data["_client_language"])
        }, {
            "trait_type": "Badge",
            "value": create_index_value
        }, {
            "trait_type":
            "Mon_Artist",
            "value":
            credit_data.get(monster_data.class_id).get("credit")
            if credit_data.get(monster_data.class_id) is not None else None
        }, {
            "trait_type": "OnChain_EXP",
            "value": monster_data.exp
        }, {
            "trait_type": "Offchain_EXP",
            "value": pending_exp
        }, {
            "trait_type": "OnChain_Level",
            "value": level
        }, {
            "trait_type": "OffChain_Level",
            "value": total_level
        }, {
            "trait_type": "OffChain_BP",
            "value": total_bp
        }, {
            "trait_type": "OnChain_BP",
            "value": bp
        }, {
            "trait_type": "Hit Point HP",
            "value": total_stats[0]
        }, {
            "trait_type": "Primary ATK",
            "value": total_stats[1]
        }, {
            "trait_type": "Primary DEF",
            "value": total_stats[2]
        }, {
            "trait_type": "Secondary ATK",
            "value": total_stats[3]
        }, {
            "trait_type": "Secondary DEF",
            "value": total_stats[4]
        }, {
            "trait_type": "Speed SPD",
            "value": total_stats[5]
        }, {
            "trait_type": "DCL level",
            "value": dcl_level
        }, {
            "trait_type":
            "DXP",
            "value":
            monster_dcl_data.dxp if monster_dcl_data is not None else 0
        }, {
            "display_type":
            "number",
            "trait_type":
            "Catch_Number",
            "value":
            0 if not hasattr(monster_data, 'create_index') else
            monster_data.create_index
        }, {
            "display_type":
            "boost_number",
            "trait_type":
            "Egg_Bonus",
            "value":
            0 if not hasattr(monster_data, 'egg_bonus') else
            monster_data.egg_bonus
        }, {
            "display_type": "boost_percentage",
            "trait_type": "Perfection",
            "value": perfect_rate
        }]

        response_data = {
            "name":
            monster_data.name,
            "image":
            get_class_image_url(monster_data.class_id),
            "external_url":
            "https://ethermon.io/mons-info/" + str(monster_id),
            "description":
            Description.get("monster.desc." + str(monster_data.class_id)),
            "attributes":
            traits,

            #"monster_id": monster_id,
            #"class_id": monster_data.class_id,
            #"owner": owner,
            #"owner_name": user_manager.get_user_name(owner),
            #"create_time": monster_data.create_time,
            #"user_defined_name": monster_data.name,
            #"approvable": is_approvable
            #"exp": monster_data.exp,
            #"pending_exp": pending_exp,
            #notused"pending_exp_txn": pending_exp_txn,

            #notused"trading_history": trading_history,

            #"level": level,
            #"total_level": total_level,
            #notused"next_level_exp": get_next_level_exp(level),
            #"bp": bp,
            #"total_bp": total_bp,
            #notused"battle_stats": stats,
            #"total_battle_stats": total_stats,

            #notused"status": monster_status,
            #notused"trading": trading,

            #"egg_bonus": 0 if not hasattr(monster_data, 'egg_bonus') else monster_data.egg_bonus,
            #"create_index": 0 if not hasattr(monster_data, 'create_index') else monster_data.create_index,

            #notused"perfect_stats": perfect_stats,
            #"perfect_rate": perfect_rate,

            #notused"burn_reward": burn_manager.get_reward_from_level(level, monster_data.class_id),

            # public api
            #"class_name": get_class_name(monster_data.class_id, data["_client_language"]),
            #"user_defined_name": monster_data.name,
            #notused"3d_model": get_gltf(monster_data.class_id),
            #"approvable": is_approvable
        }
    return api_response_result(request, ResultCode.SUCCESS, response_data)