def test_one_page_keyboard_json_markup_with_before():
    for test_case in one_page_test_cases:
        paginator = InlineKeyboardPaginator(*test_case)
        paginator.add_before(
            *extra_buttons
        )
        keyboard = json.loads(paginator.markup)['inline_keyboard']

        _verify_extra_buttons(keyboard[0])
def test_json_markup_with_before():
    for args, labels in label_test_cases.items():
        paginator = InlineKeyboardPaginator(*args)
        paginator.add_before(
            *extra_buttons
        )
        keyboard = json.loads(paginator.markup)['inline_keyboard']

        _verify_extra_buttons(keyboard[0])

        if not labels:
            continue

        assert len(keyboard[1]) == len(labels), \
            'In case init args {} button count not correct. Mast be {}'.format(args, len(labels))
示例#3
0
    def paginator(self, page, bot, edit_mess_id, first_res):

        paginator = InlineKeyboardPaginator(page_count=self.total_page,
                                            current_page=page,
                                            data_pattern='Trang#{page}')

        if first_res:
            print('===')
            end = timeit.default_timer()
            print('time send message :', end)
            print('time inference :', str(end - self.start))
            bot.sendMessage(
                chat_id=self.chat_id,
                # text=text,
                text=self.render_mess(page),
                reply_to_message_id=self.msg_id,
                reply_markup=paginator.markup)
        else:
            print('===')
            end = timeit.default_timer()
            print('time send message :', end)
            print('time inference :', str(end - self.start))
            bot.editMessageText(chat_id=self.chat_id,
                                text=self.render_mess(page),
                                message_id=edit_mess_id,
                                reply_markup=paginator.markup)
示例#4
0
def send_text(message, page=1, for_paging=False):
    if not for_paging:
        log_user_msgs(message.text, message.from_user)
        user_message = message.text.lower()
        chat_id = message.chat.id
    else:
        user_message, chat_id = message.split("~")

    msgs = generate_answer("chat", user_message, page)

    total = count_matched_documents(user_message)

    # markup = generate_pages(total, page, user_message)
    # bot.send_message(
    #    message.chat.id,
    #    msgs,
    #    reply_markup=markup
    # )

    if total > per_page:
        paginator = InlineKeyboardPaginator(
            math.ceil(total / per_page),
            current_page=page,
            data_pattern=user_message+'~'+str(chat_id)+'#{page}'
        )

    bot.send_message(
        chat_id,
        msgs,
        reply_markup=paginator.markup if total > per_page else [],
        parse_mode='Markdown'
    )
示例#5
0
def test_callback_data():
    for page_count in range(2, 6):
        for current_page in range(2, 6):
            paginator = InlineKeyboardPaginator(page_count, current_page, data_pattern='test#{page}#')
            keyboard = paginator.keyboard
            for button, num in zip(keyboard, range(1, 6)):
                data = 'test#{}#'.format(num)
                assert button['callback_data'] == data, \
                    'In case init args {} callback_data mast be {}'.format((page_count, current_page, 'test#{page}#'), data)

    for args, output in data_test_case.items():
        paginator = InlineKeyboardPaginator(*args)
        keyboard = paginator.keyboard
        for button, data in zip(keyboard, output):
            assert button['callback_data'] == data, \
                    'In case init args {} callback_data mast be {}'.format(args, data)
示例#6
0
async def test(message: types.Message, state: FSMContext):
    paginator = InlineKeyboardPaginator(len(data),
                                        current_page=0,
                                        data_pattern='page#{page}')
    # await TestState.TestState.set()
    await state.update_data(test_state="Test_State")

    await message.answer(data[0], reply_markup=paginator.markup)
示例#7
0
def start(update, context):

    paginator = InlineKeyboardPaginator(len(character_pages),
                                        data_pattern='character#{page}')

    update.message.reply_text(text=character_pages[0],
                              reply_markup=paginator.markup,
                              parse_mode='Markdown')
