diff --git a/.github/stalebot.yml b/.github/stalebot.yml index 17665e7747a3ca0f05a1f73f947d1286f9a5063a..6bde0d024dbff6629fe860577450492d9ae782f4 100644 --- a/.github/stalebot.yml +++ b/.github/stalebot.yml @@ -7,7 +7,7 @@ staleLabel: inactive # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you + any recent activity. It will be closed if no further activity occurs. Thank you for your contributions. # Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false \ No newline at end of file +closeComment: false diff --git a/.gitignore b/.gitignore index 7b7616df13739558f5d6e96245f49b9d10350a03..66593fc4e58a36d1ba8fb0fedd4ef07861fb8db9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.session-journal *.session build +test* *.mp3 *.webm *.webp diff --git a/README.md b/README.md index a2ae18686b55d71d0f2f185b647656d352c1d2ac..3395f3be2277e2c9a27af8528aad02c6d7f54735 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Get the [Necessary Variables](#Necessary-Variables) and then click the button be ### Local Deploy - Easy Method - Linux - `wget -O locals.py https://git.io/JY9UM && python3 locals.py` - Windows - `cd desktop ; wget https://git.io/JY9UM -o locals.py ; python locals.py` -- Termux - `wget -O locals.py https://git.io/JY9UM && python locals.py` +- Termux - `wget -O install-termux https://tiny.ultroid.tech/termux && bash install-termux` ### Local Deploy - Traditional Method - Get your [Necessary Variables](#Necessary-Variables) diff --git a/assistant/__init__.py b/assistant/__init__.py index 374f650a613bc4645e3be18575d622c4d0dcab8b..dda3e546fb25ddd53cf973f0baf870de3dd60f16 100644 --- a/assistant/__init__.py +++ b/assistant/__init__.py @@ -7,10 +7,10 @@ from pyUltroid import * from pyUltroid import _ult_cache +from pyUltroid._misc import owner_and_sudos +from pyUltroid._misc._assistant import asst_cmd, callback, in_pattern from pyUltroid.functions.helper import * from pyUltroid.functions.tools import get_stored_file -from pyUltroid.misc import owner_and_sudos -from pyUltroid.misc._assistant import asst_cmd, callback, in_pattern from telethon import Button, custom from plugins import ATRA_COL diff --git a/assistant/callbackstuffs.py b/assistant/callbackstuffs.py index 87a5e7fbc8337ceedffbb815a66aa38e9007f4be..9b94fceeb837e4740e5d1719b8adbe9e1c170fc5 100644 --- a/assistant/callbackstuffs.py +++ b/assistant/callbackstuffs.py @@ -15,7 +15,11 @@ from os import execl, remove from random import choice from bs4 import BeautifulSoup as bs -from pyUltroid.functions.gDrive import GDriveManager + +try: + from pyUltroid.functions.gDrive import GDriveManager +except ImportError: + GDriveManager = None from pyUltroid.functions.helper import fast_download, progress, uploader from pyUltroid.functions.tools import ( Carbon, @@ -33,7 +37,7 @@ from . import * # --------------------------------------------------------------------# telegraph = telegraph_client() -GDrive = GDriveManager() +GDrive = GDriveManager() if GDriveManager else None # --------------------------------------------------------------------# @@ -1306,4 +1310,4 @@ async def fdroid_dler(event): if msg and hasattr(msg, "media"): FD_MEDIA.update({uri: msg.media}) os.remove(thumb) - os.remove(file) \ No newline at end of file + os.remove(file) diff --git a/assistant/games.py b/assistant/games.py index 1d140a4037316e52e8de3d7dcb6056209eb263f5..5f7029e3e643ba0f3569fc7a1ad4581b25cd8153 100644 --- a/assistant/games.py +++ b/assistant/games.py @@ -20,10 +20,17 @@ import uuid from html import unescape from random import choice, shuffle -import akinator +from . import LOGS + +try: + import akinator +except ImportError: + akinator = None + LOGS.error("'akinator' not installed.") + +from pyUltroid._misc._decorators import ultroid_cmd from pyUltroid.functions.helper import inline_mention from pyUltroid.functions.tools import async_searcher -from pyUltroid.misc._decorators import ultroid_cmd from telethon.errors.rpcerrorlist import ( BotMethodInvalidError, ChatSendStickersForbiddenError, @@ -41,6 +48,8 @@ aki_photo = "https://telegra.ph/file/3cc8825c029fd0cab9edc.jpg" @ultroid_cmd(pattern="akinator") async def akina(e): + if not akinator: + return sta = akinator.Akinator() games.update({e.chat_id: {e.id: sta}}) try: diff --git a/assistant/inlinestuff.py b/assistant/inlinestuff.py index 04e44aee2dc20aa1eb1ca6407d5773a6c05ca71f..b8398da46c6d8ecd1b468032b285a049a973424d 100644 --- a/assistant/inlinestuff.py +++ b/assistant/inlinestuff.py @@ -6,6 +6,7 @@ # . import base64 +import inspect from datetime import datetime from random import choice from re import compile as re_compile @@ -20,6 +21,7 @@ from pyUltroid.functions.tools import ( webuploader, ) from telethon import Button +from telethon.tl.alltlobjects import LAYER, tlobjects from telethon.tl.types import DocumentAttributeAudio as Audio from telethon.tl.types import InputWebDocument as wb @@ -158,7 +160,7 @@ async def _(e): filename = filename.split("/")[-1] await e.edit(f"Uploading `{filename}` on {host}") link = (await webuploader(chat_id, msg_id, host)).strip().replace("\n", "") - await e.edit(f"Uploaded [{filename}]({link}) on {host}.") + await e.edit(f"Uploaded `{filename}` on {host}.", buttons=Button.url("View", link)) @in_pattern("repo", owner=True) @@ -688,3 +690,197 @@ async def savn_s(event): ) await event.answer(res, switch_pm=swi, switch_pm_param="start") _savn_cache.update({query: res}) + + +_OMG = {} + + +@in_pattern("omgu", owner=True) +async def omgubuntu(ult): + try: + match = ult.text.split(maxsplit=1)[1].lower() + except IndexError: + return await ult.answer( + [], switch_pm="Enter Query to search...", switch_pm_param="start" + ) + if _OMG.get(match): + return await ult.answer( + _OMG[match], switch_pm="OMG Ubuntu Search :]", switch_pm_param="start" + ) + get_web = "https://www.omgubuntu.co.uk/?s=" + match.replace(" ", "+") + get_ = await async_searcher(get_web, re_content=True) + BSC = bs(get_, "html.parser", from_encoding="utf-8") + res = [] + for cont in BSC.find_all("div", "sbs-layout__item"): + img = cont.find("div", "sbs-layout__image") + url = img.find("a")["href"] + src = img.find("img")["src"] + con = cont.find("div", "sbs-layout__content") + tit = con.find("a", "layout__title-link") + title = tit.text.strip() + desc = con.find("p", "layout__description").text.strip() + text = f"[{title.strip()}]({url})\n\n{desc}" + img = wb(src, 0, "image/jpeg", []) + res.append( + await ult.builder.article( + title=title, + type="photo", + description=desc, + url=url, + text=text, + buttons=Button.switch_inline( + "Search Again", query=ult.text, same_peer=True + ), + include_media=True, + content=img, + thumb=img, + ) + ) + await ult.answer( + res, + switch_pm=f"Showing {len(res)} results!" if res else "No Results Found :[", + switch_pm_param="start", + ) + _OMG[match] = res + + +@in_pattern("tl", owner=True) +async def inline_tl(ult): + try: + match = ult.text.split(maxsplit=1)[1] + except IndexError: + text = f"**It is Telegram TlObjects Searcher.**\n__(Don't use if you don't know what it is!)__\n\nโ€ข Example Usage\n`@{asst.me.username} tl GetUserRequest`" + return await ult.answer( + [ + await ult.builder.article( + title="How to Use?", + description="Tl Searcher by Ultroid", + url="https://t.me/TheUltroid", + text=text, + ) + ], + switch_pm="Tl Search ๐Ÿ”", + switch_pm_param="start", + ) + res = [] + for key in tlobjects.values(): + if match.lower() in key.__name__.lower(): + tyyp = "Function" if "tl.functions." in str(key) else "Type" + text = f"**Name:** `{key.__name__}`\n" + text += f"**Category:** `{tyyp}`\n" + text += f"\n`from {key.__module__} import {key.__name__}`\n\n" + args = str(inspect.signature(key))[1:][:-1] + if args: + text += "**Parameter:**\n" + for para in args.split(","): + text += " " * 4 + "`" + para + "`\n" + text += f"\n**Layer:** `{LAYER}`" + res.append( + await ult.builder.article( + title=key.__name__, + description=tyyp, + url="https://t.me/TheUltroid", + text=text[:4000], + ) + ) + if not res: + mo = f"No Results for {match}!" + else: + mo = f"Showing {len(res)} results!" + await ult.answer(res[:50], switch_pm=mo, switch_pm_param="start") + + +@in_pattern("gh", owner=True) +async def gh_feeds(ult): + try: + username = ult.text.split(maxsplit=1)[1] + except IndexError: + return await ult.answer( + [], + switch_pm="Enter Github Username to see feeds...", + switch_pm_param="start", + ) + if not username.endswith("."): + return await ult.answer( + [], switch_pm="End your query with . to search...", switch_pm_param="start" + ) + username = username[:-1] + data = await async_searcher( + f"https://api.github.com/users/{username}/events", re_json=True + ) + if not isinstance(data, list): + msg = "" + for ak in list(data.keys()): + msg += ak + ": `" + data[ak] + "`\n" + return await ult.answer( + [ + await ult.builder.article( + title=data["message"], text=msg, link_preview=False + ) + ], + cache_time=300, + switch_pm="Error!!!", + switch_pm_param="start", + ) + res = [] + res_ids = [] + for cont in data[:50]: + text = f"@{username}" + title = f"@{username}" + extra = None + if cont["type"] == "PushEvent": + text += " pushed in" + title += " pushed in" + dt = cont["payload"]["commits"][-1] + url = "https://github.com/" + dt["url"].split("/repos/")[-1] + extra = f"\n-> message: {dt['message']}" + elif cont["type"] == "IssueCommentEvent": + title += " commented at" + text += " commented at" + url = cont["payload"]["comment"]["html_url"] + elif cont["type"] == "CreateEvent": + title += " created" + text += " created" + url = "https://github.com/" + cont["repo"]["name"] + elif cont["type"] == "PullRequestEvent": + if ( + cont["payload"]["pull_request"].get("user", {}).get("login") + != username.lower() + ): + continue + url = cont["payload"]["pull_request"]["html_url"] + text += " created a pull request in" + title += " created a pull request in" + elif cont["type"] == "ForkEvent": + text += " forked" + title += " forked" + url = cont["payload"]["forkee"]["html_url"] + else: + continue + repo = cont["repo"]["name"] + repo_url = "https://github.com/" + repo + title += " " + repo + text += f" {repo}" + if extra: + text += extra + thumb = wb(cont["actor"]["avatar_url"], 0, "image/jpeg", []) + article = await ult.builder.article( + title=title, + text=text, + url=repo_url, + parse_mode="html", + link_preview=False, + thumb=thumb, + buttons=[ + Button.url("View", url), + Button.switch_inline("Search again", query=ult.text, same_peer=True), + ], + ) + if article.id not in res_ids: + res_ids.append(article.id) + res.append(article) + if res: + msg = f"Showing {len(res)} feeds!" + else: + msg = "Nothing Found" + await ult.answer(res, cache_time=5000, switch_pm=msg, switch_pm_param="start") diff --git a/assistant/manager/__init__.py b/assistant/manager/__init__.py index 02ba8443ee63b66a893654e853f1b359f440c3b9..b09a5ac0852e0278720ccb00b871c12f9cfe1348 100644 --- a/assistant/manager/__init__.py +++ b/assistant/manager/__init__.py @@ -5,7 +5,7 @@ # PLease read the GNU Affero General Public License in # . +from pyUltroid._misc._decorators import ultroid_cmd from pyUltroid.functions.helper import inline_mention -from pyUltroid.misc._decorators import ultroid_cmd from .. import * diff --git a/assistant/manager/stickermanager.py b/assistant/manager/stickermanager.py index 1a8995bee53f6342c69c318056fbd1b28b8edc32..2b4a83af20c98bff6331fc24f257ded49b351c89 100644 --- a/assistant/manager/stickermanager.py +++ b/assistant/manager/stickermanager.py @@ -7,7 +7,7 @@ import random -from pyUltroid.functions.misc import create_quotly +from pyUltroid.functions.misc import Quotly from pyUltroid.functions.tools import TgConverter from telethon import errors from telethon.errors.rpcerrorlist import StickersetInvalidError @@ -54,7 +54,7 @@ async def kang_cmd(ult): image = TgConverter.resize_photo_sticker(dl) image.save(name, "WEBP") elif reply.text: - dl = await create_quotly(reply) + dl = await Quotly().create_quotly(reply) else: return await ult.eor("`Reply to sticker or text to add it in your pack...`") if not emoji: diff --git a/assistant/start.py b/assistant/start.py index d89bfad02aff74aec21317f9ab17aa03bfdc3c33..bc82cfa52b7b844f660c9501c07b6f4b79fa61dc 100644 --- a/assistant/start.py +++ b/assistant/start.py @@ -8,9 +8,9 @@ from datetime import datetime from pytz import timezone as tz +from pyUltroid._misc import SUDO_M, owner_and_sudos from pyUltroid.dB.asst_fns import * from pyUltroid.functions.helper import inline_mention -from pyUltroid.misc import SUDO_M, owner_and_sudos from telethon import Button, events from telethon.errors.rpcerrorlist import MessageDeleteForbiddenError from telethon.utils import get_display_name diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..9b9828ea5e5c9152084469761ce4963ca992f653 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: "3.9" +services: + worker: + build: . + environment: + REDIS_URI: $REDIS_URI + REDIS_PASSWORD: $REDIS_PASSWORD + SESSION: $SESSION + API_ID: $API_ID # defaults to None + API_HASH: $API_HASH # defaults to None + MONGO_URI: $MONGO_URI # defaults to None + DATABASE_URL: $DATABASE_URL # defaults to None diff --git a/install-termux b/install-termux new file mode 100644 index 0000000000000000000000000000000000000000..574ed1f12d201d7ca02b948676f3f82a7e80da1d --- /dev/null +++ b/install-termux @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# Ultroid - UserBot +# Copyright (C) 2021-2022 TeamUltroid +# +# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > +# PLease read the GNU Affero General Public License in . + +if [ -d "resources" ] +then + echo "Current directory Identified.." +else + apt install git -y + git clone https://github.com/TeamUltroid/Ultroid + cd Ultroid +fi +bash resources/startup/termux.sh diff --git a/plugins/__init__.py b/plugins/__init__.py index 94c6c35e9bb74a85d7479b45890526878a5b9825..f89a58ae604929d9e47995114d8ee2199ca14b6d 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -11,15 +11,16 @@ import os import time from random import choice +import requests from pyUltroid import * +from pyUltroid._misc._assistant import asst_cmd, callback, in_pattern +from pyUltroid._misc._decorators import ultroid_cmd +from pyUltroid._misc._wrappers import eod, eor from pyUltroid.dB import DEVLIST, ULTROID_IMAGES from pyUltroid.functions.helper import * from pyUltroid.functions.info import * from pyUltroid.functions.misc import * from pyUltroid.functions.tools import * -from pyUltroid.misc._assistant import asst_cmd, callback, in_pattern -from pyUltroid.misc._decorators import ultroid_cmd -from pyUltroid.misc._wrappers import eod, eor from pyUltroid.version import __version__, ultroid_version from telethon import Button, events from telethon.tl import functions, types @@ -28,6 +29,7 @@ from strings import get_string Redis = udB.get_key con = TgConverter +quotly = Quotly() OWNER_NAME = ultroid_bot.full_name OWNER_ID = ultroid_bot.uid diff --git a/plugins/_chatactions.py b/plugins/_chatactions.py index 1d84406d9a2873b24b6ec197df0cfe542c128e75..7048e3ec97f0c3138a97824cdde7dda8284f718a 100644 --- a/plugins/_chatactions.py +++ b/plugins/_chatactions.py @@ -36,7 +36,7 @@ async def Function(event): async def DummyHandler(ult): - # clean chat actions + # clean chat actions key = udB.get_key("CLEANCHAT") or [] if ult.chat_id in key: try: diff --git a/plugins/_help.py b/plugins/_help.py index d4637d5d149743b0818c4357f765d05ee797accd..06fcc3bbf08d3f9004f78d4c984bcb41cd23a1de 100644 --- a/plugins/_help.py +++ b/plugins/_help.py @@ -5,8 +5,10 @@ # PLease read the GNU Affero General Public License in # . - -from fuzzywuzzy.process import extractOne +try: + from fuzzywuzzy.process import extractOne +except ImportError: + extractOne = None from pyUltroid.dB._core import HELP, LIST from pyUltroid.functions.tools import cmd_regex_replace from telethon.errors.rpcerrorlist import ( @@ -83,12 +85,11 @@ async def _help(ult): break if not file: # the enter command/plugin name is not found - best_match = extractOne(plug, compare_strings) - return await ult.eor( - "`{}` is not a valid plugin!\nDid you mean `{}`?".format( - plug, best_match[0] - ), - ) + text = f"`{plug}` is not a valid plugin!" + if extractOne: + best_match = extractOne(plug, compare_strings) + text += "\nDid you mean `{}`?".format(best_match[0]) + return await ult.eor(text) output = f"**Command** `{plug}` **found in plugin** - `{file}`\n" if file in HELP["Official"]: for i in HELP["Official"][file]: diff --git a/plugins/_inline.py b/plugins/_inline.py index c9900214bf90ab2e065b9ce8c4bb048ac21799a3..a1ad3d0f24891f79358d9a6b95d6944a472ef151 100644 --- a/plugins/_inline.py +++ b/plugins/_inline.py @@ -11,10 +11,10 @@ from datetime import datetime from os import remove from git import Repo +from pyUltroid._misc._assistant import callback, in_pattern from pyUltroid.dB._core import HELP, LIST from pyUltroid.functions.helper import gen_chlog, time_formatter, updater from pyUltroid.functions.misc import split_list -from pyUltroid.misc._assistant import callback, in_pattern from telethon import Button from telethon.tl.types import InputWebDocument, Message from telethon.utils import resolve_bot_file_id @@ -332,9 +332,14 @@ async def _(e): [ Button.switch_inline( "Fแด…ส€แดษชแด… Sแด‡แด€ส€แด„สœ", query="fdroid telegram", same_peer=True - ) + ), + Button.switch_inline("Sแด€แด€แด ษด sแด‡แด€ส€แด„สœ", query="saavn", same_peer=True), + ], + [ + Button.switch_inline("TสŸ Sแด‡แด€ส€แด„สœ", query="tl", same_peer=True), + Button.switch_inline("Gษชแด›Hแดœส™ า“แด‡แด‡แด…s", query="gh", same_peer=True), ], - [Button.switch_inline("Sแด€แด€แด ษด sแด‡แด€ส€แด„สœ", query="saavn", same_peer=True)], + [Button.switch_inline("OแดษขUส™แดœษดแด›แดœ", query="omgu cutefish", same_peer=True)], [ Button.inline( "ยซ Bแด€แด„แด‹", diff --git a/plugins/_userlogs.py b/plugins/_userlogs.py index 091b0dfa90fe6a2ac918044e758a68ab73bb0f9e..7ade4c38323d5458518800ad21ffe3c1a68b3752 100644 --- a/plugins/_userlogs.py +++ b/plugins/_userlogs.py @@ -21,7 +21,18 @@ from telethon.errors.rpcerrorlist import ( from telethon.tl.types import MessageEntityMention, MessageEntityMentionName, User from telethon.utils import get_display_name -from . import ultroid_bot, asst, udB, inline_mention, Button, LOGS, get_string, LOG_CHANNEL, callback, events +from . import ( + LOG_CHANNEL, + LOGS, + Button, + asst, + callback, + events, + get_string, + inline_mention, + udB, + ultroid_bot, +) CACHE_SPAM = {} TAG_EDITS = {} diff --git a/plugins/_wspr.py b/plugins/_wspr.py index 2e938d6b4de7db089dbeb0877841eb389937fd74..84edcb1dd04acedc54522068b774790933bdd1f1 100644 --- a/plugins/_wspr.py +++ b/plugins/_wspr.py @@ -90,7 +90,7 @@ async def _(e): ] us = logi.username or logi.first_name sur = e.builder.article( - title=f"{logi.first_name}", + title=logi.first_name, description=desc, text=get_string("wspr_1").format(us), buttons=button, @@ -141,9 +141,11 @@ async def _(e): same_peer=True, ), ] - sur = e.builder.article( + sur = e.builder.document( title=user.first_name, description=desc, + file=logi.full_user.profile_photo, + include_media=False, text=text, buttons=button, ) diff --git a/plugins/admintools.py b/plugins/admintools.py index dd4a90f73415583d8c4bc75879e2603153b5c2a1..f1fd082c1a7dde44fe64888acf9223e098a0fb61 100644 --- a/plugins/admintools.py +++ b/plugins/admintools.py @@ -68,7 +68,11 @@ from . import ( @ultroid_cmd( - pattern="promote( (.*)|$)", admins_only=True, manager=True, require="add_admins" + pattern="promote( (.*)|$)", + admins_only=True, + manager=True, + require="add_admins", + fullsudo=True, ) async def prmte(ult): xx = await ult.eor(get_string("com_1")) @@ -96,7 +100,11 @@ async def prmte(ult): @ultroid_cmd( - pattern="demote( (.*)|$)", admins_only=True, manager=True, require="add_admins" + pattern="demote( (.*)|$)", + admins_only=True, + manager=True, + require="add_admins", + fullsudo=True, ) async def dmote(ult): xx = await ult.eor(get_string("com_1")) @@ -127,6 +135,7 @@ async def dmote(ult): admins_only=True, manager=True, require="ban_users", + fullsudo=True, ) async def bban(ult): something = await get_uinfo(ult) @@ -152,7 +161,11 @@ async def bban(ult): @ultroid_cmd( - pattern="unban( (.*)|$)", admins_only=True, manager=True, require="ban_users" + pattern="unban( (.*)|$)", + admins_only=True, + manager=True, + require="ban_users", + fullsudo=True, ) async def uunban(ult): xx = await ult.eor(get_string("com_1")) @@ -181,6 +194,7 @@ async def uunban(ult): pattern="kick( (.*)|$)", manager=True, require="ban_users", + fullsudo=True, ) async def kck(ult): if "kickme" in ult.text: @@ -215,7 +229,11 @@ async def kck(ult): @ultroid_cmd( - pattern="tban( (.*)|$)", admins_only=True, manager=True, require="ban_users" + pattern="tban( (.*)|$)", + admins_only=True, + manager=True, + require="ban_users", + fullsudo=True, ) async def tkicki(e): huh = e.text.split() @@ -235,9 +253,9 @@ async def tkicki(e): try: user = await e.client.get_entity(userid) except Exception as ex: - return await eor(d, f"`{ex}`") + return await eor(e, f"`{ex}`") try: - bun = await ban_time(e, tme) + bun = ban_time(e, tme) await e.client.edit_permissions( e.chat_id, user.id, until_date=bun, view_messages=False ) @@ -250,7 +268,13 @@ async def tkicki(e): return await e.eor(str(m)) -@ultroid_cmd(pattern="pin$", manager=True, require="pin_messages") +@ultroid_cmd( + pattern="pin$", + admins_only=True, + manager=True, + require="pin_messages", + fullsudo=True, +) async def pin(msg): if not msg.is_reply: return await eor(msg, get_string("pin_1")) @@ -273,6 +297,7 @@ async def pin(msg): admins_only=True, manager=True, require="pin_messages", + fullsudo=True, ) async def unp(ult): xx = await ult.eor(get_string("com_1")) @@ -292,7 +317,11 @@ async def unp(ult): @ultroid_cmd( - pattern="tpin( (.*)|$)", admins_only=True, manager=True, require="pin_messages" + pattern="tpin( (.*)|$)", + admins_only=True, + manager=True, + require="pin_messages", + fullsudo=True, ) async def pin_message(ult): match = ult.pattern_match.group(1).strip() @@ -301,7 +330,7 @@ async def pin_message(ult): if not match: return await ult.eor("`Please provide time..`", time=8) msg = await ult.eor(get_string("com_1")) - time = await ban_time(msg, match) + time = ban_time(msg, match) if not time: return msg_id = ult.reply_to_msg_id diff --git a/plugins/afk.py b/plugins/afk.py index c56cdc7aaeca24655a9cc997878c1623bfe88522..4b07f4fc684d5ef32bc577b6395c79a5bd9072c7 100644 --- a/plugins/afk.py +++ b/plugins/afk.py @@ -37,7 +37,7 @@ from . import ( old_afk_msg = [] -@ultroid_cmd(pattern="afk( (.*)|$)", fullsudo=True) +@ultroid_cmd(pattern="afk( (.*)|$)", owner_only=True) async def set_afk(event): if event.client._bot or is_afk(): return diff --git a/plugins/asstcmd.py b/plugins/asstcmd.py index d94a106b791598122a286f193ef55229065ef88e..f0f190d43cd5c18b50e0282a1bd0c6f777b564aa 100644 --- a/plugins/asstcmd.py +++ b/plugins/asstcmd.py @@ -18,12 +18,16 @@ """ import os -from pyUltroid.dB.asstcmd_db import * +from pyUltroid.dB.asstcmd_db import add_cmd, cmd_reply, list_cmds, rem_cmd from pyUltroid.functions.tools import create_tl_btn, format_btn, get_msg_button -from telegraph import upload_file as uf + +try: + from telegraph import upload_file as uf +except ImportError: + uf = None from telethon import events, utils -from . import asst, get_string, mediainfo, ultroid_cmd +from . import asst, get_string, mediainfo, udB, ultroid_cmd @ultroid_cmd(pattern="addcmd( (.*)|$)") diff --git a/plugins/audiotools.py b/plugins/audiotools.py index 6dc35a355517950a181f9def069a714e1eeedfb7..22cba885092836d2932edc2c4aa7abb2e2fbda7f 100644 --- a/plugins/audiotools.py +++ b/plugins/audiotools.py @@ -26,6 +26,7 @@ from datetime import datetime as dt from pyUltroid.functions.tools import set_attributes from . import ( + LOGS, bash, downloader, eod, diff --git a/plugins/autoban.py b/plugins/autoban.py new file mode 100644 index 0000000000000000000000000000000000000000..caa3bf7d1e150e8a18f523b476267eda498af865 --- /dev/null +++ b/plugins/autoban.py @@ -0,0 +1,158 @@ +# Ultroid - UserBot +# Copyright (C) 2021-2022 TeamUltroid +# +# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > +# PLease read the GNU Affero General Public License in +# . + +""" +โœ˜ Commands Available + +โ€ข `{i}autokick ` + on - To enable. + off - To disable. + Automatically kick new joined users from the group. + +โ€ข `{i}cban` + Enable/Disable autobanning send as channel in used chat. + +โ€ข `{i}addwl ` + Add Channel to channelban whitelist. + +โ€ข `{i}remwl ` + Remove Channel from channelban whitelist. + +โ€ข `{i}listwl` : List all whitelist channels. +""" + + +from pyUltroid.dB import autoban_db, dnd_db +from pyUltroid.functions.admins import get_update_linked_chat +from telethon import events +from telethon.tl.types import Channel + +from . import LOGS, asst, get_string, inline_mention, ultroid_bot, ultroid_cmd + + +async def dnd_func(event): + if event.chat_id in dnd_db.get_dnd_chats(): + for user in event.users: + try: + await ( + await event.client.kick_participant(event.chat_id, user) + ).delete() + except Exception as ex: + LOGS.error("Error in DND:") + LOGS.exception(ex) + await event.delete() + + +async def channel_del(event): + if not autoban_db.is_autoban_enabled(event.chat_id): + return + if autoban_db.is_whitelisted(event.chat_id, event.sender_id): + return + linked = await get_update_linked_chat(event) + if linked == event.sender.id: + return + if event.chat.creator or event.chat.admin_rights.ban_users: + try: + await event.client.edit_permissions( + event.chat_id, event.sender_id, view_messages=False + ) + except Exception as er: + LOGS.exception(er) + await event.try_delete() + + +@ultroid_cmd( + pattern="autokick (on|off)$", + admins_only=True, + manager=True, + require="ban_users", + fullsudo=True, +) +async def _(event): + match = event.pattern_match.group(1) + if match == "on": + if dnd_db.chat_in_dnd(event.chat_id): + return await event.eor("`Chat already in do not disturb mode.`", time=3) + dnd_db.add_dnd(event.chat_id) + event.client.add_handler( + dnd_func, events.ChatAction(func=lambda x: x.user_joined) + ) + await event.eor("`Do not disturb mode activated for this chat.`", time=3) + elif match == "off": + if not dnd_db.chat_in_dnd(event.chat_id): + return await event.eor("`Chat is not in do not disturb mode.`", time=3) + dnd_db.del_dnd(event.chat_id) + await event.eor("`Do not disturb mode deactivated for this chat.`", time=3) + + +@ultroid_cmd(pattern="cban$", admins_only=True) +async def ban_cha(ult): + if autoban_db.is_autoban_enabled(ult.chat_id): + autoban_db.del_channel(ult.chat_id) + return await ult.eor("`Disabled Auto ChannelBan...`") + if not ( + ult.chat.creator + or (ult.chat.admin_rights.delete_messages or ult.chat.admin_rights.ban_users) + ): + return await ult.eor( + "You are missing required admin rights!\nYou can't use ChannelBan without Ban/del privilege..`" + ) + autoban_db.add_channel(ult.chat_id) + await ult.eor("`Enabled Auto ChannelBan Successfully!`") + ult.client.add_handler( + channel_del, + events.NewMessage( + func=lambda x: not x.is_private and isinstance(x.sender, Channel) + ), + ) + + +@ultroid_cmd(pattern="(list|add|rem)wl( (.*)|$)") +async def do_magic(event): + match = event.pattern_match.group(1) + msg = await event.eor(get_string("com_1")) + if match == "list": + cha = autoban_db.get_whitelisted_channels(event.chat_id) + if not cha: + return await msg.edit("`No Whitelisted channels for current chat.`") + Msg = "**Whitelist Channels in Current Chat**\n\n" + for ch in cha: + Msg += f"(`{ch}`) " + try: + Msg += inline_mention(await event.client.get_entity(ch)) + except Exception: + Msg += "\n" + return await msg.edit(Msg) + usea = event.pattern_match.group(2).strip() + if not usea: + return await Msg.edit( + "`Please provide a channel username/id to add/remove to/from whitelist..`" + ) + try: + u_id = await event.client.parse_id(usea) + cha = await event.client.get_entity(u_id) + except Exception as er: + LOGS.exception(er) + return await msg.edit(f"Error Broke Out!\n`{er}`") + if match == "add": + autoban_db.add_to_whitelist(event.chat_id, u_id) + return await msg.edit(f"`Added` {inline_mention(cha)} `to WhiteList..`") + autoban_db.del_from_whitelist(event.chat_id, u_id) + await msg.edit(f"`Removed` {inline_mention(cha)} `from WhiteList.`") + + +if dnd_db.get_dnd_chats(): + ultroid_bot.add_handler(dnd_func, events.ChatAction(func=lambda x: x.user_joined)) + asst.add_handler(dnd_func, events.ChatAction(func=lambda x: x.user_joined)) + +if autoban_db.get_all_channels(): + ultroid_bot.add_handler( + channel_del, + events.NewMessage( + func=lambda x: not x.is_private and isinstance(x.sender, Channel) + ), + ) diff --git a/plugins/autocorrect.py b/plugins/autocorrect.py index bf419d64a7191ed4b8a88315c8f1d869c39d9695..d05847a994e70f22934ff1b9d6edcd6955b6be28 100644 --- a/plugins/autocorrect.py +++ b/plugins/autocorrect.py @@ -13,13 +13,14 @@ import string -from . import udB # ignore: pylint -from . import HNDLR, get_string, ultroid_bot, ultroid_cmd +from . import HNDLR, LOGS, get_string, udB, ultroid_bot, ultroid_cmd # ignore: pylint try: from gingerit.gingerit import GingerIt except ImportError: LOGS.info("GingerIt not found") + GingerIt = None + from google_trans_new import google_translator from telethon import events @@ -54,7 +55,7 @@ async def gramme(event): pass -if udB.get_key("AUTOCORRECT"): +if GingerIt and udB.get_key("AUTOCORRECT"): ultroid_bot.add_handler( gramme, events.NewMessage(outgoing=True, func=lambda x: x.text) ) diff --git a/plugins/autopic.py b/plugins/autopic.py index c323238b5903b9664010c76e6e887e7f42f1c98d..538349f17fdd57f6e302beae6a20354aafe847f1 100644 --- a/plugins/autopic.py +++ b/plugins/autopic.py @@ -92,8 +92,11 @@ if search := udB.get_key("AUTOPIC"): await ultroid_bot(UploadProfilePhotoRequest(file)) shuffle(ok) - from apscheduler.schedulers.asyncio import AsyncIOScheduler + try: + from apscheduler.schedulers.asyncio import AsyncIOScheduler - schedule = AsyncIOScheduler() - schedule.add_job(autopic_func, "interval", seconds=sleep) - schedule.start() + schedule = AsyncIOScheduler() + schedule.add_job(autopic_func, "interval", seconds=sleep) + schedule.start() + except ModuleNotFoundError as er: + LOGS.error(f"autopic: '{er.name}' not installed.") diff --git a/plugins/bot.py b/plugins/bot.py index e272fbb98e0cbe6db1b1776aaf42e39cd2adfc9e..5e127f75c9c7b1eb6115a02f923408979d37c3cb 100644 --- a/plugins/bot.py +++ b/plugins/bot.py @@ -38,13 +38,21 @@ import time from platform import python_version as pyver from random import choice -from git import Repo from pyUltroid.version import __version__ as UltVer from telethon import __version__ from telethon.errors.rpcerrorlist import ( BotMethodInvalidError, ChatSendMediaForbiddenError, ) + +from . import HOSTED_ON, LOGS + +try: + from git import Repo +except ImportError: + LOGS.error("bot: 'gitpython' module not found!") + Repo = None + from telethon.utils import resolve_bot_file_id from . import ( @@ -132,7 +140,7 @@ async def lol(ult): parse = "html" als = in_alive.format( header, - ultroid_version, + ultroid_version + f" [{HOSTED_ON}]", UltVer, pyver(), uptime, @@ -145,7 +153,7 @@ async def lol(ult): als = (get_string("alive_1")).format( header, OWNER_NAME, - ultroid_version, + ultroid_version + f" [{HOSTED_ON}]", UltVer, uptime, pyver(), @@ -272,7 +280,7 @@ async def inline_alive(ult): kk = f"{y}" als = in_alive.format( header, - ultroid_version, + ultroid_version + f" [{HOSTED_ON}]", UltVer, pyver(), uptime, @@ -319,9 +327,12 @@ async def inline_alive(ult): @ultroid_cmd(pattern="update( (.*)|$)") async def _(e): xx = await e.eor(get_string("upd_1")) - if e.pattern_match.group(1).strip() and ( - "fast" in e.pattern_match.group(1).strip() - or "soft" in e.pattern_match.group(1).strip() + if HOSTED_ON == "heroku" or ( + e.pattern_match.group(1).strip() + and ( + "fast" in e.pattern_match.group(1).strip() + or "soft" in e.pattern_match.group(1).strip() + ) ): await bash("git pull -f && pip3 install -r requirements.txt") call_back() diff --git a/plugins/button.py b/plugins/button.py index 3618214490653754a9f4db0fe3bf7a0090301419..42c1c7c19577b2c3d84b9650aecfaff4ed1f2105 100644 --- a/plugins/button.py +++ b/plugins/button.py @@ -15,11 +15,12 @@ Format:- `{i}button Hey There! @UseUltroid ๐Ÿ˜Ž. [TeamUltroid | t.me/TeamUltroid]` """ import os + from pyUltroid.functions.tools import create_tl_btn, get_msg_button from telegraph import upload_file as uf from telethon.utils import pack_bot_file_id -from . import HNDLR, ultroid_cmd, mediainfo, get_string +from . import HNDLR, get_string, mediainfo, ultroid_cmd from ._inline import something diff --git a/plugins/chats.py b/plugins/chats.py index c5f41a9f56ae48a28eeb5859b9d3f3a2317e6c47..90ce69941f2147a11f6bc925ae95e38e04b78665 100644 --- a/plugins/chats.py +++ b/plugins/chats.py @@ -11,6 +11,9 @@ Delete the group this cmd is used in. โ€ข `{i}getlink` +โ€ข `{i}getlink r` - `create link with admin approval` +โ€ข `{i}getlink r title_here` - `admin approval with link title` +โ€ข `{i}getlink 10` - `usage limit in new link` Get link of group this cmd is used in. โ€ข `{i}create (g|b|c) ; ` @@ -80,8 +83,9 @@ async def _(e): int(udB.get_key("LOG_CHANNEL")), get_string("chats_6").format(e.chat_id) ) + @ultroid_cmd( - pattern="getlink", + pattern="getlink( (.*)|$)", groups_only=True, manager=True, ) @@ -94,16 +98,34 @@ async def _(e): chat = await e.get_chat() if hasattr(chat, "username") and chat.username: return await e.eor(f"Username: @{chat.username}") - request, usage = None, None + request, usage, title = None, None, None if match: - split = match.split() + split = match.split(maxsplit=1) request = bool(split[0] in ["r", "request"]) - if len(split) > 1 and split[1].isdigit(): - usage = int(split[1]) - if request: + title = "Created by Ultroid" + if len(split) > 1: + match = split[1] + spli = match.split(maxsplit=1) + if spli[0].isdigit(): + usage = int(spli[0]) + if len(spli) > 1: + title = spli[1] + elif not request: + if match.isdigit(): + usage = int(match) + else: + title = match + if request and usage: + usage = 0 + if request or title: try: r = await e.client( - ExportChatInviteRequest(e.chat_id, request_needed=request, usage_limit=usage, title="Create via Ultroid"), + ExportChatInviteRequest( + e.chat_id, + request_needed=request, + usage_limit=usage, + title=title, + ), ) except no_admin: return await e.eor(get_string("chats_2"), time=10) diff --git a/plugins/database.py b/plugins/database.py index ddbbb49bc69bd564ff0d873a64ec1543b7748ffc..02eca63b7873d617ad7264930f38b089501605f2 100644 --- a/plugins/database.py +++ b/plugins/database.py @@ -14,6 +14,7 @@ e.g : `{i}setdb hi there` `{i}setdb hi there | ultroid here` + `{i}setdb --extend variable value` or `{i}setdb -e variable value` to add the value to the exiting values in db. โ€ข `{i}deldb key` Delete Key from DB. diff --git a/plugins/devtools.py b/plugins/devtools.py index e91eb12b4d16f59d992d8b2378c2a0b6d447b0a6..267ddc03e2f521dbfd3e2302b1e051dbc59b5fd1 100644 --- a/plugins/devtools.py +++ b/plugins/devtools.py @@ -9,6 +9,7 @@ โœ˜ Commands Available - โ€ข `{i}bash ` +โ€ข `{i}bash -c ` Carbon image as command output. Run linux commands on telegram. โ€ข `{i}eval ` @@ -26,7 +27,6 @@ โ€ข `{i}sysinfo` Shows System Info. """ -from __future__ import print_function import sys import traceback @@ -41,9 +41,16 @@ try: import black except ImportError: black = None +from random import choice +try: + from telegraph import upload_file as uf +except ImportError: + uf = None from . import * +_ignore_eval = [] + @ultroid_cmd( pattern="sysinfo$", @@ -53,7 +60,7 @@ async def _(e): x, y = await bash("neofetch|sed 's/\x1B\\[[0-9;\\?]*[a-zA-Z]//g' >> neo.txt") with open("neo.txt", "r") as neo: p = (neo.read()).replace("\n\n", "") - haa = await Carbon(code=p, file_name="neofetch") + haa = await Carbon(code=p, file_name="neofetch", backgroundColor=choice(ATRA_COL)) await e.reply(file=haa) await xx.delete() remove("neo.txt") @@ -61,11 +68,19 @@ async def _(e): @ultroid_cmd(pattern="bash", fullsudo=True, only_devs=True) async def _(event): + carb = None try: cmd = event.text.split(" ", maxsplit=1)[1] + if cmd.split()[0] in ["-c", "--carbon"]: + cmd = cmd.split(maxsplit=1)[1] + carb = True except IndexError: return await event.eor(get_string("devs_1"), time=10) xx = await event.eor(get_string("com_1")) + if event.sender_id in _ignore_eval: + return await xx.edit( + "`You cannot use this command now. Contact owner of this bot!`" + ) reply_to_id = event.reply_to_msg_id or event.id stdout, stderr = await bash(cmd) OUT = f"**โ˜ž BASH\n\nโ€ข COMMAND:**\n`{cmd}` \n\n" @@ -73,9 +88,23 @@ async def _(event): if stderr: err = f"**โ€ข ERROR:** \n`{stderr}`\n\n" if stdout: - _o = stdout.split("\n") - o = "\n".join(_o) - out = f"**โ€ข OUTPUT:**\n`{o}`" + if (carb or udB.get_key("CARBON_ON_BASH")) and ( + event.chat.admin_rights + or event.chat.creator + or event.chat.default_banned_rights.embed_links + ): + li = await Carbon( + code=stdout, + file_name="bash", + download=True, + backgroundColor=choice(ATRA_COL), + ) + url = "https://telegra.ph" + uf(li)[-1] + OUT = f"[\xad]({url})" + OUT + out = "**โ€ข OUTPUT:**" + remove(li) + else: + out = f"**โ€ข OUTPUT:**\n`{stdout}`" if not stderr and not stdout: out = "**โ€ข OUTPUT:**\n`Success`" OUT += err + out @@ -95,7 +124,7 @@ async def _(event): await xx.delete() else: - await xx.edit(OUT) + await xx.edit(OUT, link_preview=True) pp = pprint # ignore: pylint @@ -118,9 +147,6 @@ def _parse_eval(value=None): return str(value) -_ignore_eval = [] - - @ultroid_cmd(pattern="eval", fullsudo=True, only_devs=True) async def _(event): try: @@ -150,13 +176,13 @@ async def _(event): # Consider it as Code Error, and move on to be shown ahead. pass reply_to_id = event.reply_to_msg_id or event + if event.sender_id in _ignore_eval: + return await xx.edit( + "`You cannot use this command now. Contact owner of this bot!`" + ) if any(item in cmd for item in KEEP_SAFE().All) and ( not (event.out or event.sender_id == ultroid_bot.uid) ): - if event.sender_id in _ignore_eval: - return await xx.edit( - "`You cannot use this command now. Contact owner of this bot!`" - ) warning = await event.forward_to(udB.get_key("LOG_CHANNEL")) await warning.reply( f"Malicious Activities suspected by {inline_mention(await event.get_sender())}" @@ -259,7 +285,7 @@ async def doie(e): open("cpp-ultroid.cpp", "w").write(match) m = await bash("g++ -o CppUltroid cpp-ultroid.cpp") o_cpp = f"โ€ข **Eval-Cpp**\n`{match}`" - if m[1] != "": + if m[1]: o_cpp += f"\n\n**โ€ข Error :**\n`{m[1]}`" if len(o_cpp) > 3000: os.remove("cpp-ultroid.cpp") @@ -272,7 +298,7 @@ async def doie(e): m = await bash("./CppUltroid") if m[0] != "": o_cpp += f"\n\n**โ€ข Output :**\n`{m[0]}`" - if m[1] != "": + if m[1]: o_cpp += f"\n\n**โ€ข Error :**\n`{m[1]}`" if len(o_cpp) > 3000: with BytesIO(str.encode(o_cpp)) as out_file: diff --git a/plugins/dnd.py b/plugins/dnd.py deleted file mode 100644 index 3f62a1bb4b8ac3c1b658d865900fad2505d5f59d..0000000000000000000000000000000000000000 --- a/plugins/dnd.py +++ /dev/null @@ -1,59 +0,0 @@ -# Ultroid - UserBot -# Copyright (C) 2021-2022 TeamUltroid -# -# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > -# PLease read the GNU Affero General Public License in -# . - -""" -โœ˜ Commands Available - -Do Not Disturb - As it says, activating this in your group will kick new users who joins the group. - -โ€ข `{i}dnd` - To activate. - -โ€ข `{i}deldnd` - To deactivate. -""" - - -from pyUltroid.dB.dnd_db import add_dnd, chat_in_dnd, del_dnd, get_dnd_chats -from telethon import events - -from . import LOGS, asst, ultroid_bot, ultroid_cmd - - -async def dnd_func(event): - if event.chat_id in get_dnd_chats(): - for user in event.users: - try: - await ( - await event.client.kick_participant(event.chat_id, user) - ).delete() - except Exception as ex: - LOGS.error("Error in DND:") - LOGS.exception(ex) - await event.delete() - - -@ultroid_cmd(pattern="dnd$", manager=True, admins_only=True, groups_only=True) -async def _(event): - if chat_in_dnd(event.chat_id): - return await event.eor("`Chat already in do not disturb mode.`", time=3) - add_dnd(event.chat_id) - event.client.add_handler(dnd_func, events.ChatAction(func=lambda x: x.user_joined)) - await event.eor("`Do not disturb mode activated for this chat.`", time=3) - - -@ultroid_cmd(pattern="deldnd$", manager=True, admins_only=True, groups_only=True) -async def _(event): - if not chat_in_dnd(event.chat_id): - return await event.eor("`Chat is not in do not disturb mode.`", time=3) - del_dnd(event.chat_id) - await event.eor("`Do not disturb mode deactivated for this chat.`", time=3) - - -if get_dnd_chats(): - ultroid_bot.add_handler(dnd_func, events.ChatAction(func=lambda x: x.user_joined)) - asst.add_handler(dnd_func, events.ChatAction(func=lambda x: x.user_joined)) diff --git a/plugins/downloadupload.py b/plugins/downloadupload.py index 583e92c5484b641b6d7fe44436002520aa23fee5..d3b217e3f2477a3faffed70f0eddd336ff7cf093 100644 --- a/plugins/downloadupload.py +++ b/plugins/downloadupload.py @@ -23,6 +23,7 @@ """ import asyncio +import glob import os import time from datetime import datetime as dt @@ -135,13 +136,12 @@ async def download(event): pattern="ul( (.*)|$)", ) async def _(event): - if len(event.text) >= 8: - if "ultroid" in event.text[:7]: - return msg = await event.eor(get_string("com_1")) match = event.pattern_match.group(1) if match: match = match.strip() + if not event.out and match == ".env": + return await event.reply("`You can't do this...`") stream, force_doc, delete, thumb = ( False, True, @@ -163,57 +163,63 @@ async def _(event): .replace("--no-thumb", "") .strip() ) - if not os.path.exists(match): + if match.endswith("/"): + match += "*" + results = glob.glob(match) + if not results and os.path.exists(match): + results = [match] + if not results: try: await event.reply(file=match) - await event.try_delete() + return await event.try_delete() except Exception as er: LOGS.exception(er) return await msg.eor("`File doesn't exist or path is incorrect!`") - if os.path.isdir(match): - c, s = 0, 0 - for files in sorted(os.listdir(match)): - attributes = None - if stream: + for result in results: + if os.path.isdir(result): + c, s = 0, 0 + for files in sorted(glob.glob(result + "/*")): + attributes = None + if stream: + try: + attributes = await set_attributes(files) + except KeyError as er: + LOGS.exception(er) try: - attributes = await set_attributes(files) - except KeyError as er: - LOGS.exception(er) + file, _ = await event.client.fast_uploader( + files, show_progress=True, event=msg, to_delete=delete + ) + await event.client.send_file( + event.chat_id, + file, + supports_streaming=stream, + force_document=force_doc, + thumb=thumb, + attributes=attributes, + caption=f"`Uploaded` `{files}` `in {time_formatter(_*1000)}`", + reply_to=event.reply_to_msg_id or event, + ) + s += 1 + except (ValueError, IsADirectoryError): + c += 1 + break + attributes = None + if stream: try: - file, _ = await event.client.fast_uploader( - match + "/" + files, show_progress=True, event=msg, to_delete=delete - ) - await event.client.send_file( - event.chat_id, - file, - supports_streaming=stream, - force_document=force_doc, - thumb=thumb, - attributes=attributes, - caption=f"`Uploaded` `{match}/{files}` `in {time_formatter(_*1000)}`", - reply_to=event.reply_to_msg_id or event, - ) - s += 1 - except (ValueError, IsADirectoryError): - c += 1 - return await msg.eor(f"`Uploaded {s} files, failed to upload {c}.`") - attributes = None - if stream: - try: - attributes = await set_attributes(match) - except KeyError as er: - LOGS.exception(er) - file, _ = await event.client.fast_uploader( - match, show_progress=True, event=msg, to_delete=delete - ) - await event.client.send_file( - event.chat_id, - file, - supports_streaming=stream, - force_document=force_doc, - thumb=thumb, - attributes=attributes, - caption=f"`Uploaded` `{match}` `in {time_formatter(_*1000)}`", - reply_to=event.reply_to_msg_id or event, - ) + attributes = await set_attributes(result) + except KeyError as er: + LOGS.exception(er) + file, _ = await event.client.fast_uploader( + result, show_progress=True, event=msg, to_delete=delete + ) + await event.client.send_file( + event.chat_id, + file, + supports_streaming=stream, + force_document=force_doc, + thumb=thumb, + attributes=attributes, + caption=f"`Uploaded` `{result}` `in {time_formatter(_*1000)}`", + reply_to=event.reply_to_msg_id or event, + ) await msg.try_delete() diff --git a/plugins/fakeaction.py b/plugins/fakeaction.py index 8780cac6f126b26c47c22d1846201658250a88cb..30a97edc4f13877dbc994b3f536a120688316ae3 100644 --- a/plugins/fakeaction.py +++ b/plugins/fakeaction.py @@ -56,7 +56,7 @@ async def _(e): if t.isdigit(): t = int(t) elif t.endswith(("s", "h", "d", "m")): - t = math.ceil((await ban_time(e, t)) - time.time()) + t = math.ceil((ban_time(e, t)) - time.time()) else: t = 60 await e.eor(get_string("fka_1").format(str(t)), time=5) diff --git a/plugins/fileshare.py b/plugins/fileshare.py index 499c9c78eb2b3e503ffb0d5dd36a14767a752eaf..a3bb1b8bc2e5560b5745eb26d79491286f311704 100644 --- a/plugins/fileshare.py +++ b/plugins/fileshare.py @@ -24,7 +24,7 @@ import os from pyUltroid.dB.filestore_db import del_stored, get_stored_msg, list_all_stored_msgs from pyUltroid.functions.tools import get_file_link -from . import asst, get_string, in_pattern, udB, ultroid_bot, ultroid_cmd, HNDLR +from . import HNDLR, asst, get_string, in_pattern, udB, ultroid_bot, ultroid_cmd @ultroid_cmd(pattern="store$") diff --git a/plugins/forcesubscribe.py b/plugins/forcesubscribe.py index 38cee781bdca43ae4fefa3d337472423b91622ec..8bc28f88513ee1a8129c0fe3d23e5a807ceaa317 100644 --- a/plugins/forcesubscribe.py +++ b/plugins/forcesubscribe.py @@ -87,7 +87,7 @@ async def fcall(e): spli = match.split("_") user = await ultroid_bot.get_entity(int(spli[0])) cl = await ultroid_bot.get_entity(int(spli[1])) - text = f"Hi [{inline_mention(user)}), You Need to Join" + text = f"Hi {inline_mention(user)}, You Need to Join" text += f" {cl.title} in order to Chat in this Group." if not cl.username: el = (await ultroid_bot(ExportChatInviteRequest(cl))).link @@ -131,7 +131,6 @@ async def diesoon(e): async def force_sub(ult): if not udB.get_key("FORCESUB"): return - user = await ult.get_sender() joinchat = get_forcesetting(ult.chat_id) if (not joinchat) or (isinstance(user, User) and user.bot): @@ -145,7 +144,7 @@ async def force_sub(ult): CACHE.update({ult.chat_id: {user.id: 1}}) count = CACHE[ult.chat_id][user.id] if count == 11: - CACHE[ult.chat_id][user.id].update(1) + CACHE[ult.chat_id][user.id] = 1 return if count in range(2, 11): return @@ -167,6 +166,7 @@ async def force_sub(ult): except ChatAdminRequiredError: return except Exception as e: + await ult.delete() LOGS.info(e) res = await ultroid_bot.inline_query(asst.me.username, f"fsub {user.id}_{joinchat}") await res[0].click(ult.chat_id, reply_to=ult.id) diff --git a/plugins/globaltools.py b/plugins/globaltools.py index 948f58fab7849da8645a58a4ff0c65216ab66856..d85a5a5b4c8faf4f4bfdf9ad6f53b0d256e745a2 100644 --- a/plugins/globaltools.py +++ b/plugins/globaltools.py @@ -291,7 +291,9 @@ async def _(e): xx = await e.eor("`UnGbanning...`") match = e.pattern_match.group(1).strip() peer = None - if match: + if e.reply_to_msg_id: + userid = (await e.get_reply_message()).sender_id + elif match: try: userid = int(match) except ValueError: @@ -300,8 +302,6 @@ async def _(e): userid = (await e.client.get_entity(userid)).id except (ValueError, Exception) as er: return await xx.edit(f"Failed to get User...\nError: {er}") - elif e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id elif e.is_private: userid = e.chat_id else: @@ -354,7 +354,13 @@ async def _(e): async def _(e): xx = await e.eor("`Gbanning...`") reason = "" - if e.pattern_match.group(1).strip(): + if e.reply_to_msg_id: + userid = (await e.get_reply_message()).sender_id + try: + reason = e.text.split(" ", maxsplit=1)[1] + except IndexError: + pass + elif e.pattern_match.group(1).strip(): usr = e.text.split(maxsplit=2)[1] try: userid = await e.client.parse_id(usr) @@ -364,12 +370,6 @@ async def _(e): reason = e.text.split(maxsplit=2)[2] except IndexError: pass - elif e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id - try: - reason = e.text.split(" ", maxsplit=1)[1] - except IndexError: - pass elif e.is_private: userid = e.chat_id try: @@ -503,8 +503,8 @@ async def gcast(event): chat, msg, file=reply.media if reply else None ) done += 1 - except Exception as er: - err += f"โ€ข {er}\n" + except Exception as rr: + err += f"โ€ข {rr}\n" er += 1 except BaseException as h: err += "โ€ข " + str(h) + "\n" diff --git a/plugins/imagetools.py b/plugins/imagetools.py index 3992c1cfdd41010ef676ad5c75c474caab87277e..197ee7bec14c1f4a1656722647f7acc6a52427d1 100644 --- a/plugins/imagetools.py +++ b/plugins/imagetools.py @@ -52,13 +52,16 @@ โ€ข `{i}pixelator ` Create a Pixelated Image.. """ -import asyncio import os -import cv2 -import numpy as np +from . import LOGS, con -from . import LOGS +try: + import cv2 +except ImportError: + LOGS.error(f"{__file__}: OpenCv not Installed.") + +import numpy as np try: from PIL import Image @@ -94,22 +97,7 @@ async def sketch(e): ultt = await ureply.download_media() if ultt.endswith(".tgs"): await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") img = cv2.imread(file) gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) inverted_gray_image = 255 - gray_image @@ -164,22 +152,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): xx = await event.eor(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - xx = await event.eor(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) ultroid = cv2.cvtColor(ult, cv2.COLOR_BGR2GRAY) cv2.imwrite("ult.jpg", ultroid) @@ -206,22 +179,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): xx = await event.eor(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - xx = await event.eor(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) ultroid = cv2.GaussianBlur(ult, (35, 35), 0) cv2.imwrite("ult.jpg", ultroid) @@ -249,22 +207,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) ultroid = cv2.bitwise_not(ult) cv2.imwrite("ult.jpg", ultroid) @@ -290,24 +233,7 @@ async def ultd(event): await xx.edit(get_string("cvt_3")) return ultt = await ureply.download_media() - if ultt.endswith(".tgs"): - await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) ish = cv2.flip(ult, 1) ultroid = cv2.hconcat([ult, ish]) @@ -336,22 +262,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) trn = cv2.flip(ult, 1) ish = cv2.rotate(trn, cv2.ROTATE_180) @@ -381,22 +292,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) roid = cv2.flip(ult, 1) mici = cv2.hconcat([ult, roid]) @@ -428,22 +324,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) height, width, channels = ult.shape samples = np.zeros([height * width, 3], dtype=np.float32) @@ -488,22 +369,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") ult = cv2.imread(file) dan = cv2.cvtColor(ult, cv2.COLOR_BGR2RGB) ultroid = cv2.cvtColor(dan, cv2.COLOR_HSV2BGR) @@ -553,22 +419,7 @@ async def ultd(event): ultt = await ureply.download_media() if ultt.endswith(".tgs"): await xx.edit(get_string("sts_9")) - cmd = ["lottie_convert.py", ultt, "ult.png"] - file = "ult.png" - process = await asyncio.create_subprocess_exec( - *cmd, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - stderr.decode().strip() - stdout.decode().strip() - else: - await xx.edit(get_string("com_1")) - img = cv2.VideoCapture(ultt) - heh, lol = img.read() - cv2.imwrite("ult.png", lol) - file = "ult.png" + file = await con.convert(ultt, convert_to="png", outname="ult") got = upf(file) lnk = f"https://telegra.ph{got[0]}" r = await async_searcher( diff --git a/plugins/instagram.py b/plugins/instagram.py index 37cb89a5269954bb9e3540317e2a645dd1e141d5..18a9cca69ae545924c45359bdfd740665d2197fc 100644 --- a/plugins/instagram.py +++ b/plugins/instagram.py @@ -103,17 +103,13 @@ async def insta_dl(e): e.media.webpage, WebPage ): photo = e.media.webpage.photo or e.media.webpage.document - if not photo: - return await eor( - tt, - "Please Fill `INSTA_USERNAME` and `INSTA_PASSWORD` to Use This Comamand!", + if photo: + await tt.delete() + return await e.reply( + f"**Link** :{text}\n\nIf This Wasnt Excepted Result, Please Fill `INSTA_USERNAME` and `INSTA_PASSWORD`...", + file=photo, ) - await tt.delete() - return await e.reply( - f"**Link** :{text}\n\nIf This Wasnt Excepted Result, Please Fill `INSTA_USERNAME` and `INSTA_PASSWORD`...", - file=photo, - ) - await eor(tt, "Please Fill Instagram Credential to Use this Command...") + # await eor(tt, "Please Fill Instagram Credential to Use this Command...") @ultroid_cmd(pattern="instadata( (.*)|$)") @@ -156,7 +152,7 @@ async def soon_(e): async def insta_karbon(event): cl = await create_instagram_client(event) if not cl: - return await event.eor("`Please Fill Instagram Credentials to Use This...`") + return msg = await event.eor(get_string("com_1")) replied = await event.get_reply_message() type_ = event.pattern_match.group(1).strip() diff --git a/plugins/misc.py b/plugins/misc.py index 620c0d6e899e2f01993ea8396c45376267151790..9bfd8f4465df13842b218ed049db499b9ff3ff22 100644 --- a/plugins/misc.py +++ b/plugins/misc.py @@ -22,13 +22,19 @@ Convert replied image into html. """ -import calendar import os from datetime import datetime as dt from bs4 import BeautifulSoup as bs -from htmlwebshot import WebShot -from img2html.converter import Img2HTMLConverter + +try: + from htmlwebshot import WebShot +except ImportError: + WebShot = None +try: + from img2html.converter import Img2HTMLConverter +except ImportError: + Img2HTMLConverter = None from . import async_searcher, get_random_user_data, get_string, re, ultroid_cmd @@ -120,6 +126,8 @@ async def _gen_data(event): pattern="ascii( (.*)|$)", ) async def _(e): + if not Img2HTMLConverter: + return await e.eor("'img2html-converter' not installed!") if not e.reply_to_msg_id: return await e.eor(get_string("ascii_1")) m = await e.eor(get_string("ascii_2")) diff --git a/plugins/mute.py b/plugins/mute.py index 62de7e4ba2c0fd9f1bad8c7f8e569c479690c0b1..f5a4c2622856d99aadd03086d08b5f052006f5aa 100644 --- a/plugins/mute.py +++ b/plugins/mute.py @@ -31,7 +31,7 @@ from pyUltroid.functions.admins import ban_time from telethon import events from telethon.utils import get_display_name -from . import eod, get_string, inline_mention, ultroid_bot, ultroid_cmd +from . import asst, eod, get_string, inline_mention, ultroid_bot, ultroid_cmd @ultroid_bot.on(events.NewMessage(incoming=True)) @@ -54,14 +54,17 @@ async def startmute(event): except Exception as x: return await xx.edit(str(x)) elif event.reply_to_msg_id: - userid = (await event.get_reply_message()).sender_id + reply = await event.get_reply_message() + userid = reply.sender_id + if reply.out or userid in [ultroid_bot.me.id, asst.me.id]: + return await xx.eor("`You cannot mute yourself or your assistant bot.`") elif event.is_private: userid = event.chat_id else: return await xx.eor("`Reply to a user or add their userid.`", time=5) chat = await event.get_chat() if "admin_rights" in vars(chat) and vars(chat)["admin_rights"] is not None: - if chat.admin_rights.delete_messages is not True: + if not chat.admin_rights.delete_messages: return await xx.eor("`No proper admin rights...`", time=5) elif "creator" not in vars(chat) and not event.is_private: return await xx.eor("`No proper admin rights...`", time=5) @@ -88,10 +91,9 @@ async def endmute(event): userid = event.chat_id else: return await xx.eor("`Reply to a user or add their userid.`", time=5) - chat_id = event.chat_id - if not is_muted(chat_id, userid): + if not is_muted(event.chat_id, userid): return await xx.eor("`This user is not muted in this chat.`", time=3) - unmute(chat_id, userid) + unmute(event.chat_id, userid) await xx.eor("`Successfully unmuted...`", time=3) @@ -124,7 +126,7 @@ async def _(e): if userid == ultroid_bot.uid: return await xx.eor("`I can't mute myself.`", time=3) try: - bun = await ban_time(xx, tme) + bun = ban_time(xx, tme) await e.client.edit_permissions( chat.id, userid, diff --git a/plugins/nightmode.py b/plugins/nightmode.py index 4e96bccf472a681a1fef2261fc17ff6f71e615bc..6ed0cd88e4e9947f06ed477dc7befd7ed9ce928a 100644 --- a/plugins/nightmode.py +++ b/plugins/nightmode.py @@ -29,12 +29,19 @@ And Turn On auto at morning Ex- `nmtime 01 00 06 30` """ -from apscheduler.schedulers.asyncio import AsyncIOScheduler +from . import LOGS + +try: + from apscheduler.schedulers.asyncio import AsyncIOScheduler +except ImportError: + LOGS.error("nightmode: 'apscheduler' not Installed!") + AsyncIOScheduler = None + from pyUltroid.dB.night_db import * from telethon.tl.functions.messages import EditChatDefaultBannedRightsRequest from telethon.tl.types import ChatBannedRights -from . import LOGS, get_string, ultroid_bot, ultroid_cmd, udB +from . import get_string, udB, ultroid_bot, ultroid_cmd @ultroid_cmd(pattern="nmtime( (.*)|$)") @@ -138,7 +145,7 @@ async def close_grp(): LOGS.info(er) -if night_grps(): +if AsyncIOScheduler and night_grps(): try: h1, m1, h2, m2 = 0, 0, 7, 0 if udB.get_key("NIGHT_TIME"): diff --git a/plugins/nsfwfilter.py b/plugins/nsfwfilter.py index 40a34f959cdaab7838876d81bbbbb5acb2b1883e..8eb0bccd4ca1f37571f9b66cd1d91a98fe13bb53 100644 --- a/plugins/nsfwfilter.py +++ b/plugins/nsfwfilter.py @@ -16,10 +16,16 @@ import os -from ProfanityDetector import detector +from . import LOGS + +try: + from ProfanityDetector import detector +except ImportError: + detector = None + LOGS.error("nsfwfilter: 'Profanitydetector' not installed!") from pyUltroid.dB.nsfw_db import is_nsfw, nsfw_chat, rem_nsfw -from . import HNDLR, LOGS, async_searcher, eor, events, udB, ultroid_bot, ultroid_cmd +from . import HNDLR, async_searcher, eor, events, udB, ultroid_bot, ultroid_cmd @ultroid_cmd(pattern="addnsfw( (.*)|$)", admins_only=True) @@ -56,7 +62,7 @@ async def nsfw_check(e): pass if e.file: name = e.file.name - if name: + if detector and name: x, y = detector(name) if y: nsfw += 1 diff --git a/plugins/pmpermit.py b/plugins/pmpermit.py index 7a16e46879bd8d440ad480c6f97bca01402564c4..9f64c67079ce36f212f0fc17709ebcfb2aa73260 100644 --- a/plugins/pmpermit.py +++ b/plugins/pmpermit.py @@ -8,28 +8,28 @@ โœ˜ Commands Available - โ€ข `{i}a` or `{i}approve` - To Approve Someone In PM. + Approve someone to PM. โ€ข `{i}da` or `{i}disapprove` - To Disapprove Someone In PM. + Disapprove someone to PM. โ€ข `{i}block` - To Block Someone in PM. + Block someone. โ€ข `{i}unblock` | `{i}unblock all` - To Unblock Someone in PM. + Unblock someone. โ€ข `{i}nologpm` - To stop logging from that user. + Stop logging messages from the user. โ€ข `{i}logpm` - Start logging again from that user. + Start logging messages from the user. โ€ข `{i}startarchive` - Will start adding new PMs to archive. + Archive new PMs. โ€ข `{i}stoparchive` - Will stop adding new PMs to archive. + Don't archive new PMs. โ€ข `{i}cleararchive` Unarchive all chats. @@ -45,7 +45,11 @@ from os import remove from pyUltroid.dB import DEVLIST from pyUltroid.dB.logusers_db import * from pyUltroid.dB.pmpermit_db import * -from tabulate import tabulate + +try: + from tabulate import tabulate +except ImportError: + tabulate = None from telethon import events from telethon.errors import MessageNotModifiedError from telethon.tl.functions.contacts import ( @@ -155,7 +159,7 @@ if udB.get_key("PMLOG"): if udB.get_key("PMSETTING"): - if udB.get_key("AUTOAPPROVE") in [True, None]: + if udB.get_key("AUTOAPPROVE"): @ultroid_bot.on( events.NewMessage( @@ -353,7 +357,7 @@ if udB.get_key("PMSETTING"): COUNT_PM[user.id] = COUNT_PM[user.id] + 1 if COUNT_PM[user.id] >= WARNS: await delete_pm_warn_msgs(user.id) - await event.respond(UNS) + _to_delete[user.id] = await event.respond(UNS) try: del COUNT_PM[user.id] del LASTMSG[user.id] @@ -516,7 +520,7 @@ async def blockpm(block): ) await block.client(BlockRequest(user)) aname = await block.client.get_entity(user) - await block.eor(f"`{aname.first_name} has been blocked!`") + await block.eor(f"{inline_mention(aname)} `has been blocked!`") try: disapprove_user(user) except AttributeError: @@ -525,7 +529,7 @@ async def blockpm(block): await asst.edit_message( int(udB.get_key("LOG_CHANNEL")), _not_approved[user], - f"#BLOCKED\n\n[{aname.first_name}](tg://user?id={user}) [`{user}`] has been **blocked**.", + f"#BLOCKED\n\n{inline_mention(aname)} [`{user}`] has been **blocked**.", buttons=[ Button.inline("UnBlock", data=f"unblock_{user}"), ], @@ -533,7 +537,7 @@ async def blockpm(block): except KeyError: _not_approved[user] = await asst.send_message( int(udB.get_key("LOG_CHANNEL")), - f"#BLOCKED\n\n[{aname.first_name}](tg://user?id={user}) [`{user}`] has been **blocked**.", + f"#BLOCKED\n\n{inline_mention(aname)} [`{user}`] has been **blocked**.", buttons=[ Button.inline("UnBlock", data=f"unblock_{user}"), ], @@ -544,31 +548,38 @@ async def blockpm(block): @ultroid_cmd(pattern="unblock( (.*)|$)") async def unblockpm(event): - match = ( - event.pattern_match.group(1).strip() - or (await event.get_reply_message()).sender_id - ) - if not match: - return await event.eor(NO_REPLY + "`Or give it's username/id`", time=5) - if match == "all": - msg = await event.eor(get_string("com_1")) - u_s = await event.client(GetBlockedRequest(0, 0)) - count = len(u_s.users) - if not count: - return await eor(msg, "__You have not blocked Anyone...__") - for user in u_s.users: - await asyncio.sleep(1) - await event.client(UnblockRequest(user.id)) - # GetBlockedRequest return 20 users at most. - if count < 20: - return await eor(msg, f"__Unblocked {count} Users!__") - while u_s.users: + match = event.pattern_match.group(1).strip() + if event.reply_to_msg_id: + user = (await event.get_reply_message()).sender_id + elif match: + if match == "all": + msg = await event.eor(get_string("com_1")) u_s = await event.client(GetBlockedRequest(0, 0)) + count = len(u_s.users) + if not count: + return await eor(msg, "__You have not blocked Anyone...__") for user in u_s.users: - await asyncio.sleep(3) + await asyncio.sleep(1) await event.client(UnblockRequest(user.id)) - count += len(u_s.users) - return await eor(msg, f"__Unblocked {count} users.__") + # GetBlockedRequest return 20 users at most. + if count < 20: + return await eor(msg, f"__Unblocked {count} Users!__") + while u_s.users: + u_s = await event.client(GetBlockedRequest(0, 0)) + for user in u_s.users: + await asyncio.sleep(3) + await event.client(UnblockRequest(user.id)) + count += len(u_s.users) + return await eor(msg, f"__Unblocked {count} users.__") + + try: + user = await event.client.parse_id(match) + except Exception as er: + return await event.eor(str(er)) + elif block.is_private: + user = (await event.get_chat()).id + else: + return await event.eor(NO_REPLY, time=10) try: user = await event.client.parse_id(match) except Exception as er: @@ -576,7 +587,7 @@ async def unblockpm(event): try: await event.client(UnblockRequest(user)) aname = await event.client.get_entity(user) - await event.eor(f"{inline_mention(aname)} [`user`] `has been UnBlocked!`") + await event.eor(f"{inline_mention(aname)} [`{user}`] `has been UnBlocked!`") except Exception as et: return await event.eor(f"ERROR - {et}") try: @@ -614,9 +625,15 @@ async def list_approved(event): name = "" users.append([name.strip(), str(i)]) with open("approved_pms.txt", "w") as list_appr: - list_appr.write( - tabulate(users, headers=["UserName", "UserID"], showindex="always") - ) + if tabulate: + list_appr.write( + tabulate(users, headers=["UserName", "UserID"], showindex="always") + ) + else: + text = "" + for user in users: + text += f"[{user[-1]}] - {user[0]}" + list_appr.write(text) await event.reply( "List of users approved by [{}](tg://user?id={})".format(OWNER_NAME, OWNER_ID), file="approved_pms.txt", diff --git a/plugins/qrcode.py b/plugins/qrcode.py index 925c72827511b66fa36c0e0f78154c67e5ad6bd8..c0e66009e8577010878b4254402ee51039baae00 100644 --- a/plugins/qrcode.py +++ b/plugins/qrcode.py @@ -18,7 +18,11 @@ """ import os -import cv2 +try: + import cv2 +except ImportError: + cv2 = None + import qrcode from PIL import Image from telethon.tl.types import MessageMediaDocument as doc diff --git a/plugins/schedulemsg.py b/plugins/schedulemsg.py index a82f03b360441867b6451a72cf2f156bc50a9609..e6bf2a5e98b2d7326685eceff6d7d9b5291ba63b 100644 --- a/plugins/schedulemsg.py +++ b/plugins/schedulemsg.py @@ -33,7 +33,7 @@ async def _(e): await e.eor(get_string("schdl_1"), time=5) else: try: - z = await ban_time(e, y) + z = ban_time(e, y) await e.client.send_message(e.chat_id, k, schedule=z) await e.eor(get_string("schdl_1"), time=5) except BaseException: @@ -46,7 +46,7 @@ async def _(e): await e.eor(get_string("schdl_1"), time=5) else: try: - z = await ban_time(e, x) + z = ban_time(e, x) await e.client.send_message(e.chat_id, xx, schedule=z) await e.eor(get_string("schdl_1"), time=5) except BaseException: diff --git a/plugins/search.py b/plugins/search.py index ddb466dea2f42a0bb1a2b7c5d96d62144f32bf04..cd2f9cf182ca582b13a0374062ef90aeebb47bd5 100644 --- a/plugins/search.py +++ b/plugins/search.py @@ -42,7 +42,7 @@ from pyUltroid.functions.misc import google_search from pyUltroid.functions.tools import saavn_search from telethon.tl.types import DocumentAttributeAudio -from . import async_searcher, eod, fast_download, get_string, ultroid_cmd +from . import async_searcher, con, eod, fast_download, get_string, ultroid_cmd @ultroid_cmd( @@ -145,18 +145,13 @@ async def reverse(event): return await event.eor("`Reply to an Image`") ult = await event.eor(get_string("com_1")) dl = await reply.download_media() - if reply.video: - img = cv2.VideoCapture(dl) - ult, roid = img.read() - os.remove(dl) - dl = "file.png" - cv2.imwrite(dl, roid) - img = Image.open(dl) + file = await con.convert(dl, convert_to="png") + img = Image.open(file) x, y = img.size - file = {"encoded_image": (dl, open(dl, "rb"))} + files = {"encoded_image": (file, open(file, "rb"))} grs = requests.post( "https://www.google.com/searchbyimage/upload", - files=file, + files=files, allow_redirects=False, ) loc = grs.headers.get("Location") @@ -188,7 +183,7 @@ async def reverse(event): caption="Similar Images Realted to Search", ) rmtree(f"./resources/downloads/{text}/") - os.remove(dl) + os.remove(file) @ultroid_cmd( @@ -214,9 +209,9 @@ async def siesace(e): song, _ = await fast_download(url, filename=title + ".m4a") thumb, _ = await fast_download(img, filename=title + ".jpg") song, _ = await e.client.fast_uploader(song, to_delete=True) - await e.reply( + await eve.eor( file=song, - message=f"`{title}`\n`From Saavn`", + text=f"`{title}`\n`From Saavn`", attributes=[ DocumentAttributeAudio( duration=int(duration), diff --git a/plugins/snips.py b/plugins/snips.py index facf8bb442bdc38178587d10a84f9fef2b88d8fd..9975a64fe5a530734fbc6ac3679111c243fd2fcd 100644 --- a/plugins/snips.py +++ b/plugins/snips.py @@ -21,9 +21,9 @@ """ import os +from pyUltroid._misc import sudoers from pyUltroid.dB.snips_db import add_snip, get_snips, list_snip, rem_snip from pyUltroid.functions.tools import create_tl_btn, format_btn, get_msg_button -from pyUltroid.misc import sudoers from telegraph import upload_file as uf from telethon.utils import pack_bot_file_id diff --git a/plugins/specialtools.py b/plugins/specialtools.py index 918a1d012b3c4c87f865228f802f4c1595187fe3..fc720bf538977500f9984725229f5b393c44e462 100644 --- a/plugins/specialtools.py +++ b/plugins/specialtools.py @@ -40,17 +40,18 @@ from shutil import rmtree import pytz from bs4 import BeautifulSoup as bs from pyUltroid.functions.google_image import googleimagesdownload -from pyUltroid.functions.misc import create_quotly from pyUltroid.functions.tools import metadata from telethon.tl.types import DocumentAttributeVideo from . import ( + HNDLR, async_searcher, bash, downloader, eod, get_string, mediainfo, + quotly, ultroid_bot, ultroid_cmd, uploader, @@ -161,9 +162,8 @@ async def hbd(event): s = kk[2] day = int(p) month = r - paida = q try: - jn = dt.strptime(paida, "%d/%m/%Y") + jn = dt.strptime(match, "%d/%m/%Y") except BaseException: return await event.eor(get_string("spcltool_6")) jnm = zn.localize(jn) @@ -234,7 +234,7 @@ async def hbd(event): f""" Name -: {name} -D.O.B -: {paida} +D.O.B -: {match} Lived -: {saal}yr, {mahina}m, {din}d, {ghanta}hr, {mi}min, {slive}sec @@ -351,7 +351,9 @@ async def quott_(event): if match == "random": match = choice(all_col) try: - file = await create_quotly(reply_, bg=match, reply=replied_to, sender=user) + file = await quotly.create_quotly( + reply_, bg=match, reply=replied_to, sender=user + ) except Exception as er: return await msg.edit(str(er)) message = await reply.reply("Quotly by Ultroid", file=file) diff --git a/plugins/stickertools.py b/plugins/stickertools.py index 579afaf1b2ff50e240c70fda7e7589ea7f454edc..f04c87e678eb5030f3480576e0965e117713ff9e 100644 --- a/plugins/stickertools.py +++ b/plugins/stickertools.py @@ -27,12 +27,19 @@ import os import random from os import remove -import cv2 -import numpy as np -import requests -from PIL import Image, ImageDraw -from pyUltroid.functions.misc import create_quotly -from pyUltroid.functions.tools import TgConverter +try: + import cv2 +except ImportError: + cv2 = None +try: + import numpy as np +except ImportError: + np = None +try: + from PIL import Image, ImageDraw +except ImportError: + pass + from telethon.errors import PeerIdInvalidError, YouBlockedUserError from telethon.tl.types import DocumentAttributeFilename, DocumentAttributeSticker from telethon.utils import get_input_document @@ -41,12 +48,14 @@ from . import ( KANGING_STR, LOGS, asst, + async_searcher, bash, con, functions, get_string, inline_mention, mediainfo, + quotly, types, udB, ultroid_cmd, @@ -134,7 +143,7 @@ async def hehe(args): xy = await message.download_media() if (message.file.duration or 0) <= 10: is_vid = True - photo = await TgConverter.create_webm(xy) + photo = await con.create_webm(xy) else: y = cv2.VideoCapture(xy) heh, lol = y.read() @@ -152,7 +161,7 @@ async def hehe(args): is_anim = True photo = 1 elif message.message: - photo = await create_quotly(message) + photo = await quotly.create_quotly(message) else: return await xx.edit(get_string("com_4")) if not udB.get_key("language") or udB.get_key("language") == "en": @@ -192,8 +201,8 @@ async def hehe(args): file.name = "sticker.png" image.save(file, "PNG") - response = requests.get(f"http://t.me/addstickers/{packname}") - htmlstr = response.text.split("\n") + response = await async_searcher(f"http://t.me/addstickers/{packname}") + htmlstr = response.split("\n") if ( " A Telegram user has created the Sticker Set." @@ -477,4 +486,4 @@ async def ultiny(event): ) os.remove(file) await xx.delete() - os.remove(ik) \ No newline at end of file + os.remove(ik) diff --git a/plugins/sudo.py b/plugins/sudo.py index 8e4201aa37fe369c46979691bbbc8686b7dbdcc7..0f97e9ef7402aaf51caa3b9ef4a2e43440d9b996 100644 --- a/plugins/sudo.py +++ b/plugins/sudo.py @@ -17,7 +17,7 @@ List all sudo users. """ -from pyUltroid.misc import sudoers +from pyUltroid._misc import sudoers from telethon.tl.types import User from . import get_string, inline_mention, udB, ultroid_bot, ultroid_cmd diff --git a/plugins/tools.py b/plugins/tools.py index 4d88ea172d1e7c7873cc215965f426ff6103d238..04c051be2c7231461fef2898ec0c46a38b00882e 100644 --- a/plugins/tools.py +++ b/plugins/tools.py @@ -41,10 +41,20 @@ import io import os from asyncio.exceptions import TimeoutError as AsyncTimeout -import cv2 -from google_trans_new import google_translator -from htmlwebshot import WebShot -from pyUltroid.functions.tools import TgConverter, metadata +try: + import cv2 +except ImportError: + cv2 = None + +try: + from google_trans_new import google_translator +except ImportError: + google_translator = None +try: + from htmlwebshot import WebShot +except ImportError: + WebShot = None +from pyUltroid.functions.tools import metadata from telethon.errors.rpcerrorlist import MessageTooLongError, YouBlockedUserError from telethon.tl.types import ( ChannelParticipantAdmin, @@ -53,7 +63,7 @@ from telethon.tl.types import ( ) from telethon.utils import pack_bot_file_id -from . import HNDLR, async_searcher, bash, eor, get_string +from . import HNDLR, async_searcher, bash, con, eor, get_string from . import humanbytes as hb from . import inline_mention, is_url_ok, mediainfo, ultroid_cmd @@ -220,7 +230,7 @@ async def _(e): msg = await e.eor("**Creating video note**") file = await reply.download_media("resources/downloads/") if file.endswith(".webm"): - nfile = await TgConverter.ffmpeg_convert(file, "file.mp4") + nfile = await con.ffmpeg_convert(file, "file.mp4") os.remove(file) file = nfile if file: @@ -246,9 +256,9 @@ async def _(e): if not files: files = "*" elif files.endswith("/"): - files = files + "*" + files += "*" elif "*" not in files: - files = files + "/*" + files += "/*" files = glob.glob(files) if not files: return await e.eor("`Directory Empty or Incorrect.`", time=5) @@ -455,4 +465,4 @@ async def magic(event): return await event.eor("**ERROR :** `{}`".format(response["message"])) await event.eor( f"โ€ข **Ultroid Tiny**\nโ€ข Given Url : {url}\nโ€ข Shorten Url : {data['response']['tinyUrl']}" - ) \ No newline at end of file + ) diff --git a/plugins/usage.py b/plugins/usage.py index 6145a8e012dac10f7b7a658dadb2d8a1f9dbefac..78e15e1fdb9d17efc54b01c9a4b99b369df4af45 100644 --- a/plugins/usage.py +++ b/plugins/usage.py @@ -21,26 +21,32 @@ import math import shutil from random import choice -import heroku3 -import psutil -import requests from pyUltroid.functions import some_random_headers -from . import HOSTED_ON, Var, get_string, humanbytes, udB, ultroid_cmd +from . import ( + HOSTED_ON, + LOGS, + Var, + async_searcher, + get_string, + humanbytes, + udB, + ultroid_cmd, +) HEROKU_API = None HEROKU_APP_NAME = None -heroku_api, app_name = Var.HEROKU_API, Var.HEROKU_APP_NAME -try: - if heroku_api and app_name: - HEROKU_API = heroku_api - HEROKU_APP_NAME = app_name - Heroku = heroku3.from_key(heroku_api) - app = Heroku.app(app_name) -except BaseException: - HEROKU_API = None - HEROKU_APP_NAME = None +if HOSTED_ON == "heroku": + heroku_api, app_name = Var.HEROKU_API, Var.HEROKU_APP_NAME + try: + if heroku_api and app_name: + Heroku = heroku3.from_key(heroku_api) + app = Heroku.app(app_name) + HEROKU_API = heroku_api + HEROKU_APP_NAME = app_name + except BaseException as er: + LOGS.exception(er) @ultroid_cmd(pattern="usage") @@ -54,13 +60,17 @@ async def usage_finder(event): if opt == "db": await x.edit(db_usage()) elif opt == "heroku": - is_hk, hk = heroku_usage() + is_hk, hk = await heroku_usage() await x.edit(hk) else: - await x.edit(get_full_usage()) + await x.edit(await get_full_usage()) def simple_usage(): + try: + import psutil + except ImportError: + return "Install 'psutil' to use this..." total, used, free = shutil.disk_usage(".") cpuUsage = psutil.cpu_percent() memory = psutil.virtual_memory().percent @@ -82,7 +92,14 @@ def simple_usage(): ) -def heroku_usage(): +async def heroku_usage(): + try: + import psutil + except ImportError: + return ( + False, + "'psutil' not installed!\nPlease Install it to use this.\n`pip3 install psutil`", + ) if not (HEROKU_API and HEROKU_APP_NAME): if HOSTED_ON == "heroku": return False, "Please fill `HEROKU_API` and `HEROKU_APP_NAME`" @@ -97,13 +114,10 @@ def heroku_usage(): "Accept": "application/vnd.heroku+json; version=3.account-quotas", } her_url = f"https://api.heroku.com/accounts/{user_id}/actions/get-quota" - r = requests.get(her_url, headers=headers) - if r.status_code != 200: - return ( - True, - f"**ERROR**\n`{r.reason}`", - ) - result = r.json() + try: + result = await async_searcher(her_url, headers=headers, re_json=True) + except Exception as er: + return False, str(er) quota = result["account_quota"] quota_used = result["quota_used"] remaining_quota = quota - quota_used @@ -164,8 +178,8 @@ def db_usage(): return f"**{udB.name}**\n\n**Storage Used**: `{a}`\n**Usage percentage**: **{b}**" -def get_full_usage(): - is_hk, hk = heroku_usage() +async def get_full_usage(): + is_hk, hk = await heroku_usage() her = hk if is_hk else "" rd = db_usage() return her + "\n\n" + rd diff --git a/plugins/utilities.py b/plugins/utilities.py index 40f8c8e08d833499c7ec7661db0ee4376f70c4ea..16a6cac6e746fea4f992deec95e0317823fecb39 100644 --- a/plugins/utilities.py +++ b/plugins/utilities.py @@ -55,17 +55,19 @@ import os import time from datetime import datetime as dt -import pygments - try: from PIL import Image except ImportError: Image = None -from pygments.formatters import ImageFormatter -from pygments.lexers import Python3Lexer + +from pyUltroid._misc._assistant import asst_cmd from pyUltroid.dB.gban_mute_db import is_gbanned -from pyUltroid.misc._assistant import asst_cmd -from telegraph import upload_file as uf + +try: + from telegraph import upload_file as uf +except ImportError: + uf = None + from telethon.errors.rpcerrorlist import UserBotError from telethon.events import NewMessage from telethon.tl.custom import Dialog @@ -515,7 +517,7 @@ async def _(event): msg = getattr(msg, match) if hasattr(msg, "to_json"): try: - msg = json_parser(msg.to_json(), indent=1) + msg = json_parser(msg.to_json(ensure_ascii=False), indent=1) except Exception as e: LOGS.exception(e) msg = str(msg) @@ -670,6 +672,14 @@ async def thumb_dl(event): @ultroid_cmd(pattern="ncode$") async def coder_print(event): + try: + import pygments + from pygments.formatters import ImageFormatter + from pygments.lexers import Python3Lexer + except ImportError: + return await event.eor( + "`pygments` `not installed!`\nInstall it with `pip3 install pygments`" + ) if not event.reply_to_msg_id: return await eod(event, "`Reply to a file or message!`", time=5) msg = await event.get_reply_message() diff --git a/plugins/videotools.py b/plugins/videotools.py index b52b77e787580cffe24614f5efd3e5a0ac4d43be..62d083407d4c05b4cdf6a829c9281a728b361a15 100644 --- a/plugins/videotools.py +++ b/plugins/videotools.py @@ -60,7 +60,7 @@ async def gen_sample(e): ) await xxx.delete() else: - await e.eor(get_string("videotools_8"), time=5) + await e.eor(get_string("audiotools_8"), time=5) @ultroid_cmd(pattern="vshots( (.*)|$)") diff --git a/plugins/webupload.py b/plugins/webupload.py index e024d853a1181b5fa257f795f93908dc5f9442c4..2c65b0925a24258b2eb2ff0747da376d51f0ed9f 100644 --- a/plugins/webupload.py +++ b/plugins/webupload.py @@ -16,7 +16,7 @@ import os from pyUltroid.functions.tools import _webupload_cache -from . import asst, get_string, ultroid_cmd +from . import Button, asst, get_string, ultroid_cmd @ultroid_cmd( @@ -38,7 +38,7 @@ async def _(event): _webupload_cache[int(event.chat_id)][int(event.id)] = file else: file, _ = await event.client.fast_downloader( - reply.document, reply.file.name, show_progress=True, event=xx + reply.document, show_progress=True, event=xx ) _webupload_cache[int(event.chat_id)][int(event.id)] = file.name else: diff --git a/plugins/words.py b/plugins/words.py index b64912f8d1262893c703c4b192534251cbb3f293..59c3d31d7fc1318b0d354c2e069386db9b90c716 100644 --- a/plugins/words.py +++ b/plugins/words.py @@ -41,12 +41,12 @@ async def mean(event): defi = out[0]["meanings"][0]["definitions"][0] ex = "None" if not defi.get("example") else defi["example"] text = get_string("wrd_1").format(wrd, defi["definition"], ex) - if defi["synonyms"]: + if defi.get("synonyms"): text += ( f"\n\nโ€ข **{get_string('wrd_5')} :**" + "".join(f" {a}," for a in defi["synonyms"])[:-1][:10] ) - if defi["antonyms"]: + if defi.get("antonyms"): text += ( f"\n\n**{get_string('wrd_6')} :**" + "".join(f" {a}," for a in defi["antonyms"])[:-1][:10] diff --git a/plugins/youtube.py b/plugins/youtube.py index d4e49a9f089e424747c1a9000808d65ae701aff0..539411f33546909d7f7803615584fdc50b17f555 100644 --- a/plugins/youtube.py +++ b/plugins/youtube.py @@ -7,10 +7,10 @@ """ โœ˜ Commands Available - -โ€ข `{i}yta <(youtube) link>` +โ€ข `{i}yta <(youtube/any) link>` Download audio from the link. -โ€ข `{i}ytv <(youtube) link>` +โ€ข `{i}ytv <(youtube/any) link>` Download video from the link. โ€ข `{i}ytsa <(youtube) search query>` @@ -39,14 +39,6 @@ async def download_from_youtube_(event): if opt == "a": ytd["format"] = "bestaudio" ytd["outtmpl"] = "%(id)s.m4a" - ytd["postprocessors"] = [ - { - "key": "FFmpegExtractAudio", - "preferredcodec": "mp3", - "preferredquality": "128", - }, - {"key": "FFmpegMetadata"}, - ] url = event.pattern_match.group(2) if not url: return await xx.eor(get_string("youtube_1")) @@ -68,19 +60,13 @@ async def download_from_youtube_(event): elif opt == "sa": ytd["format"] = "bestaudio" ytd["outtmpl"] = "%(id)s.m4a" - ytd["postprocessors"] = [ - { - "key": "FFmpegExtractAudio", - "preferredcodec": "mp3", - "preferredquality": "128", - }, - {"key": "FFmpegMetadata"}, - ] try: query = event.text.split(" ", 1)[1] except IndexError: return await xx.eor(get_string("youtube_5")) url = get_yt_link(query) + if not url: + return await xx.edit(get_string("unspl_1")) await xx.eor(get_string("youtube_6")) elif opt == "sv": ytd["format"] = "best" @@ -91,6 +77,8 @@ async def download_from_youtube_(event): except IndexError: return await xx.eor(get_string("youtube_7")) url = get_yt_link(query) + if not url: + return await xx.edit(get_string("unspl_1")) await xx.eor(get_string("youtube_8")) else: return diff --git a/requirements.txt b/requirements.txt index 7ad536432df20c264ad1dc46b5c422e2cb10d4c5..dc5bdf4f500cda2b2400f2d8a4d8bcc4b1db2c6c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Important Requirements here. -https://github.com/New-dev0/Telethon/archive/Artifact.zip -py-Ultroid==2022.2.10 +https://github.com/New-dev0/Telethon/archive/PlayTime.zip +py-Ultroid==2022.3.20 pytgcalls==3.0.0.dev21 diff --git a/resources/startup/_termux.py b/resources/startup/_termux.py new file mode 100644 index 0000000000000000000000000000000000000000..c6146bbe8c2bef94fd0b3fcfa268a08d79983be1 --- /dev/null +++ b/resources/startup/_termux.py @@ -0,0 +1,255 @@ +# /usr/bin/python3 +# Ultroid - UserBot +# Copyright (C) 2021-2022 TeamUltroid +# +# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > +# Please read the GNU Affero General Public License in +# . + +from os import system, path +from time import sleep +from datetime import datetime +from colorama import Style, Fore, Back + +# clear screen +def clear(): + system("clear") + +MANDATORY_REQS = [ + "https://github.com/New-dev0/Telethon/archive/PlayTime.zip", + "py-Ultroid==2022.3.20", + "gitpython", + "enhancer==0.3.4", + "telegraph", + "aiohttp" +] + +OPT_PACKAGES = { + "bs4":"Used for site-scrapping (used in commands like - .gadget and many more)", + "yt-dlp": "Used for Youtuble Related Downloads...", + "youtube-search-python": "Used for youtube video search..", + "pillow": "Used for Image-Conversion related task. (size - approx 50mb ) (required for kang, convert and many more.)", + "psutil": "Used for .usage command.", + "lottie":"Used for animated sticker related conversion.", + "apscheduler":"Used in autopic/nightmode (scheduling tasks.)", + "git+https://github.com/1danish-00/google_trans_new.git": "Used for translation purposes." +} + +APT_PACKAGES = [ + "ffmpeg", + "neofetch", + "mediainfo" +] + +DISCLAIMER_TEXT = "" + +COPYRIGHT = f"ยฉ๏ธ TeamUltroid {datetime.now().year}" + +HEADER = f"""{Fore.MAGENTA} +โ•”โ•— โ•”โ•—โ•”โ•— โ•”โ•— โ•”โ•— +โ•‘โ•‘ โ•‘โ•‘โ•‘โ•‘ โ•”โ•โ•šโ•— โ•‘โ•‘ +โ•‘โ•‘ โ•‘โ•‘โ•‘โ•‘ โ•šโ•—โ•”โ•โ•”โ•โ•—โ•”โ•โ•โ•—โ•”โ•—โ•”โ•โ•โ•‘ +โ•‘โ•‘ โ•‘โ•‘โ•‘โ•‘ โ•‘โ•‘ โ•‘โ•”โ•โ•‘โ•”โ•—โ•‘โ• โ•ฃโ•‘โ•”โ•—โ•‘ +โ•‘โ•šโ•โ•โ•‘โ•‘โ•šโ•— โ•‘โ•šโ•—โ•‘โ•‘ โ•‘โ•šโ•โ•‘โ•‘โ•‘โ•‘โ•šโ•โ•‘ +โ•šโ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ• โ•šโ•โ•โ•โ•šโ•โ•šโ•โ•โ•\n{Fore.RESET} +""" + +INFO_TEXT = f""" +{Fore.GREEN}# Important points to know. + +{Fore.YELLOW}1. This script will just install basic requirements because of which some command whose requirements are missing won't work. You can view all optional requirements in (./resources/startup/optional-requirements.txt) + +2. You can install that requirement whenever you want with 'pip install' (a very basic python+bash knowledge is required.) + +3. Some of the plugins are disabled for 'Termux Users' to save resources (by adding in EXCLUDE_OFFICIAL). + - Read More - https://t.me/UltroidUpdates/36 + - Also, way to enable the disabled plugins is mentioned in that post. + + # Disabled Plugins Name + - autocorrect - compressor + - Gdrive - instagram + - nsfwfilter - glitch + - pdftools - writer + - youtube - megadl + - autopic - nightmode + - blacklist - forcesubscribe + +4. You can't use 'VCBOT' on Termux. + +5. You can't use 'MongoDB' on Termux (Android). +{Fore.RESET} +* Hope you are smart enought to understand. +* Enter 'A' to Continue, 'E' to Exit..\n +""" + +def ask_and_wait(text, header:bool=False): + if header: + text = with_header(text) + print(text + "\nPress 'ANY Key' to Continue or 'Ctrl+C' to exit...\n") + input("") + + +def with_header(text): + return HEADER + "\n\n" + text + +def yes_no_apt(): + yes_no = input("").strip().lower() + if yes_no in ["yes", "y"]: + return True + elif yes_no in ["no", "n"]: + return False + print("Invalid Input\nRe-Enter: ") + return yes_no_apt() + + +def ask_process_info_text(): + strm = input("").lower().strip() + if strm == "e": + print("Exiting...") + exit(0) + elif strm == "a": + pass + else: + print("Invalid Input") + print("Enter 'A' to Continue or 'E' to exit...") + ask_process_info_text() + + +def ask_process_apt_install(): + strm = input("").lower().strip() + if strm == "e": + print("Exiting...") + exit(0) + elif strm == "a": + for apt in APT_PACKAGES: + print(f"* Do you want to install '{apt}'? [Y/N] ") + if yes_no_apt(): + print(f"Installing {apt}...") + system(f"apt install {apt} -y") + else: + print(f"- Discarded {apt}.\n") + elif strm == "i": + names = " ".join(APT_PACKAGES) + print("Installing all apt-packages...") + system(f"apt install {names} -y") + elif strm == "s": + pass + else: + print("Invalid Input\n* Enter Again...") + ask_process_apt_install() + +def ask_and_wait_opt(): + strm = input("").strip().lower() + if strm == "e": + print("Exiting...") + exit(0) + elif strm == "a": + for opt in OPT_PACKAGES.keys(): + print(f"* {Fore.YELLOW}Do you want to install '{opt}'? [Y/N]\n- {OPT_PACKAGES[opt]}") + if yes_no_apt(): + print(f"Installing {opt}...") + system(f"pip install {opt}") + else: + print(f"{Fore.YELLOW}- Discarded {opt}.\n") + elif strm == "i": + names = " ".join(OPT_PACKAGES.keys()) + print(f"{Fore.YELLOW}Installing all packages...") + system(f"pip install {names}") + elif strm == "s": + pass + else: + print("Invalid Input\n* Enter Again...") + ask_and_wait_opt() + +def ask_make_env(): + strm = input("").strip().lower() + if strm in ["yes", "y"]: + print(f"{Fore.YELLOW}* Creating .env file..") + with open(".env", "a") as file: + for var in ["API_ID", "API_HASH", "SESSION", "REDIS_URI", "REDIS_PASSWORD"]: + inp = input(f"Enter {var}\n- ") + file.write(f"{var}={inp}\n") + print("* Created '.env' file successfully! ๐Ÿ˜ƒ") + + else: + print("OK!") + +# ------------------------------------------------------------------------------------------ # + +clear() + +print( + f""" +{Fore.BLACK}{Back.WHITE} _____________ + โ–„โ–„ โ–„โ–„ โ–„โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„ +โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–„ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ +โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–„ โ–„โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–„ โ–ˆ โ–ˆ โ–„ โ–ˆ +โ–ˆ โ–ˆโ–„โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ +โ–ˆ โ–ˆ โ–ˆโ–„โ–„โ–„ โ–ˆ โ–ˆ โ–ˆ โ–„โ–„ โ–ˆ โ–ˆโ–„โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–„โ–ˆ โ–ˆ +โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ +โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆ โ–ˆโ–„โ–„โ–„โ–ˆ โ–ˆโ–„โ–„โ–„โ–ˆ โ–ˆโ–„โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–ˆ +{Style.RESET_ALL} +{Fore.GREEN}- ULTROID Termux Installation - + The Main Aim of this script is to deploy Ultroid with basic requirements and save your phone resources. +{Fore.RESET} + +{COPYRIGHT} + """ +) +print("Press 'Any Key' to continue...") +input("") +clear() + +print(with_header(INFO_TEXT)) +ask_process_info_text() + +clear() + +print(with_header("Installing Mandatory requirements...")) +all_ = " ".join(MANDATORY_REQS) +system(f"pip install {all_}") + +clear() +print(with_header(f"\n{Fore.GREEN}# Moving toward Installing Apt-Packages{Fore.RESET}\n\n")) +print("---Enter---") +print(" - A = 'Ask Y/N for each'.") +print(" - I = 'Install all'") +print(" - S = 'Skip Apt installation.'") +print(" - E = Exit.\n") +ask_process_apt_install() + +clear() +print( + with_header(f""" +{Fore.YELLOW}# Installing other non mandatory requirements. +(You can Install them, if you want command using them to work!){Fore.RESET} + +{'- '.join(list(OPT_PACKAGES.keys()))} + +Enter [ A = Ask for each, I = Install all, S = Skip, E = Exit]""") +) +ask_and_wait_opt() + +print(f"\n{Fore.RED}#EXTRA Features...\n") +print(f"{Fore.YELLOW}* Do you want to get Ultroid Logs in Colors? [Y/N] ") +inp = input("").strip().lower() +if inp in ["yes", "y"]: + print(f"{Fore.GREEN}*Spoking the Magical Mantras*") + system("pip install coloredlogs") +else: + print("Skipped!") + +clear() +if not path.exists(".env"): + print(with_header("# Do you want to move toward creating .env file ? [y/N] ")) + ask_make_env() + +print(with_header(f"\n{Fore.GREEN}You are all Done! ๐Ÿฅณ")) +sleep(0.2) +print(f"Use 'bash startup' to try running Ultroid.{Fore.RESET}") +sleep(0.5) +print("\nYou can head over to @UltroidSupport, if you get stuck somewhere, and need help.") +sleep(0.5) +print("\nMade with โค๏ธ by @TeamUltroid...") + +system("pip3 uninstall colorama -y") diff --git a/resources/startup/optional-requirements.txt b/resources/startup/optional-requirements.txt index 877d68f8072bb03452b5fa9593ed88d1c2e139a5..1cbe5035db866b3360c675ab6d822924bc3c79c8 100644 --- a/resources/startup/optional-requirements.txt +++ b/resources/startup/optional-requirements.txt @@ -3,40 +3,42 @@ akinator.py apscheduler +aiohttp +aiofiles bs4 cairosvg cfscrape -enhancer==0.3.4 +enhancer>=0.3.4 gingerit git+https://github.com/1danish-00/google_trans_new.git git+https://github.com/New-dev0/instagrapi.git git+https://github.com/buddhhu/img2html.git git+https://github.com/programmingerror/heroku3.py.git -gitpython==3.1.23 -google-api-python-client==2.31.0 -html-telegraph-poster==0.4.0 -htmlwebshot==0.1.2 -lottie==0.6.9 -multiprocess==0.70.12.2 -numpy==1.21.2 -oauth2client==4.1.3 +gitpython +google-api-python-client +html-telegraph-poster +htmlwebshot +lottie +multiprocess +numpy>=1.21.2 +oauth2client opencv-python-headless pillow>=7.0.0 profanitydetector -psutil==5.8.0 +psutil psycopg2-binary pygments pymongo[srv] -pypdf2==1.26.0 -pytz==2021.1 -pyyaml==5.4.1 -qrcode==7.3 -requests==2.26.0 -scikit-image==0.18.2 -tabulate==0.8.9 +pypdf2>=1.26.0 +pytz +pyyaml>=5.4.1 +qrcode +requests +scikit-image +tabulate telegraph tgcrypto -youtube-search-python==1.6.1 +youtube-search-python yt-dlp pygments python-Levenshtein diff --git a/resources/startup/termux.sh b/resources/startup/termux.sh new file mode 100644 index 0000000000000000000000000000000000000000..645cc55b71e41f171f81ffab82c2b25a5d330eb1 --- /dev/null +++ b/resources/startup/termux.sh @@ -0,0 +1,19 @@ +printf "Updating System..\n\n" +pkg update -y +apt update +apt upgrade -y + +python_not_installed="$(python -c 'exit()')" + +# Install Python if n0t installed.. +if [ python_not_installed ] +then + printf "Installing Python..\nThis may take some long...\n" + pkg install python3 -y +fi + +printf "*Putting some magical effect...*" +pip install colorama + +printf "Running up Installation tool.\n" +python resources/startup/_termux.py diff --git a/strings/README.md b/strings/README.md index dc06eb3569e117e140d179cb8276eec451734ba2..bbaa39e118604a58de8e03ecee53e02c20a7b41d 100644 --- a/strings/README.md +++ b/strings/README.md @@ -4,28 +4,28 @@ | Code | Language | Translated | Remaining | |----|-------|-------|---| | en | English [English] | 413 | 0 | -| ka | Kannada [เฒ•เฒจเณเฒจเฒก] | 114 | 299 | -| bn | bengoli [เฆฌเฆพเฆ‚เฆฒเฆพ] | 114 | 299 | -| od | Odia [เฌ“เฌกเฌฟเฌ†] | 114 | 299 | -| ru | Russian [ะ ัƒััะบะธะน] | 413 | 0 | -| pt-br | Portuguese [Portuguรชs] | 413 | 0 | -| my | Malay [Bahasa Melayu] | 114 | 299 | -| jp | Japanese [ๆ—ฅๆœฌ] | 416 | -3 | -| tr | Turkish [Tรผrk] | 114 | 299 | -| si | sinhala [เทƒเท’เถ‚เท„เถฝ] | 114 | 299 | +| ka | Kannada [เฒ•เฒจเณเฒจเฒก] | 112 | 301 | +| bn | Bengali [เฆฌเฆพเฆ‚เฆฒเฆพ] | 382 | 31 | +| od | Odia [เฌ“เฌกเฌฟเฌ†] | 112 | 301 | +| ru | Russian [ะ ัƒััะบะธะน] | 411 | 2 | +| pt-br | Portuguese [Portuguรชs] | 413 | NULL | +| my | Malay [Bahasa Melayu] | 112 | 301 | +| jp | Japanese [ๆ—ฅๆœฌ] | 413 | NULL | +| tr | Turkish [Tรผrk] | 112 | 301 | +| si | sinhala [เทƒเท’เถ‚เท„เถฝ] | 112 | 301 | | fa | Persian [Farsi] | 391 | 22 | -| hi | Hindi [เคนเคฟเค‚เคฆเฅ€] | 410 | 3 | +| hi | Hindi [เคนเคฟเค‚เคฆเฅ€] | 413 | NULL | | az | Azerbaijan [Azษ™rbaycan] | 382 | 31 | -| id | Indonesia [Indonesia] | 413 | 0 | -| cn | Chinese [็ฎ€ไฝ“ไธญๆ–‡] | 114 | 299 | -| ta | เฎคเฎฎเฎฟเฎดเฏ [เฎคเฎฎเฎฟเฎดเฏ] | 114 | 299 | -| mr | Marathi [เคฎเคฐเคพเค เฅ€] | 114 | 299 | -| ar | Arabic [ุงู„ุนุฑุจูŠุฉ] | 413 | 0 | -| it | Italian [italiano] | 113 | 300 | -| gu | Gujarati [เช—เซเชœเชฐเชพเชคเซ€] | 111 | 302 | -| ml | Malayalam [เดฎเดฒเดฏเดพเดณเด‚] | 114 | 299 | -| es | Spanish [Espaรฑol] | 114 | 299 | +| id | Indonesia [Indonesia] | 413 | NULL | +| cn | Chinese [็ฎ€ไฝ“ไธญๆ–‡] | 112 | 301 | +| ta | เฎคเฎฎเฎฟเฎดเฏ [เฎคเฎฎเฎฟเฎดเฏ] | 112 | 301 | +| mr | Marathi [เคฎเคฐเคพเค เฅ€] | 131 | 282 | +| ar | Arabic [ุงู„ุนุฑุจูŠุฉ] | 411 | 2 | +| it | Italian [italiano] | 111 | 302 | +| gu | Gujarati [เช—เซเชœเชฐเชพเชคเซ€] | 109 | 304 | +| ml | Malayalam [เดฎเดฒเดฏเดพเดณเด‚] | 112 | 301 | +| es | Spanish [Espaรฑol] | 409 | 4 | If Strings are not present, Google Translation will be used to Translate them at time of Usage. -
โ€ข Remaining Strings can be found [here](./remaining.csv) for easy sort out. +
โ€ข Remaining Strings can be found [here](./remaining.csv) for easy sort out. \ No newline at end of file diff --git a/strings/remaining.csv b/strings/remaining.csv index d01e9090af61828d6e4fd874584e9f2fb67bc6ef..8dcf2ae21ee068fdbb9529c27d2238fed38b2e3f 100644 --- a/strings/remaining.csv +++ b/strings/remaining.csv @@ -1,308 +1,310 @@ --,Arabic,Azerbaijan,bengoli,Chinese,Spanish,Persian,Gujarati,Hindi,Indonesia,Italian,Japanese,Kannada,Malayalam,Marathi,Malay,Odia,Portuguese,Russian,sinhala,เฎคเฎฎเฎฟเฎดเฏ,Turkish -com_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -com_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -com_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -com_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -com_7,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -can_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -can_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -can_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -can_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_9,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_10,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_11,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_12,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -help_13,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -userlogs_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -userlogs_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -userlogs_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -userlogs_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -userlogs_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -adm_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -adm_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -adm_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pro_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pro_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -de_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -de_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ban_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ban_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ban_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ban_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ban_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -tban_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -tban_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -unban_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -unban_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -unban_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -kick_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -kick_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -kick_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -kick_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pin_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pinned_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pinned_2,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -unpin_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -listpin_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -purge_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -purgeall_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -purgeall_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -aki_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -aki_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -aki_3,,,โŒ,โŒ,โŒ,,โŒ,โŒ,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -antiflood_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -antiflood_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -antiflood_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -antiflood_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -antiflood_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ascii_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ascii_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_9,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -audiotools_10,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -asstcmd_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -asstcmd_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -asstcmd_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -asstcmd_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -asstcmd_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -asstcmd_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -act_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -act_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -autopic_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -autopic_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -inline_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -inline_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -inline_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -inline_9,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wspr_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wspr_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wspr_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bot_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bot_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bot_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bot_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bot_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +-,Arabic,Azerbaijan,Bengali,Chinese,Spanish,Persian,Gujarati,Hindi,Indonesia,Italian,Japanese,Kannada,Malayalam,Marathi,Malay,Odia,Portuguese,Russian,sinhala,เฎคเฎฎเฎฟเฎดเฏ,Turkish +com_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +com_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +com_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +com_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +com_7,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +can_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +can_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +can_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +can_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_9,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_10,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_11,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_12,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +help_13,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +userlogs_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +userlogs_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +userlogs_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +userlogs_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +userlogs_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +adm_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +adm_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +adm_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pro_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pro_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +de_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +de_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ban_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ban_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ban_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ban_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ban_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +tban_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +tban_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +unban_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +unban_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +unban_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +kick_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +kick_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +kick_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +kick_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pin_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pinned_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pinned_2,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +unpin_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +listpin_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +purge_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +purgeall_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +purgeall_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +aki_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +aki_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +aki_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +antiflood_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +antiflood_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +antiflood_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +antiflood_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +antiflood_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ascii_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ascii_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_9,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +audiotools_10,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +asstcmd_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +asstcmd_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +asstcmd_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +asstcmd_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +asstcmd_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +asstcmd_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +act_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +act_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +autopic_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +autopic_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +inline_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +inline_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +inline_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +inline_9,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wspr_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wspr_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wspr_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bot_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bot_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bot_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bot_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bot_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ log,,,,,,,,,,,,,,โŒ,,,,,,, ping,,,,,,,,,,,,,,โŒ,,,,,,, usage,,,,,,,,,,,,,,โŒ,,,,,,, -usage_simple,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +usage_simple,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ shutdown,,,,,,,,,,,,,,โŒ,,,,,,, -blk_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -blk_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -blk_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -blk_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -blk_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -blk_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bd_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bd_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -bd_9,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -calc_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -calc_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cha_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -carbon_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -chab_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -chab_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -chab_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +blk_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +blk_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +blk_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +blk_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +blk_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +blk_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bd_7,,,,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bd_8,,,,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +bd_9,,,,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +calc_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +calc_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cha_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +carbon_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +chab_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +chab_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +chab_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ chats_6,,,,,,,,,,โŒ,,,,,,,,,,, -clan_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clan_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clan_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clan_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clan_5,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cvt_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cvt_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cvt_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -cvt_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -eod_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -eod_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -devs_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -devs_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -devs_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -dm_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -dm_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -dm_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -dm_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -dm_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -dm_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -echo_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fka_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sf_22,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sf_23,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -flr_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -flr_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -flr_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -flr_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -flr_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -flr_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fgn_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsub_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -ex_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -gas_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -grt_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -grt_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -grt_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -grt_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -grt_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -grt_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -grt_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -glitch_1,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -mdi_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -nightm_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -nightm_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -nightm_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -nightm_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -nightm_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -schdl_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -schdl_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -srch_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -srch_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -srch_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -snip_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -snip_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -snip_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -spcltool_9,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sudo_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sudo_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sudo_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sudo_4,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -unspl_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -udl_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -udl_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -udl_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -udl_7,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vct_1,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vct_2,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vct_3,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vct_4,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vct_5,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vct_6,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clan_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clan_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clan_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clan_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clan_5,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cvt_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cvt_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cvt_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +cvt_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +eod_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +eod_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +devs_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +devs_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +devs_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +dm_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +dm_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +dm_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +dm_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +dm_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +dm_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +echo_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fka_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sf_22,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sf_23,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +flr_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +flr_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +flr_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +flr_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +flr_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +flr_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fgn_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsub_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +ex_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +gas_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +grt_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +grt_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +grt_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +grt_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +grt_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +grt_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +grt_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +glitch_1,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +mdi_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +nightm_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +nightm_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +nightm_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +nightm_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +nightm_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +schdl_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +schdl_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +srch_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +srch_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +srch_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +snip_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +snip_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +snip_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +spcltool_9,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sudo_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sudo_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sudo_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sudo_4,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +unspl_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +upd_5,โŒ,,,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,โŒ,โŒ,โŒ,โŒ +upd_7,โŒ,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,โŒ,โŒ,โŒ,โŒ +udl_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +udl_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +udl_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +udl_7,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vct_1,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vct_2,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vct_3,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vct_4,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vct_5,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vct_6,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ wrd_1,,,,,,,โŒ,,,,,,,,,,,,,, wrd_2,,,,,,,โŒ,,,,,,,,,,,,,, wrd_3,,,,,,,โŒ,,,,,,,,,,,,,, -wrd_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wrd_5,,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wrd_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wrd_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wrd_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -prof_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -prof_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -notes_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -notes_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -notes_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -notes_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -notes_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_9,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_10,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_11,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_12,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -sts_13,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -whs_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -whs_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -whs_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -whs_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wbl_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -writer_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wbs_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wbs_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -wbs_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -youtube_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -zip_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -zip_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -zip_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsh_1,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsh_2,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsh_3,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -fsh_4,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -instu_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -instu_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -instu_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -instu_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -games_1,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -games_2,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -games_3,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -games_4,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -games_5,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -games_6,,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,โŒ,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clst_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clst_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clst_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clst_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -clst_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pmbot_1,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pmbot_2,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pmbot_3,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pmbot_4,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pmbot_5,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pmbot_6,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -pmbot_7,,โŒ,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_1,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_2,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_3,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_4,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_5,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_6,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_7,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_8,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_9,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_10,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_11,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_12,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_13,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_14,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_15,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_16,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_17,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_18,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_19,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_20,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_21,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ -vcbot_22,,,โŒ,โŒ,โŒ,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ \ No newline at end of file +wrd_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wrd_5,,,,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wrd_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wrd_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wrd_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +prof_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +prof_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +notes_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +notes_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +notes_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +notes_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +notes_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_9,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_10,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_11,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_12,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +sts_13,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +whs_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +whs_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +whs_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +whs_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wbl_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +writer_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wbs_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wbs_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +wbs_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +youtube_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +zip_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +zip_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +zip_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsh_1,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsh_2,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsh_3,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +fsh_4,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +instu_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +instu_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +instu_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +instu_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +games_1,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +games_2,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +games_3,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +games_4,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +games_5,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +games_6,,โŒ,โŒ,โŒ,,โŒ,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clst_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clst_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clst_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clst_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +clst_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pmbot_1,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pmbot_2,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pmbot_3,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pmbot_4,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pmbot_5,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pmbot_6,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +pmbot_7,,โŒ,โŒ,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_1,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_2,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_3,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_4,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_5,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_6,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_7,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_8,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_9,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_10,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_11,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_12,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_13,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_14,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_15,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_16,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_17,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_18,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_19,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,โŒ,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_20,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_21,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ +vcbot_22,,,,โŒ,,,โŒ,,,โŒ,,โŒ,โŒ,,โŒ,โŒ,,,โŒ,โŒ,โŒ \ No newline at end of file diff --git a/strings/strings.py b/strings/strings.py index 837976f1028618e69cee8d8f673783e0d490cf9a..62008b33364827010c0dfe4d83a06e9c4d6f0732 100644 --- a/strings/strings.py +++ b/strings/strings.py @@ -7,14 +7,38 @@ try: from google_trans_new import google_translator Trs = google_translator() except ImportError: - LOGS.info("'google_trans_new' not installed!") + LOGS.error("'google_trans_new' not installed!") Trs = None try: from yaml import safe_load except ModuleNotFoundError: - LOGS.info("'pyYaml' not installed!\nPlease install it to use Ultroid.") - sys.exit() + + def _get_value(stri): + try: + value = eval(stri.strip()) + except Exception as er: + LOGS.debug(er) + value = stri.strip() + return value + + def safe_load(file, *args, **kwargs): + read = file.readlines() + out = {} + for line in read: + if ":" in line: # Ignores Empty & Invalid lines + spli = line.split(":", maxsplit=1) + key = spli[0].strip() + value = _get_value(spli[1]) + out.update({key: value or []}) + elif "-" in line: + spli = line.split("-", maxsplit=1) + where = out[list(out.keys())[-1]] + if isinstance(where, list): + value = _get_value(spli[1]) + if value: + where.append(value) + return out language = [udB.get_key("language") or "en"] languages = {} diff --git a/strings/strings/bn.yml b/strings/strings/bn.yml index d26667eaf6d2e0c2c5fbc19b38442a1a39d8c125..cfedfb270996763af5d727b18e94f5321ac2a8bd 100644 --- a/strings/strings/bn.yml +++ b/strings/strings/bn.yml @@ -121,7 +121,7 @@ autopic_5: "Autopic เฆฌเฆจเงเฆง!" # inline inline_1: "[UสŸแด›ส€แดษชแด… Sแดœแด˜แด˜แดส€แด›](t.me/ultroidsupport)\n\n**Hแด‡สŸแด˜ Mแด‡ษดแดœ Oา“ {}.\n\nPสŸแดœษขษชษดs ~ {}**" inline_2: "[UสŸแด›ส€แดษชแด… Sแดœแด˜แด˜แดส€แด›](t.me/ultroidsupport)\n\n**Hแด‡สŸแด˜ Mแด‡ษดแดœ Oา“ {}.\n\nAแด…แด…แดษดs ~ {}**" -inline_3: "[UสŸแด›ส€แดษชแด… Sแดœแด˜แด˜แดส€แด›](t.me/ultroidsupport)\n\n**Hแด‡สŸแด˜ Mแด‡ษดแดœ Oา“ {}.\n\nAแด…แด…แดษดs ~ {}\n\nDแด **`.setredis ADDONS True`** แด€ษดแด… ส€แด‡sแด›แด€ส€แด› แด›แด ษขแด‡แด› แด€แด…แด…แดษดs.**" +inline_3: "[UสŸแด›ส€แดษชแด… Sแดœแด˜แด˜แดส€แด›](t.me/ultroidsupport)\n\n**Hแด‡สŸแด˜ Mแด‡ษดแดœ Oา“ {}.\n\nAแด…แด…แดษดs ~ {}\n\nDแด **`.setdb ADDONS True`** แด€ษดแด… ส€แด‡sแด›แด€ส€แด› แด›แด ษขแด‡แด› แด€แด…แด…แดษดs.**" inline_4: "** Bแดแด› Oา“ {}\n\nMแด€ษชษด Mแด‡ษดแดœ\n\nPสŸแดœษขษชษดs ~ {}\nAแด…แด…แดษดs ~ {}\nTแดแด›แด€สŸ Cแดแดแดแด€ษดแด…s ~ {}**" inline_5: "**Mแด‡ษดแดœ Hแด€s Bแด‡แด‡ษด CสŸแดsแด‡แด…**" inline_6: "**เฆญเฆฏเฆผเง‡เฆธ เฆšเงเฆฏเฆพเฆŸ เฆนเง‡เฆฒเงเฆช เฆฎเง‡เฆจเง เฆœเฆจเงเฆฏ {}**\n**เฆ‰เฆชเฆฒเฆฌเงเฆง เฆ•เฆฎเฆพเฆจเงเฆก:** `{}`\n\n@TeamUltroid" @@ -210,7 +210,7 @@ chats_2: "`เฆ†เฆฎเฆฟ เฆ…เงเฆฏเฆพเฆกเฆฎเฆฟเฆจ เฆจเฆ‡ `" chats_3: "#เฆฎเง‹เฆ›เฆพ\nเฆฎเง‹เฆ›เฆพ {}" chats_4: "เฆคเง‹เฆฎเฆพเฆฐ [{}]({}) เฆ—เงเฆฐเงเฆช เฆคเงˆเฆฐเฆฟ เฆฌเฆธ!!" chats_5: "เฆฏเง‹เฆ— เฆฆเฆฟเฆจ@TeamUltroid" -chats_6: "เฆคเง‹เฆฎเฆพเฆฐ [{}]({}) เฆ—เงเฆฐเงเฆช/เฆšเงเฆฏเฆพเฆจเง‡เฆฒ เฆคเงˆเฆฐเฆฟ เฆ•เฆฐเฆพ เฆนเฆฏเฆผเง‡เฆ›เง‡ เฆฌเฆธ!"!" +chats_6: "เฆคเง‹เฆฎเฆพเฆฐ [{}]({}) เฆ—เงเฆฐเงเฆช/เฆšเงเฆฏเฆพเฆจเง‡เฆฒ เฆคเงˆเฆฐเฆฟ เฆ•เฆฐเฆพ เฆนเฆฏเฆผเง‡เฆ›เง‡ เฆฌเฆธ!" # clean action clan_1: "เฆเฆ‡ เฆšเงเฆฏเฆพเฆŸเง‡เฆฐ เฆœเฆจเงเฆฏ เฆ•เงเฆฒเฆฟเฆจ เฆ…เงเฆฏเฆพเฆ•เฆถเฆจ เฆธเง‡เฆŸเฆฟเฆ‚เฆธ เฆฏเง‹เฆ— เฆ•เฆฐเฆพ เฆนเฆฏเฆผเง‡เฆ›เง‡" diff --git a/strings/strings/en.yml b/strings/strings/en.yml index 3ef6c64069bfaa8f91e96fda42e164950b1a36e3..38fdb47069b368e6c3fd1b8cff2622dcedfbe429 100644 --- a/strings/strings/en.yml +++ b/strings/strings/en.yml @@ -211,7 +211,7 @@ chab_2: "`No user has AI added.`" chab_3: "**Total List Of AI Enabled Users In This Chat :**\n\n" # chats -chats_1: "`Cant delete this chat`" +chats_1: "`Cant delete this chat.`" chats_2: "`I m not an admin`" chats_3: "#Deleted\nDeleted {}" chats_4: "Your [{}]({}) Group Made Boss!" diff --git a/strings/strings/es.yml b/strings/strings/es.yml index f7c0e9b7f5aa3544107683ca193a60eb3a7a0e43..c8cc0d77c28494918964cbc81bc7abfc8bc4ae58 100644 --- a/strings/strings/es.yml +++ b/strings/strings/es.yml @@ -1,4 +1,3 @@ ---- name: Spanish natively: Espaรฑol authors: diff --git a/strings/strings/hi.yml b/strings/strings/hi.yml index 8fdfee2a6fcc903c050dd168bbe6dffbf4fcadaa..c1fbdccba8bf73523be933615d39b08de4ff9fad 100644 --- a/strings/strings/hi.yml +++ b/strings/strings/hi.yml @@ -426,7 +426,9 @@ upd_1: "`เค…เคชเคกเฅ‡เคŸ เค–เฅ‹เคœเคพ เคœเคพ เคฐเคนเคพ เคนเฅˆ, เค•เฅƒเคชเคฏเคพ upd_2: "`เค“เคน .. เค…เคชเคกเฅ‡เคŸเคฐ เค•เฅเค› เคธเคฎเคธเฅเคฏเคพเค“เค‚ เค•เฅ‡ เค•เคพเคฐเคฃ เคœเคพเคฐเฅ€ เคจเคนเฅ€เค‚ เคฐเคน เคธเค•เคคเคพ.`\n\n**เค‰เคชเคฆเฅ‡เคถ:**\n" upd_3: "**[[{}]]({}/tree/{}) เค•เฅ‡ เคฒเคฟเค เคจเคฏเคพ เค…เคชเคกเฅ‡เคŸ เค‰เคชเคฒเคฌเฅเคง เคนเฅˆ :\n\nเคฌเคฆเคฒเคพเคต :**\n\n{}" upd_4: "`เคฌเคฆเคฒเคพเคต เคฌเคนเฅเคค เคฌเคกเคผเคพ เคนเฅˆ, เค‡เคธเฅ‡ เคฆเฅ‡เค–เคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เคซเคผเคพเค‡เคฒ เคฆเฅ‡เค–เฅ‡เค‚.`" +upd_5: "`เค…เคชเคกเฅ‡เคŸ เค•เคฐเคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เคจเฅ€เคšเฅ‡ เคฆเคฟเค เค—เค เคฌเคŸเคจ เคชเคฐ เค•เฅเคฒเคฟเค• เค•เคฐเฅ‡เค‚เฅค`" upd_6: "\n`เค†เคชเค•เคพ เคฌเฅ‰เคŸ` **เค…เคชเคกเฅ‡เคŸเฅ‡เคก เคนเฅˆ** **[[{}]]({}/tree/{})** `เค•เฅ‡ เคธเคพเคฅ`\n" +upd_7: "`เคซเคพเคธเฅเคŸ เคธเฅ‰เคซเฅเคŸ เค…เคชเคกเฅ‡เคŸเคฟเค‚เค—...`" # upload download udl_1: "`เค‰เคธ เคซเคผเคพเค‡เคฒ / เคฎเฅ€เคกเคฟเคฏเคพ เค•เคพ เค‰เคคเฅเคคเคฐ เคฆเฅ‡เค‚ เคœเคฟเคธเฅ‡ เค†เคช เคกเคพเค‰เคจเคฒเฅ‹เคก เค•เคฐเคจเคพ เคšเคพเคนเคคเฅ‡ เคนเฅˆเค‚...`" @@ -553,10 +555,14 @@ games_1: "เค–เฅ‡เคฒ เคšเฅเคจเฅ‡เค‚ ๐ŸŽฎ" games_2: "เคถเฅเคฐเฅ‡เคฃเฅ€ เค•เคพ เคšเคฏเคจ เค•เคฐเฅ‡เค‚!" games_3: "เค•เค เคฟเคจเคพเคˆ เค•เคพ เคธเฅเคคเคฐ เคšเฅเคจเฅ‡" games_4: "เคชเฅเคฐเคถเฅเคจเฅ‹เค‚ เค•เฅ€ เคธเค‚เค–เฅเคฏเคพ เคšเฅเคจเฅ‡เค‚.." +games_5: "เคธเคฎเคฏ เค…เค‚เคคเคฐเคพเคฒ เคšเฅเคจเฅ‡เค‚... " +games_6: "**โ€ข 5 เคธเฅ‡เค•เค‚เคก เคฎเฅ‡เค‚ เค•เฅเคตเคฟเคœเคผ เคถเฅเคฐเฅ‚ เค•เคฐเคจเคพเฅค**\n**โ€ข เคธเฅเคคเคฐ :**`{}`\n**โ€ข QS:** `{}`" # akinator aki_1 : "เค–เฅ‡เคฒ เคธเคฎเคพเคชเฅเคค เค•เคฐ เคฆเคฟเคฏเคพ เค—เคฏเคพ เคนเฅˆ...." aki_2 : "เค–เฅ‡เคฒ เคถเฅเคฐเฅ‚" +aki_3: "เคธเคฎเคฏ เคธเคฎเคพเคชเฅเคค!" + # VcBot vcbot_1: "`เคตเฅ‰เคฏเคธ เคšเฅˆเคŸ เค›เฅ‹เคกเคผ เคฆเคฟเคฏเคพเฅค`" diff --git a/strings/strings/jp.yml b/strings/strings/jp.yml index 0bcefd0dbdf26664cec1aecd0abb64dc606d81cd..5e6be18fb2c2508b7eaa3725059077f0f62eb25b 100644 --- a/strings/strings/jp.yml +++ b/strings/strings/jp.yml @@ -59,9 +59,6 @@ tban_2: "` {} `ใฎ{}ใง` `{}` `ใŒๆญฃๅธธใซ็ฆๆญขใ•ใ‚Œใพใ—ใŸ" unban_1: "`ใƒฆใƒผใ‚ถใƒผใซ่ฟ”ไฟกใ™ใ‚‹ใ‹ใ€ใƒฆใƒผใ‚ถใƒผๅใ‚’ๆŒ‡ๅฎšใ—ใฆ็ฆๆญขใ‚’่งฃ้™คใ—ใฆใใ ใ•ใ„๏ผ`" unban_2: "ใ€Œ `ใƒฆใƒผใ‚ถใƒผใฎ็ฆๆญขใ‚’่งฃ้™คใ™ใ‚‹ๆจฉๅˆฉใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚`ใ€" unban_3: "{} **็ฆๆญข่งฃ้™คใ•ใ‚ŒใŸ** {} ** in **` {} `" -kill_1: "ใ€Œ `็งใซใฏใƒฆใƒผใ‚ถใƒผใ‚’่นดใ‚‹ๆจฉๅˆฉใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚`ใ€" -kill_3: "ใ€Œ `็งใฏๅฝผใ‚’่นดใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“...`ใ€" -kill_4: "{} **ใ‚ญใƒƒใ‚ฏใ•ใ‚ŒใŸ** {} ** in **` {} `" kick_1: "`็ง ใ—ใชใ„ใงใใ ใ•ใ„ ใƒฆใƒผใ‚ถใƒผใ‚’่นดใ‚‹ๆจฉๅˆฉใŒใ‚ใ‚‹.`" kick_2: "ใ€Œ `็ฌ‘ใ€้–‹็™บ่€…ใ‚’่นดใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“`๐Ÿ˜‚ใ€" kick_3: "`็งใฏๅฝผใ‚’่นดใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“...`" diff --git a/strings/strings/mr.yml b/strings/strings/mr.yml index 86083f257829275aee1282fd4c795dccb104507f..1317003c611fa2f67847a1fcd7e2dbb5dbca6e02 100644 --- a/strings/strings/mr.yml +++ b/strings/strings/mr.yml @@ -204,3 +204,23 @@ ast_1: "เคคเฅเคฎเฅเคนเคพเคฒเคพ เค•เฅ‹เคฃเคคเคพ API เคธเฅเคฅเคพเคชเคฟเคค เค• ast_2: "**remove.bg API**\nremove.bg เค‡เค•เคกเฅ‡ เคœเคพเคŠเคจ เค†เคชเคฒเคพ API เคฎเคฟเคณเคตเคพ เค†เคฃเคฟ เค–เคพเคฒเฅ€ เคชเฅเคฐเคตเคฟเคทเฅเคŸ เค•เคฐเคพ.\n\nเค…เคฅเคตเคพ เคฐเคฆเฅเคฆ เค•เคฐเคฃเฅเคฏเคพเคธเคพเค เฅ€ /cancel เคฒเคฟเคนเคพ" ast_3: "เคจเคฎเคธเฅเค•เคพเคฐ๐Ÿ™ {}. เคชเคฐเฅเคฏเคพเคฏ เคฌเฅเคฐเคพเคŠเคœ เค•เคฐเคพ.." +# vcbot +vcbot_1: "เคตเฅเคนเฅ‰เค‡เคธ เคšเฅ…เคŸ เคธเฅ‹เคกเคฒเฅ‡." +vcbot_2: "**เคคเฅเคฐเฅเคŸเฅ€:** `{}`" +vcbot_3: "โ€ข เคตเฅเคนเฅ‰เคฒเฅเคฏเฅ‚เคฎ เคฌเคฆเคฒเคฒเฅ‡ `{}`% โ€ข" +vcbot_4: "`เค•เฅƒเคชเคฏเคพ 1 เคคเฅ‡ 200 เคชเคพเคธเฅ‚เคจ เคตเฅเคนเฅ‰เคฒเฅเคฏเฅ‚เคฎ เคจเคฟเคฐเฅเคฆเคฟเคทเฅเคŸ เค•เคฐเคพ!`" +vcbot_5: "`เคฏเคพ เคตเฅเคนเฅ‰เค‡เคธ เคšเฅ…เคŸ เคชเฅเคจเฅเคนเคพ เคธเคพเคฎเฅ€เคฒ เคตเฅเคนเคพ.`" +vcbot_6: "`เค†เคชเคฃ เคตเฅเคนเฅ‰เคˆเคธ เคšเฅ…เคŸเคถเฅ€ เค•เคจเฅ‡เค•เฅเคŸ เค•เฅ‡เคฒเฅ‡เคฒเฅ‡ เคจเคพเคนเฅ€!`" +vcbot_7: "`เคงเฅˆเคฐเฅเคฏ เค เฅ‡เคตเคพ...\nเคคเฅ‡ เค•เคพเคนเฅ€ เคตเฅ‡เคณ เคฒเคพเค—เฅ‡เคฒ.`" +vcbot_8: "`เคซเค•เฅเคค YouTube เคชเฅเคฒเฅ‡เคฒเคฟเคธเฅเคŸ เคฆเฅเคฏเคพ!`" +vcbot_9: "`เคคเฅ‚ เคฎเคฒเคพ เคฎเคœเคพ เค•เคฐเคค เค†เคนเฅ‡เคธ เค•เคพ?\nเค•เคพเคฏ เค–เฅ‡เคณเคพเคฏเคšเฅ‡?`" +vcbot_10: "`เคตเฅเคนเฅ€เคธเฅ€ เค‘เคฅ เค—เฅเคฐเฅเคชเคฎเคงเฅ‚เคจ เคšเฅ…เคŸ เค•เคพเคขเคฒเคพ!`" +vcbot_11: "`เคตเฅเคนเฅ‰เค‡เคธ เคšเฅ…เคŸ เคฌเฅ‰เคŸ เคตเคพเคชเคฐเค•เคฐเฅเคคเฅเคฏเคพเค‚เคšเฅ€ เคฏเคพเคฆเฅ€ เคฎเคฟเคณเคตเคฃเฅ‡...`" +vcbot_13: "`เคฏเคพ เคšเฅ…เคŸ เคฎเคงเฅเคฏเฅ‡ เคชเฅเคฒเฅ‡เคฌเฅ…เค• เคชเฅเคจเฅเคนเคพ เคธเฅเคฐเฅ‚ เค•เฅ‡เคฒเฅ‡.`" +vcbot_14: "`เคฏเคพ เคšเฅ…เคŸ เคฎเคงเฅเคฏเฅ‡ เคชเฅเคฒเฅ‡เคฌเฅ…เค• เคฅเคพเค‚เคฌเคตเคพ.`" +vcbot_15: "`เค•เฅƒเคชเคฏเคพ เค—เคพเคฃเฅ‡ เคจเคพเคต เคจเคฟเคฐเฅเคฆเคฟเคทเฅเคŸ เค•เคฐเคพ เค•เคฟเค‚เคตเคพ เคตเฅเคนเคฟเคกเคฟเค“ เคซเคพเค‡เคฒเคฒเคพ เคชเฅเคฐเคคเฅเคฏเฅเคคเฅเคคเคฐ เคฆเฅเคฏเคพ!`" +vcbot_17: "`เคตเคพเคชเคฐเค•เคฐเฅเคคเฅเคฏเคพเคšเฅเคฏเคพ เคธเค‚เคฆเฅ‡เคถเคพเคธ เคชเฅเคฐเคคเฅเคฏเฅเคคเฅเคคเคฐ เคฆเฅเคฏเคพ เค•เคฟเค‚เคตเคพ ID / เคตเคพเคชเคฐเค•เคฐเฅเคคเคพเคจเคพเคต เคœเฅ‹เคกเคพ ... " +vcbot_18: "โ€ข เคตเฅเคนเฅ€เคธเฅ€ เค‘เคฅ เคฏเคพเคฆเฅ€ เคฐเคฟเค•เฅเคค เค†เคนเฅ‡..." +vcbot_20: "`เคกเคพเค‰เคจเคฒเฅ‹เคก เค•เคฐเคฃเฅ‡ เค†เคฃเคฟ เคฐเฅ‚เคชเคพเค‚เคคเคฐเคฟเคค เค•เคฐเคฃเฅ‡...`" +vcbot_21: "โ€ข เคฐเคพเค‚เค—เฅ‡เคค เค•เคพเคนเฅ€เคนเฅ€ เคจเคพเคนเฅ€!" +vcbot_22: "เคšเฅ…เคŸ เคฎเคงเฅเคฏเฅ‡ เคธเคฐเฅเคต เคฐเคพเค‚เค— เคธเคพเคซ เค•เฅ‡เคฒเฅ‡" diff --git a/strings/strings/ta.yml b/strings/strings/ta.yml index 58bab6890469dbfa5fa5538a9383a16106376b16..24108f824810e6f5998dc7b9add08f0a91427849 100644 --- a/strings/strings/ta.yml +++ b/strings/strings/ta.yml @@ -1,4 +1,3 @@ ---- name: เฎคเฎฎเฎฟเฎดเฏ natively: เฎคเฎฎเฎฟเฎดเฏ authors: diff --git a/strings/strings/tr.yml b/strings/strings/tr.yml index d3ba52908204868e085e592b625e05b85f1d4de6..51d89bdcbbf514d80de9201ba6d944ad91eea76f 100644 --- a/strings/strings/tr.yml +++ b/strings/strings/tr.yml @@ -1,4 +1,3 @@ ---- name: Turkish natively: Tรผrk diff --git a/vcbot/__init__.py b/vcbot/__init__.py index 231e1a36aa187e8400d2e2e3272ca8f763056a06..f363ca7aa17ac90c31d3138c1865567ac6746dcd 100644 --- a/vcbot/__init__.py +++ b/vcbot/__init__.py @@ -30,6 +30,7 @@ from telethon.errors.rpcerrorlist import ( ChatSendMediaForbiddenError, ) from pyUltroid import HNDLR, LOGS, asst, udB, vcClient +from pyUltroid._misc._decorators import compile_pattern from pyUltroid.functions.helper import ( bash, downloader, @@ -40,9 +41,9 @@ from pyUltroid.functions.helper import ( from pyUltroid.functions.admins import admin_check from pyUltroid.functions.tools import is_url_ok from pyUltroid.functions.ytdl import get_videos_link -from pyUltroid.misc import owner_and_sudos, sudoers -from pyUltroid.misc._assistant import in_pattern -from pyUltroid.misc._wrappers import eod, eor +from pyUltroid._misc import owner_and_sudos, sudoers +from pyUltroid._misc._assistant import in_pattern +from pyUltroid._misc._wrappers import eod, eor from pyUltroid.version import __version__ as UltVer from telethon import events from telethon.tl import functions, types @@ -52,9 +53,12 @@ try: from yt_dlp import YoutubeDL except ImportError: YoutubeDL = None - LOGS.info("'yt-dlp' not found!") + LOGS.error("'yt-dlp' not found!") -from youtubesearchpython import Playlist, ResultMode, Video, VideosSearch +try: + from youtubesearchpython import VideosSearch +except ImportError: + VideosSearch = None from strings import get_string @@ -219,7 +223,7 @@ def vc_asst(dec, **kwargs): lambda e: not e.is_private and not e.via_bot_id and not e.fwd_from ) handler = udB.get_key("VC_HNDLR") or HNDLR - kwargs["pattern"] = re.compile(f"\\{handler}" + dec) + kwargs["pattern"] = compile_pattern(dec, handler) vc_auth = kwargs.get("vc_auth", True) key = udB.get_key("VC_AUTH_GROUPS") or {} if "vc_auth" in kwargs: diff --git a/vcbot/_help.py b/vcbot/_help.py index c139cdae0893f8f16d3b3deb6d5a11718bb0dd33..06d992abb3e37a595a3df4058f05c91f89f665a5 100644 --- a/vcbot/_help.py +++ b/vcbot/_help.py @@ -7,7 +7,7 @@ from telethon import Button -from . import * +from . import vc_asst, asst, in_pattern @vc_asst("vchelp") diff --git a/vcbot/auth.py b/vcbot/auth.py index 08de1a453b4fdc9275cb0095eda62579af81225f..9929afa522fff46b7f0181e0dcb2dcd646d01a0b 100644 --- a/vcbot/auth.py +++ b/vcbot/auth.py @@ -28,8 +28,7 @@ """ from pyUltroid.dB.vc_sudos import add_vcsudo, del_vcsudo, get_vcsudos, is_vcsudo - -from . import * +from . import vc_asst, owner_and_sudos, get_string, udB @vc_asst("addauth", from_users=owner_and_sudos(), vc_auth=False) @@ -49,8 +48,7 @@ async def auth_group(event): key.update({chat: {"admins": admins}}) udB.set_key("VC_AUTH_GROUPS", key) kem = "Admins" if admins else "All" - await eor( - event, + await event.eor( f"โ€ข Added to AUTH Groups Successfully For {kem}.", parse_mode="html", ) @@ -118,15 +116,14 @@ async def _(e): else: return await xx.edit(get_string("vcbot_17"), time=3) if not is_vcsudo(userid): - return await eod( + return await xx.eor( xx, f"[{name}](tg://user?id={userid})` is not approved to use my Voice Chat Bot.`", time=5, ) try: del_vcsudo(userid) - await eod( - xx, + await xx.eor( f"[{name}](tg://user?id={userid})` is removed from Voice Chat Bot Users.`", time=5, ) @@ -150,15 +147,14 @@ async def _(e): else: return await xx.eor(get_string("vcbot_17"), time=3) if is_vcsudo(userid): - return await eod( - xx, + return await xx.eor( f"[{name}](tg://user?id={userid})` is already approved to use my Voice Chat Bot.`", time=5, ) try: add_vcsudo(userid) - await eod( - xx, + await xx.eor( + f"[{name}](tg://user?id={userid})` is added to Voice Chat Bot Users.`", time=5, ) diff --git a/vcbot/controls.py b/vcbot/controls.py index 51dc51486c679f84d70e04a58f8c025f57050ea5..5fb84bfda69ec543581b13772d1a3995f0d11f00 100644 --- a/vcbot/controls.py +++ b/vcbot/controls.py @@ -26,7 +26,7 @@ from pytgcalls.exceptions import NotConnectedError -from . import * +from . import vc_asst, Player, get_string,CLIENTS,VIDEO_ON @vc_asst("joinvc") diff --git a/vcbot/play.py b/vcbot/play.py index dc7e9b940574da538714351a32093fd4ed7edff0..a3471c399b19bfe093dd7edbc51c19a57dd2b803 100644 --- a/vcbot/play.py +++ b/vcbot/play.py @@ -21,8 +21,9 @@ Stream Live YouTube """ - -from . import * +import re,os +from telethon.tl import types +from . import vc_asst, get_string, inline_mention, add_to_queue, mediainfo, file_download, LOGS, is_url_ok, bash, download, Player, VC_QUEUE from telethon.errors.rpcerrorlist import ChatSendMediaForbiddenError, MessageIdInvalidError @@ -59,8 +60,7 @@ async def play_music_(event): else: song = input if not (reply or song): - return await eor( - xx, "Please specify a song name or reply to a audio file !", time=5 + return await xx.eor("Please specify a song name or reply to a audio file !", time=5 ) await xx.eor(get_string("vcbot_20"), parse_mode="md") if reply and reply.media and mediainfo(reply.media).startswith(("audio", "video")): @@ -134,8 +134,8 @@ async def play_music_(event): try: fromchat = (await event.client.get_entity(input)).id except Exception as er: - return await eor(msg, str(er)) - await eor(msg, "`โ€ข Started Playing from Channel....`") + return await msg.eor(str(er)) + await msg.eor("`โ€ข Started Playing from Channel....`") send_message = True ultSongs = Player(chat, event) count = 0 @@ -168,8 +168,7 @@ async def play_music_(event): else: add_to_queue(chat, song, song_name, link, thumb, from_user, duration) if send_message and count == 1: - await eor( - msg, + await msg.eor( f"โ–ถ Added ๐ŸŽต {song_name} to queue at #{list(VC_QUEUE[chat].keys())[-1]}.", parse_mode="html", ) diff --git a/vcbot/queue.py b/vcbot/queue.py index b34ff884e1fbe5139b8e289298d9f40b559fd3aa..2dce9416a17ce5ab179938bd5cb8072a4da4b4b9 100644 --- a/vcbot/queue.py +++ b/vcbot/queue.py @@ -15,7 +15,7 @@ Clear all queue in chat. """ -from . import * +from . import vc_asst, get_string, list_queue, VC_QUEUE @vc_asst("queue") diff --git a/vcbot/vctools.py b/vcbot/vctools.py index bf8236db907d1b3cd039fdd30b18fc66fde1c03c..3e9d0612f0d4ac5319c97a980ddf99282d90ba37 100644 --- a/vcbot/vctools.py +++ b/vcbot/vctools.py @@ -23,7 +23,7 @@ โ€ข `{i}replay` Re-play the current song from the beginning. """ -from . import * +from . import vc_asst, Player, get_string @vc_asst("mutevc") diff --git a/vcbot/videoplay.py b/vcbot/videoplay.py index 45a8cdbd6316134b574b561286d06a1331a5e4a2..5ec27f8e65e5e47b7ce2789a8714d8104b26f48d 100644 --- a/vcbot/videoplay.py +++ b/vcbot/videoplay.py @@ -14,9 +14,9 @@ like `{i}videoplay @chat ` """ - +import re, asyncio from telethon.errors.rpcerrorlist import ChatSendMediaForbiddenError -from . import * +from . import vc_asst, Player, get_string, inline_mention, is_url_ok, mediainfo, vid_download, file_download,LOGS @vc_asst("videoplay") diff --git a/vcbot/ytplaylist.py b/vcbot/ytplaylist.py index 675fe6c576c2d31479e244a30124839bbf7eab22..887fcca1e3414046b670d5d8b39ca5a76e4cd28f 100644 --- a/vcbot/ytplaylist.py +++ b/vcbot/ytplaylist.py @@ -13,7 +13,8 @@ """ -from . import * +import re +from . import vc_asst, get_string, inline_mention, Player, dl_playlist, add_to_queue, is_url_ok, VC_QUEUE @vc_asst("ytplaylist") @@ -26,7 +27,7 @@ async def live_stream(e): chat = int(input[1]) song = e.text.split(maxsplit=2)[2] elif input[1].startswith("@"): - cid_moosa = (await vcClient.get_entity(input[1])).id + cid_moosa = (await e.client.get_entity(input[1])).id chat = int("-100" + str(cid_moosa)) song = e.text.split(maxsplit=2)[2] else: @@ -57,7 +58,6 @@ async def live_stream(e): else: from_user = inline_mention(e) add_to_queue(chat, file, title, link, thumb, from_user, duration) - return await eor( - xx, + return await xx.eor( f"โ–ถ Added ๐ŸŽต **[{title}]({link})** to queue at #{list(VC_QUEUE[chat].keys())[-1]}.", )