示例#1
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        time = get_time_as_str(self.expiration, timezone)
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'stop_id': self.stop_id,

            # Time left
            'time_left': time[0],
            '12h_time': time[1],
            '24h_time': time[2],

            # Location
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lat),
            'distance': (
                get_dist_as_str(self.distance, units)
                if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'waze': get_waze_link(self.lat, self.lng),
            'geofence': self.geofence
        })
        return dts
示例#2
0
 def generate_dts(self, locale, timezone, units):
     """ Return a dict with all the DTS for this event. """
     dts = self.custom_dts.copy()
     dts.update({
         # Identification
         'stop_id': self.stop_id,
         'stop_name': self.stop_name,
         'stop_image': self.stop_image,
         # Location
         'lat': self.lat,
         'lng': self.lng,
         'lat_5': "{:.5f}".format(self.lat),
         'lng_5': "{:.5f}".format(self.lat),
         'distance': (
             get_dist_as_str(self.distance, units)
             if Unknown.is_not(self.distance) else Unknown.SMALL),
         'direction': self.direction,
         'gmaps': get_gmaps_link(self.lat, self.lng),
         'applemaps': get_applemaps_link(self.lat, self.lng),
         'geofence': self.geofence,
         # Quest Details
         'quest': self.quest,
         'reward': self.reward,
         'expiry': self.expiry
     })
     return dts
示例#3
0
    def generate_dts(self, locale):
        """ Return a dict with all the DTS for this event. """
        time = get_time_as_str(self.expiration)
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'stop_id': self.stop_id,

            # Time left
            'time_left': time[0],
            '12h_time': time[1],
            '24h_time': time[2],

            # Location
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lat),
            'distance': (
                get_dist_as_str(self.distance) if Unknown.is_not(self.distance)
                else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'geofence': self.geofence
        })
        return dts
示例#4
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'gym_id':
            self.gym_id,

            # Location
            'lat':
            self.lat,
            'lng':
            self.lng,
            'lat_5':
            "{:.5f}".format(self.lat),
            'lng_5':
            "{:.5f}".format(self.lng),
            'distance': (get_dist_as_str(self.distance, units)
                         if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction':
            self.direction,
            'gmaps':
            get_gmaps_link(self.lat, self.lng),
            'applemaps':
            get_applemaps_link(self.lat, self.lng),
            'waze':
            get_waze_link(self.lat, self.lng),
            'geofence':
            self.geofence,

            # Team Info
            'old_team':
            locale.get_team_name(self.old_team_id),
            'old_team_id':
            self.old_team_id,
            'old_team_leader':
            locale.get_leader_name(self.old_team_id),
            'new_team':
            locale.get_team_name(self.new_team_id),
            'new_team_id':
            self.new_team_id,
            'new_team_leader':
            locale.get_leader_name(self.new_team_id),

            # Details
            'gym_name':
            self.gym_name,
            'gym_description':
            self.gym_description,
            'gym_image':
            self.gym_image,

            # Guards
            'slots_available':
            self.slots_available,
            'guard_count':
            self.guard_count,
        })
        return dts
示例#5
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        weather_name = locale.get_weather_name(self.weather_id)
        severity_locale = locale.get_severity_name(self.severity_id)
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            's2_cell_id':
            self.s2_cell_id,

            # Location - center of the s2 cell
            'lat':
            self.lat,
            'lng':
            self.lng,
            'lat_5':
            "{:.5f}".format(self.lat),
            'lng_5':
            "{:.5f}".format(self.lng),
            'distance': (get_dist_as_str(self.distance, units)
                         if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction':
            self.direction,
            'gmaps':
            get_gmaps_link(self.lat, self.lng),
            'applemaps':
            get_applemaps_link(self.lat, self.lng),
            'geofence':
            self.geofence,
            'waze':
            get_waze_link(self.lat, self.lng),

            # Weather Info
            'weather_id':
            self.weather_id,
            'weather_id_3':
            "{:03}".format(self.weather_id),
            'weather':
            weather_name,
            'weather_emoji':
            get_weather_emoji(self.weather_id),
            'severity_id':
            self.severity_id,
            'severity_id_3':
            "{:03}".format(self.severity_id),
            'severity':
            severity_locale,
            'severity_or_empty':
            '' if self.severity_id == 0 else severity_locale,
            'day_or_night_id':
            self.day_or_night_id,
            'day_or_night_id_3':
            "{:03}".format(self.day_or_night_id),
            'day_or_night':
            locale.get_day_or_night(self.day_or_night_id)
        })
        return dts
示例#6
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        hatch_time = get_time_as_str(self.hatch_time, timezone)
        raid_end_time = get_time_as_str(self.raid_end, timezone)
        weather_name = locale.get_weather_name(self.weather_id)
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'gym_id': self.gym_id,

            # Time Remaining
            'hatch_time_left': hatch_time[0],
            '12h_hatch_time': hatch_time[1],
            '24h_hatch_time': hatch_time[2],
            'raid_time_left': raid_end_time[0],
            '12h_raid_end': raid_end_time[1],
            '24h_raid_end': raid_end_time[2],

            # Location
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lng),
            'distance': (
                get_dist_as_str(self.distance, units)
                if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'waze': get_waze_link(self.lat, self.lng),
            'geofence': self.geofence,
            'weather_id': self.weather_id,
            'weather': weather_name,
            'weather_or_empty': Unknown.or_empty(weather_name),
            'weather_emoji': get_weather_emoji(self.weather_id),

            # Egg info
            'egg_lvl': self.egg_lvl,

            # Gym Details
            'gym_name': self.gym_name,
            'gym_description': self.gym_description,
            'gym_image': self.gym_image,
            'sponsor_id': self.sponsor_id,
            'sponsored':
                self.sponsor_id > 0
                if Unknown.is_not(self.sponsor_id) else Unknown.REGULAR,
            'park': self.park,
            'team_id': self.current_team_id,
            'team_name': locale.get_team_name(self.current_team_id),
            'team_leader': locale.get_leader_name(self.current_team_id)
        })
        return dts