示例#8
0
async def send_character_page(message, page=1):
    paginator = InlineKeyboardPaginator(len(get_quontation()),
                                        current_page=page,
                                        data_pattern='character#{page}')

    await bot.send_message(message.chat.id,
                           get_quontation()[page - 1],
                           reply_markup=paginator.markup,
                           parse_mode='Markdown')
示例#9
0
def test_button_label():
    for args, labels in label_test_cases.items():
        paginator = InlineKeyboardPaginator(*args)
        keyboard = paginator.keyboard

        assert len(keyboard) == len(labels), \
            'In case init args {} button count not correct. Mast be {}'.format(args, len(labels))

        for button, label in zip(keyboard, labels):
            assert button['text'] == label, \
                'In case init args {} button label not correct. Must be {}'.format(args, label)
def test_json_markup_with_after():
    for args, labels in label_test_cases.items():
        paginator = InlineKeyboardPaginator(*args)
        paginator.add_after(
            *extra_buttons
        )
        keyboard = json.loads(paginator.markup)['inline_keyboard']

        if not labels:
            _verify_extra_buttons(keyboard[0])
            continue

        assert len(keyboard[0]) == len(labels), \
            'In case init args {} button count not correct. Mast be {}'.format(args, len(labels))

        # for button, label in zip(keyboard[0], labels):
        #     assert button['text'] == label, \
        #         'In case init args {} button label not correct. Must be {}'.format(args, label)

        _verify_extra_buttons(keyboard[1])
示例#11
0
async def send_current_page(message: types.Message, page: int = 1):
    """ Отображает текущую страницу из списка temp_text """

    try:
        paginator = InlineKeyboardPaginator(len(temp_text),
                                            current_page=page,
                                            data_pattern='character#{page}')
        answer_message = temp_text[page - 1]
        await message.answer(answer_message, reply_markup=paginator.markup)
    except Exception as ex:
        await message.answer("!!! Something bad with paging !!!\n"
                             f"{ex, ex.args}")
示例#12
0
def on_request(update: Update, context: CallbackContext):
    message = update.message

    paginator = InlineKeyboardPaginator(page_count=len(character_pages),
                                        current_page=1,
                                        data_pattern='character#{page}')

    character = character_pages[0]

    message.reply_photo(photo=open(character['image'], 'rb'),
                        caption="*{title}*".format(**character),
                        reply_markup=paginator.markup,
                        parse_mode=ParseMode.MARKDOWN)
示例#13
0
def send_character_page(message, page=1):
    paginator = InlineKeyboardPaginator(
        len(character_pages),
        current_page=page,
        data_pattern='character#{page}'
    )

    bot.send_message(
        message.chat.id,
        character_pages[page-1],
        reply_markup=paginator.markup,
        parse_mode='Markdown'
    )
示例#14
0
    async def send_opening(message, page=1):
        paginator = InlineKeyboardPaginator(
            len(openings),
            current_page=page,
            data_pattern='openings#{page}'
        )
        text = f"текст вакансии: {openings[page - 1].description}, \nПрислала: {openings[page - 1].contact}"

        await bot.send_message(
            chat_id=message.chat.id,
            text=text,
            reply_markup=paginator.markup,
            parse_mode='Markdown'
        )
示例#15
0
def send_character_page(message, page=1):
    # print(pers)
    chat_id = message.chat.id
    global clients
    if not clients[chat_id]:
        bot.send_message(chat_id,
                         'База пуста, отправьте файл. Информация /start')
        return
    paginator = InlineKeyboardPaginator(len(clients[chat_id]) // 6 + 1,
                                        current_page=page,
                                        data_pattern='character#{page}')

    for i in clients[chat_id][6 * (page - 1):6 * page]:
        paginator.add_before(
            InlineKeyboardButton(str(i[0]) + ':' + i[1],
                                 callback_data='pers:{}'.format(i[0])))

    print(page)

    bot.send_message(message.chat.id,
                     msg(clients[chat_id][page - 1]),
                     reply_markup=paginator.markup,
                     parse_mode='Markdown')
