diff --git a/Stark/Plugins/rayso.py b/Stark/Plugins/rayso.py new file mode 100644 index 00000000..2ef39777 --- /dev/null +++ b/Stark/Plugins/rayso.py @@ -0,0 +1,229 @@ +#Credits to CatUB +#Originally made in telethon ny @feelded +#Ported to Pyrogram by @Naveen_xD + +import os +import re +import time +import random +import base64 +import requests +import contextlib +from datetime import datetime + +from selenium import webdriver +from selenium.webdriver.chrome.options import Options as ChromeOptions +from selenium.webdriver.common.by import By + +from Stark import error_handler +from Stark.config import Config +from pyrogram import Client, filters + +THEMES = [ + "breeze", + "candy", + "crimson", + "falcon", + "meadow", + "midnight", + "raindrop", + "sunset", +] + +MODES = ["mode-day", "mode-night"] + +class chromeDriver: + @staticmethod + def start_driver(): + if Config.CHROME_BIN is None: + return None, "Need to install Google Chrome or Chromium. Module Stopping." + try: + chrome_options = ChromeOptions() + chrome_options.binary_location = Config.CHROME_BIN + chrome_options.add_argument("--ignore-certificate-errors") + chrome_options.add_argument("--test-type") + chrome_options.add_argument("--headless=new") + chrome_options.add_argument("--no-sandbox") + chrome_options.add_argument("--disable-dev-shm-usage") + chrome_options.add_argument("--window-size=1920x1080") + chrome_options.add_argument("--disable-gpu") + prefs = {"download.default_directory": "./"} + chrome_options.add_experimental_option("prefs", prefs) + driver = webdriver.Chrome(options=chrome_options) + return driver, None + except Exception as err: + return None, str(err) + + @staticmethod + def bypass_cache(inputstr, driver=None): + if driver is None: + driver, error = chromeDriver.start_driver() + if not driver: + return None, error + driver.get(inputstr) + if "google" in inputstr: + with contextlib.suppress(Exception): + driver.find_element(By.ID, "L2AGLb").click() + with contextlib.suppress(Exception): + driver.find_element( + By.XPATH, "//button[@aria-label='Accept all']" + ).click() + return driver, None + + @staticmethod + def get_html(inputstr): + driver, error = chromeDriver.bypass_cache(inputstr) + if not driver: + return None, error + html = driver.page_source + driver.close() + return html, None + + @staticmethod + def get_rayso( + inputstr, file_name="Rayso.png", title="Mr.Stark", theme="crimson", darkMode=True + ): + url = f'https://ray.so/#code={base64.b64encode(inputstr.encode()).decode().replace("+","-")}&title={title}&theme={theme}&padding=64&darkMode={darkMode}&language=python' + driver, error = chromeDriver.start_driver() + if error: + return None, error + driver.set_window_size(2000, 20000) + driver.get(url) + element = driver.find_element(By.CLASS_NAME, "Controls_controls__kwzcE") + driver.execute_script("arguments[0].style.display = 'none';", element) + frame = driver.find_element(By.CLASS_NAME, "Frame_frame__Dmfe9") + frame.screenshot(file_name) + driver.quit() + return file_name, None + + @staticmethod + async def get_screenshot(inputstr, message=None): + start = datetime.now() + driver, error = chromeDriver.bypass_cache(inputstr) + if not driver: + return None, error + if message: + x = await message.reply_text( + "`Calculating Page Dimensions with Google Chrome BIN`" + ) + height = driver.execute_script( + "return Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);" + ) + width = driver.execute_script( + "return Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);" + ) + driver.set_window_size(width + 100, height + 100) + im_png = driver.get_screenshot_as_png() + if message: + await x.edit("`Stoppping Chrome Bin`") + driver.close() + end = datetime.now() + ms = (end - start).seconds + return im_png, f"**url : **{inputstr} \n**Time :** `{ms} seconds`" + +def text_chunk_list(query, bits=29900): + text_list = [] + string = query + checker = len(query) + if checker > bits: + limit = int(checker / (int(checker / bits) + 1)) + string = "" + + for item in query.split(" "): + string += f"{item} " + if len(string) > limit: + string = string.replace(item, "") + text_list.append(string) + string = "" + if string != "": + text_list.append(string) + return text_list + + +@Client.on_message(filters.command("Rayso")) +@error_handler +async def rayso_by_pro_odi(c, m): + "To paste text or file into image." + files = [] + captions = [] + reply_to_id = m.reply_to_message.id + try: + query = m.text.split(None, 1)[1] + except IndexError: + query = None + if m.reply_to_message: + rquery = m.reply_to_message.id + else: + rquery = None + rayso = await m.reply_text("**Processing...**") + checker = query.split(maxsplit=1) if query else None + # Add Theme + if checker and (checker[0].lower() in THEMES or checker[0].lower() == "random"): + if checker[0] == query and not rquery: + return await rayso.edit("`Theme changed to {query.title()}.`") + query = checker[1] if len(checker) > 1 else None + + # Add Mode + # if checker and checker[0].lower() in MODES: + # if checker[0] == query and not rquery: + # return await edit_delete( + # catevent, f"`Theme Mode changed to {query.title()}.`" + # ) + # query = checker[1] if len(checker) > 1 else None + + # Themes List + if query == "-l": + ALLTHEME = "**🎈Modes:**\n**1.** `Mode-Day`\n**2.** `Mode-Night`\n\n**🎈Themes:**\n**1.** `Random`" + for i, each in enumerate(THEMES, start=2): + ALLTHEME += f"\n**{i}.** `{each.title()}`" + return await rayso.edit(ALLTHEME) + + # Get Theme + theme = checker or "random" + if theme == "random": + theme = random.choice(THEMES) + + # Get Mode + mode = random.choice(MODES) + darkMode = mode == "mode-night" + + if query: + text = query + elif rquery: + if rquery.document and rquery.document.mime_type.startswith("text"): + filename = await rquery.download() + with open(filename, "r") as f: + text = str(f.read()) + os.remove(filename) + elif rquery.text: + text = rquery.txt + else: + return await rayso.edit("`Unsupported.`") + else: + return await rayso.edit("`What should I do?`") + + # // Max size 30000 byte but that breaks thumb so making on 28000 byte + text_list = text_chunk_list(text, 28000) + user = m.from_user.first_name + for i, text in enumerate(text_list, start=1): + await rayso.edit(f"**Making Rayso Image: {i}/{len(text_list)} **") + outfile, error = chromeDriver.get_rayso( + text, file_name=f"rayso{i}.png", title=user, theme=theme, darkMode=darkMode + ) + if error: + return await rayso.edit(error) + files.append(outfile) + captions.append("") + + await rayso.edit("**📎 Uploading... **") + captions[-1] = f"➥ Generated by : {m.from_user.mention}" + await c.send_document( + m.chat.id, + files, + reply_to=reply_to_id, + force_document=True, + caption=captions, + ) + await rayso.delete() + for name in files: + os.remove(name) \ No newline at end of file diff --git a/Stark/Plugins/stickers.py b/Stark/Plugins/stickers.py index 1df23198..0a857dd7 100644 --- a/Stark/Plugins/stickers.py +++ b/Stark/Plugins/stickers.py @@ -42,7 +42,7 @@ async def kang(c, m): if msg.reply_to_message.sticker: if msg.reply_to_message.sticker.is_animated == True: file_id = msg.reply_to_message.sticker.file_id - await kangani(m, c) + await kangani(c, m) elif msg.reply_to_message.sticker.is_video == True: file_id = msg.reply_to_message.sticker.file_id await kangwebm(m, c) diff --git a/Stark/config.py b/Stark/config.py index 4ce2b223..b6270c74 100644 --- a/Stark/config.py +++ b/Stark/config.py @@ -25,4 +25,5 @@ class Config(object): LEXICA_ART_7 = os.environ.get("LEXICA_ART_7", None) LEXICA_ART_8 = os.environ.get("LEXICA_ART_8", None) LEXICA_ART_9 = os.environ.get("LEXICA_ART_9", None) - LEXICA_ART_10 = os.environ.get("LEXICA_ART_10", None) \ No newline at end of file + LEXICA_ART_10 = os.environ.get("LEXICA_ART_10", None) + CHROME_BIN = os.environ.get("CHROME_BIN", "/usr/bin/google-chrome-stable") \ No newline at end of file diff --git a/main/helper_func/stcr_funcs.py b/main/helper_func/stcr_funcs.py index 9f26c84d..2d40da46 100644 --- a/main/helper_func/stcr_funcs.py +++ b/main/helper_func/stcr_funcs.py @@ -38,7 +38,7 @@ async def upload_document(client: Client, file_path: str, chat_id: int) -> raw.b ) async def kangMyAss(m, c, chat_id): - # await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) + await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) msg = m user = m.from_user user_id = str(m.from_user.id) @@ -46,7 +46,7 @@ async def kangMyAss(m, c, chat_id): packnum = 0 packname = "kang_" + str(user_id) + "_by_" + str(BOT_USERNAME) hm = await m.reply_text(f"`Processing ...`") - # await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) + await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) msg_id = f'{hm.id}' packname_found = 0 max_stickers = 120 @@ -132,9 +132,10 @@ async def kangMyAss(m, c, chat_id): print(e) return except Exception as e: + print(e) if "STICKERSET_INVALID" in str(e): hm2 = await hm.edit(f"`Creating a new pack ...`") - # await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) + await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) await makekang_internal(msg, user, f'{idk}.png', sticker_emoji, c, packname, packnum, chat_id, hm2, idk) elif str(e) == "Sticker_png_dimensions": im.save(f'{idk}.png') @@ -180,18 +181,20 @@ async def kangMyAss(m, c, chat_id): if os.path.isfile(f"{idk}.png"): os.remove(f"{idk}.png") -async def makekang_internal(msg, user, png_sticker, emoji, c, packname, packnum, chat_id, hm2, idk): +async def makekang_internal(msg, user, png_sticker, emoji, c, packname, packnum, chat_id, msg2, idk): name = user.first_name name = name[:50] user_id = str(user.id) success = None + try: extra_version = "" if packnum > 0: extra_version = " " + str(packnum) - user_peer = raw.types.InputPeerUser(user_id=user_id, access_hash=0) + user_peer = raw.types.InputPeerUser(user_id=int(user_id), access_hash=0) + print(user_peer) stcr = await create_sticker( - await upload_document(c, png_sticker, msg.chat.id), + await upload_document(Client, png_sticker, msg.chat.id), emoji ) # Create the sticker set @@ -203,17 +206,18 @@ async def makekang_internal(msg, user, png_sticker, emoji, c, packname, packnum, stickers=[stcr], # Wrap stcr in a list ) ) - print(success) + + print('Sticker created succesfully') except Exception as e: print(e) if str(e) == "Sticker set name is already occupied": - await msg.edit("Your pack can be found [Here](t.me/addstickers/%s)" % packname) - elif str(e) == "Peer_id_invalid": - await hm2.edit("Contact me in PM first.", reply_markup=types.InlineKeyboardMarkup([[types.InlineKeyboardButton(text="Start", url=f"t.me/{BOT_USERNAME}?start")]])) + await msg2.edit("Your pack can be found [Here](t.me/addstickers/%s)" % packname) + elif "user_id_invalid" in str(e).lower(): + await msg2.edit("Contact me in PM first.", reply_markup=types.InlineKeyboardMarkup([[types.InlineKeyboardButton(text="Start", url=f"t.me/{BOT_USERNAME}?start")]])) return - elif str(e) == "Internal Server Error: created sticker set not found (500)": - await hm2.edit("*Sticker pack successfully created.* `Get it` [Here](t.me/addstickers/%s)" % packname) - elif str(e) == "Invalid sticker emojis": + elif "internal server error" in str(e).lower(): + await msg2.edit("*Sticker pack successfully created.* `Get it` [Here](t.me/addstickers/%s)" % packname) + elif "invalid sticker emojis" in str(e).lower(): sticker_emoji = random.choice(emojiss) stcr = await create_sticker( await upload_document(c, f'{idk}.png', msg.chat.id), @@ -247,7 +251,7 @@ async def makekang_internal(msg, user, png_sticker, emoji, c, packname, packnum, stickers=[stcr], # Wrap stcr in a list ) ) - await hm2.edit("**Sticker pack successfully created.** `Get it` [Here](t.me/addstickers/%s)" % packname) + await msg2.edit("**Sticker pack successfully created.** `Get it` [Here](t.me/addstickers/%s)" % packname) elif str(e) == "Sticker_png_dimensions": im = Image.open(png_sticker) maxsize = (512, 512) @@ -289,12 +293,11 @@ async def makekang_internal(msg, user, png_sticker, emoji, c, packname, packnum, else: print("make pack", e) if success: - await hm2.edit(f"**Sticker pack successfully created.** ` Get it` [here](t.me/addstickers/%s)" % packname) + await msg2.edit(f"*Sticker pack successfully created.* ` Get it` [here](t.me/addstickers/%s)" % packname) else: - await hm2.edit("`Failed to create sticker pack. Possibly due to black magic.`") - + await msg2.edit("`Failed to create sticker pack. Possibly due to black magic.`") -async def kangani(m, c): +async def kangani(c, m): await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) msg = m user = m.from_user @@ -312,18 +315,22 @@ async def kangani(m, c): try: stickerset = await c.invoke( functions.messages.GetStickerSet( - stickerset=types.InputStickerSetShortName(short_name=packname), + stickerset=types.InputStickerSetShortName( + short_name=packname + ), hash=0 ) ) - if len(stickerset.stickers) >= max_stickers: + if int(stickerset.set.count) >= max_stickers: packnum += 1 packname = "kang_" + str(packnum) + "_" + str(user.id) + "animated_by_" + str(BOT_USERNAME) else: packname_found = 1 except Exception as e: - if str(e) == "Stickerset_invalid": - packname_found = 1 + print(e) + + # if "invalid" in str(e).lower(): + packname_found = 1 idk = str(rain(0000000000, 9999999999)) kangsticker = f"{idk}.tgs" if msg.reply_to_message: @@ -331,7 +338,7 @@ async def kangani(m, c): file_id = msg.reply_to_message.sticker.file_id else: msg.reply_text("I can't kang that") - await c.download_media(file_id, f'{idk}.tgs') + await c.download_media(file_id, f'./{idk}.tgs') try: sticker_emoji = msg.text.split(' ')[1] except: @@ -340,7 +347,7 @@ async def kangani(m, c): except: sticker_emoji = random.choice(emojiss) try: - await c.edit_message(message_id=hm.id, text=f"`With emoji` '{sticker_emoji}'") + await hm.edit(f"`With emoji` '{sticker_emoji}'") await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) stcr = await create_sticker( await upload_document(c, f'{idk}.tgs', msg.chat.id), @@ -349,21 +356,24 @@ async def kangani(m, c): try: await c.invoke( functions.stickers.AddStickerToSet( - stickerset=types.InputStickerSetShortName(short_name=packname), - sticker=stcr, - hash=0 + stickerset=types.InputStickerSetShortName( + short_name=packname + ), + sticker=stcr + # hash=0 ) ) await hm.edit(f"*Sticker successfully added to*: [Pack](t.me/addstickers/{packname}) \n*Emoji is*: {sticker_emoji}") except Exception as e: - if str(e) == "Stickerset_invalid": + print(e) + if "stickerset_invalid" in str(e).lower(): await hm.edit("`Brewing a new pack ...`") await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) try: extra_version = "" if packnum > 0: extra_version = " " + str(packnum) - user_peer = raw.types.InputPeerUser(user_id=user_id, access_hash=0) + user_peer = raw.types.InputPeerUser(user_id=int(user_id), access_hash=0) stcr = await create_sticker( await upload_document(c, f'{idk}.tgs', msg.chat.id), sticker_emoji @@ -372,13 +382,14 @@ async def kangani(m, c): success = await c.invoke( functions.stickers.CreateStickerSet( user_id=user_peer, - title=f"{name}'s kang pack", + title=f"{name}'s Animated kang pack"+ extra_version, short_name=packname, animated=True, stickers=[stcr], # Wrap stcr in a list ) ) except Exception as e: + print(e) if str(e) == "Sticker set name is already occupied": msg.reply_text("Your pack can be found [Here](t.me/addstickers/%s)" % packname) elif str(e) == "Peer_id_invalid": @@ -399,7 +410,8 @@ async def kangani(m, c): await hm.edit("*Sticker pack successfully created.* `Get it` [Here](t.me/addstickers/%s)" % packname) if os.path.isfile(f"{idk}.tgs"): os.remove(f"{idk}.tgs") - except: + except Exception as e: + print(e) await hm.edit("Something went wrong LOL") async def kangwebm(m, c): @@ -411,8 +423,9 @@ async def kangwebm(m, c): user_id = str(m.from_user.id) name = name[:50] packnum = 0 + success=None packname = "kang_" + str(user.id) + "video_by_" + str(BOT_USERNAME) - hm = m.reply_text(f"`Processing ⏳ ...`") + hm = await m.reply_text(f"`Processing ⏳ ...`") await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) packname_found = 0 max_stickers = 50 @@ -425,19 +438,19 @@ async def kangwebm(m, c): hash=0 ) ) - if len(stickerset.stickers) >= max_stickers: + if int(stickerset.set.count) >= max_stickers: packnum += 1 packname = "kang_" + str(packnum) + "_" + str(user.id) + "video_by_" + str(BOT_USERNAME) else: packname_found = 1 except Exception as e: - if str(e) == "Stickerset_invalid": - packname_found = 1 + print(e) + packname_found = 1 if msg.reply_to_message: if msg.reply_to_message.sticker: file_id = msg.reply_to_message.sticker.file_id - await c.download_media(file_id, f'{idk}.webm') + await c.download_media(file_id, f'./{idk}.webm') else: msg.reply_text("`I can't kang that`") return @@ -451,10 +464,12 @@ async def kangwebm(m, c): try: await hm.edit(f"`With emoji` '{sticker_emoji}'") await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) + # user_peer = raw.types.input_peer_user(user_id=int(user_id), access_hash=0) stcr = await create_sticker( await upload_document(c, f'{idk}.webm', msg.chat.id), sticker_emoji ) + await c.invoke( functions.stickers.AddStickerToSet( stickerset=types.InputStickerSetShortName(short_name=packname), @@ -464,34 +479,35 @@ async def kangwebm(m, c): await hm.edit(f"*Sticker successfully added to*: [Pack](t.me/addstickers/{packname}) \n*Emoji is*: {sticker_emoji}") except Exception as e: print("video kang error", e) - if str(e) == "Stickerset_invalid" or str(e) == "Stickers_too_much": + if "stickerset_invalid" in str(e).lower() or "stickers_too_much" in str(e).lower(): await hm.edit("`Brewing a new pack ...`") await c.send_chat_action(m.chat.id, enums.ChatAction.CHOOSE_STICKER) try: extra_version = "" if packnum > 0: extra_version = " " + str(packnum) - user_peer = raw.types.InputPeerUser(user_id=user_id, access_hash=0) + user_peer = raw.types.InputPeerUser(user_id=int(user_id), access_hash=0) stcr = await create_sticker( - await upload_document(c, f'{idk}.tgs', msg.chat.id), + await upload_document(c, f'{idk}.webm', msg.chat.id), sticker_emoji ) # Create the sticker set success = await c.invoke( functions.stickers.CreateStickerSet( user_id=user_peer, - title=f"{name}'s kang pack", + title=f"{name}' video kang pack" + extra_version, short_name=packname, videos=True, stickers=[stcr], # Wrap stcr in a list ) ) except Exception as e: - if str(e) == "Sticker set name is already occupied": + print(e) + if "ticker set name is already occupied" in str(e).lower(): msg.reply_text("Your pack can be found [Here](t.me/addstickers/%s)" % packname) - elif str(e) == "Peer_id_invalid": - msg.reply_text("Contact me in PM first.", reply_markup=types.InlineKeyboardMarkup([[types.InlineKeyboardButton(text="Start", url=f"t.me/{BOT_USERNAME}")]])) - elif str(e) == "Internal Server Error: created sticker set not found (500)": + elif "peer_id_invalid" in str(e).lower(): + msg.reply_text("Contact me in PM first.", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Start", url=f"t.me/{BOT_USERNAME}")]])) + else: await hm.edit("**Sticker pack successfully created.** `Get it` [Here](t.me/addstickers/%s)" % packname) if success: hm2 = await hm.edit(f"**Sticker pack successfully created.** `Get it` [Here](t.me/addstickers/%s)" % packname) @@ -506,4 +522,4 @@ async def kangwebm(m, c): elif str(e) == "Internal Server Error: created sticker set not found (500)": await hm.edit("**Sticker pack successfully created.** `Get it` [Here](t.me/addstickers/%s)" % packname) if os.path.isfile(f"{idk}.webm"): - os.remove(f"{idk}.webm") + os.remove(f"{idk}.webm") \ No newline at end of file diff --git a/start_req.sh b/start_req.sh index 5f59b09c..875566f9 100644 --- a/start_req.sh +++ b/start_req.sh @@ -57,6 +57,12 @@ sudo apt-get install ffmpeg -y echo -e "\e[32mInstalling gifsicle...\e[0m" sudo apt-get install gifsicle -y +echo -e "\e[32mInstalling GOOGLE-CHROME-STABLE...\e[0m" +wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && apt -fqqy install ./google-chrome-stable_current_amd64.deb && rm google-chrome-stable_current_amd64.deb + +echo -e "\e[32mInstalling GOOGLE-CHROME-STABLE...\e[0m" +wget https://chromedriver.storage.googleapis.com/$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE)/chromedriver_linux64.zip && unzip chromedriver_linux64.zip && chmod +x chromedriver && mv -f chromedriver /usr/bin/ && rm chromedriver_linux64.zip + echo -e "\e[32mUpdating repository...\e[0m" cd "Mr.Stark" && git pull && pip install -r req.txt