async def select_lang_keyboard(message, strings): markup = InlineKeyboardMarkup(row_width=2) lang_info = await get_chat_lang_info(message.chat.id) if message.chat.type == 'private': text = strings['your_lang'].format( lang=lang_info['flag'] + " " + lang_info['babel'].display_name) text += strings['select_pm_lang'] # TODO: Connected chat lang info else: text = strings['chat_lang'].format( lang=lang_info['flag'] + " " + lang_info['babel'].display_name) text += strings['select_chat_lang'] for lang in LANGUAGES.values(): lang_info = lang['language_info'] markup.insert(InlineKeyboardButton( lang_info['flag'] + " " + lang_info['babel'].display_name, callback_data=select_lang_cb.new(lang=lang_info['code'])) ) markup.add(InlineKeyboardButton(strings['crowdin_btn'], url='https://crowdin.com/project/sophiebot')) await message.reply(text, reply_markup=markup)
async def select_lang_keyboard(message, strings, edit=False): markup = InlineKeyboardMarkup(row_width=2) task = message.reply if edit is False else message.edit_text lang_info = await get_chat_lang_info(message.chat.id) if message.chat.type == 'private': text = strings['your_lang'].format(lang=lang_info['flag'] + " " + lang_info['babel'].display_name) text += strings['select_pm_lang'] # TODO: Connected chat lang info else: text = strings['chat_lang'].format(lang=lang_info['flag'] + " " + lang_info['babel'].display_name) text += strings['select_chat_lang'] for lang in LANGUAGES.values(): lang_info = lang['language_info'] markup.insert( InlineKeyboardButton( lang_info['flag'] + " " + lang_info['babel'].display_name, callback_data=select_lang_cb.new( lang=lang_info['code'], back_btn=False if edit is False else True))) markup.add( InlineKeyboardButton(strings['crowdin_btn'], url='https://crowdin.com/project/nao-tomori/')) if edit: markup.add( InlineKeyboardButton(strings['back'], callback_data='go_to_start')) with suppress(MessageNotModified): await task(text, reply_markup=markup)
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
async def del_filter(message, chat, strings): handler = get_args_str(message) chat_id = chat['chat_id'] filters = await db.filters.find({ 'chat_id': chat_id, 'handler': handler }).to_list(9999) if not filters: await message.reply( strings['no_such_filter'].format(chat_name=chat['chat_title'])) return # Remove filter in case if we found only 1 filter with same header filter = filters[0] if len(filters) == 1: await db.filters.delete_one({'_id': filter['_id']}) await update_handlers_cache(chat_id) await message.reply( strings['del_filter'].format(handler=filter['handler'])) return # Build keyboard row for select which exactly filter user want to remove buttons = InlineKeyboardMarkup(row_width=1) text = strings['select_filter_to_remove'].format(handler=handler) for filter in filters: action = FILTERS_ACTIONS[filter['action']] buttons.add( InlineKeyboardButton( # If module's filter support custom del btn names else just show action name '' + action['del_btn_name'](message, filter) if 'del_btn_name' in action else filter['action'], callback_data=filter_remove_cp.new(id=str(filter['_id'])))) await message.reply(text, reply_markup=buttons)
async def select_time(state, strings, action, chat_id, msg_id): async with state.proxy() as data: data['time_sel_msg'] = msg_id await NewFilter.time.set() # For manual select time text = strings['select_time'] text += strings['select_time_tip'] text += strings['select_time_btns'] buttons = InlineKeyboardMarkup(row_width=2).add( InlineKeyboardButton(strings['time_f'], callback_data=new_filter_time_cb.new(time=False)), InlineKeyboardButton(strings['time_2h'], callback_data=new_filter_time_cb.new(time='2h')), InlineKeyboardButton(strings['time_5h'], callback_data=new_filter_time_cb.new(time='5h')), InlineKeyboardButton(strings['time_24h'], callback_data=new_filter_time_cb.new(time='24h')), InlineKeyboardButton(strings['time_2d'], callback_data=new_filter_time_cb.new(time='2d')), InlineKeyboardButton(strings['time_1w'], callback_data=new_filter_time_cb.new(time='7d'))) buttons.add( InlineKeyboardButton(strings['back'], callback_data='add_filter_actions')) buttons.add(InlineKeyboardButton(strings['exit'], callback_data='cancel')) await bot.edit_message_text(text, chat_id, msg_id, reply_markup=buttons) return
async def set_access(user: User, data: dict): bot_user = User.get(User.user_id == data['user_id']) bot_user.access = data['mode'] keyboard = InlineKeyboardMarkup() callback_data = { 'action': 'set_access', 'user_id': bot_user.user_id, 'mode': not bot_user.access } if bot_user.access: btn_text = STRESS['access_granted_btn'] msg_text = STRESS['access_granted_msg'] else: btn_text = STRESS['access_denied_btn'] msg_text = STRESS['access_denied_msg'] keyboard.insert( InlineKeyboardButton(text=btn_text, callback_data=json.dumps(callback_data))) await bot.edit_message_reply_markup(ACCESS_CONTROL_CHANNEL_ID, bot_user.access_msg_id, reply_markup=keyboard) if bot_user.access: bot_user.state = 'default' keyboard = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) keyboard.add(KeyboardButton('Главное меню')) else: keyboard = ReplyKeyboardRemove() bot_user.save() await bot.send_message(bot_user.user_id, msg_text, reply_markup=keyboard)
def inline_keyboard(*buttons, row_width=2): """ Собирает по полученным кнопкам InlineKeyboard """ keyboard = InlineKeyboardMarkup() keyboard.row_width = row_width buttons = [b.value if isinstance(b, InlineButtons) else b for b in buttons] keyboard.add(*buttons) return keyboard
async def new_shedule_1_potok_handler(callback : types.CallbackQuery, state : FSMContext): await callback.answer() await state.update_data(id_shedule = 1) keyboard = InlineKeyboardMarkup() keyboard.add(InlineKeyboardButton(text = "Назад", callback_data="new_shedule_back")) await callback.message.edit_text("Отправьте новый текст с расписанием", reply_markup=keyboard) await AdminStateMainMenu.write_new_shedule.set()
async def admin_whos(callback: types.CallbackQuery): await callback.answer() user = DataBaseFunc.get_user(callback.from_user.id) keyboard = InlineKeyboardMarkup() keyboard.add(InlineKeyboardButton(text="Назад", callback_data="admin_in_admin_menu")) await callback.message.edit_text(text=AdminHelper.get_whos_admin(user), reply_markup=keyboard) await AdminStateMainMenu.whos.set()
async def change_lang(message, lang, e=False, back_btn=False): chat_id = message.chat.id await change_chat_lang(chat_id, lang) strings = await get_strings(chat_id, 'language') lang_info = LANGUAGES[lang]['language_info'] text = strings['lang_changed'].format(lang_name=lang_info['flag'] + " " + lang_info['babel'].display_name) text += strings['help_us_translate'] markup = InlineKeyboardMarkup() if 'translators' in lang_info: markup.add( InlineKeyboardButton( strings['see_translators'], callback_data=translators_lang_cb.new(lang=lang))) if back_btn == 'True': # Callback_data converts boolean to str markup.add( InlineKeyboardButton(strings['back'], callback_data='go_to_start')) if e: with suppress(MessageNotModified): await message.edit_text(text, reply_markup=markup, disable_web_page_preview=True) else: await message.reply(text, reply_markup=markup, disable_web_page_preview=True)
def full_wallets_inl(): keyboard = InlineKeyboardMarkup(row_width=2) keyboard.add( InlineKeyboardButton(_('Добавить кошелек'), callback_data='add_wallet'), InlineKeyboardButton(_('Конвертировать'), callback_data='convert_wallet')) return keyboard
def DeleteMarkup(chatID: str, chatType: str) -> InlineKeyboardMarkup: isDeleteButton = DBH.GetSetting(chatID, "deleteButton", chatType) DeleteMU = InlineKeyboardMarkup() if isDeleteButton: lang = DBH.GetSetting(chatID, "lang", chatType) dictLang = ButtonTexts[lang] DeleteMU.add( InlineKeyboardButton(dictLang['delete'], callback_data="delete")) return DeleteMU
async def help_cb(event, strings): button = InlineKeyboardMarkup() button.add( InlineKeyboardButton(strings['click_btn'], url='https://wiki.sophiebot.gq')) button.add( InlineKeyboardButton(strings['back'], callback_data='go_to_start')) with suppress(MessageNotModified): await event.message.edit_text(strings['help_header'], reply_markup=button)
async def shedule(callback: types.CallbackQuery): await callback.answer() user = DataBaseFunc.get_user(callback.from_user) ketboard = InlineKeyboardMarkup() ketboard.add(InlineKeyboardButton("Назад", callback_data="shedule_back")) with open(texts_shedule_filename, 'r', encoding='utf8') as file: TEXT_SHEDULE_1 = file.read() await callback.message.edit_text(text=TEXT_SHEDULE_1, reply_markup=ketboard)
async def clear_all_notes(message, chat, strings): # Ensure notes count if not await db.notes.find_one({'chat_id': chat['chat_id']}): await message.reply(strings['notelist_no_notes'].format(chat_title=chat['chat_title'])) return text = strings['clear_all_text'].format(chat_name=chat['chat_title']) buttons = InlineKeyboardMarkup() buttons.add(InlineKeyboardButton(strings['clearall_btn_yes'], callback_data='clean_all_notes_cb')) buttons.add(InlineKeyboardButton(strings['clearall_btn_no'], callback_data='cancel')) await message.reply(text, reply_markup=buttons)
async def change_device_info(message, device, edit=False): await ChangeDeviceState.list_info.set() codename = device['codename'] text = "Device name: " + device['fullname'] text += "\nCodename: " + codename text += "\nMaintainer: " + device['maintainer'] text += "\nStatus: " + device['status'] if 'default_bugs' in device: text += "\nDefault builds bugs:\n" + device['default_bugs'] if 'default_notes' in device: text += "\nDefault builds notes:\n" + device['default_notes'] buttons = InlineKeyboardMarkup(row_width=2).add( InlineKeyboardButton( "Change maintainer", callback_data=fox_change_maintainer_cp.new(codename=codename)), InlineKeyboardButton( "Change development status", callback_data=fox_change_status_cp.new(codename=codename))) if 'default_bugs' not in device: buttons.add( InlineKeyboardButton( "Add default bugs", callback_data=fox_change_def_bugs_cp.new(codename=codename))) else: buttons.add( InlineKeyboardButton( "Edit default bugs", callback_data=fox_change_def_bugs_cp.new(codename=codename)), InlineKeyboardButton( "Delete default bugs", callback_data=fox_del_def_bugs_cp.new(codename=codename))) if 'default_notes' not in device: buttons.add( InlineKeyboardButton( "Add default notes", callback_data=fox_change_def_notes_cp.new(codename=codename))) else: buttons.add( InlineKeyboardButton( "Edit default notes", callback_data=fox_change_def_notes_cp.new(codename=codename)), InlineKeyboardButton( "Delete default notes", callback_data=fox_del_def_notes_cp.new(codename=codename))) buttons.add(InlineKeyboardButton("Done", callback_data='cancel')) if edit is True: await message.edit_text(text, reply_markup=buttons) else: await message.reply(text, reply_markup=buttons)
async def enable_all(message, chat, strings): # Ensure that something is disabled if not await db.disabled_v2.find_one({'chat_id': chat['chat_id']}): await message.reply(strings['not_disabled_anything'].format(chat_title=chat['chat_title'])) return text = strings['enable_all_text'].format(chat_name=chat['chat_title']) buttons = InlineKeyboardMarkup() buttons.add(InlineKeyboardButton(strings['enable_all_btn_yes'], callback_data='enable_all_notes_cb')) buttons.add(InlineKeyboardButton(strings['enable_all_btn_no'], callback_data='cancel')) await message.reply(text, reply_markup=buttons)
async def get_start_func(message, strings, edit=False): msg = message.message if hasattr(message, 'message') else message task = msg.edit_text if edit else msg.reply buttons = InlineKeyboardMarkup() buttons.add(InlineKeyboardButton(strings['btn_help'], callback_data='get_help'), InlineKeyboardButton(strings['btn_lang'], callback_data='lang_btn')) buttons.add(InlineKeyboardButton(strings['btn_channel'], url='https://t.me/HitsukiNews'), InlineKeyboardButton(strings['btn_source'], url='https://github.com/HitsukiNetwork/HitsukiX')) # Handle error when user click the button 2 or more times simultaneously with suppress(MessageNotModified): await task(strings['start_hi'], reply_markup=buttons)
async def del_fed_cmd(message, fed, strings): fed_name = html.escape(fed['fed_name'], False) fed_id = fed['fed_id'] fed_owner = fed['creator'] buttons = InlineKeyboardMarkup() buttons.add(InlineKeyboardButton(text=strings['delfed_btn_yes'], callback_data=delfed_cb.new(fed_id=fed_id, creator_id=fed_owner))) buttons.add(InlineKeyboardButton(text=strings['delfed_btn_no'], callback_data=f'cancel_{fed_owner}')) await message.reply(strings['delfed'] % fed_name, reply_markup=buttons)
async def build_process_info(message, state, edit=True): text = '<b>Build info</b>' async with state.proxy() as data: text += f"\nFile name: <code>{data['file_name']}</code>" text += f"\nFile size: <code>{data['file_size']}</code>" text += f"\nFile MD5: <code>{data['file_md5']}</code>" text += f"\nFile SHA256: <code>{data['file_sha256']}</code>" text += "\n" text += f"\nDevice codename: <code>{data['device_codename']}</code>" text += f"\nBuild type: <code>{data['build_type']}</code>" text += f"\nBuild version: <code>{data['build_ver']}</code>" if 'special_notes' not in data: text += "\nBuild notes: Nothing" else: text += "\nBuild notes:\n" + data['special_notes'] if 'build_bugs' not in data: text += "\nBuild bugs: Nothing" else: text += "\nBuild bugs:\n" + data['build_bugs'] text += "\nBuild changelog:\n" + data['changelog_text'] buttons = InlineKeyboardMarkup(row_width=2).add( InlineKeyboardButton("📝 Change changelog", callback_data='fox_changelog_change')) if 'build_bugs' not in data: buttons.add( InlineKeyboardButton("🐞 Add build bugs", callback_data='fox_add_build_bugs')) else: buttons.add( InlineKeyboardButton("🐞 Edit build bugs", callback_data='fox_add_build_bugs')) if 'special_notes' not in data: buttons.add( InlineKeyboardButton("✏️ Add build notes", callback_data='fox_add_build_notes')) else: buttons.add( InlineKeyboardButton("✏️ Edit build notes", callback_data='fox_add_build_notes'), InlineKeyboardButton("❌ Delete build notes", callback_data='fox_del_build_notes')) buttons.add( InlineKeyboardButton("❌ Exit", callback_data='cancel'), InlineKeyboardButton("🆗 Release it", callback_data='fox_release_build')) if edit is True: await message.edit_text(text, reply_markup=buttons) else: await message.reply(text, reply_markup=buttons)
async def get_missing_katas(cls, user, offset=0): conn = await asyncpg.connect(POSTGRES_URI) records = await conn.fetch( """ SELECT name, slug FROM katas WHERE id in ( SELECT id FROM katas EXCEPT SELECT kata_id FROM solved_katas WHERE user_id = $1 ) LIMIT 10 OFFSET $2; """, user.id, offset) count = await conn.fetchrow( """ SELECT COUNT(*) FROM katas WHERE id in ( SELECT id FROM katas EXCEPT SELECT kata_id FROM solved_katas WHERE user_id = $1 ); """, user.id) await conn.close() markup = InlineKeyboardMarkup() for r in records: btn = InlineKeyboardButton( text=r.get('name'), url=f"{CODEWARS_BASE_KATA_URL}/{r.get('slug')}/") markup.add(btn) buttons = [] if not count.get('count') - offset <= 10: buttons.append( InlineKeyboardButton(text='Далее', callback_data=f'next_{offset + 10}')) if offset > 0: buttons.append( InlineKeyboardButton(text='Назад', callback_data=f'next_{offset - 10}')) if buttons: markup.add(*buttons) return markup, count.get('count')
async def delall_filters(message: Message, strings: dict): if not await is_chat_creator(message, message.chat.id, message.from_user.id): return await message.reply(strings['not_chat_creator']) buttons = InlineKeyboardMarkup() buttons.add(*[ InlineKeyboardButton(strings['confirm_yes'], callback_data=filter_delall_yes_cb.new( chat_id=message.chat.id)), InlineKeyboardButton(strings['confirm_no'], callback_data="filter_delall_no_cb") ]) return await message.reply(strings['delall_header'], reply_markup=buttons)
def choice_method_add_wallet_inl(bch): keyboard = InlineKeyboardMarkup(row_width=1) keyboard.add( InlineKeyboardButton(_('Добавить адрес кошелька'), callback_data=f'{bch}_add_bch_wallet'), InlineKeyboardButton(_('Импортировать приватный ключ'), callback_data=f'{bch}_import_private_key'), # InlineKeyboardButton(_('Импортировать seed-фразу'), # callback_data=f'{bch}_import_seed_phrase'), InlineKeyboardButton(_('Сгенерировать новый кошелек'), callback_data=f'{bch}_generate_wallet'), InlineKeyboardButton(_('Назад'), callback_data=f'{bch}_view')) return keyboard
def DonateMarkup(chatID: str, chatType: str) -> InlineKeyboardMarkup: lang = DBH.GetSetting(chatID, "lang", chatType) isDeleteButton = DBH.GetSetting(chatID, "deleteButton", chatType) dictLang = ButtonTexts[lang] DonateMU = InlineKeyboardMarkup() DonateMU.add( InlineKeyboardButton( dictLang['donate'], url="https://secure.wayforpay.com/payment/s3641f64becae", callback_data="donate")) if isDeleteButton: DonateMU.add( InlineKeyboardButton(dictLang['delete'], callback_data="delete")) return DonateMU
def EditMenuMarkup(chatID: str, chatType: str) -> InlineKeyboardMarkup: def RulesMark(role: str, answDict) -> str: if answDict['editSettings'] == role: return " ✅" else: return " ❌" lang = DBH.GetSetting(chatID, "lang", chatType) AllSettings = DBH.GetAllSettings(chatID, chatType) dictLang = ButtonTexts[lang] EditMenuMU = InlineKeyboardMarkup() EditMenuMU.add( InlineKeyboardButton(dictLang['creator'] + RulesMark('creator', AllSettings), callback_data="edit_creator")) EditMenuMU.add( InlineKeyboardButton(dictLang['admins'] + RulesMark('admins', AllSettings), callback_data="edit_admins")) EditMenuMU.add( InlineKeyboardButton(dictLang['everybody'] + RulesMark('everybody', AllSettings), callback_data="edit_everybody")) EditMenuMU.add( InlineKeyboardButton(dictLang['back'], callback_data="settings")) return EditMenuMU
async def release_new_build(message): await ReleaseState.sel_build_type.set() text = "<b>Releasing new OrangeFox build</b>" text += "\nSelect build type:" buttons = InlineKeyboardMarkup(row_width=2).add( InlineKeyboardButton( "Stable", callback_data=build_type_cp.new(build_type='stable')), InlineKeyboardButton( "Beta/RC", callback_data=build_type_cp.new(build_type='beta'))) buttons.add(InlineKeyboardButton("Exit", callback_data='cancel')) await message.reply(text, reply_markup=buttons)
async def get_start_func(message, strings, edit=False): msg = message.message if hasattr(message, "message") else message task = msg.edit_text if edit else msg.reply buttons = InlineKeyboardMarkup() buttons.add( InlineKeyboardButton(strings["btn_help"], callback_data="get_help")) buttons.add( InlineKeyboardButton(strings["btn_lang"], callback_data="lang_btn"), InlineKeyboardButton(strings["btn_source"], url="https://github.com/TeamDaisyX/"), ) buttons.add( InlineKeyboardButton(strings["btn_channel"], url="https://t.me/DaisyXUpdates"), InlineKeyboardButton("👥 Support Grup", url="https://t.me/DaisySupport_Official"), ) buttons.add( InlineKeyboardButton( "👸🏼 Add DaisyX to your group", url=f"https://telegram.me/daisyxbot?startgroup=true", )) # Handle error when user click the button 2 or more times simultaneously with suppress(MessageNotModified): await task(strings["start_hi"], reply_markup=buttons)
def get_start(chat_id): strings = get_strings(chat_id, module='pm_menu') text = strings["start_hi"] buttons = InlineKeyboardMarkup() buttons.add(InlineKeyboardButton(strings["btn_help"], callback_data='get_help')) buttons.add(InlineKeyboardButton(strings["btn_lang"], callback_data='set_lang')) buttons.add( InlineKeyboardButton(strings["btn_chat"], url='https://t.me/YanaBotGrou'), InlineKeyboardButton(strings["btn_channel"], url='https://t.me/SophieNEWS'), ) return text, buttons
async def get_start_func(message, strings, edit=False): msg = message.message if hasattr(message, "message") else message task = msg.edit_text if edit else msg.reply buttons = InlineKeyboardMarkup() buttons.add( InlineKeyboardButton(strings["btn_help"], callback_data="get_help")) buttons.add( InlineKeyboardButton(strings["btn_lang"], callback_data="lang_btn"), InlineKeyboardButton(strings["btn_source"], url="https://t.me/bothousesupport"), ) buttons.add( InlineKeyboardButton(strings["btn_channel"], url="https://t.me/doraemonupdate"), InlineKeyboardButton("Support Grup", url="https://t.me/doraemonSupport10"), ) buttons.add( InlineKeyboardButton( "Add DORAEMON to your group", url=f"http://t.me/DoraemonxRobot?startgroup=true", )) # Handle error when user click the button 2 or more times simultaneously with suppress(MessageNotModified): await task(strings["start_hi"], reply_markup=buttons)
async def get_start_func(message, strings, edit=False): msg = message.message if hasattr(message, "message") else message task = msg.edit_text if edit else msg.reply buttons = InlineKeyboardMarkup() buttons.add(InlineKeyboardButton(strings["btn_help"], callback_data="get_help")) buttons.add( InlineKeyboardButton(strings["btn_lang"], url="https://t.me/ExploreMoviez"), InlineKeyboardButton( strings["btn_source"], url="http://www.google.com/" ), ) buttons.add( InlineKeyboardButton(strings["btn_channel"], url="https://t.me/Mrvasuz"), InlineKeyboardButton( "My Crush👩❤️💋👨", url="https://t.me/Sasi_kaladhar" ), ) buttons.add( InlineKeyboardButton( "💋Add Meh to your group", url=f"https://telegram.me/Explorerobot?startgroup=true", ) ) # Handle error when user click the button 2 or more times simultaneously with suppress(MessageNotModified): await task(strings["start_hi"], reply_markup=buttons)