def characters_page_callback(update, context):
    query = update.callback_query

    query.answer()

    page = int(query.data.split('#')[1])

    paginator = InlineKeyboardPaginator(len(character_pages),
                                        current_page=page,
                                        data_pattern='character#{page}')

    query.edit_message_text(text=character_pages[page - 1],
                            reply_markup=paginator.markup,
                            parse_mode='Markdown')
示例#17
0
async def callback_test(call: CallbackQuery, state: FSMContext):
    print(f'-> {call.data}')
    page = call.data.split('#')[1]
    print(f'page={str(page)}')

    # await call.message.answer(call.message.text)
    paginator = InlineKeyboardPaginator(len(data),
                                        current_page=int(page),
                                        data_pattern='page#{page}')
    await call.message.edit_text(data[int(page) - 1],
                                 reply_markup=paginator.markup)
    data_state = await state.get_data()
    test_data = data_state.get("test_state")
    print(f"test_data = {test_data}")
示例#18
0
async def show_openings(call, openings):
    paginator = InlineKeyboardPaginator(
        len(openings),
        data_pattern='openings#{page}'
    )

    text = f"Последняя присланная вакансия: \n" \
           f"текст вакансии: {openings[-1].description}" \
           f"\nПрислала: {openings[-1].contact}"

    await call.reply(
        text=text,
        reply_markup=paginator.markup,
        parse_mode='Markdown'
    )
示例#19
0
def send_character_page(message, page=1):
    url = last_queries[str(message.chat.id)]
    result, meta = csapi.query_clearspending_text(url, page)
    if meta == None or meta["pages"] == 1:
        set_last_query(message, None)
        bot.send_message(message.chat.id, result, parse_mode="HTML")
        return

    pieces = util.split_string(result, 3000)
    if len(pieces) > 1:
        for piece in pieces[:len(pieces) - 2]:
            msg = bot.send_message(message.chat.id, piece, parse_mode="HTML")
            add_to_delete_buffer(msg)

    paginator = InlineKeyboardPaginator(meta["pages"],
                                        current_page=page,
                                        data_pattern='character#{page}')

    paginator.add_after(InlineKeyboardButton('Отмена', callback_data='back'))

    bot.send_message(message.chat.id,
                     pieces[-1],
                     reply_markup=paginator.markup,
                     parse_mode='HTML')
示例#20
0
def send_character_page(update, pages, page=1):
    """
    Create pages

    :param telegram.Update update: Bot updater object
    :param list pages: List with message to print on each page
    :param int page: Current number of page
    """

    paginator = InlineKeyboardPaginator(len(pages),
                                        current_page=page,
                                        data_pattern='character#{page}')

    update.message.reply_text(pages[page - 1],
                              reply_markup=paginator.markup,
                              parse_mode='Markdown')
def on_request(update: Update, context: CallbackContext):
    message = update.message

    paginator = InlineKeyboardPaginator(
        page_count=len(character_pages),
        current_page=1,
        data_pattern='character#{page}'
    )

    character = character_pages[0]

    message.reply_text(
        text='*{title}*\n{description}'.format(**character),
        reply_markup=paginator.markup,
        parse_mode=ParseMode.MARKDOWN
    )
示例#22
0
def send_news(message, keyword, page=1, by_source=True):
    paginator = InlineKeyboardPaginator(
        10,
        current_page=page,
        data_pattern='Новости#'+keyword+'#{page}'
    )
    if by_source is not True:
        a = get_news_from_db_by_source(keyword, page)
    else:
        a = get_news_from_db(keyword, page)
    bot.send_message(
        message.chat.id,
        a,
        reply_markup=paginator.markup,
        parse_mode='html',
        disable_web_page_preview=True
    )
