# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ # █▀█ █ █ █ █▀█ █▀▄ █ # © Copyright 2022 # https://t.me/hikariatama # # 🔒 Licensed under the GNU AGPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html # scope: hikka_min 1.2.10 # meta pic: https://img.icons8.com/external-xnimrodx-lineal-color-xnimrodx/512/000000/external-short-shopping-mall-xnimrodx-lineal-color-xnimrodx.png # meta banner: https://mods.hikariatama.ru/badges/surl.jpg # meta developer: @hikarimods # scope: hikka_only import logging import requests from telethon.tl.types import Message, MessageEntityUrl from .. import loader, utils logger = logging.getLogger(__name__) @loader.tds class AutoShortenerMod(loader.Module): """Automatically shortens urls in your messages, which are larger than specified threshold""" strings = { "name": "AutoShortener", "state": "🔗 Auotmatic url shortener is now {}", "no_args": "🔗 No link to shorten", "on": "on", "off": "off", } strings_ru = { "state": "🔗 Автоматический сократитель ссылок теперь {}", "no_args": "🔗 Не указана ссылка для сокращения", "_cmd_doc_autosurl": "Включить\\выключить автоматическое сокращение ссылок", "_cmd_doc_surl": "[ссылка] [движок]- Сократить ссылку", "_cls_doc": ( "Автоматически сокращает ссылки в твоих сообщениях, если они длиннее" " значения в конфиге" ), "on": "включен", "off": "выключен", } strings_de = { "state": "🔗 Automatisches URL-Kürzen ist jetzt {}", "no_args": "🔗 Kein Link zum Kürzen", "_cmd_doc_autosurl": ( "Aktivieren\\Deaktivieren Sie das automatische Kürzen von URLs" ), "_cmd_doc_surl": "[URL] [Engine] - URL kürzen", "_cls_doc": ( "Kürzt automatisch URLs in Ihren Nachrichten, wenn sie länger sind als" " Wert in der Konfiguration" ), "on": "Aktiviert", "off": "Deaktiviert", } strings_tr = { "state": "🔗 Otomatik URL kısaltıcı şimdi {}", "no_args": "🔗 Kısaltılacak URL yok", "_cmd_doc_autosurl": ( "URL'leri otomatik olarak kısaltmayı etkinleştirin\\devre dışı bırakın" ), "_cmd_doc_surl": "[URL] [motor] - URL kısalt", "_cls_doc": ( "URL'leri, yapılandırmanın değerinden daha uzun olduğunda mesajlarınızda" " otomatik olarak kısaltır" ), "on": "açık", "off": "kapalı", } strings_hi = { "state": "🔗 ऑटो यूआरएल शॉर्टनर अब {} है", "no_args": "🔗 संक्षिप्त करने के लिए कोई लिंक नहीं", "_cmd_doc_autosurl": "URL को स्वचालित रूप से छोटा करना चालू\\बंद करें", "_cmd_doc_surl": "[URL] [Engine] - URL को छोटा करें", "_cls_doc": ( "अपने संदेशों में यूआरएल को छोटा करता है, जब वे विन्यास में निर्दिष्ट मान से अधिक होते हैं" ), "on": "चालू", "off": "बंद", } strings_uz = { "state": "🔗 URL avtomatik qisqartiruvchisi hozir {}", "no_args": "🔗 Qisqartiladigan URL yo'q", "_cmd_doc_autosurl": "URL'ni avtomatik ravishda qisqartishni yoqish\\o'chirish", "_cmd_doc_surl": "[URL] [mashina] - URL'ni qisqartirish", "_cls_doc": ( "So'rovlarizdagi URL'ni konfiguratsiyadagi qiymatdan katta bo'lganda" " avtomatik ravishda qisqartadi" ), "on": "yoqilgan", "off": "o'chirilgan", } def __init__(self): self.config = loader.ModuleConfig( loader.ConfigValue( "threshold", 80, lambda: "Urls larger than this value will be automatically shortened", validator=loader.validators.Integer(minimum=50), ), loader.ConfigValue( "auto_engine", "owo", lambda: "Engine to auto-shorten urls with", validator=loader.validators.Choice(["owo", "gg", "gay"]), ), ) async def autosurlcmd(self, message: Message): """Toggle automatic url shortener""" state = not self.get("state", False) self.set("state", state) await utils.answer( message, self.strings("state").format("on" if state else "off") ) async def surlcmd(self, message: Message): """[url] [engine]- Shorten url""" if ( not getattr(message, "raw_text", False) or not getattr(message, "entities", False) or not message.entities or not any( isinstance(entity, MessageEntityUrl) for entity in message.entities ) ): reply = await message.get_reply_message() if ( not reply or not getattr(reply, "raw_text", False) or not getattr(reply, "entities", False) or not reply.entities or not any( isinstance(entity, MessageEntityUrl) for entity in reply.entities ) ): await utils.answer(message, self.strings("no_args")) return txt = reply.raw_text text = reply.text entities = reply.entities just_url = False else: txt = message.raw_text text = message.text entities = message.entities just_url = True urls = [ txt[entity.offset : entity.offset + entity.length] for entity in entities ] if just_url: text = "" for url in urls: surl = await self.shorten( url, txt.split()[-1] if len(txt.split()) > 1 else None ) if not just_url: text = text.replace(url, surl) else: text += f"{surl} | " await utils.answer(message, text.strip(" | ")) @staticmethod async def shorten(url, engine=None) -> str: if not engine or engine == "gg": r = await utils.run_sync( requests.post, "http://gg.gg/create", data={ "custom_path": None, "use_norefs": 0, "long_url": url, "app": "site", "version": "0.1", }, ) return r.text elif engine in ["owo", "gay"]: r = await utils.run_sync( requests.post, "https://owo.vc/generate", json={ "link": url, "generator": engine, "preventScrape": True, "owoify": True, }, headers={"User-Agent": "https://mods.hikariatama.ru/view/surl.py"}, ) logger.debug(r.json()) return "https://" + r.json()["result"] async def watcher(self, message: Message): if ( not getattr(message, "text", False) or not getattr(message, "out", False) or not getattr(message, "entities", False) or not message.entities or not any( isinstance(entity, MessageEntityUrl) for entity in message.entities ) or not self.get("state", False) or message.raw_text.lower().startswith(self.get_prefix()) ): return entities = message.entities urls = list( filter( lambda x: len(x) > int(self.config["threshold"]), [ message.raw_text[entity.offset : entity.offset + entity.length] for entity in entities ], ) ) if not urls: return text = message.text for url in urls: text = text.replace( url, await self.shorten(url, self.config["auto_engine"]) ) await message.edit(text)