def generate_quest(quest): gettext.find('quest', 'locales', all=True) lang = gettext.translation('quest', localedir='locale', fallback=True) lang.install() quest_reward_type = questreward(quest['quest_reward_type']) quest_type = questtype(quest['quest_type']) if '{0}' in quest_type: quest_type = quest_type.replace('{0}', str(quest['quest_target'])) item_id = 0 item_amount = 1 pokemon_id = '000' pokemon_name = '' item_type = '' pokemon_form = '00' pokemon_costume = '00' pokemon_asset_bundle = '00' if quest_reward_type == _('Item'): item_amount = quest['quest_item_amount'] item_type = rewarditem(quest['quest_item_id']) item_id = quest['quest_item_id'] elif quest_reward_type == _('Stardust'): item_amount = quest['quest_stardust'] item_type = _('Stardust') elif quest_reward_type == _('Pokemon'): item_type = 'Pokemon' pokemon_name = i8ln(pokemonname(str(quest['quest_pokemon_id']))) pokemon_id = quest['quest_pokemon_id'] pokemon_form = quest['quest_pokemon_form_id'] pokemon_costume = quest['quest_pokemon_costume_id'] if pokemon_form != '00': pokemon_asset_bundle = form_mapper(int(pokemon_id), pokemon_form) elif quest_reward_type == _('Energy'): item_type = _('Mega Energy') if quest['quest_pokemon_id'] and int(quest['quest_pokemon_id']) > 0: pokemon_name = i8ln(pokemonname(str(quest['quest_pokemon_id']))) pokemon_id = quest['quest_pokemon_id'] else: pokemon_name = '' item_amount = quest['quest_item_amount'] if not quest['task']: quest_task = questtask(quest['quest_type'], quest['quest_condition'], quest['quest_target'], quest['quest_template']) else: quest_task = quest['task'] quest_raw = ({ 'pokestop_id': quest['pokestop_id'], 'name': quest['name'], 'url': quest['image'], 'latitude': quest['latitude'], 'longitude': quest['longitude'], 'timestamp': quest['quest_timestamp'], 'item_id': item_id, 'item_amount': item_amount, 'item_type': item_type, 'pokemon_id': pokemon_id, 'pokemon_name': pokemon_name, 'pokemon_form': pokemon_form, 'pokemon_asset_bundle_id': pokemon_asset_bundle, 'pokemon_costume': pokemon_costume, 'quest_type': quest_type, 'quest_type_raw': quest['quest_type'], 'quest_reward_type': quest_reward_type, 'quest_reward_type_raw': quest['quest_reward_type'], 'quest_task': quest_task, 'quest_target': quest['quest_target'], 'quest_condition': quest['quest_condition'], 'quest_template': quest['quest_template'], }) return quest_raw
def shiny_stats_data(self): # shiny hour shiny_hour_temp = {} shiny_hour_calc = {} shiny_hour = [] data = self._db_stats_reader.get_shiny_stats_hour() for dat in data: if dat[1] not in shiny_hour_temp: shiny_hour_temp[dat[1]] = dat[0] for dat in shiny_hour_temp: if shiny_hour_temp[dat] not in shiny_hour_calc: shiny_hour_calc[shiny_hour_temp[dat]] = 0 shiny_hour_calc[shiny_hour_temp[dat]] += 1 for dat in sorted(shiny_hour_calc): sht = ([ self.utc2local(dat * 60 * 60) * 1000, shiny_hour_calc[dat] ]) shiny_hour.append(sht) shiny_stats = [] shiny_worker = {} shiny_avg = {} data = self._db_stats_reader.get_shiny_stats() for dat in data: form_suffix = "%02d" % form_mapper(dat[2], dat[5]) mon = "%03d" % dat[2] mon_img = self.generate_mon_icon_url(dat[2], dat[8], dat[9]) mon_name = get_mon_name(dat[2]) diff: int = dat[0] if diff == 0: logger.warning( 'No deeper pokemon stats are possible - not enough data (check config.ini // ' 'game_stats_raw)') diff = 1 ratio = round(dat[1] * 100 / diff, 2) if dat[3] not in shiny_worker: shiny_worker[dat[3]] = 0 shiny_worker[dat[3]] += dat[1] if dat[2] not in shiny_avg: shiny_avg[dat[2]] = {} if dat[5] not in shiny_avg[dat[2]]: shiny_avg[dat[2]][dat[5]] = {} shiny_avg[dat[2]][dat[5]]['total_shiny'] = [] shiny_avg[dat[2]][dat[5]]['total_nonshiny'] = [] shiny_avg[dat[2]][dat[5]]['total_shiny'].append(dat[1]) shiny_avg[dat[2]][dat[5]]['total_nonshiny'].append(diff) shiny_stats.append({ 'sum': dat[0], 'shiny': dat[1], 'img': mon_img, 'name': mon_name, 'ratio': ratio, 'worker': dat[3], 'encounterid': dat[4], 'periode': datetime.datetime.fromtimestamp(dat[6]).strftime( self._datetimeformat) }) shiny_stats_avg = [] for dat in shiny_avg: for form_dat in shiny_avg[dat]: form_suffix = "%02d" % form_mapper(dat, form_dat) mon = "%03d" % dat mon_img = 'asset/pokemon_icons/pokemon_icon_' + mon + '_' + form_suffix + '_shiny.png' mon_name = get_mon_name(dat) total_shiny_encounters = sum( shiny_avg[dat][form_dat]['total_shiny']) total_nonshiny_encounters = sum( shiny_avg[dat][form_dat]['total_nonshiny']) shiny_avg_click = round( total_nonshiny_encounters / total_shiny_encounters, 0) shiny_stats_avg.append({ 'name': mon_name, 'img': mon_img, 'total_shiny_encounters': total_shiny_encounters, 'total_nonshiny_encounters': total_nonshiny_encounters, 'click_for_shiny': shiny_avg_click }) shiny_stats_worker = [] for dat in shiny_worker: shiny_stats_worker.append({ 'sum': shiny_worker[dat], 'worker': dat }) stats = { 'shiny': shiny_stats, 'shiny_worker': shiny_stats_worker, 'shiny_hour': shiny_hour, 'shiny_stats_avg': shiny_stats_avg } return jsonify(stats)
def game_stats_shiny_v2(self): logger.debug2('game_stats_shiny_v2') timestamp_from = request.args.get('from', None) if (timestamp_from): timestamp_from = self.local2utc(int(timestamp_from)) logger.debug2('using timestamp_from: {}', timestamp_from) timestamp_to = request.args.get('to', None) if (timestamp_to): timestamp_to = self.local2utc(int(timestamp_to)) logger.debug2('using timestamp_to: {}', timestamp_to) tmp_perworker_v2 = {} data = self._db_stats_reader.get_shiny_stats_v2( timestamp_from, timestamp_to) found_shiny_mon_id = [] shiny_count = {} mon_names = {} tmp_perhour_v2 = {} if data is None or len(data) == 0: return jsonify({'empty': True}) shiny_stats_v2 = [] for dat in data: form_suffix = "%02d" % form_mapper(dat[0], dat[1]) mon = "%03d" % dat[0] mon_img = 'asset/pokemon_icons/pokemon_icon_' + mon + '_' + form_suffix + '_shiny.png' mon_name = get_mon_name(dat[0]) mon_names[dat[0]] = mon_name found_shiny_mon_id.append( mon ) # append everything now, we will set() it later to remove duplicates if dat[8] not in tmp_perworker_v2: tmp_perworker_v2[dat[8]] = 0 tmp_perworker_v2[dat[8]] += 1 if dat[0] not in shiny_count: shiny_count[dat[0]] = {} if dat[1] not in shiny_count[dat[0]]: shiny_count[dat[0]][dat[1]] = 0 shiny_count[dat[0]][dat[1]] += 1 # there is later strftime which converts to local time too, can't use utc2local - it will do double shift timestamp = datetime.datetime.fromtimestamp(dat[7]) if timestamp.hour in tmp_perhour_v2: tmp_perhour_v2[timestamp.hour] += 1 else: tmp_perhour_v2[timestamp.hour] = 1 shiny_stats_v2.append({ 'img': mon_img, 'name': mon_name, 'worker': dat[8], 'lat': dat[2], 'lat_5': "{:.5f}".format(dat[2]), 'lng_5': "{:.5f}".format(dat[3]), 'lng': dat[3], 'timestamp': timestamp.strftime(self._datetimeformat), 'form': dat[1], 'mon_id': dat[0], 'encounter_id': str(dat[9]) }) global_shiny_stats_v2 = [] data = self._db_stats_reader.get_shiny_stats_global_v2( set(found_shiny_mon_id), timestamp_from, timestamp_to) for dat in data: if dat[1] in shiny_count and dat[2] in shiny_count[dat[1]]: odds = round(dat[0] / shiny_count[dat[1]][dat[2]], 0) form_suffix = "%02d" % form_mapper(dat[1], dat[2]) mon = "%03d" % dat[1] mon_img = 'asset/pokemon_icons/pokemon_icon_' + mon + '_' + form_suffix + '_shiny.png' global_shiny_stats_v2.append({ 'name': mon_names[dat[1]], 'count': dat[0], 'img': mon_img, 'shiny': shiny_count[dat[1]][dat[2]], 'odds': odds, 'mon_id': dat[1], 'form': dat[2], 'gender': dat[3], 'costume': dat[4] }) shiny_stats_perworker_v2 = [] for worker in tmp_perworker_v2: shiny_stats_perworker_v2.append({ 'name': worker, 'count': tmp_perworker_v2[worker] }) shiny_stats_perhour_v2 = [] for hour in tmp_perhour_v2: shiny_stats_perhour_v2.append([hour, tmp_perhour_v2[hour]]) stats = { 'empty': False, 'shiny_statistics': shiny_stats_v2, 'global_shiny_statistics': global_shiny_stats_v2, 'per_worker': shiny_stats_perworker_v2, 'per_hour': shiny_stats_perhour_v2 } return jsonify(stats)
def generate_quest(quest): quest_reward_type = questreward(quest['quest_reward_type']) quest_type = questtype(quest['quest_type']) if '{0}' in quest_type: quest_type = quest_type.replace('{0}', str(quest['quest_target'])) item_id = 0 item_amount = 1 pokemon_id = '000' pokemon_name = '' item_type = '' pokemon_form = '00' pokemon_costume = '00' pokemon_asset_bundle = '00' if quest_reward_type == _('Item'): item_amount = quest['quest_item_amount'] item_type = rewarditem(quest['quest_item_id']) item_id = quest['quest_item_id'] elif quest_reward_type == _('Stardust'): item_amount = quest['quest_stardust'] item_type = _('Stardust') elif quest_reward_type == _('Pokemon'): item_type = 'Pokemon' pokemon_name = i8ln(pokemonname(str(quest['quest_pokemon_id']))) pokemon_id = quest['quest_pokemon_id'] pokemon_form = quest['quest_pokemon_form_id'] pokemon_costume = quest['quest_pokemon_costume_id'] if pokemon_form != '00': pokemon_asset_bundle = form_mapper(int(pokemon_id), pokemon_form) elif quest_reward_type == _('Energy'): item_type = _('Mega Energy') if quest['quest_pokemon_id'] and int(quest['quest_pokemon_id']) > 0: pokemon_name = i8ln(pokemonname(str(quest['quest_pokemon_id']))) pokemon_id = quest['quest_pokemon_id'] else: pokemon_name = '' item_amount = quest['quest_item_amount'] elif quest_reward_type == _("Candy"): # TODO maybe we should be doing deep parsing against the reward array item_amount = quest['quest_item_amount'] item_type = quest_reward_type pokemon_id = quest['quest_pokemon_id'] pokemon_name = pokemon_name = i8ln(pokemonname(str(pokemon_id))) if not quest['task']: quest_task = questtask( quest['quest_type'], quest['quest_condition'], quest['quest_target'], quest['quest_template']) else: quest_task = quest['task'] quest_raw = ({ 'pokestop_id': quest['pokestop_id'], 'name': quest['name'], 'url': quest['image'], 'latitude': quest['latitude'], 'longitude': quest['longitude'], 'timestamp': quest['quest_timestamp'], 'item_id': item_id, 'item_amount': item_amount, 'item_type': item_type, 'pokemon_id': pokemon_id, 'pokemon_name': pokemon_name, 'pokemon_form': pokemon_form, 'pokemon_asset_bundle_id': pokemon_asset_bundle, 'pokemon_costume': pokemon_costume, 'quest_type': quest_type, 'quest_type_raw': quest['quest_type'], 'quest_reward_type': quest_reward_type, 'quest_reward_type_raw': quest['quest_reward_type'], 'quest_task': quest_task, 'quest_target': quest['quest_target'], 'quest_condition': quest['quest_condition'], 'quest_template': quest['quest_template'], 'is_ar_scan_eligible': quest['is_ar_scan_eligible'], }) return quest_raw