from random import choice from pyrogram import enums, filters from pyrogram.errors import MediaCaptionTooLong from pyrogram.types import CallbackQuery, Message from Powers.bot_class import Gojo from Powers.utils.custom_filters import command from Powers.utils.extras import StartPic from Powers.utils.kbhelpers import ikb async def gen_formatting_kb(m): return ikb( [ [ ("Markdown Formatting", "formatting.md_formatting"), ("Fillings", "formatting.fillings"), ], [("Random Content", "formatting.random_content")], ], True, "commands" ) @Gojo.on_message( command(["markdownhelp", "formatting"]) & filters.private, ) async def markdownhelp(_, m: Message): await m.reply_photo( photo=str(choice(StartPic)), caption=f"{__HELP__}", quote=True, reply_markup=(await gen_formatting_kb(m)), ) return md_txt = """Markdown Formatting You can format your message using bold, italic, underline, strike and much more. Go ahead and experiment! **Note**: It supports telegram user based formatting as well as html and markdown formattings. Supported markdown: - `code words`: Backticks are used for monospace fonts. Shows as: code words. - __italic__: Underscores are used for italic fonts. Shows as: italic words. - **bold**: Asterisks are used for bold fonts. Shows as: bold words. - ```pre```: To make the formatter ignore other formatting characters inside the text formatted with '```', like: **bold** | *bold*. - --underline--: To make text underline. - ~~strike~~: Tildes are used for strikethrough. Shows as: strike. - ||spoiler||: Double vertical bars are used for spoilers. Shows as: Spoiler. - [hyperlink](example.com): This is the formatting used for hyperlinks. Shows as: hyperlink. - [My Button](buttonurl://example.com): This is the formatting used for creating buttons. This example will create a button named "My button" which opens example.com when clicked. If you would like to send buttons on the same row, use the :same formatting. Example: [button 1](buttonurl:example.com) [button 2](buttonurl://example.com:same) [button 3](buttonurl://example.com) This will show button 1 and 2 on the same line, while 3 will be underneath.""" async def get_splited_formatting(msg, page=1): msg = msg.split("\n") l = len(msg) new_msg = "" total = l // 10 first = 10 * (page - 1) last = 10 * page if not first: for i in msg[first:last]: new_msg += f"{i}\n" kb = [ [ ("Next page ▶️", f"next_format_{page + 1}") ] ] else: first += 1 if page == total: for i in msg[first:]: new_msg += f"{i}\n" kb = [ [ ("◀️ Previous page", f"next_format_{page - 1}") ] ] else: for i in msg[first:last]: new_msg += f"{i}\n" kb = [ [ ("◀️ Previous page", f"next_format_{page - 1}"), ("Next page ▶️", f"next_format_{page + 1}") ] ] kb = ikb(kb, True, "back.formatting") return new_msg, kb @Gojo.on_callback_query(filters.regex(r"^next_format_.*[0-9]$")) async def change_formatting_page(c: Gojo, q: CallbackQuery): page = q.data.split("_")[-1] txt, kb = await get_splited_formatting(md_txt, int(page)) await q.edit_message_caption(txt, reply_markup=kb, parse_mode=enums.ParseMode.HTML, ) return @Gojo.on_callback_query(filters.regex("^formatting.")) async def get_formatting_info(c: Gojo, q: CallbackQuery): cmd = q.data.split(".")[1] kb = ikb([[("Back", "back.formatting")]]) if cmd == "md_formatting": try: await q.edit_message_caption( caption=md_txt, reply_markup=kb, parse_mode=enums.ParseMode.HTML, ) except MediaCaptionTooLong: txt, kb = await get_splited_formatting(md_txt) await q.edit_message_caption( caption=txt, reply_markup=kb, parse_mode=enums.ParseMode.HTML, ) elif cmd == "fillings": await q.edit_message_caption( caption="""Fillings You can also customise the contents of your message with contextual data. For example, you could mention a user by name in the welcome message, or mention them in a filter! You can use these to mention a user in notes too! Supported fillings: - {first}: The user's first name. - {last}: The user's last name. - {fullname}: The user's full name. - {username}: The user's username. If they don't have one, mentions the user instead. - {mention}: Mentions the user with their firstname. - {id}: The user's ID. - {chatname}: The chat's name.""", reply_markup=kb, parse_mode=enums.ParseMode.HTML, ) elif cmd == "random_content": await q.edit_message_caption( caption="""Random Content Another thing that can be fun, is to randomise the contents of a message. Make things a little more personal by changing welcome messages, or changing notes! How to use random contents: - %%%: This separator can be used to add "random" replies to the bot. For example: hello %%% how are you This will randomly choose between sending the first message, "hello", or the second message, "how are you". Use this to make Gojo feel a bit more customised! (only works in filters/notes) Example welcome message:: - Every time a new user joins, they'll be presented with one of the three messages shown here. -> /filter "hey" hello there {first}! %%% Ooooh, {first} how are you? %%% Sup? {first}""", reply_markup=kb, parse_mode=enums.ParseMode.HTML, ) await q.answer() return @Gojo.on_callback_query(filters.regex("^back.")) async def send_mod_help(_, q: CallbackQuery): await q.edit_message_caption( caption="""Formatting Gojo supports a large number of formatting options to make your messages more expressive. Take a look by clicking the buttons below!""", reply_markup=(await gen_formatting_kb(q.message)), ) await q.answer() return __PLUGIN__ = "formatting" __alt_name__ = ["formatting", "markdownhelp", "markdown"] __buttons__ = [ [ ("Markdown Formatting", "formatting.md_formatting"), ("Fillings", "formatting.fillings"), ], [("Random Content", "formatting.random_content")], ] __HELP__ = """ **Formatting** Gojo supports a large number of formatting options to make your messages more expressive. Take a look by clicking the buttons below!"""