示例#23
0
def vacancy_paginator(vacancies: list, pattern: str, page: int, text: str,
                      update, context):
    vacancies = vacancies[::-1]
    if len(vacancies) == 0:
        inline_keyboard = [[
            InlineKeyboardButton('Вернуться ', callback_data='start')
        ]]
        inline_buttons = InlineKeyboardMarkup(inline_keyboard=inline_keyboard)
        update.callback_query.edit_message_text(
            text='Не найдено. Попробуйте изменить фильтр',
            reply_markup=inline_buttons)
    else:
        page_num = page_definer(vacancies)
        paginator = InlineKeyboardPaginator(page_num,
                                            current_page=page,
                                            data_pattern=f'{pattern}' +
                                            '#{page}')
        # Defining a range of vacancies that should be applicable to current page
        # And adding each vacancy as a new button
        vacancies_range = vacancies[page * PAGE_SPLIT - PAGE_SPLIT:page *
                                    PAGE_SPLIT]
        for i in vacancies_range:
            paginator.add_before(
                InlineKeyboardButton(
                    text=f'{i["title"]} | {i["salary"]} | {i["joining_date"]}',
                    callback_data=f'detail_{pattern}' + f'#{page}' +
                    f'_{i["id"]}'))
        # If user pressed current page twicely, than will add space to button
        # To change markup and avoid BadRequest error from telegram
        if context.user_data[CURRENT_PAGE] == page:
            paginator.add_after(
                InlineKeyboardButton('Вернуться ', callback_data='start'))
        else:
            paginator.add_after(
                InlineKeyboardButton('Вернуться', callback_data='start'))
        update.callback_query.edit_message_text(text=text,
                                                reply_markup=paginator.markup,
                                                parse_mode='Markdown')
        # Updating current page to real current page
        context.user_data[CURRENT_PAGE] = page
    return ConversationHandler.END
def send_character_page(message, page=1):
    paginator = InlineKeyboardPaginator(len(character_pages),
                                        current_page=page,
                                        data_pattern='character#{page}')

    paginator.add_before(
        InlineKeyboardButton('Like', callback_data='like#{}'.format(page)),
        InlineKeyboardButton('Dislike',
                             callback_data='dislike#{}'.format(page)))
    paginator.add_after(InlineKeyboardButton('Go back', callback_data='back'))

    bot.send_message(message.chat.id,
                     character_pages[page - 1],
                     reply_markup=paginator.markup,
                     parse_mode='Markdown')
示例#25
0
def show_subs(bot, update):
    table_id = update.user_data[
        'id'] = bot.message.text  # временно сохраняем ответ
    if table_id not in ['1', '2', '3']:
        update.bot.send_message(bot.message.chat.id,
                                text='Некорректный номер',
                                parse_mode=ParseMode.HTML)
        return ConversationHandler.END
    free_sub_count = 0
    conn = create_connection()
    sub_list = select_subs(conn, table_id)
    decoded_table_name = decode_table_name(table_id)
    if not sub_list:
        update.bot.send_message(
            bot.message.chat.id,
            text=f"А нет аккаунтов <b>{decoded_table_name}</b>",
            parse_mode=ParseMode.HTML)
        return ConversationHandler.END
    update.bot.send_message(bot.message.chat.id,
                            text=f'<b>Подписки {decoded_table_name}</b>\n\n',
                            parse_mode=ParseMode.HTML)
    for sub in sub_list:

        if sub[4] == 0:
            free_sub_count += 1
    formed_list = form_sub_text(sub_list, 5)
    sub = formed_list[0]
    paginator = InlineKeyboardPaginator(len(formed_list),
                                        data_pattern='character#{page}#' +
                                        str(table_id))
    update.bot.send_message(chat_id=bot.message.chat.id,
                            text=sub,
                            reply_markup=paginator.markup,
                            parse_mode=ParseMode.HTML)
    update.bot.send_message(
        bot.message.chat.id,
        text=
        f'<b>Всего</b>: {len(sub_list)}\n<b>Непроданных</b>: {free_sub_count}',
        parse_mode=ParseMode.HTML)
    return ConversationHandler.END
示例#26
0
def on_callback_query(update: Update, context: CallbackContext):
    query = update.callback_query
    query.answer()

    source, page = query.data.split('#', 1)
    page = int(page)

    paginator = InlineKeyboardPaginator(page_count=len(character_pages),
                                        current_page=page,
                                        data_pattern=source + '#{page}')

    # Fix error: "telegram.error.BadRequest: Message is not modified"
    if is_equal_inline_keyboards(paginator, query.message.reply_markup):
        return

    character = character_pages[page - 1]

    query.message.edit_media(media=InputMediaPhoto(
        media=open(character['image'], 'rb'),
        caption="*{title}*".format(**character),
        parse_mode=ParseMode.MARKDOWN),
                             reply_markup=paginator.markup)
