예제 #1
0
def load_gym_section(settings):
    log.info("Setting Gym filters...")
    # Set the defaults for "True"
    # Override defaults using a new Filter to verify inputs
    default_filt = GymFilter(settings.pop('default', {}), {
        "to_team": {0, 1, 2, 3}, "from_team": {0, 1, 2, 3},
        "min_dist": 0.0, "max_dist": float('inf')
    }, 'default')
    default = default_filt.to_dict()
    # Create the settings for gyms
    gym = {
        "enabled": bool(parse_boolean(settings.pop('enabled', None)) or False),
        "ignore_neutral": bool(parse_boolean(settings.pop('ignore_neutral', None)) or False),
        "filters": create_multi_filter('Gym --> filters', GymFilter,
                                       settings.pop('filters', "False"), default)
    }

    reject_leftover_parameters(settings, 'Gym section of Filters file.')  # Check for leftovers

    for filt in gym['filters']:
        log.debug("Team(s) {} changes to Team(s) {} between {} and {}.".format(
            filt.from_team, filt.to_team, get_dist_as_str(filt.min_dist), get_dist_as_str(filt.max_dist)
        ))
    if gym['enabled'] is False:
        log.info("Gym notifications will NOT be sent. - Enabled is False  ")
    return gym
예제 #2
0
파일: Load.py 프로젝트: kvangent/PokeAlarm
def parse_alarms_file(manager, filename):
    try:
        filepath = utils.get_path(filename)
        log.info("Loading Alarms from file at {}".format(filepath))
        with open(filepath, 'r') as f:
            alarm_settings = json.load(f, object_pairs_hook=OrderedDict)
        if type(alarm_settings) is not OrderedDict:
            log.critical("Alarms file must be an object of Alarms objects "
                         + "- { 'alarm1': {...}, ... 'alarm5': {...} }")
            sys.exit(1)
    except ValueError as e:
        log.error("Encountered error while loading Alarms:"
                  " {}: {}".format(type(e).__name__, e))
        log.error(
            "PokeAlarm has encountered a 'ValueError' while loading the "
            "Alarms file. This typically means the file isn't in the "
            "correct json format. Try loading the file contents into a "
            "json validator.")
        log.debug("Stack trace: \n {}".format(traceback.format_exc()))
        sys.exit(1)

    try:
        for name, alarm in alarm_settings.iteritems():
            active = parse_boolean(require_and_remove_key(
                'active', alarm, "Alarm objects in file."))
            if active:
                manager.add_alarm(name, alarm)
            else:
                log.debug("%s alarm ignored: active is set to 'false'", name)
    except Exception as e:
        log.error("Encountered error while loading Alarms: "
                  + "{}: {}".format(type(e).__name__, e))
        log.debug("Stack trace: \n {}".format(traceback.format_exc()))
        sys.exit(1)
예제 #3
0
    def __init__(self, settings, default, location):
        self.min_dist = float(settings.pop('min_dist', None) or default['min_dist'])
        self.max_dist = float(settings.pop('max_dist', None) or default['max_dist'])
        # Do we ignore pokemon with missing info?
        self.ignore_missing = bool(parse_boolean(settings.pop('ignore_missing', default['ignore_missing'])))
        # CP
        self.min_cp = int(settings.pop('min_cp', None) or default['min_cp'])
        self.max_cp = int(settings.pop('max_cp', None) or default['max_cp'])
        # Level
        self.min_level = int(settings.pop('min_level', None) or default['min_level'])
        self.max_level = int(settings.pop('max_level', None) or default['max_level'])
        # IVs
        self.min_iv = float(settings.pop('min_iv', None) or default['min_iv'])
        self.max_iv = float(settings.pop('max_iv', None) or default['max_iv'])
        self.min_atk = int(settings.pop('min_atk', None) or default['min_atk'])
        self.max_atk = int(settings.pop('max_atk', None) or default['max_atk'])
        self.min_def = int(settings.pop('min_def', None) or default['min_def'])
        self.max_def = int(settings.pop('max_def', None) or default['max_def'])
        self.min_sta = int(settings.pop('min_sta', None) or default['min_sta'])
        self.max_sta = int(settings.pop('max_sta', None) or default['max_sta'])
        # Size
        self.sizes = PokemonFilter.check_sizes(settings.pop("size", default['size']))
        self.genders = PokemonFilter.check_genders(settings.pop("gender", default['gender']))
        self.forms = PokemonFilter.check_forms(settings.pop("form", default['form']))
        # Moves - These can't be set in the default filter
        self.req_quick_move = PokemonFilter.create_moves_list(settings.pop("quick_move", default['quick_move']))
        self.req_charge_move = PokemonFilter.create_moves_list(settings.pop("charge_move", default['charge_move']))
        self.req_moveset = PokemonFilter.create_moveset_list(settings.pop("moveset",  default['moveset']))

        reject_leftover_parameters(settings, "pokemon filter under '{}'".format(location))
