From 3e84a94b55d9158c3d7b1c80c01711a249b336b5 Mon Sep 17 00:00:00 2001 From: 5hojib Date: Fri, 12 Jul 2024 11:58:58 +0600 Subject: [PATCH] update --- bot/__main__.py | 6 +- bot/helper/ext_utils/bot_utils.py | 6 +- bot/helper/listeners/tasks_listener.py | 8 +-- .../mirror_leech_utils/rclone_utils/list.py | 6 +- .../upload_utils/telegramEngine.py | 2 +- bot/helper/telegram_helper/button_build.py | 69 +++++++++---------- bot/modules/bot_settings.py | 2 +- bot/modules/cancel_mirror.py | 2 +- bot/modules/clone.py | 2 +- bot/modules/images.py | 6 +- bot/modules/list.py | 4 +- bot/modules/mirror_leech.py | 2 +- bot/modules/torrent_search.py | 12 ++-- bot/modules/users_settings.py | 16 ++--- bot/modules/ytdlp.py | 14 ++-- 15 files changed, 77 insertions(+), 80 deletions(-) diff --git a/bot/__main__.py b/bot/__main__.py index f5903cfbb..00fd8a17a 100644 --- a/bot/__main__.py +++ b/bot/__main__.py @@ -98,7 +98,7 @@ async def stats(_, message): @new_thread async def start(client, message): buttons = ButtonMaker() - reply_markup = buttons.menu(2) + reply_markup = buttons.column(2) if len(message.command) > 1 and message.command[1] == "private": await deleteMessage(message) elif len(message.command) > 1 and len(message.command[1]) == 36: @@ -185,7 +185,7 @@ def parseline(line): endLine = "" btn = ButtonMaker() btn.callback('Close', f'aeon {user_id} close') - reply_message = await sendMessage(message, startLine + escape(Loglines) + endLine, btn.menu(1)) + reply_message = await sendMessage(message, startLine + escape(Loglines) + endLine, btn.column(1)) await query.edit_message_reply_markup(None) await deleteMessage(message) await five_minute_del(reply_message) @@ -202,7 +202,7 @@ def parseline(line): async def log(_, message): buttons = ButtonMaker() buttons.callback('Log display', f'aeon {message.from_user.id} logdisplay') - reply_message = await sendFile(message, 'log.txt', buttons=buttons.menu(1)) + reply_message = await sendFile(message, 'log.txt', buttons=buttons.column(1)) await deleteMessage(message) await five_minute_del(reply_message) diff --git a/bot/helper/ext_utils/bot_utils.py b/bot/helper/ext_utils/bot_utils.py index c576f02fb..4a764c20e 100644 --- a/bot/helper/ext_utils/bot_utils.py +++ b/bot/helper/ext_utils/bot_utils.py @@ -147,7 +147,7 @@ def bt_selection_buttons(id_): buttons.callback("Pincode", f"btsel pin {gid} {pincode}") buttons.callback("Cancel", f"btsel rm {gid} {id_}") buttons.callback("Done Selecting", f"btsel done {gid} {id_}") - return buttons.menu(2) + return buttons.column(2) async def get_telegraph_list(telegraph_content): @@ -157,7 +157,7 @@ async def get_telegraph_list(telegraph_content): buttons = ButtonMaker() buttons.url("View", f"https://telegra.ph/{path[0]}") buttons = extra_btns(buttons) - return buttons.menu(1) + return buttons.column(1) def handleIndex(index, dic): @@ -233,7 +233,7 @@ def get_readable_message(): buttons.callback("Prev", "status pre") buttons.callback(f"{PAGE_NO}/{PAGES}", "status ref") buttons.callback("Next", "status nex") - button = buttons.menu(3) + button = buttons.column(3) msg += f"• Tasks: {tasks}{bmax_task}" msg += f"\n• Bot uptime: {currentTime}" msg += f"\n• Free disk space: {get_readable_file_size(disk_usage('/usr/src/app/downloads/').free)}" diff --git a/bot/helper/listeners/tasks_listener.py b/bot/helper/listeners/tasks_listener.py index b89415878..74dac4f52 100644 --- a/bot/helper/listeners/tasks_listener.py +++ b/bot/helper/listeners/tasks_listener.py @@ -377,7 +377,7 @@ async def onUploadComplete(self, link, size, files, folders, mime_type, name, rc await sendMessage(self.botpmmsg, msg + lmsg + fmsg) await deleteMessage(self.botpmmsg) if self.isSuperGroup: - await sendMessage(self.message, f'{msg}Files has been sent to your inbox', inboxButton.menu(1)) + await sendMessage(self.message, f'{msg}Files has been sent to your inbox', inboxButton.column(1)) else: await deleteMessage(self.botpmmsg) if self.seed: @@ -402,12 +402,12 @@ async def onUploadComplete(self, link, size, files, folders, mime_type, name, rc share_url += '/' buttons.url('Index link', share_url) buttons = extra_btns(buttons) - button = buttons.menu(2) + button = buttons.column(2) elif rclonePath: msg += f'• Path: {rclonePath}\n' button = None buttons = extra_btns(buttons) - button = buttons.menu(2) + button = buttons.column(2) msg += f'• User ID: {self.message.from_user.id}\n' msg += f'• By: {self.tag}\n\n' @@ -418,7 +418,7 @@ async def onUploadComplete(self, link, size, files, folders, mime_type, name, rc await sendMessage(self.botpmmsg, msg, button, 'Random') await deleteMessage(self.botpmmsg) if self.isSuperGroup: - await sendMessage(self.message, f'{msg} Links has been sent to your inbox', inboxButton.menu(1)) + await sendMessage(self.message, f'{msg} Links has been sent to your inbox', inboxButton.column(1)) else: await deleteMessage(self.botpmmsg) if self.seed: diff --git a/bot/helper/mirror_leech_utils/rclone_utils/list.py b/bot/helper/mirror_leech_utils/rclone_utils/list.py index 18a64ead1..1f29abfbe 100644 --- a/bot/helper/mirror_leech_utils/rclone_utils/list.py +++ b/bot/helper/mirror_leech_utils/rclone_utils/list.py @@ -176,7 +176,7 @@ async def get_path_buttons(self): if self.path: buttons.callback('Back To Root', 'rcq root', position='footer') buttons.callback('Cancel', 'rcq cancel', position='footer') - button = buttons.menu(f_cols=2) + button = buttons.column(f_cols=2) msg = 'Choose Path:' + ('\nTransfer Type: Download' if self.list_status == 'rcd' else '\nTransfer Type: Upload') if self.list_status == 'rcu': @@ -239,7 +239,7 @@ async def list_remotes(self): if self.__rc_user and self.__rc_owner: buttons.callback('Back', 'rcq back re', position='footer') buttons.callback('Cancel', 'rcq cancel', position='footer') - button = buttons.menu(2) + button = buttons.column(2) await self.__send_list_message(msg, button) async def list_config(self): @@ -252,7 +252,7 @@ async def list_config(self): buttons.callback('Owner Config', 'rcq owner') buttons.callback('My Config', 'rcq user') buttons.callback('Cancel', 'rcq cancel') - button = buttons.menu(2) + button = buttons.column(2) await self.__send_list_message(msg, button) else: self.config_path = 'rcl.conf' if self.__rc_owner else self.user_rcc_path diff --git a/bot/helper/mirror_leech_utils/upload_utils/telegramEngine.py b/bot/helper/mirror_leech_utils/upload_utils/telegramEngine.py index 55cf76148..f975923e2 100644 --- a/bot/helper/mirror_leech_utils/upload_utils/telegramEngine.py +++ b/bot/helper/mirror_leech_utils/upload_utils/telegramEngine.py @@ -95,7 +95,7 @@ async def __buttons(self, up_path, is_video=False): LOGGER.info(m) except Exception as e: LOGGER.error(f"MediaInfo Error: {str(e)}") - return buttons.menu(1) if self.__has_buttons else None + return buttons.column(1) if self.__has_buttons else None async def __copy_file(self): try: diff --git a/bot/helper/telegram_helper/button_build.py b/bot/helper/telegram_helper/button_build.py index 1708430ff..3c7b88947 100644 --- a/bot/helper/telegram_helper/button_build.py +++ b/bot/helper/telegram_helper/button_build.py @@ -2,46 +2,43 @@ class ButtonMaker: def __init__(self): - self.__button = [] - self.__header_button = [] - self.__footer_button = [] + self.main_buttons = [] + self.header_buttons = [] + self.footer_buttons = [] - def url(self, key, link, position=None): - if not position: - self.__button.append(InlineKeyboardButton(text=key, url=link)) - elif position == 'header': - self.__header_button.append( - InlineKeyboardButton(text=key, url=link)) + def url(self, text, url, position=None): + button = InlineKeyboardButton(text=text, url=url) + if position == 'header': + self.header_buttons.append(button) elif position == 'footer': - self.__footer_button.append( - InlineKeyboardButton(text=key, url=link)) + self.footer_buttons.append(button) + else: + self.main_buttons.append(button) - def callback(self, key, data, position=None): - if not position: - self.__button.append(InlineKeyboardButton( - text=key, callback_data=data)) - elif position == 'header': - self.__header_button.append( - InlineKeyboardButton(text=key, callback_data=data)) + def callback(self, text, callback_data, position=None): + button = InlineKeyboardButton(text=text, callback_data=callback_data) + if position == 'header': + self.header_buttons.append(button) elif position == 'footer': - self.__footer_button.append( - InlineKeyboardButton(text=key, callback_data=data)) + self.footer_buttons.append(button) + else: + self.main_buttons.append(button) - def menu(self, b_cols=1, h_cols=8, f_cols=8): - menu = [self.__button[i:i+b_cols] - for i in range(0, len(self.__button), b_cols)] - if self.__header_button: - h_cnt = len(self.__header_button) - if h_cnt > h_cols: - header_buttons = [self.__header_button[i:i+h_cols] - for i in range(0, len(self.__header_button), h_cols)] - menu = header_buttons + menu + def column(self, main_columns=1, header_columns=8, footer_columns=8): + keyboard = [self.main_buttons[i:i + main_columns] for i in range(0, len(self.main_buttons), main_columns)] + + if self.header_buttons: + if len(self.header_buttons) > header_columns: + header_chunks = [self.header_buttons[i:i + header_columns] for i in range(0, len(self.header_buttons), header_columns)] + keyboard = header_chunks + keyboard else: - menu.insert(0, self.__header_button) - if self.__footer_button: - if len(self.__footer_button) > f_cols: - [menu.append(self.__footer_button[i:i+f_cols]) - for i in range(0, len(self.__footer_button), f_cols)] + keyboard.insert(0, self.header_buttons) + + if self.footer_buttons: + if len(self.footer_buttons) > footer_columns: + footer_chunks = [self.footer_buttons[i:i + footer_columns] for i in range(0, len(self.footer_buttons), footer_columns)] + keyboard += footer_chunks else: - menu.append(self.__footer_button) - return InlineKeyboardMarkup(menu) \ No newline at end of file + keyboard.append(self.footer_buttons) + + return InlineKeyboardMarkup(keyboard) \ No newline at end of file diff --git a/bot/modules/bot_settings.py b/bot/modules/bot_settings.py index 5405adfe4..e9a74f87e 100644 --- a/bot/modules/bot_settings.py +++ b/bot/modules/bot_settings.py @@ -413,7 +413,7 @@ async def get_buttons(key=None, edit_type=None, edit_mode=None, mess=None): buttons.callback('Make it True', f"botset boolvar {key} on") else: buttons.callback('Make it False', f"botset boolvar {key} off") - button = buttons.menu(1) if key is None else buttons.menu(2) + button = buttons.column(1) if key is None else buttons.column(2) return msg, button diff --git a/bot/modules/cancel_mirror.py b/bot/modules/cancel_mirror.py index b1addecd9..451f745ba 100644 --- a/bot/modules/cancel_mirror.py +++ b/bot/modules/cancel_mirror.py @@ -70,7 +70,7 @@ async def cancell_all_buttons(_, message): buttons.callback("Paused", f"stopall {MirrorStatus.STATUS_PAUSED}") buttons.callback("All", "stopall all") buttons.callback("Close", "stopall close") - button = buttons.menu(2) + button = buttons.column(2) can_msg = await sendMessage(message, 'Choose tasks to cancel.', button) await deleteMessage(message) await one_minute_del(can_msg) diff --git a/bot/modules/clone.py b/bot/modules/clone.py index 34352e267..a57d61e05 100644 --- a/bot/modules/clone.py +++ b/bot/modules/clone.py @@ -233,7 +233,7 @@ async def __run_multi(): for __i, __msg in enumerate(error_msg, 1): final_msg += f'\n
{__i}: {__msg}
' if error_button is not None: - error_button = error_button.menu(2) + error_button = error_button.column(2) await delete_links(message) force_m = await sendMessage(message, final_msg, error_button) await five_minute_del(force_m) diff --git a/bot/modules/images.py b/bot/modules/images.py index 7b05e6a87..54e10cee8 100644 --- a/bot/modules/images.py +++ b/bot/modules/images.py @@ -67,7 +67,7 @@ async def pictures(_, message): buttons.callback("Close", f"images {user_id} close") buttons.callback("Remove all", f"images {user_id} removeall", 'footer') await deleteMessage(to_edit) - await sendMessage(message, f'Image No. : 1 / {len(IMAGES)}', buttons.menu(2), IMAGES[0]) + await sendMessage(message, f'Image No. : 1 / {len(IMAGES)}', buttons.column(2), IMAGES[0]) @new_task async def pics_callback(_, query): @@ -90,7 +90,7 @@ async def pics_callback(_, query): buttons.callback("Remove Image", f"images {data[1]} remove {ind}") buttons.callback("Close", f"images {data[1]} close") buttons.callback("Remove all", f"images {data[1]} removeall", 'footer') - await editMessage(message, pic_info, buttons.menu(2), IMAGES[ind]) + await editMessage(message, pic_info, buttons.column(2), IMAGES[ind]) elif data[2] == "remove": IMAGES.pop(int(data[3])) @@ -112,7 +112,7 @@ async def pics_callback(_, query): buttons.callback("Remove image", f"images {data[1]} remove {ind}") buttons.callback("Close", f"images {data[1]} close") buttons.callback("Remove all", f"images {data[1]} removeall", 'footer') - await editMessage(message, pic_info, buttons.menu(2), IMAGES[ind]) + await editMessage(message, pic_info, buttons.column(2), IMAGES[ind]) elif data[2] == 'removeall': IMAGES.clear() diff --git a/bot/modules/list.py b/bot/modules/list.py index 6f8b56afd..17c4897c7 100644 --- a/bot/modules/list.py +++ b/bot/modules/list.py @@ -16,7 +16,7 @@ async def list_buttons(user_id, isRecursive=True): buttons.callback("Both", f"list_types {user_id} both {isRecursive}") buttons.callback(f"Recursive: {isRecursive}", f"list_types {user_id} rec {isRecursive}") buttons.callback("Cancel", f"list_types {user_id} cancel") - return buttons.menu(2) + return buttons.column(2) async def _list_drive(key, message, item_type, isRecursive): LOGGER.info(f"listing: {key}") @@ -67,7 +67,7 @@ async def drive_list(_, message): if message.chat.type != message.chat.type.PRIVATE: msg, btn = await checking_access(user_id) if msg is not None: - reply_message = await sendMessage(message, msg, btn.menu(1)) + reply_message = await sendMessage(message, msg, btn.column(1)) await delete_links(message) await five_minute_del(reply_message) return diff --git a/bot/modules/mirror_leech.py b/bot/modules/mirror_leech.py index 7aff02cb9..e2c3b34de 100644 --- a/bot/modules/mirror_leech.py +++ b/bot/modules/mirror_leech.py @@ -230,7 +230,7 @@ async def __run_multi(): for __i, __msg in enumerate(error_msg, 1): final_msg += f'\n
{__i}: {__msg}
' if error_button is not None: - error_button = error_button.menu(2) + error_button = error_button.column(2) await delete_links(message) force_m = await sendMessage(message, final_msg, error_button) await five_minute_del(force_m) diff --git a/bot/modules/torrent_search.py b/bot/modules/torrent_search.py index 216161a1c..493983a04 100644 --- a/bot/modules/torrent_search.py +++ b/bot/modules/torrent_search.py @@ -98,7 +98,7 @@ async def __search(key, site, message, method): link = await __getResult(search_results, key, message, method) buttons = ButtonMaker() buttons.url("View", link) - button = buttons.menu(1) + button = buttons.column(1) await editMessage(message, msg, button) @@ -175,7 +175,7 @@ def __api_buttons(user_id, method): for data, name in SITES.items(): buttons.callback(name, f"torser {user_id} {data} {method}") buttons.callback("Cancel", f"torser {user_id} cancel") - return buttons.menu(2) + return buttons.column(2) async def __plugin_buttons(user_id): @@ -184,7 +184,7 @@ async def __plugin_buttons(user_id): buttons.callback(siteName.capitalize(), f"torser {user_id} {siteName} plugin") buttons.callback('All', f"torser {user_id} all plugin") buttons.callback("Cancel", f"torser {user_id} cancel") - return buttons.menu(2) + return buttons.column(2) @new_thread async def torrentSearch(_, message): @@ -195,7 +195,7 @@ async def torrentSearch(_, message): if message.chat.type != message.chat.type.PRIVATE: msg, buttons = await checking_access(user_id, buttons) if msg is not None: - reply_message = await sendMessage(message, msg, buttons.menu(1)) + reply_message = await sendMessage(message, msg, buttons.column(1)) await delete_links(message) await five_minute_del(reply_message) return @@ -208,13 +208,13 @@ async def torrentSearch(_, message): buttons.callback('Trending', f"torser {user_id} apitrend") buttons.callback('Recent', f"torser {user_id} apirecent") buttons.callback("Cancel", f"torser {user_id} cancel") - button = buttons.menu(2) + button = buttons.column(2) reply_message = await sendMessage(message, "Send a search key along with command", button) elif SITES is not None: buttons.callback('Api', f"torser {user_id} apisearch") buttons.callback('Plugins', f"torser {user_id} plugin") buttons.callback("Cancel", f"torser {user_id} cancel") - button = buttons.menu(2) + button = buttons.column(2) reply_message = await sendMessage(message, 'Choose tool to search:', button) else: button = await __plugin_buttons(user_id) diff --git a/bot/modules/users_settings.py b/bot/modules/users_settings.py index e80c9de9d..0d4bc2a5a 100644 --- a/bot/modules/users_settings.py +++ b/bot/modules/users_settings.py @@ -49,7 +49,7 @@ async def get_user_settings(from_user, key=None, edit_type=None, edit_mode=None) buttons.callback("Reset", f"userset {user_id} reset_all") buttons.callback("Close", f"userset {user_id} close") text = f'User Settings for {name}' - button = buttons.menu(2) + button = buttons.column(2) elif key == 'universal': buttons.callback("YT-DLP Options", f"userset {user_id} yt_opt") ytopt = 'Not Exists' if (val:=user_dict.get('yt_opt', config_dict.get('YT_DLP_OPTIONS', ''))) == '' else val @@ -78,7 +78,7 @@ async def get_user_settings(from_user, key=None, edit_type=None, edit_mode=None) text += f'• Remname: {remname}' buttons.callback("Back", f"userset {user_id} back", "footer") buttons.callback("Close", f"userset {user_id} close", "footer") - button = buttons.menu(2) + button = buttons.column(2) elif key == 'mirror': buttons.callback("RClone", f"userset {user_id} rcc") rccmsg = "Exists" if await aiopath.exists(rclone_path) else "Not Exists" @@ -92,7 +92,7 @@ async def get_user_settings(from_user, key=None, edit_type=None, edit_mode=None) buttons.callback("Back", f"userset {user_id} back", "footer") buttons.callback("Close", f"userset {user_id} close", "footer") - button = buttons.menu(2) + button = buttons.column(2) elif key == 'leech': if user_dict.get('as_doc', False) or 'as_doc' not in user_dict and config_dict['AS_DOCUMENT']: ltype = "DOCUMENT" @@ -132,7 +132,7 @@ async def get_user_settings(from_user, key=None, edit_type=None, edit_mode=None) buttons.callback("Back", f"userset {user_id} back", "footer") buttons.callback("Close", f"userset {user_id} close", "footer") - button = buttons.menu(2) + button = buttons.column(2) elif edit_type: text = f"{fname_dict[key]} Settings :\n\n" if key == 'rcc': @@ -166,7 +166,7 @@ async def get_user_settings(from_user, key=None, edit_type=None, edit_mode=None) buttons.callback("Delete", f"userset {user_id} d{key}") buttons.callback("Back", f"userset {user_id} back {edit_type}", "footer") buttons.callback("Close", f"userset {user_id} close", "footer") - button = buttons.menu(2) + button = buttons.column(2) return text, button @@ -466,7 +466,7 @@ async def edit_user_settings(client, query): buttons.callback('Yes', f"userset {user_id} reset_now y") buttons.callback('No', f"userset {user_id} reset_now n") buttons.callback("Close", f"userset {user_id} close", "footer") - await editMessage(message, 'Do you want to Reset Settings ?', buttons.menu(2)) + await editMessage(message, 'Do you want to Reset Settings ?', buttons.column(2)) elif data[2] == 'reset_now': handler_dict[user_id] = False if data[3] == 'n': @@ -520,7 +520,7 @@ async def send_users_settings(client, message): msg = f'Total Users / Chats Data Saved : {len(user_data)}' buttons = ButtonMaker() buttons.callback("Close", f"userset {message.from_user.id} close") - button = buttons.menu(1) + button = buttons.column(1) for user, data in user_data.items(): msg += f'\n\n{user}:' if data: @@ -542,7 +542,7 @@ async def send_users_settings(client, message): buttons = ButtonMaker() buttons.callback("Delete", f"userset {message.from_user.id} user_del {userid}") buttons.callback("Close", f"userset {message.from_user.id} close") - button = buttons.menu(1) + button = buttons.column(1) for key, value in data.items(): if key in ['token', 'time']: continue diff --git a/bot/modules/ytdlp.py b/bot/modules/ytdlp.py index 18c859310..a08f5686e 100644 --- a/bot/modules/ytdlp.py +++ b/bot/modules/ytdlp.py @@ -109,7 +109,7 @@ async def get_quality(self, result): buttons.callback('Best Videos', 'ytq bv*+ba/b') buttons.callback('Best Audios', 'ytq ba/b') buttons.callback('Cancel', 'ytq cancel', 'footer') - self.__main_buttons = buttons.menu(3) + self.__main_buttons = buttons.column(3) msg = f'Choose Playlist Videos Quality:\nTimeout: {get_readable_time(self.__timeout-(time()-self.__time), True)}' else: format_dict = result.get('formats') @@ -155,7 +155,7 @@ async def get_quality(self, result): buttons.callback('Best Video', 'ytq bv*+ba/b') buttons.callback('Best Audio', 'ytq ba/b') buttons.callback('Cancel', 'ytq cancel', 'footer') - self.__main_buttons = buttons.menu(2) + self.__main_buttons = buttons.column(2) msg = f'Choose Video Quality:\nTimeout: {get_readable_time(self.__timeout-(time()-self.__time), True)}' self.__reply_to = await sendMessage(self.__message, msg, self.__main_buttons) await wrap_future(future) @@ -178,7 +178,7 @@ async def qual_subbuttons(self, b_name): buttons.callback(button_name, f'ytq sub {b_name} {tbr}') buttons.callback('Back', 'ytq back', 'footer') buttons.callback('Cancel', 'ytq cancel', 'footer') - subbuttons = buttons.menu(2) + subbuttons = buttons.column(2) msg = f'Choose Bit rate for {b_name}:\nTimeout: {get_readable_time(self.__timeout-(time()-self.__time), True)}' await editMessage(self.__reply_to, msg, subbuttons) @@ -191,7 +191,7 @@ async def mp3_subbuttons(self): buttons.callback(f'{q}K-mp3', f'ytq {audio_format}') buttons.callback('Back', 'ytq back') buttons.callback('Cancel', 'ytq cancel') - subbuttons = buttons.menu(3) + subbuttons = buttons.column(3) msg = f'Choose mp3 Audio{i} Bitrate:\nTimeout: {get_readable_time(self.__timeout-(time()-self.__time), True)}' await editMessage(self.__reply_to, msg, subbuttons) @@ -203,7 +203,7 @@ async def audio_format(self): buttons.callback(frmt, f'ytq aq {audio_format}') buttons.callback('Back', 'ytq back', 'footer') buttons.callback('Cancel', 'ytq cancel', 'footer') - subbuttons = buttons.menu(3) + subbuttons = buttons.column(3) msg = f'Choose Audio{i} Format:\nTimeout: {get_readable_time(self.__timeout-(time()-self.__time), True)}' await editMessage(self.__reply_to, msg, subbuttons) @@ -215,7 +215,7 @@ async def audio_quality(self, format): buttons.callback(qual, f'ytq {audio_format}') buttons.callback('Back', 'ytq aq back') buttons.callback('Cancel', 'ytq aq cancel') - subbuttons = buttons.menu(5) + subbuttons = buttons.column(5) msg = f'Choose Audio{i} Qaulity:\n0 is best and 10 is worst\nTimeout: {get_readable_time(self.__timeout-(time()-self.__time), True)}' await editMessage(self.__reply_to, msg, subbuttons) @@ -377,7 +377,7 @@ async def __run_multi(): for __i, __msg in enumerate(error_msg, 1): final_msg += f'\n
{__i}: {__msg}
' if error_button is not None: - error_button = error_button.menu(2) + error_button = error_button.column(2) await delete_links(message) force_m = await sendMessage(message, final_msg, error_button) await five_minute_del(force_m)