示例#27
0
async def callback_paginator_for_paying(call: CallbackQuery,
                                        state: FSMContext):
    # print(f'callback_paginator  for paying -> {str(call.from_user.id)}')
    await state.reset_state(with_data=False)
    call_data = call.data
    state_name = ""
    # print(f"call_data = {call_data}")
    if call_data == 'signed':
        page = 1
        state_name = get_state_name(str(call_data))
        enquiries = Enquiry(call.from_user.id)
        # fetching data from DB
        entities = enquiries.get_entities_for_paying(state_name, "Нет")
        await state.update_data(request_data=entities,
                                state_name=state_name,
                                call_data=call_data)
        data_state = await state.get_data()
        request_data = data_state.get("request_data")
    # print(f"request_data = {request_data}")
    else:
        data_state = await state.get_data()
        request_data = data_state.get("request_data")
        # print(f"request_data = {request_data}")
        page = int(call.data.split('&')[1])
    # print(f'page={str(page)}')
    paginator = InlineKeyboardPaginator(
        0 if request_data is None else len(request_data),
        current_page=int(page),
        data_pattern='page&{page}')

    if len(request_data) if request_data is not None else 0 > 0:
        if data_state.get("call_data") == 'signed':
            paginator.add_after(
                InlineKeyboardButton(
                    text="{}  Запросить выплату для всех выполненных заявок".
                    format(emojize(":bell:")),
                    callback_data="task_sign&{}".format(request_data[
                        page - 1]["id"] if len(request_data) > 0 else [])))

    paginator.add_after(
        InlineKeyboardButton("{}  Назад".format(
            emojize(":leftwards_arrow_with_hook:")),
                             callback_data="choice_buttons"))
    await call.message.edit_text(format_enquiry_for_paying(
        request_data[page - 1] if len(request_data) > 0 else []),
                                 reply_markup=paginator.markup)
示例#28
0
def characters_page_callback(update, context):
    query = update.callback_query

    query.answer()

    page = int(query.data.split('#')[1])

    paginator = InlineKeyboardPaginator(len(character_pages),
                                        current_page=page,
                                        data_pattern='character#{page}')

    paginator.add_before(
        InlineKeyboardButton('Like', callback_data='like#{}'.format(page)),
        InlineKeyboardButton('Dislike',
                             callback_data='dislike#{}'.format(page)))
    paginator.add_after(InlineKeyboardButton('Go back', callback_data='back'))

    query.edit_message_text(text=character_pages[page - 1],
                            reply_markup=paginator.markup,
                            parse_mode='Markdown')
def reply_text_or_edit_with_keyboard_paginator(
    message: Message,
    query: Optional[CallbackQuery],
    text: str,
    page_count: int,
    items_per_page: int,
    current_page: int,
    data_pattern: str,
    before_inline_buttons: List[InlineKeyboardButton] = None,
    after_inline_buttons: List[InlineKeyboardButton] = None,
    quote: bool = False,
    **kwargs,
):
    page_count = math.ceil(page_count / items_per_page)

    paginator = InlineKeyboardPaginator(
        page_count=page_count,
        current_page=current_page,
        data_pattern=data_pattern,
    )
    if before_inline_buttons:
        paginator.add_before(*before_inline_buttons)

    if after_inline_buttons:
        paginator.add_after(*after_inline_buttons)

    reply_markup = paginator.markup

    reply_text_or_edit_with_keyboard(
        message,
        query,
        text,
        reply_markup,
        quote=quote,
        **kwargs,
    )
示例#30
0
def test_json_markup():
    for args, markup in markup_test_cases.items():
        paginator = InlineKeyboardPaginator(*args)
        assert paginator.markup == markup, \
                'In case init args {} markup not correct'.format(args)