示例#7
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        time = get_time_as_str(self.expiration, timezone)
        dts = self.custom_dts.copy()
        type_name = locale.get_grunt_type_name(self.type_id)
        dts.update({
            # Identification
            'stop_id': self.stop_id,

            # Details
            'stop_name': self.stop_name,
            'stop_image': self.stop_image,
            'type_id': self.type_id,
            'type_id_3': "{:03}".format(self.type_id),
            'type_name': type_name,
            'type_emoji': get_type_emoji(get_grunt_type_id(type_name)),
            'gender_id': self.gender_id,
            'gender': self.gender,
            # ToDo: Add reward (should probably be sent via webhook)

            # Time left
            'time_left': time[0],
            '12h_time': time[1],
            '24h_time': time[2],
            'time_left_no_secs': time[3],
            '12h_time_no_secs': time[4],
            '24h_time_no_secs': time[5],
            'time_left_raw_hours': time[6],
            'time_left_raw_minutes': time[7],
            'time_left_raw_seconds': time[8],

            # Location
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lng),
            'distance': (
                get_dist_as_str(self.distance, units)
                if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'waze': get_waze_link(self.lat, self.lng),
            'geofence': self.geofence
        })
        return dts
示例#8
0
 def generate_dts(self, locale, timezone, units):
     """ Return a dict with all the DTS for this event. """
     dts = self.custom_dts.copy()
     dts.update({
         # Identification
         'stop_id':
         self.stop_id,
         'stop_name':
         self.stop_name,
         'stop_image':
         self.stop_image,
         # Location
         'lat':
         self.lat,
         'lng':
         self.lng,
         'lat_5':
         "{:.5f}".format(self.lat),
         'lng_5':
         "{:.5f}".format(self.lat),
         'distance': (get_dist_as_str(self.distance, units)
                      if Unknown.is_not(self.distance) else Unknown.SMALL),
         'direction':
         self.direction,
         'gmaps':
         get_gmaps_link(self.lat, self.lng),
         'applemaps':
         get_applemaps_link(self.lat, self.lng),
         'geofence':
         self.geofence,
         # Quest Details
         'quest':
         get_string_for_quest_task(locale, self.quest, self.condition,
                                   self.target),
         'reward':
         (locale.get_pokemon_name(self.monster_id)
          if self.reward == 'Pokemon' else "{} ({})".format(
              locale.get_item_name(self.item_id), self.item_amount)),
         'expiry':
         self.expiry
     })
     return dts
示例#9
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'gym_id': self.gym_id,

            # Location
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lng),
            'distance': (
                get_dist_as_str(self.distance, units)
                if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'waze': get_waze_link(self.lat, self.lng),
            'geofence': self.geofence,

            # Team Info
            'old_team': locale.get_team_name(self.old_team_id),
            'old_team_id': self.old_team_id,
            'old_team_leader': locale.get_leader_name(self.old_team_id),
            'new_team': locale.get_team_name(self.new_team_id),
            'new_team_id': self.new_team_id,
            'new_team_leader': locale.get_leader_name(self.new_team_id),

            # Details
            'gym_name': self.gym_name,
            'gym_description': self.gym_description,
            'gym_image': self.gym_image,

            # Guards
            'slots_available': self.slots_available,
            'guard_count': self.guard_count,
        })
        return dts
示例#10
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        weather_name = locale.get_weather_name(self.weather_id)
        severity_locale = locale.get_severity_name(self.severity_id)
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            's2_cell_id': self.s2_cell_id,

            # Location - center of the s2 cell
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lng),
            'distance': (
                get_dist_as_str(self.distance, units)
                if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'geofence': self.geofence,
            'waze': get_waze_link(self.lat, self.lng),

            # Weather Info
            'weather_id': self.weather_id,
            'weather_id_3': "{:03}".format(self.weather_id),
            'weather': weather_name,
            'weather_emoji': get_weather_emoji(self.weather_id),
            'severity_id': self.severity_id,
            'severity_id_3': "{:03}".format(self.severity_id),
            'severity': severity_locale,
            'severity_or_empty':
                '' if self.severity_id is 0 else severity_locale,
            'day_or_night_id': self.day_or_night_id,
            'day_or_night_id_3': "{:03}".format(self.day_or_night_id),
            'day_or_night': locale.get_day_or_night(self.day_or_night_id)
        })
        return dts
