예제 #1
0
    def test_creating_worker(self):
        obj = convert_from_json("""[{
                "type": "HandleSoftBan"
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()

        self.assertIsInstance(tree[0], HandleSoftBan)
        self.assertIs(tree[0].bot, self.bot)
    def test_creating_worker(self):
        obj = convert_from_json("""[{
                "type": "HandleSoftBan"
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()

        self.assertIsInstance(tree[0], HandleSoftBan)
        self.assertIs(tree[0].bot, self.bot)
    def test_task_with_config(self):
        obj = convert_from_json("""[{
                "type": "IncubateEggs",
                "config": {
                    "longer_eggs_first": true
                }
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()
        self.assertTrue(tree[0].config.get('longer_eggs_first', False))
예제 #4
0
    def test_task_with_config(self):
        obj = convert_from_json("""[{
                "type": "IncubateEggs",
                "config": {
                    "longer_eggs_first": true
                }
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()
        self.assertTrue(tree[0].config.get('longer_eggs_first', False))
    def test_load_plugin_task(self):
        package_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'resources', 'plugin_fixture')
        plugin_loader = PluginLoader()
        plugin_loader.load_plugin(package_path)

        obj = convert_from_json("""[{
            "type": "plugin_fixture.FakeTask"
        }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()
        result = tree[0].work()
        self.assertEqual(result, 'FakeTask')
예제 #6
0
    def test_load_plugin_task(self):
        package_path = os.path.join(os.path.abspath(os.path.dirname(__file__)),
                                    'resources', 'plugin_fixture')
        plugin_loader = PluginLoader()
        plugin_loader.load_plugin(package_path)

        obj = convert_from_json("""[{
            "type": "plugin_fixture.FakeTask"
        }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()
        result = tree[0].work()
        self.assertEqual(result, 'FakeTask')
예제 #7
0
    def test_disabling_task(self):
        obj = convert_from_json("""[{
                "type": "HandleSoftBan",
                "config": {
                    "enabled": false
                }
            }, {
                "type": "CatchPokemon",
                "config": {
                    "enabled": true
                }
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()

        self.assertTrue(len(tree) == 1)
        self.assertIsInstance(tree[0], CatchPokemon)
예제 #8
0
    def test_should_throw_on_non_matching_type(self):
        obj = convert_from_json("""[{
                "type": "foo"
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)

        self.assertRaisesRegexp(ConfigException, "No worker named foo defined",
                                builder.build)
예제 #9
0
    def test_should_throw_on_no_type_key(self):
        obj = convert_from_json("""[{
                "bad_key": "foo"
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)

        self.assertRaisesRegexp(ConfigException,
                                "No type found for given task", builder.build)
    def test_disabling_task(self):
        obj = convert_from_json("""[{
                "type": "HandleSoftBan",
                "config": {
                    "enabled": false
                }
            }, {
                "type": "CatchLuredPokemon",
                "config": {
                    "enabled": true
                }
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)
        tree = builder.build()

        self.assertTrue(len(tree) == 1)
        self.assertIsInstance(tree[0], CatchLuredPokemon)
예제 #11
0
    def test_should_throw_on_wrong_evolve_task_name(self):
        obj = convert_from_json("""[{
                "type": "EvolveAll"
            }]""")

        builder = TreeConfigBuilder(self.bot, obj)

        self.assertRaisesRegexp(
            ConfigException,
            "The EvolveAll task has been renamed to EvolvePokemon",
            builder.build)
예제 #12
0
    def setupUnsupportedBuilder(self):
        package_path = os.path.join(os.path.abspath(os.path.dirname(__file__)),
                                    '..', 'pokemongo_bot', 'test', 'resources',
                                    'plugin_fixture')
        plugin_loader = PluginLoader()
        plugin_loader.load_plugin(package_path)

        obj = convert_from_json("""[{
            "type": "plugin_fixture.UnsupportedApiTask"
        }]""")

        return TreeConfigBuilder(self.bot, obj)
예제 #13
0
 def initialize_task(bot, config):
     tree = TreeConfigBuilder(bot, config.raw_tasks).build()
     bot.workers = tree
예제 #14
0
def main():
    bot = False

    def handle_sigint(*args):
        raise SIGINTRecieved

    signal.signal(signal.SIGINT, handle_sigint)

    def get_commit_hash():
        try:
            hash = subprocess.check_output(['git', 'rev-parse', 'HEAD'],
                                           stderr=subprocess.STDOUT)[:-1]

            return hash if all(c in string.hexdigits
                               for c in hash) else "not found"
        except:
            return "not found"

    try:
        logger.info('PokemonGO Bot v1.0')
        logger.info('commit: ' + get_commit_hash())
        sys.stdout = codecs.getwriter('utf8')(sys.stdout)
        sys.stderr = codecs.getwriter('utf8')(sys.stderr)

        config = init_config()
        if not config:
            return

        logger.info('Configuration initialized')
        health_record = BotEvent(config)
        health_record.login_success()

        finished = False

        while not finished:
            try:
                bot = PokemonGoBot(config)
                bot.start()
                tree = TreeConfigBuilder(bot, config.raw_tasks).build()
                bot.workers = tree
                bot.metrics.capture_stats()
                bot.health_record = health_record

                bot.event_manager.emit('bot_start',
                                       sender=bot,
                                       level='info',
                                       formatted='Starting bot...')

                while True:
                    bot.tick()

            except KeyboardInterrupt:
                bot.event_manager.emit('bot_exit',
                                       sender=bot,
                                       level='info',
                                       formatted='Exiting bot.')
                finished = True
                report_summary(bot)

            except NotLoggedInException:
                wait_time = config.reconnecting_timeout * 60
                bot.event_manager.emit(
                    'api_error',
                    sender=bot,
                    level='info',
                    formatted='Log logged in, reconnecting in {:d}'.format(
                        wait_time))
                time.sleep(wait_time)
            except ServerBusyOrOfflineException:
                bot.event_manager.emit('api_error',
                                       sender=bot,
                                       level='info',
                                       formatted='Server busy or offline')
            except ServerSideRequestThrottlingException:
                bot.event_manager.emit(
                    'api_error',
                    sender=bot,
                    level='info',
                    formatted='Server is throttling, reconnecting in 30 seconds'
                )
                time.sleep(30)

    except PermaBannedException:
        bot.event_manager.emit(
            'api_error',
            sender=bot,
            level='info',
            formatted=
            'Probably permabanned, Game Over ! Play again at https://club.pokemon.com/us/pokemon-trainer-club/sign-up/'
        )
    except GeocoderQuotaExceeded:
        raise Exception("Google Maps API key over requests limit.")
    except SIGINTRecieved:
        if bot:
            bot.event_manager.emit(
                'bot_interrupted',
                sender=bot,
                level='info',
                formatted='Bot caught SIGINT. Shutting down.')
            report_summary(bot)
    except Exception as e:
        # always report session summary and then raise exception
        if bot:
            report_summary(bot)

        raise
    finally:
        # Cache here on SIGTERM, or Exception.  Check data is available and worth caching.
        if bot:
            if bot.recent_forts[
                    -1] is not None and bot.config.forts_cache_recent_forts:
                cached_forts_path = os.path.join(
                    _base_dir, 'data',
                    'recent-forts-%s.json' % bot.config.username)
                try:
                    with open(cached_forts_path, 'w') as outfile:
                        json.dump(bot.recent_forts, outfile)
                    bot.event_manager.emit(
                        'cached_fort',
                        sender=bot,
                        level='debug',
                        formatted='Forts cached.',
                    )
                except IOError as e:
                    bot.event_manager.emit(
                        'error_caching_forts',
                        sender=bot,
                        level='debug',
                        formatted='Error caching forts for {path}',
                        data={'path': cached_forts_path})