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
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