示例#11
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        time = get_time_as_str(self.disappear_time, timezone)

        form_name = locale.get_form_name(self.monster_id, self.form_id)
        costume_name = locale.get_costume_name(self.monster_id,
                                               self.costume_id)

        weather_name = locale.get_weather_name(self.weather_id)
        boosted_weather_name = locale.get_weather_name(self.boosted_weather_id)

        type1 = locale.get_type_name(self.types[0])
        type2 = locale.get_type_name(self.types[1])

        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'encounter_id': self.enc_id,
            'mon_name': locale.get_pokemon_name(self.monster_id),
            'mon_id': self.monster_id,
            'mon_id_3': "{:03}".format(self.monster_id),

            # Time Remaining
            'time_left': time[0],
            '12h_time': time[1],
            '24h_time': time[2],

            # Spawn Data
            'spawn_start': self.spawn_start,
            'spawn_end': self.spawn_end,
            'spawn_verified': self.spawn_verified,

            # Location
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lng),
            'distance': (
                get_dist_as_str(self.distance, units)
                if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'geofence': self.geofence,

            # Weather
            'weather_id': self.weather_id,
            'weather': weather_name,
            'weather_or_empty': Unknown.or_empty(weather_name),
            'weather_emoji': get_weather_emoji(self.weather_id),
            'boosted_weather_id': self.boosted_weather_id,
            'boosted_weather': boosted_weather_name,
            'boosted_weather_or_empty': (
                '' if self.boosted_weather_id == 0
                else Unknown.or_empty(boosted_weather_name)),
            'boosted_weather_emoji':
                get_weather_emoji(self.boosted_weather_id),
            'boosted_or_empty': locale.get_boosted_text() if \
                Unknown.is_not(self.boosted_weather_id) and
                self.boosted_weather_id != 0 else '',

            # Encounter Stats
            'mon_lvl': self.mon_lvl,
            'cp': self.cp,

            # IVs
            'iv_0': (
                "{:.0f}".format(self.iv) if Unknown.is_not(self.iv)
                else Unknown.TINY),
            'iv': (
                "{:.1f}".format(self.iv) if Unknown.is_not(self.iv)
                else Unknown.SMALL),
            'iv_2': (
                "{:.2f}".format(self.iv) if Unknown.is_not(self.iv)
                else Unknown.SMALL),
            'atk': self.atk_iv,
            'def': self.def_iv,
            'sta': self.sta_iv,

            # Type
            'type1': type1,
            'type1_or_empty': Unknown.or_empty(type1),
            'type1_emoji': Unknown.or_empty(get_type_emoji(self.types[0])),
            'type2': type2,
            'type2_or_empty': Unknown.or_empty(type2),
            'type2_emoji': Unknown.or_empty(get_type_emoji(self.types[1])),
            'types': (
                "{}/{}".format(type1, type2)
                if Unknown.is_not(type2) else type1),
            'types_emoji': (
                "{}{}".format(
                    get_type_emoji(self.types[0]),
                    get_type_emoji(self.types[1]))
                if Unknown.is_not(type2) else get_type_emoji(self.types[0])),

            # Form
            'form': form_name,
            'form_or_empty': Unknown.or_empty(form_name),
            'form_id': self.form_id,
            'form_id_3': "{:03d}".format(self.form_id),

            # Costume
            'costume': costume_name,
            'costume_or_empty': Unknown.or_empty(costume_name),
            'costume_id': self.costume_id,
            'costume_id_3': "{:03d}".format(self.costume_id),

            # Quick Move
            'quick_move': locale.get_move_name(self.quick_id),
            'quick_id': self.quick_id,
            'quick_type_id': self.quick_type,
            'quick_type': locale.get_type_name(self.quick_type),
            'quick_type_emoji': get_type_emoji(self.quick_type),
            'quick_damage': self.quick_damage,
            'quick_dps': self.quick_dps,
            'quick_duration': self.quick_duration,
            'quick_energy': self.quick_energy,

            # Charge Move
            'charge_move': locale.get_move_name(self.charge_id),
            'charge_id': self.charge_id,
            'charge_type_id': self.charge_type,
            'charge_type': locale.get_type_name(self.charge_type),
            'charge_type_emoji': get_type_emoji(self.charge_type),
            'charge_damage': self.charge_damage,
            'charge_dps': self.charge_dps,
            'charge_duration': self.charge_duration,
            'charge_energy': self.charge_energy,

            # Cosmetic
            'gender': self.gender,
            'height_0': (
                "{:.0f}".format(self.height) if Unknown.is_not(self.height)
                else Unknown.TINY),
            'height': (
                "{:.1f}".format(self.height) if Unknown.is_not(self.height)
                else Unknown.SMALL),
            'height_2': (
                "{:.2f}".format(self.height) if Unknown.is_not(self.height)
                else Unknown.SMALL),
            'weight_0': (
                "{:.0f}".format(self.weight) if Unknown.is_not(self.weight)
                else Unknown.TINY),
            'weight': (
                "{:.1f}".format(self.weight) if Unknown.is_not(self.weight)
                else Unknown.SMALL),
            'weight_2': (
                "{:.2f}".format(self.weight) if Unknown.is_not(self.weight)
                else Unknown.SMALL),
            'size': locale.get_size_name(self.size_id),

            # Attack rating
            'atk_grade': (
                Unknown.or_empty(self.atk_grade, Unknown.TINY)),
            'def_grade': (
                Unknown.or_empty(self.def_grade, Unknown.TINY)),

            # Catch Prob
            'base_catch_0': (
                "{:.0f}".format(self.base_catch * 100)
                if Unknown.is_not(self.base_catch)
                else Unknown.TINY),
            'base_catch': (
                "{:.1f}".format(self.base_catch * 100)
                if Unknown.is_not(self.base_catch)
                else Unknown.SMALL),
            'base_catch_2': (
                "{:.2f}".format(self.base_catch * 100)
                if Unknown.is_not(self.base_catch)
                else Unknown.SMALL),
            'great_catch_0': (
                "{:.0f}".format(self.great_catch * 100)
                if Unknown.is_not(self.great_catch)
                else Unknown.TINY),
            'great_catch': (
                "{:.1f}".format(self.great_catch * 100)
                if Unknown.is_not(self.great_catch)
                else Unknown.SMALL),
            'great_catch_2': (
                "{:.2f}".format(self.great_catch * 100)
                if Unknown.is_not(self.great_catch)
                else Unknown.SMALL),
            'ultra_catch_0': (
                "{:.0f}".format(self.ultra_catch * 100)
                if Unknown.is_not(self.ultra_catch)
                else Unknown.TINY),
            'ultra_catch': (
                "{:.1f}".format(self.ultra_catch * 100)
                if Unknown.is_not(self.ultra_catch)
                else Unknown.SMALL),
            'ultra_catch_2': (
                "{:.2f}".format(self.ultra_catch * 100)
                if Unknown.is_not(self.ultra_catch)
                else Unknown.SMALL),

            # Misc
            'big_karp': (
                'big' if self.monster_id == 129 and Unknown.is_not(self.weight)
                and self.weight >= 13.13 else ''),
            'tiny_rat': (
                'tiny' if self.monster_id == 19 and Unknown.is_not(self.weight)
                and self.weight <= 2.41 else '')
        })
        return dts
