コード例 #1
0
    def setUp(self):
        self.user_session = UserSession('1488228')

        self.user_session.to_waiting_pizza_type()

        DialogEngine.process_message(self.user_session, Options.pizza_big)

        DialogEngine.process_message(self.user_session, Options.payment_card)
コード例 #2
0
    def __get_audio(self, bot: TelegramBot, update: Update):
        chat_id = update.message.chat.id
        if chat_id not in self.__sessions:
            self.__sessions[chat_id] = UserSession(chat_id)

        current_session: UserSession = self.__sessions[chat_id]
        audio_getter = YoutubeAudioGetter()
        part_time = current_session.get_part_time()
        if part_time > 0:
            audio_getter.set_part_len(part_time)
        current_session.set_audio_getter(audio_getter)

        url = None
        entities = update.message.entities
        if entities:
            if entities[0].type == MessageEntity.URL:
                url = update.message.parse_entity(entities[0])

        if not url:
            return update.message.chat.send_message("Send url!")

        audio_files: List[AudioFile] = current_session.get_audio(url)
        for audio_file in audio_files:
            with open(audio_file.get_filename(), 'rb') as file:
                result = update.message.chat.send_audio(
                    file, caption=audio_file.get_name())
            logging.info(result)
コード例 #3
0
 def __start(self, bot: TelegramBot, update: Update):
     chat_id = update.message.chat.id
     if chat_id in self.__sessions:
         del self.__sessions[chat_id]
         self.__sessions[chat_id] = UserSession(chat_id)
     update.message.chat.send_message(
         "Hey! Use /help to get list of commands. Send url to download audio."
     )
コード例 #4
0
class TestChoosingPaymentDialog(TestCase):
    def setUp(self):
        self.user_session = UserSession('1488228')

        self.user_session.to_waiting_pizza_type()

        DialogEngine.process_message(self.user_session, Options.pizza_big)

    # === test payment method choosing ===

    def test_payment_choosing_wrong_choice(self):
        previous_state = self.user_session.state

        message = DialogEngine.process_message(self.user_session,
                                               'любой неверный выбор')

        self.assertEqual(message, Messages.error)

        self.assertEqual(previous_state, self.user_session.state)

    def test_payment_choosing_cash_choice(self):
        message = DialogEngine.process_message(self.user_session,
                                               Options.payment_cash)

        self.assertEqual(
            message,
            Messages.verify_order_msg(PizzaType.big, PaymentMethod.cash))

        self.assertTrue(self.user_session.is_verifying_order())

        self.assertEqual(self.user_session.payment_method, PaymentMethod.cash)

    def test_payment_choosing_card_choice(self):
        message = DialogEngine.process_message(self.user_session,
                                               Options.payment_card)

        self.assertEqual(
            message,
            Messages.verify_order_msg(PizzaType.big, PaymentMethod.card))

        self.assertTrue(self.user_session.is_verifying_order())

        self.assertEqual(self.user_session.payment_method, PaymentMethod.card)
コード例 #5
0
class TestOrderVerifyingDialog(TestCase):
    def setUp(self):
        self.user_session = UserSession('1488228')

        self.user_session.to_waiting_pizza_type()

        DialogEngine.process_message(self.user_session, Options.pizza_big)

        DialogEngine.process_message(self.user_session, Options.payment_card)

    # === test order verifying ===

    def test_order_verifying_wrong_choice(self):
        previous_state = self.user_session.state

        message = DialogEngine.process_message(self.user_session,
                                               'любой текст')

        self.assertEqual(message, Messages.error)

        self.assertEqual(self.user_session.state, previous_state)

    def test_order_verifying_verify_choice(self):
        message = DialogEngine.process_message(self.user_session,
                                               Options.order_verify)

        self.assertEqual(message, Messages.order_created)

        self.assertTrue(self.user_session.is_initial())

    def test_order_verifying_decline_choice(self):
        messages = DialogEngine.process_message(self.user_session,
                                                Options.order_decline)

        self.assertListEqual(messages,
                             [Messages.restart_order, Messages.choose_pizza])

        self.assertTrue(self.user_session.is_waiting_pizza_type())
コード例 #6
0
class TestChoosingPizzaDialog(TestCase):
    def setUp(self):
        self.user_session = UserSession('1488228')

        self.user_session.to_waiting_pizza_type()

    # === test pizza choosing ===

    def test_pizza_choosing_wrong_choice(self):
        previous_state = self.user_session.state

        message = DialogEngine.process_message(self.user_session,
                                               'любой неверный выбор')

        self.assertEqual(message, Messages.error)

        self.assertEqual(self.user_session.state, previous_state)

    def test_pizza_choosing_small_pizza_choice(self):
        message = DialogEngine.process_message(self.user_session,
                                               Options.pizza_small)

        self.assertEqual(message, Messages.choose_payment)

        self.assertTrue(self.user_session.is_waiting_payment_method())

        self.assertEqual(self.user_session.pizza_type, PizzaType.small)

    def test_pizza_choosing_big_pizza_choice(self):
        message = DialogEngine.process_message(self.user_session,
                                               Options.pizza_big)

        self.assertEqual(message, Messages.choose_payment)

        self.assertTrue(self.user_session.is_waiting_payment_method())

        self.assertEqual(self.user_session.pizza_type, PizzaType.big)
コード例 #7
0
class TestInitDialog(TestCase):
    def setUp(self):
        self.user_session = UserSession('1488228')

    # === test dialog initializing ===

    def test_init_dialog(self):
        messages = DialogEngine.process_message(
            self.user_session, 'любое сообщение для начала диалога')

        self.assertEqual(len(messages),
                         2,
                         msg='в первом состоянии должно быть два сообщения')

        self.assertListEqual(messages, [Messages.hello, Messages.choose_pizza])

        self.assertTrue(self.user_session.is_waiting_pizza_type())
コード例 #8
0
    def process_message(cls, session: UserSession, message_text: str):
        if session.state == 'initial':
            if session.start_ordering():
                return [Messages.hello, Messages.choose_pizza]

            else:
                return Messages.error

        elif session.state == 'waiting_pizza_type':
            try:
                pizza_type = cls.parse_pizza_type(message_text)

            except ValueError:
                return Messages.error

            if session.approve_pizza_type(pizza_type):
                return Messages.choose_payment

            else:
                return Messages.error

        elif session.state == 'waiting_payment_method':
            try:
                payment_method = cls.parse_payment_method(message_text)

            except ValueError:
                return Messages.error

            if session.approve_payment_method(payment_method):
                return Messages.verify_order_msg(session.pizza_type,
                                                 session.payment_method)

            else:
                return Messages.error

        elif session.state == 'verifying_order':
            try:
                order_was_verified = cls.parse_verifying_order(message_text)

            except ValueError:
                return Messages.error

            if not order_was_verified:
                if session.decline_order():
                    return [Messages.restart_order, Messages.choose_pizza]

                else:
                    return Messages.error

            else:
                if session.verify_order():
                    # TODO: further order processing here
                    process_order(session.user_id, session.pizza_type,
                                  session.payment_method)

                    return Messages.order_created

                else:
                    return Messages.error

        return Messages.error
コード例 #9
0
 def setUp(self):
     self.user_session = UserSession('1488228')
コード例 #10
0
    def setUp(self):
        self.user_session = UserSession('1488228')

        self.user_session.to_waiting_pizza_type()
コード例 #11
0
def get_user_session(chat_id) -> UserSession:
    if sessions.get(chat_id) is None:
        sessions[chat_id] = UserSession(chat_id)

    return sessions[chat_id]