예제 #1
0
    def start(self):
        request = Request(con_pool_size=8)
        self.bot = MQBot(token=self.bot_key, request=request)
        self.subscription_watcher = SubscriptionWatcher.load_from_json(
            self.api, self.bot)
        self.subscription_watcher_thread = Thread(
            target=self.subscription_watcher.run)
        updater = Updater(bot=self.bot, use_context=True)
        dispatcher = updater.dispatcher
        logging.basicConfig(
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            level=logging.INFO)

        self.functionalities = self.initialise_functionalities()
        for func in self.functionalities:
            func.register(dispatcher)

        updater.start_polling()
        self.alive = True

        # Start the sub watcher
        self.subscription_watcher_thread.start()

        while self.alive:
            print("Main thread alive")
            try:
                time.sleep(30)
            except KeyboardInterrupt:
                self.alive = False

        # Kill the sub watcher
        self.subscription_watcher.running = False
        self.subscription_watcher_thread.join()
    def test_to_json_and_back(self, bot):
        test_watcher_file = "./test_subscription_watcher.json"
        if os.path.exists(test_watcher_file):
            os.remove(test_watcher_file)
        old_filename = SubscriptionWatcher.FILENAME
        SubscriptionWatcher.FILENAME = test_watcher_file
        api = MockExportAPI()
        latest_submissions = [
            SubmissionBuilder(submission_id="123243").build_short_submission(),
            SubmissionBuilder(submission_id="123242").build_short_submission(),
            SubmissionBuilder(submission_id="123240").build_short_submission()
        ]
        subscription1 = Subscription("query", 1234)
        subscription2 = Subscription("example", 5678)
        watcher = SubscriptionWatcher(api, bot)
        watcher._update_latest_ids(latest_submissions)
        watcher.subscriptions.add(subscription1)
        watcher.subscriptions.add(subscription2)
        watcher.blocklists[3452] = {"test", "example"}
        watcher.blocklists[1453] = {"ych"}

        try:
            watcher.save_to_json()
            new_watcher = SubscriptionWatcher.load_from_json(api, bot)

            assert len(new_watcher.latest_ids) == 3
            assert "123243" in new_watcher.latest_ids
            assert "123242" in new_watcher.latest_ids
            assert "123240" in new_watcher.latest_ids
            assert list(watcher.latest_ids) == list(new_watcher.latest_ids)
            assert len(new_watcher.subscriptions) == 2
            list_subs = list(new_watcher.subscriptions)
            if list_subs[0].query == "query":
                assert list_subs[0].destination == 1234
                assert list_subs[1].query == "example"
                assert list_subs[1].destination == 5678
            else:
                assert list_subs[0].query == "example"
                assert list_subs[0].destination == 5678
                assert list_subs[1].query == "query"
                assert list_subs[1].destination == 1234
            assert len(new_watcher.blocklists) == 2
            assert 3452 in new_watcher.blocklists
            assert len(new_watcher.blocklists[3452]) == 2
            assert isinstance(new_watcher.blocklists[3452], set)
            assert "test" in new_watcher.blocklists[3452]
            assert "example" in new_watcher.blocklists[3452]
            assert 1453 in new_watcher.blocklists
            assert len(new_watcher.blocklists[1453]) == 1
            assert isinstance(new_watcher.blocklists[1453], set)
            assert "ych" in new_watcher.blocklists[1453]
        finally:
            SubscriptionWatcher.FILENAME = old_filename
            os.remove(test_watcher_file)
    def test_from_json(self, bot):
        test_watcher_file = "./test_subscription_watcher.json"
        if os.path.exists(test_watcher_file):
            os.remove(test_watcher_file)
        old_filename = SubscriptionWatcher.FILENAME
        SubscriptionWatcher.FILENAME = test_watcher_file
        try:
            data = {
                "latest_ids": ["12423", "12422", "12420"],
                "subscriptions": [{
                    "query": "test",
                    "destination": 87238,
                    "latest_update": "2019-10-26T18:57:09"
                }, {
                    "query": "example",
                    "destination": -87023,
                    "latest_update": "2019-10-25T17:34:08"
                }],
                "blacklists": {
                    "8732": ["example", "ych"],
                    "-123": ["fred"]
                }
            }
            with open(test_watcher_file, "w+") as f:
                json.dump(data, f)
            api = MockExportAPI()

            watcher = SubscriptionWatcher.load_from_json(api, bot)

            assert len(watcher.latest_ids) == 3
            assert "12423" in watcher.latest_ids
            assert "12422" in watcher.latest_ids
            assert "12420" in watcher.latest_ids
            assert len(watcher.subscriptions) == 2
            list_subs = list(watcher.subscriptions)
            if list_subs[0].query == "test":
                assert list_subs[0].destination == 87238
                assert list_subs[0].latest_update == datetime.datetime(
                    2019, 10, 26, 18, 57, 9)
                assert list_subs[1].query == "example"
                assert list_subs[1].destination == -87023
                assert list_subs[1].latest_update == datetime.datetime(
                    2019, 10, 25, 17, 34, 8)
            else:
                assert list_subs[0].query == "example"
                assert list_subs[0].destination == -87023
                assert list_subs[0].latest_update == datetime.datetime(
                    2019, 10, 25, 17, 34, 8)
                assert list_subs[1].query == "test"
                assert list_subs[1].destination == 87238
                assert list_subs[1].latest_update == datetime.datetime(
                    2019, 10, 26, 18, 57, 9)
            assert len(watcher.blocklists) == 2
            assert 8732 in watcher.blocklists
            assert len(watcher.blocklists[8732]) == 2
            assert isinstance(watcher.blocklists[8732], set)
            assert "example" in watcher.blocklists[8732]
            assert "ych" in watcher.blocklists[8732]
            assert -123 in watcher.blocklists
            assert len(watcher.blocklists[-123]) == 1
            assert isinstance(watcher.blocklists[-123], set)
            assert "fred" in watcher.blocklists[-123]
        finally:
            SubscriptionWatcher.FILENAME = old_filename
            os.remove(test_watcher_file)