示例#12
0
    def generate_dts(self, locale):
        """ Return a dict with all the DTS for this event. """
        time = get_time_as_str(self.disappear_time)
        form_name = locale.get_form_name(self.monster_id, self.form_id)
        weather_name = locale.get_weather_name(self.weather_id)
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'encounter_id':
            self.enc_id,
            'mon_name':
            locale.get_pokemon_name(self.monster_id),
            'mon_id':
            self.monster_id,
            'mon_id_3':
            "{:03}".format(self.monster_id),

            # Time Remaining
            'time_left':
            time[0],
            '12h_time':
            time[1],
            '24h_time':
            time[2],

            # Spawn Data
            'spawn_start':
            self.spawn_start,
            'spawn_end':
            self.spawn_end,
            'spawn_verified':
            self.spawn_verified,

            # Location
            'lat':
            self.lat,
            'lng':
            self.lng,
            'lat_5':
            "{:.5f}".format(self.lat),
            'lng_5':
            "{:.5f}".format(self.lng),
            'distance': (get_dist_as_str(self.distance)
                         if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction':
            self.direction,
            'gmaps':
            get_gmaps_link(self.lat, self.lng),
            'applemaps':
            get_applemaps_link(self.lat, self.lng),
            'geofence':
            self.geofence,
            'weather_id':
            self.weather_id,
            'weather':
            weather_name,
            'weather_or_empty':
            Unknown.or_empty(weather_name),
            'weather_emoji':
            get_weather_emoji(self.weather_id),

            # Encounter Stats
            'mon_lvl':
            self.mon_lvl,
            'cp':
            self.cp,
            # IVs
            'iv_0': ("{:.0f}".format(self.iv)
                     if Unknown.is_not(self.iv) else Unknown.TINY),
            'iv': ("{:.1f}".format(self.iv)
                   if Unknown.is_not(self.iv) else Unknown.SMALL),
            'iv_2': ("{:.2f}".format(self.iv)
                     if Unknown.is_not(self.iv) else Unknown.SMALL),
            'atk':
            self.atk_iv,
            'def':
            self.def_iv,
            'sta':
            self.sta_iv,
            # Form
            'form':
            form_name,
            'form_or_empty':
            Unknown.or_empty(form_name),
            'form_id':
            self.form_id,
            'form_id_3':
            "{:03d}".format(self.form_id),

            # Quick Move
            'quick_move':
            locale.get_move_name(self.quick_move_id),
            'quick_id':
            self.quick_move_id,
            'quick_damage':
            self.quick_damage,
            'quick_dps':
            self.quick_dps,
            'quick_duration':
            self.quick_duration,
            'quick_energy':
            self.quick_energy,
            # Charge Move
            'charge_move':
            locale.get_move_name(self.charge_move_id),
            'charge_id':
            self.charge_move_id,
            'charge_damage':
            self.charge_damage,
            'charge_dps':
            self.charge_dps,
            'charge_duration':
            self.charge_duration,
            'charge_energy':
            self.charge_energy,

            # Cosmetic
            'gender':
            self.gender,
            'height':
            self.height,
            'weight':
            self.weight,
            'size':
            self.size,

            # Misc
            'big_karp':
            ('big' if self.monster_id == 129 and Unknown.is_not(self.weight)
             and self.weight >= 13.13 else ''),
            'tiny_rat':
            ('tiny' if self.monster_id == 19 and Unknown.is_not(self.weight)
             and self.weight <= 2.41 else '')
        })
        return dts
示例#13
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        form_name = locale.get_form_name(self.monster_id, self.monster_form_id)
        costume_name = locale.get_costume_name(self.monster_id,
                                               self.monster_costume_id)
        type1 = locale.get_type_name(self.monster_types[0])
        type2 = locale.get_type_name(self.monster_types[1])
        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'stop_id':
            self.stop_id,
            'stop_name':
            self.stop_name,
            'stop_image':
            self.stop_image,
            # Location
            'lat':
            self.lat,
            'lng':
            self.lng,
            'lat_5':
            "{:.5f}".format(self.lat),
            'lng_5':
            "{:.5f}".format(self.lng),
            'distance': (get_dist_as_str(self.distance, units)
                         if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction':
            self.direction,
            'gmaps':
            get_gmaps_link(self.lat, self.lng),
            'applemaps':
            get_applemaps_link(self.lat, self.lng),
            'waze':
            get_waze_link(self.lat, self.lng),
            'geofence':
            self.geofence,

            # Quest Details
            # ToDo: Interpret the `quest_condition` field and use that instead
            #  of `quest_type`
            #  Will be able to better serve manager specific locales
            #  also do this for `quest_task`
            'quest_type':
            self.quest_type_raw,
            'quest_type_id':
            self.quest_type_id,
            'quest_target':
            self.quest_target,
            'quest_task':
            self.quest_task_raw,
            'quest_template':
            self.quest_template,
            'last_modified':
            self.last_modified,
            'quest_condition':
            self.quest_condition_raw,
            'quest_image':
            get_quest_image(self),

            # Reward Details
            'reward_type_id':
            self.reward_type_id,
            'reward_type':
            locale.get_quest_type_name(self.reward_type_id),
            'reward_type_raw':
            self.reward_type_raw,
            'reward_amount':
            self.item_amount,
            'reward':
            reward_string(self, locale),

            # Monster Reward Details
            'mon_name':
            locale.get_pokemon_name(self.monster_id),
            'mon_id':
            self.monster_id,
            'mon_id_3':
            "{:03}".format(self.monster_id),
            'form':
            form_name,
            'form_or_empty':
            Unknown.or_empty(form_name),
            'form_id':
            self.monster_form_id,
            'form_id_2':
            "{:02d}".format(self.monster_form_id),
            'form_id_3':
            "{:03d}".format(self.monster_form_id),
            'costume':
            costume_name,
            'costume_or_empty':
            Unknown.or_empty(costume_name),
            'costume_id':
            self.monster_costume_id,
            'costume_id_2':
            "{:02d}".format(self.monster_costume_id),
            'costume_id_3':
            "{:03d}".format(self.monster_costume_id),
            'type1':
            type1,
            'type1_or_empty':
            Unknown.or_empty(type1),
            'type1_emoji':
            Unknown.or_empty(get_type_emoji(self.monster_types[0])),
            'type2':
            type2,
            'type2_or_empty':
            Unknown.or_empty(type2),
            'type2_emoji':
            Unknown.or_empty(get_type_emoji(self.monster_types[1])),
            'types':
            ("{}/{}".format(type1, type2) if Unknown.is_not(type2) else type1),
            'types_emoji':
            ("{}{}".format(get_type_emoji(self.monster_types[0]),
                           get_type_emoji(self.monster_types[1])) if
             Unknown.is_not(type2) else get_type_emoji(self.monster_types[0])),

            # Item Reward Details
            'raw_item_type':
            self.item_type,
            'item':
            get_item_id(self.item_id),
            'item_id':
            self.item_id,
            'item_id_4':
            "{:04d}".format(self.item_id)
        })
        return dts
