def update_daily_energy_claim(quest, current_ts): energy_record = ema_energy_manager.get_energy_by_trainer( quest.player_address) if not energy_record: return 0 return int( energy_record and get_start_time_of_the_day(current_ts) <= energy_record.last_claim_time <= get_end_time_of_the_day(current_ts))
def update_practice_played(quest, current_ts): quest_info = QUEST_LIST[quest.quest_id] if quest.quest_type == QuestTypes.DAILY or quest_info.get( "is_daily", False): return ema_battle_manager.count_practice_battles_by_time( quest.player_address, get_start_time_of_the_day(current_ts), get_end_time_of_the_day(current_ts)) else: if len(quest_info["quest_target"]) >= 2: prev_res = ema_battle_manager.count_practice_battles_by_time( quest.player_address, 0, QUEST_SYSTEM_START_TIME) curr_res = ema_battle_manager.count_practice_battles_by_time( quest.player_address, QUEST_SYSTEM_START_TIME + 1, current_ts) return min( prev_res, quest_info["quest_target"][0] + quest_info["quest_target"][1]) + curr_res else: return ema_battle_manager.count_practice_battles( quest.player_address)
def update_consecutive_rank_won(quest, current_ts): player_bid = ema_player_manager.get_player_bid_by_address( quest.player_address) quest_info = QUEST_LIST[quest.quest_id] if quest.quest_type == QuestTypes.DAILY or quest_info.get( "is_daily", False): matches = ema_battle_manager.get_rank_attack_battles_by_time( player_bid, get_start_time_of_the_day(current_ts), get_end_time_of_the_day(current_ts)) else: matches = ema_battle_manager.get_rank_attack_battles(player_bid) win_streak = 0 longest_streak = 0 for match in matches: if match.result == BattleResult.ATTACKER_WIN: win_streak += 1 longest_streak = max(longest_streak, win_streak) else: win_streak = 0 return longest_streak if longest_streak >= quest.quest_target else win_streak
def create_or_update_quest(player_uid, player_address, quest_id, quest): current_ts = get_timestamp() today_start_time = get_start_time_of_the_day(current_ts) today_end_time = get_end_time_of_the_day(current_ts) # Get quest info quest_info = quest_config.QUEST_LIST[quest_id] quest_start_time = quest_info.get("start_time", 0) quest_end_time = quest_info.get("end_time", INFINITY_FUTURE) is_daily_quest = quest_info[ 'quest_type'] == QuestTypes.DAILY or quest_info.get('is_daily', False) # Case daily quest reset if quest and is_daily_quest: if current_ts > quest.end_time: quest.start_time = max(quest_start_time, today_start_time) quest.end_time = min(quest_end_time, today_end_time) quest.status = QuestStatus.TO_DO quest.quest_level = 0 quest.quest_target = quest_info['quest_target'][0] quest.reward_type = quest_info['reward_type'][0] quest.reward_value = quest_info['reward_value'][0] # Case claimed / finished quest if quest and quest.status != QuestStatus.TO_DO: return quest # Case new quest if quest is None: quest = EtheremonDB.QuestTab( player_uid=player_uid, player_address=player_address, quest_id=quest_id, quest_type=quest_info['quest_type'], quest_level=0, quest_name=quest_info['quest_name'], quest_target=quest_info['quest_target'][0], quest_progress=0, reward_type=quest_info['reward_type'][0], reward_value=quest_info['reward_value'][0], status=QuestStatus.TO_DO, start_time=quest_start_time if not is_daily_quest else max( quest_start_time, today_start_time), end_time=quest_end_time if not is_daily_quest else min( quest_end_time, today_end_time), last_check=0, create_time=current_ts, extra="{}", ) # Update progress temp = quest_info['update_progress_func'](quest, current_ts) quest_progress = temp if not isinstance(temp, tuple) else temp[0] quest.quest_progress = min(quest.quest_target, quest_progress) # Ready to claim if quest.quest_progress == quest.quest_target: quest.status = QuestStatus.TO_CLAIM quest_extra_data = None if not isinstance(temp, tuple) else temp[1] extra_data = json.loads(quest.extra or "{}") extra_data["info"] = quest_extra_data quest.extra = json.dumps(extra_data) quest.last_check = current_ts quest.update_time = current_ts quest.save() return quest