예제 #4
0
def load_raid_section(settings):
    log.info("Setting up Raid Filters...")
    raid = {
        "enabled": bool(parse_boolean(settings.pop('enabled', None)) or False)
    }

    # load any raid pokemon filters
    filters = load_pokemon_filters(settings)
    raid['filters'] = filters

    return raid
예제 #5
0
def load_egg_section(settings):
    log.info("Setting up Egg Filters...")
    egg = {
        "enabled": bool(parse_boolean(settings.pop('enabled', None)) or False),
        "min_level": int(settings.pop('min_level', 0) or 0),
        "max_level": int(settings.pop('max_level', 10) or 10)
    }

    log.debug("Report eggs between level {} and {}".format(egg['min_level'], egg['max_level']))

    return egg
예제 #6
0
def load_pokemon_section(settings):
    log.info("Setting Pokemon filters...")
    pokemon = { "enabled": bool(parse_boolean(settings.pop('enabled', None)) or False)}

    filters = load_pokemon_filters(settings)
    pokemon['filters'] = filters
    # Output filters
    log.debug(filters)
    for pkmn_id in sorted(filters):
        log.debug("The following filters are set for #{}:".format(pkmn_id))
        for i in range(len(filters[pkmn_id])):
            log.debug("F#{}: ".format(i) + filters[pkmn_id][i].to_string())
    if pokemon['enabled'] is False:
        log.info("Pokemon notifications will NOT be sent - Enabled is False.")
    return pokemon
예제 #7
0
def load_pokestop_section(settings):
    log.info("Setting Pokestop filters...")
    # Set the defaults settings for "True"
    default_true = {"min_dist": 0.0, "max_dist": float('inf')}
    stop = {
        "enabled": bool(parse_boolean(require_and_remove_key('enabled', settings, 'Pokestops')) or False),
        "filters": create_multi_filter('Pokestops --> filters', PokestopFilter,
                                       settings.pop('filters', "False"), default_true)
    }

    reject_leftover_parameters(settings, "Pokestops section of Filters file.")
    for filt in stop['filters']:
        log.debug("Between {} and {} away.".format(
            get_dist_as_str(filt.min_dist), get_dist_as_str(filt.max_dist)))
    if stop['enabled'] is False:
        log.info("Pokestop notifications will NOT be sent - Enabled is False.")
    return stop
예제 #8
0
def create_multi_filter(location, FilterType, settings, default):
    bool = parse_boolean(settings)
    if bool is not None:  # Make a new filter off of one of the defaults
        if bool is True:
            return [FilterType({}, default, location)]
        else:
            return None
    elif type(settings) == dict:  # Single filter
        return [FilterType(settings, default, location)]
    elif type(settings) == list:  # Multiple Filters
        rtn = []
        for filt in settings:
            rtn.append(FilterType(filt, default, location))
        return rtn
    else:
        log.error("{} contains filter that is not in the proper format. Accepted formats are: ".format(location))
        log.error("'True' for default filter, 'False' for disabled,")
        log.error("{ ... filter info ...} for a single filter,")
        log.error("[ {filter1}, {filter2}, {filter3} ] for multiple filters. ")
        log.error("Please check the PokeAlarm documentation for more information.")
        sys.exit(1)
예제 #9
0
def create_multi_filter(location, FilterType, settings, default):
    bool = parse_boolean(settings)
    if bool is not None:  # Make a new filter off of one of the defaults
        if bool is True:
            return [FilterType({}, default, location)]
        else:
            return None
    elif type(settings) == dict:  # Single filter
        return [FilterType(settings, default, location)]
    elif type(settings) == list:  # Multiple Filters
        rtn = []
        for filt in settings:
            rtn.append(FilterType(filt, default, location))
        return rtn
    else:
        log.error(
            "{} contains filter that is not in the proper format. Accepted formats are: "
            .format(location))
        log.error("'True' for default filter, 'False' for disabled,")
        log.error("{ ... filter info ...} for a single filter,")
        log.error("[ {filter1}, {filter2}, {filter3} ] for multiple filters. ")
        log.error(
            "Please check the PokeAlarm documentation for more information.")
        sys.exit(1)