示例#14
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        raid_end_time = get_time_as_str(self.raid_end, timezone)
        dts = self.custom_dts.copy()

        exraid = self.gym_park
        if exraid == 'unknown':
            exraid = ''
        else:
            exraid = "\n*Potential EX Raid (" + exraid + ")*"

        boosted_weather_name = locale.get_weather_name(self.boosted_weather_id)
        weather_name = locale.get_weather_name(self.weather_id)

        type1 = locale.get_type_name(self.types[0])
        type2 = locale.get_type_name(self.types[1])

        cp_range = get_pokemon_cp_range(self.mon_id, self.boss_level)
        dts.update({
            # Identification
            'gym_id':
            self.gym_id,

            # Time Remaining
            'raid_time_left':
            raid_end_time[0],
            '12h_raid_end':
            raid_end_time[1],
            '24h_raid_end':
            raid_end_time[2],

            # Type
            'type1':
            type1,
            'type1_or_empty':
            Unknown.or_empty(type1),
            'type1_emoji':
            Unknown.or_empty(get_type_emoji(self.types[0])),
            'type2':
            type2,
            'type2_or_empty':
            Unknown.or_empty(type2),
            'type2_emoji':
            Unknown.or_empty(get_type_emoji(self.types[1])),
            'types':
            ("{}/{}".format(type1, type2) if Unknown.is_not(type2) else type1),
            'types_emoji':
            ("{}{}".format(get_type_emoji(self.types[0]),
                           get_type_emoji(self.types[1]))
             if Unknown.is_not(type2) else get_type_emoji(self.types[0])),

            # Location
            'lat':
            self.lat,
            'lng':
            self.lng,
            'lat_5':
            "{:.5f}".format(self.lat),
            'lng_5':
            "{:.5f}".format(self.lng),
            'distance': (get_dist_as_str(self.distance, units)
                         if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction':
            self.direction,
            'gmaps':
            get_gmaps_link(self.lat, self.lng),
            'applemaps':
            get_applemaps_link(self.lat, self.lng),
            'geofence':
            self.geofence,
            'station':
            self.station,

            # Weather
            'weather_id':
            self.weather_id,
            'weather':
            weather_name,
            'weather_or_empty':
            Unknown.or_empty(weather_name),
            'weather_emoji':
            get_weather_emoji(self.weather_id),
            'boosted_weather_id':
            self.boosted_weather_id,
            'boosted_weather':
            boosted_weather_name,
            'boosted_weather_or_empty':
            ('' if self.boosted_weather_id == 0 else
             Unknown.or_empty(boosted_weather_name)),
            'boosted_weather_emoji':
            get_weather_emoji(self.boosted_weather_id),
            'boosted_or_empty':
            locale.get_boosted_text() if self.boss_level == 25 else '',

            # Raid Info
            'raid_lvl':
            self.raid_lvl,
            'mon_name':
            locale.get_pokemon_name(self.mon_id),
            'mon_id':
            self.mon_id,
            'mon_id_3':
            "{:03}".format(self.mon_id),
            # TODO: Form?

            # Quick Move
            'quick_move':
            locale.get_move_name(self.quick_id),
            'quick_id':
            self.quick_id,
            'quick_damage':
            self.quick_damage,
            'quick_dps':
            self.quick_dps,
            'quick_duration':
            self.quick_duration,
            'quick_energy':
            self.quick_energy,

            # Charge Move
            'charge_move':
            locale.get_move_name(self.charge_id),
            'charge_id':
            self.charge_id,
            'charge_damage':
            self.charge_damage,
            'charge_dps':
            self.charge_dps,
            'charge_duration':
            self.charge_duration,
            'charge_energy':
            self.charge_energy,

            # CP info
            'cp':
            self.cp,
            'min_cp':
            cp_range[0],
            'max_cp':
            cp_range[1],

            # Gym Details
            'gym_name':
            self.gym_name,
            'gym_description':
            self.gym_description,
            'gym_image':
            self.gym_image,
            'gym_sponsor':
            self.gym_sponsor,
            'gym_park':
            exraid,
            'team_id':
            self.current_team_id,
            'team_name':
            locale.get_team_name(self.current_team_id),
            'team_leader':
            locale.get_leader_name(self.current_team_id)
        })
        return dts
示例#15
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        raid_end_time = get_time_as_str(self.raid_end, timezone)
        dts = self.custom_dts.copy()

        form_name = locale.get_form_name(self.mon_id, self.form_id)
        costume_name = locale.get_costume_name(self.mon_id, self.costume_id)

        boosted_weather_name = locale.get_weather_name(self.boosted_weather_id)
        weather_name = locale.get_weather_name(self.weather_id)

        type1 = locale.get_type_name(self.types[0])
        type2 = locale.get_type_name(self.types[1])

        cp_range = get_pokemon_cp_range(self.mon_id, self.boss_level)
        dts.update({
            # Identification
            'gym_id':
            self.gym_id,

            # Time Remaining
            'raid_time_left':
            raid_end_time[0],
            '12h_raid_end':
            raid_end_time[1],
            '24h_raid_end':
            raid_end_time[2],

            # Time Remaining Without Seconds
            'raid_time_no_secs':
            raid_end_time[3],
            '12h_raid_end_no_secs':
            raid_end_time[4],
            '24h_raid_end_no_secs':
            raid_end_time[5],

            # Raw time remaining values
            'raid_time_raw_hours':
            raid_end_time[6],
            'raid_time_raw_minutes':
            raid_end_time[7],
            'raid_time_raw_seconds':
            raid_end_time[8],

            # Type
            'type1':
            type1,
            'type1_or_empty':
            Unknown.or_empty(type1),
            'type1_emoji':
            Unknown.or_empty(get_type_emoji(self.types[0])),
            'type2':
            type2,
            'type2_or_empty':
            Unknown.or_empty(type2),
            'type2_emoji':
            Unknown.or_empty(get_type_emoji(self.types[1])),
            'types':
            ("{}/{}".format(type1, type2) if Unknown.is_not(type2) else type1),
            'types_emoji':
            ("{}{}".format(get_type_emoji(self.types[0]),
                           get_type_emoji(self.types[1]))
             if Unknown.is_not(type2) else get_type_emoji(self.types[0])),

            # Form
            'form':
            form_name,
            'form_or_empty':
            Unknown.or_empty(form_name),
            'form_id':
            self.form_id,
            'form_id_2':
            "{:02d}".format(self.form_id),
            'form_id_3':
            "{:03d}".format(self.form_id),

            # Costume
            'costume':
            costume_name,
            'costume_or_empty':
            Unknown.or_empty(costume_name),
            'costume_id':
            self.costume_id,
            'costume_id_2':
            "{:02d}".format(self.costume_id),
            'costume_id_3':
            "{:03d}".format(self.costume_id),

            # Location
            'lat':
            self.lat,
            'lng':
            self.lng,
            'lat_5':
            "{:.5f}".format(self.lat),
            'lng_5':
            "{:.5f}".format(self.lng),
            'distance': (get_dist_as_str(self.distance, units)
                         if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction':
            self.direction,
            'gmaps':
            get_gmaps_link(self.lat, self.lng),
            'applemaps':
            get_applemaps_link(self.lat, self.lng),
            'waze':
            get_waze_link(self.lat, self.lng),
            'geofence':
            self.geofence,

            # Weather
            'weather_id':
            self.weather_id,
            'weather':
            weather_name,
            'weather_or_empty':
            Unknown.or_empty(weather_name),
            'weather_emoji':
            get_weather_emoji(self.weather_id),
            'boosted_weather_id':
            self.boosted_weather_id,
            'boosted_weather':
            boosted_weather_name,
            'boosted_weather_or_empty':
            ('' if self.boosted_weather_id == 0 else
             Unknown.or_empty(boosted_weather_name)),
            'boosted_weather_emoji':
            get_weather_emoji(self.boosted_weather_id),
            'boosted_or_empty':
            locale.get_boosted_text() if self.boss_level == 25 else '',

            # Raid Info
            'raid_lvl':
            self.raid_lvl,
            'mon_name':
            locale.get_pokemon_name(self.mon_id),
            'mon_id':
            self.mon_id,
            'mon_id_3':
            "{:03}".format(self.mon_id),
            'gender':
            self.gender,
            # TODO: Form?

            # Quick Move
            'quick_move':
            locale.get_move_name(self.quick_id),
            'quick_id':
            self.quick_id,
            'quick_type_id':
            self.quick_type,
            'quick_type':
            locale.get_type_name(self.quick_type),
            'quick_type_emoji':
            get_type_emoji(self.quick_type),
            'quick_damage':
            self.quick_damage,
            'quick_dps':
            self.quick_dps,
            'quick_duration':
            self.quick_duration,
            'quick_energy':
            self.quick_energy,

            # Charge Move
            'charge_move':
            locale.get_move_name(self.charge_id),
            'charge_id':
            self.charge_id,
            'charge_type_id':
            self.charge_type,
            'charge_type':
            locale.get_type_name(self.charge_type),
            'charge_type_emoji':
            get_type_emoji(self.charge_type),
            'charge_damage':
            self.charge_damage,
            'charge_dps':
            self.charge_dps,
            'charge_duration':
            self.charge_duration,
            'charge_energy':
            self.charge_energy,

            # CP info
            'cp':
            self.cp,
            'min_cp':
            cp_range[0],
            'max_cp':
            cp_range[1],

            # Gym Details
            'gym_name':
            self.gym_name,
            'gym_description':
            self.gym_description,
            'gym_image':
            self.gym_image,
            'sponsor_id':
            self.sponsor_id,
            'sponsored':
            self.sponsor_id > 0
            if Unknown.is_not(self.sponsor_id) else Unknown.REGULAR,
            'ex_eligible':
            self.ex_eligible > 0
            if Unknown.is_not(self.ex_eligible) else Unknown.REGULAR,
            'ex_eligible_emoji':
            get_ex_eligible_emoji(self.ex_eligible),
            'park':
            self.park,
            'team_id':
            self.current_team_id,
            'team_emoji':
            get_team_emoji(self.current_team_id),
            'team_name':
            locale.get_team_name(self.current_team_id),
            'team_color':
            locale.get_team_color(self.current_team_id),
            'team_leader':
            locale.get_leader_name(self.current_team_id)
        })
        return dts
示例#16
0
    def generate_dts(self, locale):
        """ Return a dict with all the DTS for this event. """
        raid_end_time = get_time_as_str(self.raid_end)
        dts = self.custom_dts.copy()
        cp_range = get_pokemon_cp_range(self.mon_id, 20)
        dts.update({
            # Identification
            'gym_id':
            self.gym_id,

            # Time Remaining
            'raid_time_left':
            raid_end_time[0],
            '12h_raid_end':
            raid_end_time[1],
            '24h_raid_end':
            raid_end_time[2],

            # Location
            'lat':
            self.lat,
            'lng':
            self.lng,
            'lat_5':
            "{:.5f}".format(self.lat),
            'lng_5':
            "{:.5f}".format(self.lng),
            'distance': (get_dist_as_str(self.distance)
                         if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction':
            self.direction,
            'gmaps':
            get_gmaps_link(self.lat, self.lng),
            'applemaps':
            get_applemaps_link(self.lat, self.lng),
            'geofence':
            self.geofence,

            # Raid Info
            'raid_lvl':
            self.raid_lvl,
            'mon_name':
            locale.get_pokemon_name(self.mon_id),
            'mon_id':
            self.mon_id,
            'mon_id_3':
            "{:03}".format(self.mon_id),
            # TODO: Form?

            # Quick Move
            'quick_move':
            locale.get_move_name(self.quick_id),
            'quick_id':
            self.quick_id,
            'quick_damage':
            self.quick_damage,
            'quick_dps':
            self.quick_dps,
            'quick_duration':
            self.quick_duration,
            'quick_energy':
            self.quick_energy,
            # Charge Move
            'charge_move':
            locale.get_move_name(self.charge_id),
            'charge_id':
            self.charge_id,
            'charge_damage':
            self.charge_damage,
            'charge_dps':
            self.charge_dps,
            'charge_duration':
            self.charge_duration,
            'charge_energy':
            self.charge_energy,
            # Potential CP
            'min_cp':
            cp_range[0],
            'max_cp':
            cp_range[1],

            # Gym Details
            'gym_name':
            self.gym_name,
            'gym_description':
            self.gym_description,
            'gym_image':
            self.gym_image,
            'team_id':
            self.current_team_id,
            'team_name':
            locale.get_team_name(self.current_team_id),
            'team_leader':
            locale.get_leader_name(self.current_team_id)
        })
        return dts
示例#17
0
    def generate_dts(self, locale, timezone, units):
        """ Return a dict with all the DTS for this event. """
        time = get_time_as_str(self.disappear_time, timezone)

        form_name = locale.get_form_name(self.monster_id, self.form_id)
        costume_name = locale.get_costume_name(self.monster_id,
                                               self.costume_id)

        weather_name = locale.get_weather_name(self.weather_id)
        boosted_weather_name = locale.get_weather_name(self.boosted_weather_id)

        type1 = locale.get_type_name(self.types[0])
        type2 = locale.get_type_name(self.types[1])

        dts = self.custom_dts.copy()
        dts.update({
            # Identification
            'encounter_id': self.enc_id,
            'mon_name': locale.get_pokemon_name(self.monster_id),
            'mon_id': self.monster_id,
            'mon_id_3': "{:03}".format(self.monster_id),

            # Time Remaining
            'time_left': time[0],
            '12h_time': time[1],
            '24h_time': time[2],
            'time_left_no_secs': time[3],
            '12h_time_no_secs': time[4],
            '24h_time_no_secs': time[5],
            'time_left_raw_hours': time[6],
            'time_left_raw_minutes': time[7],
            'time_left_raw_seconds': time[8],

            # Spawn Data
            'spawn_start': self.spawn_start,
            'spawn_end': self.spawn_end,
            'spawn_verified':
                self.spawn_verified > 0 if Unknown.is_not(self.spawn_verified)
                else Unknown.REGULAR,
            'spawn_verified_emoji': get_spawn_verified_emoji(self.spawn_verified),
            'spawn_verified_emoji_or_empty': (
                '' if self.spawn_verified != 1
                else get_spawn_verified_emoji(self.spawn_verified)),
            'spawn_unverified_emoji_or_empty': (
                '' if self.spawn_verified != 0
                else get_spawn_verified_emoji(self.spawn_verified)),

            # Location
            'lat': self.lat,
            'lng': self.lng,
            'lat_5': "{:.5f}".format(self.lat),
            'lng_5': "{:.5f}".format(self.lng),
            'distance': (
                get_dist_as_str(self.distance, units)
                if Unknown.is_not(self.distance) else Unknown.SMALL),
            'direction': self.direction,
            'gmaps': get_gmaps_link(self.lat, self.lng),
            'applemaps': get_applemaps_link(self.lat, self.lng),
            'waze': get_waze_link(self.lat, self.lng),
            'geofence': self.geofence,

            # Weather
            'weather_id': self.weather_id,
            'weather': weather_name,
            'weather_or_empty': Unknown.or_empty(weather_name),
            'weather_emoji': get_weather_emoji(self.weather_id),
            'boosted_weather_id': self.boosted_weather_id,
            'boosted_weather': boosted_weather_name,
            'boosted_weather_or_empty': (
                '' if self.boosted_weather_id == 0
                else Unknown.or_empty(boosted_weather_name)),
            'boosted_weather_emoji':
                get_weather_emoji(self.boosted_weather_id),
            'boosted_or_empty': locale.get_boosted_text() if \
                Unknown.is_not(self.boosted_weather_id) and
                self.boosted_weather_id != 0 else '',

            # Encounter Stats
            'mon_lvl': self.mon_lvl,
            'cp': self.cp,

            # IVs
            'iv_0': (
                "{:.0f}".format(self.iv) if Unknown.is_not(self.iv)
                else Unknown.TINY),
            'iv': (
                "{:.1f}".format(self.iv) if Unknown.is_not(self.iv)
                else Unknown.SMALL),
            'iv_2': (
                "{:.2f}".format(self.iv) if Unknown.is_not(self.iv)
                else Unknown.SMALL),
            'atk': self.atk_iv,
            'def': self.def_iv,
            'sta': self.sta_iv,

            # PVP Information
            'great_mon_id': self.great_id,
            'great_product': self.great_product,
            'great_mon_name': locale.get_pokemon_name(self.great_id),
            'great_cp': self.great_cp,
            'great_level': self.great_level,
            'great_url': 'https://www.stadiumgaming.gg/rank-checker?'
                + urlencode({
                    'pokemon': re.sub(r'[^A-Za-z0-9\s]+', '',
                                      locale.get_english_pokemon_name(
                                          self.great_id)),
                    'league': '1500',
                    'att_iv': self.atk_iv,
                    'def_iv': self.def_iv,
                    'hp_iv': self.sta_iv,
                    'min_iv': '0',
                    'include-best-buddy': 'false'
                }),
            'great_pvpoke':
                'https://pvpoke.com/rankings/all/1500/overall/{}{}/'.format(
                    re.sub(r'[^A-Za-z0-9\s]+', '',
                           locale.get_english_pokemon_name(self.great_id))
                    .lower().replace(' ', '_'),
                    '_' + re.sub(r'[^A-Za-z0-9\s]+', '',
                                 locale.get_english_form_name(
                                     self.great_id, self.form_id)
                                 .lower().replace(' ', '_'))
                    if not any(x in locale.get_english_form_name(
                        self.great_id, self.form_id)
                           for x in ['unknown', 'Normal'])
                    else ''),
            'ultra_mon_id': self.ultra_id,
            'ultra_product': self.ultra_product,
            'ultra_mon_name': locale.get_pokemon_name(self.ultra_id),
            'ultra_cp': self.ultra_cp,
            'ultra_level': self.ultra_level,
            'ultra_url': 'https://www.stadiumgaming.gg/rank-checker?'
                + urlencode({
                    'pokemon': re.sub(r'[^A-Za-z0-9\s]+', '',
                                      locale.get_english_pokemon_name(
                                          self.ultra_id)),
                    'league': '2500',
                    'att_iv': self.atk_iv,
                    'def_iv': self.def_iv,
                    'hp_iv': self.sta_iv,
                    'min_iv': '0',
                    'include-best-buddy': 'false'
                }),
            'ultra_pvpoke':
                'https://pvpoke.com/rankings/all/2500/overall/{}{}/'.format(
                    re.sub(r'[^A-Za-z0-9\s]+', '',
                           locale.get_english_pokemon_name(self.ultra_id))
                    .lower().replace(' ', '_'),
                    '_' + re.sub(r'[^A-Za-z0-9\s]+', '',
                                 locale.get_english_form_name(
                                     self.ultra_id, self.form_id)
                                 .lower().replace(' ', '_'))
                    if not any(x in locale.get_english_form_name(
                        self.ultra_id, self.form_id)
                               for x in ['unknown', 'Normal'])
                    else ''),
            # Type
            'type1': type1,
            'type1_or_empty': Unknown.or_empty(type1),
            'type1_emoji': Unknown.or_empty(get_type_emoji(self.types[0])),
            'type2': type2,
            'type2_or_empty': Unknown.or_empty(type2),
            'type2_emoji': Unknown.or_empty(get_type_emoji(self.types[1])),
            'types': (
                "{}/{}".format(type1, type2)
                if Unknown.is_not(type2) else type1),
            'types_emoji': (
                "{}{}".format(
                    get_type_emoji(self.types[0]),
                    get_type_emoji(self.types[1]))
                if Unknown.is_not(type2) else get_type_emoji(self.types[0])),

            # Form
            'form': form_name,
            'form_or_empty': Unknown.or_empty(form_name),
            'form_id': self.form_id,
            'form_id_2': "{:02d}".format(self.form_id),
            'form_id_3': "{:03d}".format(self.form_id),

            # Costume
            'costume': costume_name,
            'costume_or_empty': Unknown.or_empty(costume_name),
            'costume_id': self.costume_id,
            'costume_id_2': "{:02d}".format(self.costume_id),
            'costume_id_3': "{:03d}".format(self.costume_id),

            # Quick Move
            'quick_move': locale.get_move_name(self.quick_id),
            'quick_id': self.quick_id,
            'quick_type_id': self.quick_type,
            'quick_type': locale.get_type_name(self.quick_type),
            'quick_type_emoji': get_type_emoji(self.quick_type),
            'quick_damage': self.quick_damage,
            'quick_dps': self.quick_dps,
            'quick_duration': self.quick_duration,
            'quick_energy': self.quick_energy,

            # Charge Move
            'charge_move': locale.get_move_name(self.charge_id),
            'charge_id': self.charge_id,
            'charge_type_id': self.charge_type,
            'charge_type': locale.get_type_name(self.charge_type),
            'charge_type_emoji': get_type_emoji(self.charge_type),
            'charge_damage': self.charge_damage,
            'charge_dps': self.charge_dps,
            'charge_duration': self.charge_duration,
            'charge_energy': self.charge_energy,

            # Cosmetic
            'gender': self.gender,
            'height_0': (
                "{:.0f}".format(self.height) if Unknown.is_not(self.height)
                else Unknown.TINY),
            'height': (
                "{:.1f}".format(self.height) if Unknown.is_not(self.height)
                else Unknown.SMALL),
            'height_2': (
                "{:.2f}".format(self.height) if Unknown.is_not(self.height)
                else Unknown.SMALL),
            'weight_0': (
                "{:.0f}".format(self.weight) if Unknown.is_not(self.weight)
                else Unknown.TINY),
            'weight': (
                "{:.1f}".format(self.weight) if Unknown.is_not(self.weight)
                else Unknown.SMALL),
            'weight_2': (
                "{:.2f}".format(self.weight) if Unknown.is_not(self.weight)
                else Unknown.SMALL),
            'size': locale.get_size_name(self.size_id),

            # Misc
            'atk_grade': (
                Unknown.or_empty(self.atk_grade, Unknown.TINY)),
            'def_grade': (
                Unknown.or_empty(self.def_grade, Unknown.TINY)),
            'rarity_id': self.rarity_id,
            'rarity': locale.get_rarity_name(self.rarity_id),

            # Catch Prob
            'base_catch_0': (
                "{:.0f}".format(self.base_catch * 100)
                if Unknown.is_not(self.base_catch)
                else Unknown.TINY),
            'base_catch': (
                "{:.1f}".format(self.base_catch * 100)
                if Unknown.is_not(self.base_catch)
                else Unknown.SMALL),
            'base_catch_2': (
                "{:.2f}".format(self.base_catch * 100)
                if Unknown.is_not(self.base_catch)
                else Unknown.SMALL),
            'great_catch_0': (
                "{:.0f}".format(self.great_catch * 100)
                if Unknown.is_not(self.great_catch)
                else Unknown.TINY),
            'great_catch': (
                "{:.1f}".format(self.great_catch * 100)
                if Unknown.is_not(self.great_catch)
                else Unknown.SMALL),
            'great_catch_2': (
                "{:.2f}".format(self.great_catch * 100)
                if Unknown.is_not(self.great_catch)
                else Unknown.SMALL),
            'ultra_catch_0': (
                "{:.0f}".format(self.ultra_catch * 100)
                if Unknown.is_not(self.ultra_catch)
                else Unknown.TINY),
            'ultra_catch': (
                "{:.1f}".format(self.ultra_catch * 100)
                if Unknown.is_not(self.ultra_catch)
                else Unknown.SMALL),
            'ultra_catch_2': (
                "{:.2f}".format(self.ultra_catch * 100)
                if Unknown.is_not(self.ultra_catch)
                else Unknown.SMALL),

            # Misc
            'big_karp': (
                'big' if self.monster_id == 129 and Unknown.is_not(self.weight)
                and self.weight >= 13.13 else ''),
            'tiny_rat': (
                'tiny' if self.monster_id == 19 and Unknown.is_not(self.weight)
                and self.weight <= 2.41 else '')
        })
        return dts