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]}.",
)