예제 #10
0
 def load_alarms_file(self, file_path, max_attempts):
     log.info("Loading Alarms from the file at {}".format(file_path))
     try:
         with open(file_path, 'r') as f:
             alarm_settings = json.load(f)
         if type(alarm_settings) is not list:
             log.critical(
                 "Alarms file must be a list of Alarms objects - [ {...}, {...}, ... {...} ]"
             )
             sys.exit(1)
         self.__alarms = []
         for alarm in alarm_settings:
             if parse_boolean(
                     require_and_remove_key(
                         'active', alarm,
                         "Alarm objects in Alarms file.")) is True:
                 _type = require_and_remove_key(
                     'type', alarm, "Alarm objects in Alarms file.")
                 self.set_optional_args(str(alarm))
                 if _type == 'discord':
                     from Discord import DiscordAlarm
                     self.__alarms.append(
                         DiscordAlarm(alarm, max_attempts,
                                      self.__google_key))
                 elif _type == 'facebook_page':
                     from FacebookPage import FacebookPageAlarm
                     self.__alarms.append(FacebookPageAlarm(alarm))
                 elif _type == 'pushbullet':
                     from Pushbullet import PushbulletAlarm
                     self.__alarms.append(PushbulletAlarm(alarm))
                 elif _type == 'slack':
                     from Slack import SlackAlarm
                     self.__alarms.append(
                         SlackAlarm(alarm, self.__google_key))
                 elif _type == 'telegram':
                     from Telegram import TelegramAlarm
                     self.__alarms.append(TelegramAlarm(alarm))
                 elif _type == 'twilio':
                     from Twilio import TwilioAlarm
                     self.__alarms.append(TwilioAlarm(alarm))
                 elif _type == 'twitter':
                     from Twitter import TwitterAlarm
                     self.__alarms.append(TwitterAlarm(alarm))
                 else:
                     log.error("Alarm type not found: " + alarm['type'])
                     log.error(
                         "Please consult the PokeAlarm documentation accepted Alarm Types"
                     )
                     sys.exit(1)
             else:
                 log.debug("Alarm not activated: " + alarm['type'] +
                           " because value not set to \"True\"")
         log.info("{} active alarms found.".format(len(self.__alarms)))
         return  # all done
     except ValueError as e:
         log.error(
             "Encountered error while loading Alarms file: {}: {}".format(
                 type(e).__name__, e))
         log.error(
             "PokeAlarm has encountered a 'ValueError' while loading the Alarms file. This typically means your "
             +
             "file isn't in the correct json format. Try loading your file contents into a json validator."
         )
     except IOError as e:
         log.error("Encountered error while loading Alarms: {}: {}".format(
             type(e).__name__, e))
         log.error(
             "PokeAlarm was unable to find a filters file at {}." +
             "Please check that this file exists and PA has read permissions."
         ).format(file_path)
     except Exception as e:
         log.error("Encountered error while loading Alarms: {}: {}".format(
             type(e).__name__, e))
     log.debug("Stack trace: \n {}".format(traceback.format_exc()))
     sys.exit(1)
예제 #11
0
 def set_pokemon(self, settings):
     # Start a new dict to track filters
     pokemon = {
         'enabled': bool(parse_boolean(settings.pop('enabled', False)))
     }
     min_dist = float(settings.pop('min_dist', None) or 0)
     max_dist = float(settings.pop('max_dist', None) or 'inf')
     min_iv = float(settings.pop('min_iv', None) or 0)
     max_iv = float(settings.pop('max_iv', None) or 100)
     ignore_missing = bool(
         parse_boolean(settings.pop('ignore_missing', False)))
     if pokemon['enabled']:
         log.info(
             "Pokemon defaults: distance {:.2f} to {:.2f} / IV's {:.2f} to {:.2f}"
             .format(min_dist, max_dist, min_iv, max_iv))
     for name in settings:
         pkmn_id = get_pkmn_id(name)
         if pkmn_id is None:
             log.error("Unable to find pokemon named {}...".format(name))
             continue
         if parse_boolean(settings[name]
                          ) is False:  # If set to false, set it as false
             log.debug("{} name set to 'false'. Skipping... ".format(name))
             continue
         else:
             try:
                 info = settings[name]
                 if parse_boolean(info):  # Allow all defaults
                     info = {}
                 pokemon[pkmn_id] = {
                     "min_dist":
                     float(info.get('min_dist', None) or min_dist),
                     "max_dist":
                     float(info.get('max_dist', None) or max_dist),
                     "min_iv":
                     float(info.get('min_iv', None) or min_iv),
                     "max_iv":
                     float(info.get('max_iv', None) or max_iv),
                     "move_1":
                     self.required_moves(info.get("move_1", None)),
                     "move_2":
                     self.required_moves(info.get("move_2", None)),
                     "moveset":
                     self.required_moveset(info.get("moveset", None)),
                     "size":
                     self.check_sizes(info.get("size", None)),
                     "ignore_missing":
                     bool(
                         parse_boolean(
                             info.get('ignore_missing', ignore_missing)))
                 }
             except Exception as e:
                 log.error(
                     "Trying to set pokemon {} gave error: \n {}".format(
                         pkmn_id, e))
                 log.debug("Stack trace: \n {}".format(
                     traceback.format_exc()))
                 sys.exit(1)
     for key in sorted(pokemon.iterkeys()):  # Output the pokemon in order
         log.debug("#{} was set to the following: \n{}".format(
             key, json.dumps(pokemon[key], sort_keys=True, indent=4)))
     self.__pokemon_filter = pokemon