# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ # █▀█ █ █ █ █▀█ █▀▄ █ # © 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 # May be working a lil bit weird, because info was manually # parsed from telegram schema and official telethon search # mechanism was used as a base for this search # meta pic: https://i.imgur.com/jH9i1SW.jpeg # meta banner: https://mods.hikariatama.ru/badges/teledocs.jpg # meta developer: @hikarimods # scope: inline # scope: hikka_only import re import requests as rqsts from telethon.tl.types import Message from .. import loader, utils from ..inline.types import InlineCall def get_message(i: dict) -> str: return ( f"🔧 {i['result']}\n\n" "🍙 Parameters:\n\n" f"ℹ️ {utils.escape_html(re.sub(r'<.*?>', '', i['description'][0]))}\n\n" f"{i['description'][1]}\n\n" "🦀 Example:\n\n" f"
{utils.escape_html(i['example'])}
" ) @loader.tds class TeledocsMod(loader.Module): """Telethon docs in your pocket""" strings = {"name": "Teledocs"} @staticmethod def _find(haystack: list, needle: str): if needle in haystack: return 0 haystack_index, needle_index, penalty, started = 0, 0, 0, False while True: while needle[needle_index] < "a" or needle[needle_index] > "z": needle_index += 1 if needle_index == len(needle): return penalty while haystack[haystack_index] != needle[needle_index]: haystack_index += 1 if started: penalty += 1 if haystack_index == len(haystack): return -1 haystack_index += 1 needle_index += 1 started = True if needle_index == len(needle): return penalty if haystack_index == len(haystack): return -1 def _get_search_array(self, original: list, original_urls: list, query: str): destination, destination_urls = [], [] for i, (item, itemu) in enumerate(zip(original, original_urls)): penalty = self._find(item.lower(), query) if penalty > -1 and penalty < len(item) / 3: destination += [[item, i]] destination_urls += [itemu] return destination, destination_urls def _build_list( self, found_elements: list, requests: bool = False, constructors: bool = False, ) -> list: return ( [ { "link": link, "result": item[0], "description": self._tl[ "requests_desc" if requests else "constructors_desc" ][item[1]], **( {"example": self._tl["requests_ex"][item[1]]} if requests else {"example": ""} ), } for item, link in zip(*found_elements) ] if requests or constructors else [ { "link": link, "result": item[0], "description": ["", ""], "example": "", } for item, link in zip(*found_elements) ] ) def search(self, query: str): found_requests = self._get_search_array( self._tl["requests"], self._tl["requests_urls"], query, ) found_types = self._get_search_array( self._tl["types"], self._tl["types_urls"], query, ) found_constructors = self._get_search_array( self._tl["constructors"], self._tl["constructors_urls"], query, ) original = self._tl["requests"] + self._tl["constructors"] original_urls = self._tl["requests_urls"] + self._tl["constructors_urls"] destination = [] destination_urls = [] for item, link in zip(original, original_urls): if item.lower().replace("request", "") == query: destination += [item] destination_urls += [link] return ( self._build_list(found_requests, True) + self._build_list(found_types) + self._build_list(found_constructors, False, True) ) async def client_ready(self, client, db): self._tl = ( await utils.run_sync( rqsts.get, "https://github.com/hikariatama/assets/raw/master/tl_docs.json", ) ).json() @loader.inline_everyone async def tl_inline_handler(self, query: InlineCall): return [ { "title": i["result"], "description": re.sub("<.*?>", "", i["description"][0]), "message": get_message(i), } for i in self.search(query.args) if i["description"][0] ][:50] async def tlcmd(self, message: Message): """ - Return telethon reference""" await utils.answer( message, get_message(self.search(utils.get_args_raw(message))[0]), )