Example #1
0
def button_parser(chat_id, texts, pm=False, aio=False, row_width=None):
    buttons = InlineKeyboardMarkup(row_width=row_width) if aio else []
    pattern = r'\[(.+?)\]\((button|btn)(.+?)(:.+?|)(:same|)\)(\n|)'
    raw_buttons = re.findall(pattern, texts)
    text = re.sub(pattern, '', texts)
    for raw_button in raw_buttons:
        name = raw_button[0]
        action = raw_button[2]
        argument = raw_button[3][1:].lower() if raw_button[3] else ''

        if action in BUTTONS:
            cb = BUTTONS[action]
            string = f'{cb}_{argument}_{chat_id}' if argument else f'{cb}_{chat_id}'
            if aio:
                start_btn = InlineKeyboardButton(
                    name, url=f'https://t.me/{BOT_USERNAME}?start=' + string)
                cb_btn = InlineKeyboardButton(name, callback_data=string)
            else:
                start_btn = Button.url(
                    name, f'https://t.me/{BOT_USERNAME}?start=' + string)
                cb_btn = Button.inline(name, string)

            if cb.endswith('sm'):
                btn = cb_btn if pm else start_btn
            elif cb.endswith('cb'):
                btn = cb_btn
            elif cb.endswith('start'):
                btn = start_btn
            elif cb.startswith('url'):
                btn = Button.url(name, argument)
        elif action == 'url':
            if argument[0] == '/' and argument[1] == '/':
                argument = argument[2:]
            btn = InlineKeyboardButton(
                name, url=argument) if aio else Button.url(name, argument)
        else:
            # If btn not registred
            btn = None
            if argument:
                text += f'\n[{name}].(btn{action}:{argument})'
            else:
                text += f'\n[{name}].(btn{action})'
                continue

        if aio:
            buttons.insert(btn) if raw_button[4] else buttons.add(btn)
        else:
            if len(buttons) < 1 and raw_button[4]:
                buttons.add(btn) if aio else buttons.append([btn])
            else:
                buttons[-1].append(btn) if raw_button[4] else buttons.append(
                    [btn])

    if not aio and len(buttons) == 0:
        buttons = None

    if not text or text == ' ':  # TODO: Sometimes we can return text == ' '
        text = None

    return text, buttons
Example #2
0
def button_parser(chat_id, texts, pm=False, aio=False, row_width=None):
    buttons = InlineKeyboardMarkup(row_width=row_width) if aio else []
    pattern = r"\[(.+?)\]\((button|btn|#)(.+?)(:.+?|)(:same|)\)(\n|)"
    raw_buttons = re.findall(pattern, texts)
    text = re.sub(pattern, "", texts)
    btn = None
    for raw_button in raw_buttons:
        name = raw_button[0]
        action = (raw_button[1]
                  if raw_button[1] not in ("button", "btn") else raw_button[2])

        if raw_button[3]:
            argument = raw_button[3][1:].lower().replace("`", "")
        elif action in ("#"):
            argument = raw_button[2]
            print(raw_button[2])
        else:
            argument = ""

        if action in BUTTONS.keys():
            cb = BUTTONS[action]
            string = f"{cb}_{argument}_{chat_id}" if argument else f"{cb}_{chat_id}"
            if aio:
                start_btn = InlineKeyboardButton(
                    name, url=f"https://t.me/{BOT_USERNAME}?start=" + string)
                cb_btn = InlineKeyboardButton(name, callback_data=string)
            else:
                start_btn = Button.url(
                    name, f"https://t.me/{BOT_USERNAME}?start=" + string)
                cb_btn = Button.inline(name, string)

            if cb.endswith("sm"):
                btn = cb_btn if pm else start_btn
            elif cb.endswith("cb"):
                btn = cb_btn
            elif cb.endswith("start"):
                btn = start_btn
            elif cb.startswith("url"):
                # Workaround to make URLs case-sensitive TODO: make better
                argument = raw_button[3][1:].replace(
                    "`", "") if raw_button[3] else ""
                btn = Button.url(name, argument)
            elif cb.endswith("rules"):
                btn = start_btn
        elif action == "url":
            argument = raw_button[3][1:].replace("`",
                                                 "") if raw_button[3] else ""
            if argument[0] == "/" and argument[1] == "/":
                argument = argument[2:]
            btn = (InlineKeyboardButton(name, url=argument)
                   if aio else Button.url(name, argument))
        else:
            # If btn not registred
            btn = None
            if argument:
                text += f"\n[{name}].(btn{action}:{argument})"
            else:
                text += f"\n[{name}].(btn{action})"
                continue

        if btn:
            if aio:
                buttons.insert(btn) if raw_button[4] else buttons.add(btn)
            else:
                if len(buttons) < 1 and raw_button[4]:
                    buttons.add(btn) if aio else buttons.append([btn])
                else:
                    buttons[-1].append(
                        btn) if raw_button[4] else buttons.append([btn])

    if not aio and len(buttons) == 0:
        buttons = None

    if not text or text.isspace():  # TODO: Sometimes we can return text == ' '
        text = None

    return text, buttons