diff --git a/Dockerfile b/Dockerfile
index b0d5e86..9d21a08 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,18 +7,12 @@ FROM theteamultroid/ultroid:main
# set timezone
ENV TZ=Asia/Kolkata
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
- # cloning the repo and installing requirements.
- && git clone https://github.com/TeamUltroid/Ultroid.git /root/TeamUltroid/ \
- && pip3 install --no-cache-dir -r root/TeamUltroid/requirements.txt \
- && pip3 install av --no-binary av
-
-# Railway's banned dependency
-RUN if [ ! $RAILWAY_STATIC_URL ]; then pip3 install --no-cache-dir yt-dlp; fi
+RUN bash installer.sh
# changing workdir
-WORKDIR /root/TeamUltroid/
+WORKDIR "/root/TeamUltroid"
-# start the bot
+# start the bot.
CMD ["bash", "startup"]
diff --git a/README.md b/README.md
index f2ce5a2..4055712 100644
--- a/README.md
+++ b/README.md
@@ -7,11 +7,11 @@
A stable pluggable Telegram userbot + Voice & Video Call music bot, based on Telethon.
-[](#)
+[](#)
[](https://github.com/TeamUltroid/Ultroid/stargazers)
[](https://github.com/TeamUltroid/Ultroid/fork)
[](https://github.com/TeamUltroid/Ultroid/)
-[](https://www.python.org/)
+[](https://www.python.org/)
[](https://www.codefactor.io/repository/github/teamultroid/ultroid/overview/main)
[](https://github.com/TeamUltroid/Ultroid/graphs/commit-activity)
[](https://img.shields.io/docker/pulls/theteamultroid/ultroid?style=flat-square)
@@ -23,8 +23,9 @@
----
# Deploy
-- [Heroku](#Deploy-to-Heroku)
-- [Local Machine](#Deploy-Locally)
+- [Heroku](#deploy-to-heroku)
+- [Okteto](#deploy-to-okteto)
+- [Local Machine](#deploy-locally)
# Documentation
[](http://ultroid.tech/)
@@ -40,10 +41,15 @@ Get the [Necessary Variables](#Necessary-Variables) and then click the button be
[](https://deploy.ultroid.tech)
+## Deploy to Okteto
+Get the [Necessary Variables](#Necessary-Variables) and then click the button below!
+
+[](https://cloud.okteto.com/deploy?repository=https://github.com/TeamUltroid/Ultroid)
+
## Deploy Locally
- [Traditional Method](#local-deploy---traditional-method)
- [Easy Method](#local-deploy---easy-method)
-- [Ultroid CLI](#Ultroid-CLI)
+- [Ultroid CLI](#ultroid-cli)
### Local Deploy - Easy Method
- Linux - `wget -O locals.py https://git.io/JY9UM && python3 locals.py`
diff --git a/assistant/callbackstuffs.py b/assistant/callbackstuffs.py
index 9b94fce..1e64f02 100644
--- a/assistant/callbackstuffs.py
+++ b/assistant/callbackstuffs.py
@@ -20,7 +20,7 @@ try:
from pyUltroid.functions.gDrive import GDriveManager
except ImportError:
GDriveManager = None
-from pyUltroid.functions.helper import fast_download, progress, uploader
+from pyUltroid.functions.helper import fast_download, progress
from pyUltroid.functions.tools import (
Carbon,
async_searcher,
@@ -1284,8 +1284,10 @@ async def fdroid_dler(event):
)
),
)
- tt = time.time()
- n_file = await uploader(file, file, tt, event, "Uploading...")
+ time.time()
+ n_file = await event.client.fast_uploader(
+ file, show_progress=True, event=event, message="Uploading...", to_delete=True
+ )
buttons = Button.switch_inline("Search Back", query="fdroid", same_peer=True)
try:
msg = await event.edit(
@@ -1304,10 +1306,8 @@ async def fdroid_dler(event):
)
except Exception as er:
os.remove(thumb)
- os.remove(file)
LOGS.exception(er)
return await event.edit(f"**ERROR**: `{er}`", buttons=buttons)
if msg and hasattr(msg, "media"):
FD_MEDIA.update({uri: msg.media})
os.remove(thumb)
- os.remove(file)
diff --git a/assistant/inlinestuff.py b/assistant/inlinestuff.py
index b8398da..3d547ce 100644
--- a/assistant/inlinestuff.py
+++ b/assistant/inlinestuff.py
@@ -180,7 +180,7 @@ async def repo(e):
@in_pattern("go", owner=True)
async def gsearch(q_event):
try:
- match = q_event.text.split(" ", maxsplit=1)[1]
+ match = q_event.text.split(maxsplit=1)[1]
except IndexError:
return await q_event.answer(
[], switch_pm="Google Search. Enter a query!", switch_pm_param="start"
@@ -273,7 +273,7 @@ async def _(e):
@in_pattern("xda", owner=True)
async def xda_dev(event):
- QUERY = event.text.split(" ", maxsplit=1)
+ QUERY = event.text.split(maxsplit=1)
try:
query = QUERY[1]
except IndexError:
@@ -749,7 +749,7 @@ 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`"
+ text = f"**Telegram TlObjects Searcher.**\n__(Don't use if you don't know what it is!)__\n\n• Example Usage\n`@{asst.me.username} tl GetFullUserRequest`"
return await ult.answer(
[
await ult.builder.article(
diff --git a/assistant/manager/misc.py b/assistant/manager/misc.py
index c36929a..c411a35 100644
--- a/assistant/manager/misc.py
+++ b/assistant/manager/misc.py
@@ -10,6 +10,7 @@ import random
import aiohttp
from pyUltroid.dB import DEVLIST
+from pyUltroid.functions.admins import admin_check
from . import *
@@ -24,6 +25,8 @@ async def dheh(e):
@asst_cmd(pattern="echo( (.*)|$)")
async def oqha(e):
+ if not await admin_check(e):
+ return
match = e.pattern_match.group(1).strip()
if match:
text = match
diff --git a/docker-compose.yml b/docker-compose.yml
index 9b9828e..8362b2e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,4 +9,7 @@ services:
API_ID: $API_ID # defaults to None
API_HASH: $API_HASH # defaults to None
MONGO_URI: $MONGO_URI # defaults to None
+ BOT_TOKEN: $BOT_TOKEN # Not mandatory
+ LOG_CHANNEL: $LOG_CHANNEL # Not mandatory
DATABASE_URL: $DATABASE_URL # defaults to None
+ OKTETO_TOKEN: $OKTETO_TOKEN
diff --git a/installer.sh b/installer.sh
new file mode 100644
index 0000000..8fdc269
--- /dev/null
+++ b/installer.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+
+REPO="https://github.com/TeamUltroid/Ultroid.git"
+DIR="/root/TeamUltroid"
+
+spinner(){
+ local pid=$!
+ while [ "$(ps a | awk '{print $1}' | grep $pid)" ];
+ do
+ for i in "Ooooo" "oOooo" "ooOoo" "oooOo" "ooooO" "oooOo" "ooOoo" "oOooo" "Ooooo"
+ do
+ echo -ne "\r• $i"
+ sleep 0.2
+ done
+ done
+}
+
+clone_repo(){
+ if [ ! $BRANCH ]
+ then export BRANCH="main"
+ fi
+ echo -e "\n\nCloning Ultroid ${BRANCH}... "
+ git clone -b $BRANCH $REPO $DIR
+}
+
+install_requirements(){
+ echo -e "\n\nInstalling requirements... "
+ pip3 install -q --no-cache-dir -r $DIR/requirements.txt && pip3 install av -q --no-binary av
+}
+
+railways_dep(){
+ if [ ! $RAILWAY_STATIC_URL ]
+ then
+ echo -e "\n\nInstalling YouTube dependency... "
+ pip3 install -q --no-cache-dir yt-dlp
+ fi
+}
+
+install_okteto_cli(){
+ if [ $OKTETO_TOKEN ]
+ then
+ echo -e "\n\nInstalling Okteto-CLI... "
+ curl https://get.okteto.com -sSfL | sh
+ fi
+}
+
+main(){
+ (clone_repo) & spinner
+ (install_requirements) & spinner
+ (railways_dep) & spinner
+ (install_okteto_cli) & spinner
+}
+
+main
diff --git a/okteto-pipeline.yml b/okteto-pipeline.yml
new file mode 100644
index 0000000..c14afbd
--- /dev/null
+++ b/okteto-pipeline.yml
@@ -0,0 +1,3 @@
+icon: https://raw.githubusercontent.com/TeamUltroid/Ultroid/main/resources/extras/logo_readme.jpg
+deploy:
+ - okteto stack deploy --build -f docker-compose.yml
diff --git a/plugins/__init__.py b/plugins/__init__.py
index f89a58a..c32c498 100644
--- a/plugins/__init__.py
+++ b/plugins/__init__.py
@@ -5,7 +5,6 @@
# PLease read the GNU Affero General Public License in
# .
-
import asyncio
import os
import time
diff --git a/plugins/_inline.py b/plugins/_inline.py
index a1ad3d0..cf103f2 100644
--- a/plugins/_inline.py
+++ b/plugins/_inline.py
@@ -19,7 +19,17 @@ from telethon import Button
from telethon.tl.types import InputWebDocument, Message
from telethon.utils import resolve_bot_file_id
-from . import HNDLR, INLINE_PIC, LOGS, OWNER_NAME, asst, get_string, start_time, udB
+from . import (
+ HNDLR,
+ INLINE_PIC,
+ LOGS,
+ OWNER_NAME,
+ asst,
+ get_string,
+ split_list,
+ start_time,
+ udB,
+)
from ._help import _main_help_menu
# ================================================#
@@ -270,83 +280,38 @@ async def _(event):
await event.answer(pin, cache_time=0, alert=True)
+InPlugin = {
+ "Pʟᴀʏ Sᴛᴏʀᴇ Aᴘᴘs": "app telegram",
+ "Mᴏᴅᴅᴇᴅ Aᴘᴘs": "mods minecraft",
+ "Sᴇᴀʀᴄʜ Oɴ Gᴏᴏɢʟᴇ": "go TeamUltroid",
+ "Search on XDA": "xda telegram",
+ "WʜɪSᴘᴇʀ": "wspr @username Hello🎉",
+ "YᴏᴜTᴜʙᴇ Dᴏᴡɴʟᴏᴀᴅᴇʀ": "yt Ed Sheeran Perfect",
+ "Piston Eval": "run javascript console.log('Hello Ultroid')",
+ "OʀᴀɴɢᴇFᴏx🦊": "ofox beryllium",
+ "Tᴡɪᴛᴛᴇʀ Usᴇʀ": "twitter theultroid",
+ "Kᴏᴏ Sᴇᴀʀᴄʜ": "koo @__kumar__amit",
+ "Fᴅʀᴏɪᴅ Sᴇᴀʀᴄʜ": "fdroid telegram",
+ "Sᴀᴀᴠɴ sᴇᴀʀᴄʜ": "saavn",
+ "Tʟ Sᴇᴀʀᴄʜ": "tl",
+ "GɪᴛHᴜʙ ғᴇᴇᴅs": "gh",
+ "OᴍɢUʙᴜɴᴛᴜ": "omgu cutefish",
+}
+_InButtons = [Button.switch_inline(_, query=InPlugin[_]) for _ in list(InPlugin.keys())]
+InButtons = split_list(_InButtons, 2)
+
+
@callback(data="inlone", owner=True)
async def _(e):
- button = [
- [
- Button.switch_inline(
- "Pʟᴀʏ Sᴛᴏʀᴇ Aᴘᴘs",
- query="app telegram",
- same_peer=True,
- ),
- Button.switch_inline(
- "Mᴏᴅᴅᴇᴅ Aᴘᴘs",
- query="mods minecraft",
- same_peer=True,
- ),
- ],
- [
- Button.switch_inline(
- "Sᴇᴀʀᴄʜ Oɴ Gᴏᴏɢʟᴇ",
- query="go TeamUltroid",
- same_peer=True,
- ),
- Button.switch_inline(
- "Search on XDA",
- query="xda telegram",
- same_peer=True,
- ),
- ],
- [
- Button.switch_inline(
- "WʜɪSᴘᴇʀ",
- query="wspr @username Hello🎉",
- same_peer=True,
- ),
- Button.switch_inline(
- "YᴏᴜTᴜʙᴇ Dᴏᴡɴʟᴏᴀᴅᴇʀ",
- query="yt Ed Sheeran Perfect",
- same_peer=True,
- ),
- ],
- [
- Button.switch_inline(
- "Piston Eval",
- query="run javascript console.log('Hello Ultroid')",
- same_peer=True,
- ),
- Button.switch_inline(
- "OʀᴀɴɢᴇFᴏx🦊",
- query="ofox beryllium",
- same_peer=True,
- ),
- ],
- [
- Button.switch_inline(
- "Tᴡɪᴛᴛᴇʀ Usᴇʀ", query="twitter theultroid", same_peer=True
- ),
- Button.switch_inline(
- "Kᴏᴏ Sᴇᴀʀᴄʜ", query="koo @__kumar__amit", same_peer=True
- ),
- ],
- [
- 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("OᴍɢUʙᴜɴᴛᴜ", query="omgu cutefish", same_peer=True)],
+ button = InButtons.copy()
+ button.append(
[
Button.inline(
"« Bᴀᴄᴋ",
data="open",
),
],
- ]
+ )
await e.edit(buttons=button, link_preview=False)
diff --git a/plugins/_wspr.py b/plugins/_wspr.py
index 84edcb1..795df7c 100644
--- a/plugins/_wspr.py
+++ b/plugins/_wspr.py
@@ -39,7 +39,8 @@ async def _(e):
okk = await e.get_reply_message()
if okk.sender.username:
put = f"@{okk.sender.username}"
- put = okk.sender_id
+ else:
+ put = okk.sender_id
else:
put = e.pattern_match.group(1).strip()
if put:
@@ -72,7 +73,8 @@ async def _(e):
text="You Didn't Type Username or id.",
)
return await e.answer([sur])
- except ValueError:
+ except ValueError as er:
+ LOGS.exception(er)
sur = e.builder.article(
title="User Not Found",
description="Make sure username or id is correct.",
@@ -141,11 +143,9 @@ async def _(e):
same_peer=True,
),
]
- sur = e.builder.document(
+ sur = e.builder.article(
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 f1fd082..a7dccd7 100644
--- a/plugins/admintools.py
+++ b/plugins/admintools.py
@@ -48,7 +48,7 @@ from pyUltroid.dB import DEVLIST
from pyUltroid.functions.admins import ban_time
from telethon.errors import BadRequestError
from telethon.errors.rpcerrorlist import ChatNotModifiedError, UserIdInvalidError
-from telethon.tl.functions.channels import GetFullChannelRequest
+from telethon.tl.functions.channels import EditAdminRequest, GetFullChannelRequest
from telethon.tl.functions.messages import GetFullChatRequest, SetHistoryTTLRequest
from telethon.tl.types import InputMessagesFilterPinned
from telethon.utils import get_display_name
@@ -62,7 +62,6 @@ from . import (
get_uinfo,
inline_mention,
types,
- ultroid_bot,
ultroid_cmd,
)
@@ -79,19 +78,31 @@ async def prmte(ult):
await ult.get_chat()
user, rank = await get_uinfo(ult)
rank = rank or "Admin"
+ FullRight = False
if not user:
return await xx.edit(get_string("pro_1"))
+ if rank.split()[0] == "-f":
+ try:
+ rank = rank.split(maxsplit=1)[1]
+ except IndexError:
+ rank = "Admin"
+ FullRight = True
try:
- await ult.client.edit_admin(
- ult.chat_id,
- user.id,
- invite_users=True,
- ban_users=True,
- delete_messages=True,
- pin_messages=True,
- manage_call=True,
- title=rank,
- )
+ if FullRight:
+ await ult.client(
+ EditAdminRequest(ult.chat_id, user.id, ult.chat.admin_rights, rank)
+ )
+ else:
+ await ult.client.edit_admin(
+ ult.chat_id,
+ user.id,
+ invite_users=True,
+ ban_users=True,
+ delete_messages=True,
+ pin_messages=True,
+ manage_call=True,
+ title=rank,
+ )
await eod(
xx, get_string("pro_2").format(inline_mention(user), ult.chat.title, rank)
)
@@ -220,6 +231,7 @@ async def kck(ult):
return await xx.edit(get_string("kick_1"))
except Exception as e:
LOGS.exception(e)
+ return
text = get_string("kick_4").format(
inline_mention(user), inline_mention(await ult.get_sender()), ult.chat.title
)
@@ -268,13 +280,7 @@ async def tkicki(e):
return await e.eor(str(m))
-@ultroid_cmd(
- pattern="pin$",
- admins_only=True,
- manager=True,
- require="pin_messages",
- fullsudo=True,
-)
+@ultroid_cmd(pattern="pin$", manager=True, require="pin_messages", fullsudo=True)
async def pin(msg):
if not msg.is_reply:
return await eor(msg, get_string("pin_1"))
@@ -294,7 +300,6 @@ async def pin(msg):
@ultroid_cmd(
pattern="unpin($| (.*))",
- admins_only=True,
manager=True,
require="pin_messages",
fullsudo=True,
@@ -387,7 +392,7 @@ async def fastpurger(purg):
)
async def fastpurgerme(purg):
num = purg.pattern_match.group(1).strip()
- if num and not purg.is_reply:
+ if num:
try:
nnt = int(num)
except BaseException:
@@ -401,32 +406,27 @@ async def fastpurgerme(purg):
mp += 1
await eor(purg, f"Purged {mp} Messages!", time=5)
return
- chat = await purg.get_input_chat()
- msgs = []
- count = 0
- if not (purg.reply_to_msg_id or num):
+ elif purg.reply_to_msg_id:
+ pass
+ else:
return await eod(
purg,
"`Reply to a message to purge from or use it like ``purgeme `",
time=10,
)
+ chat = await purg.get_input_chat()
+ msgs = []
async for msg in purg.client.iter_messages(
chat,
from_user="me",
min_id=purg.reply_to_msg_id,
):
msgs.append(msg)
- count += 1
- msgs.append(purg.reply_to_msg_id)
- if len(msgs) == 100:
- await ultroid_bot.delete_messages(chat, msgs)
- msgs = []
-
if msgs:
await purg.client.delete_messages(chat, msgs)
await eod(
purg,
- "__Fast purge complete!__\n**Purged** `" + str(count) + "` **messages.**",
+ "__Fast purge complete!__\n**Purged** `" + str(len(msgs)) + "` **messages.**",
)
@@ -516,7 +516,7 @@ async def autodelte(ult):
try:
await ult.client(SetHistoryTTLRequest(ult.chat_id, period=tt))
except ChatNotModifiedError:
- return await eor(
- ult, f"Auto Delete Setting is Already same to `{match}`", time=5
+ return await ult.eor(
+ f"Auto Delete Setting is Already same to `{match}`", time=5
)
await ult.eor(f"Auto Delete Status Changed to `{match}` !")
diff --git a/plugins/beautify.py b/plugins/beautify.py
new file mode 100644
index 0000000..4c1a07d
--- /dev/null
+++ b/plugins/beautify.py
@@ -0,0 +1,140 @@
+# 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}carbon `
+ Carbonise the text with default settings.
+
+• `{i}rcarbon `
+ Carbonise the text, with random bg colours.
+
+• `{i}ccarbon `
+ Carbonise the text, with custom bg colours.
+
+• `{i}rayso /`
+ `{i}rayso list` - `Get list of themes.`
+"""
+
+import random
+
+from telethon.utils import get_display_name
+
+from . import Carbon, eor, get_string, inline_mention, os, ultroid_cmd
+
+_colorspath = "resources/colorlist.txt"
+
+if os.path.exists(_colorspath):
+ with open(_colorspath, "r") as f:
+ all_col = f.read().split()
+else:
+ all_col = []
+
+
+@ultroid_cmd(
+ pattern="(rc|c)arbon",
+)
+async def crbn(event):
+ xxxx = await event.eor(get_string("com_1"))
+ te = event.pattern_match.group(1)
+ col = random.choice(all_col) if te[0] == "r" else "White"
+ if event.reply_to_msg_id:
+ temp = await event.get_reply_message()
+ if temp.media:
+ b = await event.client.download_media(temp)
+ with open(b) as a:
+ code = a.read()
+ os.remove(b)
+ else:
+ code = temp.message
+ else:
+ try:
+ code = event.text.split(" ", maxsplit=1)[1]
+ except IndexError:
+ return await eor(xxxx, get_string("carbon_2"))
+ xx = await Carbon(code=code, file_name="ultroid_carbon", backgroundColor=col)
+ await xxxx.delete()
+ await event.reply(
+ f"Carbonised by {inline_mention(event.sender)}",
+ file=xx,
+ )
+
+
+@ultroid_cmd(
+ pattern="ccarbon( (.*)|$)",
+)
+async def crbn(event):
+ match = event.pattern_match.group(1).strip()
+ if not match:
+ return await event.eor(get_string("carbon_3"))
+ msg = await event.eor(get_string("com_1"))
+ if event.reply_to_msg_id:
+ temp = await event.get_reply_message()
+ if temp.media:
+ b = await event.client.download_media(temp)
+ with open(b) as a:
+ code = a.read()
+ os.remove(b)
+ else:
+ code = temp.message
+ else:
+ try:
+ match = match.split(" ", maxsplit=1)
+ code = match[1]
+ match = match[0]
+ except IndexError:
+ return await eor(msg, get_string("carbon_2"))
+ xx = await Carbon(code=code, backgroundColor=match)
+ await msg.delete()
+ await event.reply(
+ f"Carbonised by {inline_mention(event.sender)}",
+ file=xx,
+ )
+
+
+RaySoTheme = [
+ "meadow",
+ "breeze",
+ "raindrop",
+ "candy",
+ "crimson",
+ "falcon",
+ "sunset",
+ "midnight",
+]
+
+
+@ultroid_cmd(pattern="rayso")
+async def pass_on(ult):
+ spli = ult.text.split()
+ theme, dark, title, text = None, True, get_display_name(ult.chat), None
+ if len(spli) > 2:
+ if spli[1] in RaySoTheme:
+ theme = spli[1]
+ dark = bool(spli[2].lower().strip() in ["true", "t"])
+ elif len(spli) > 1:
+ if spli[1] in RaySoTheme:
+ theme = spli[1]
+ elif spli[1] == "list":
+ text = "**List of Rayso Themes:**\n"
+ text += "\n".join([f"- `{th_}`" for th_ in RaySoTheme])
+ await ult.eor(text)
+ return
+ else:
+ try:
+ text = ult.text.split(maxsplit=1)[1]
+ except IndexError:
+ pass
+ if not theme:
+ theme = random.choice(RaySoTheme)
+ if ult.is_reply:
+ msg = await ult.get_reply_message()
+ text = msg.text
+ title = get_display_name(msg.sender)
+ await ult.reply(
+ file=await Carbon(text, rayso=True, title=title, theme=theme, darkMode=dark)
+ )
diff --git a/plugins/carbon.py b/plugins/carbon.py
deleted file mode 100644
index 8790cb2..0000000
--- a/plugins/carbon.py
+++ /dev/null
@@ -1,233 +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 -
-
-• `{i}carbon `
- Carbonise the text with default settings.
-
-• `{i}rcarbon `
- Carbonise the text, with random bg colours.
-
-• `{i}ccarbon `
- Carbonise the text, with custom bg colours.
-"""
-import random
-
-from . import Carbon, eor, get_string, inline_mention, os, ultroid_cmd
-
-all_col = [
- "Black",
- "Navy",
- "DarkBlue",
- "MediumBlue",
- "Blue",
- "DarkGreen",
- "Green",
- "Teal",
- "DarkCyan",
- "DeepSkyBlue",
- "DarkTurquoise",
- "MediumSpringGreen",
- "Lime",
- "SpringGreen",
- "Aqua",
- "Cyan",
- "MidnightBlue",
- "DodgerBlue",
- "LightSeaGreen",
- "ForestGreen",
- "SeaGreen",
- "DarkSlateGray",
- "DarkSlateGrey",
- "LimeGreen",
- "MediumSeaGreen",
- "Turquoise",
- "RoyalBlue",
- "SteelBlue",
- "DarkSlateBlue",
- "MediumTurquoise",
- "Indigo ",
- "DarkOliveGreen",
- "CadetBlue",
- "CornflowerBlue",
- "RebeccaPurple",
- "MediumAquaMarine",
- "DimGray",
- "DimGrey",
- "SlateBlue",
- "OliveDrab",
- "SlateGray",
- "SlateGrey",
- "LightSlateGray",
- "LightSlateGrey",
- "MediumSlateBlue",
- "LawnGreen",
- "Chartreuse",
- "Aquamarine",
- "Maroon",
- "Purple",
- "Olive",
- "Gray",
- "Grey",
- "SkyBlue",
- "LightSkyBlue",
- "BlueViolet",
- "DarkRed",
- "DarkMagenta",
- "SaddleBrown",
- "DarkSeaGreen",
- "LightGreen",
- "MediumPurple",
- "DarkViolet",
- "PaleGreen",
- "DarkOrchid",
- "YellowGreen",
- "Sienna",
- "Brown",
- "DarkGray",
- "DarkGrey",
- "LightBlue",
- "GreenYellow",
- "PaleTurquoise",
- "LightSteelBlue",
- "PowderBlue",
- "FireBrick",
- "DarkGoldenRod",
- "MediumOrchid",
- "RosyBrown",
- "DarkKhaki",
- "Silver",
- "MediumVioletRed",
- "IndianRed ",
- "Peru",
- "Chocolate",
- "Tan",
- "LightGray",
- "LightGrey",
- "Thistle",
- "Orchid",
- "GoldenRod",
- "PaleVioletRed",
- "Crimson",
- "Gainsboro",
- "Plum",
- "BurlyWood",
- "LightCyan",
- "Lavender",
- "DarkSalmon",
- "Violet",
- "PaleGoldenRod",
- "LightCoral",
- "Khaki",
- "AliceBlue",
- "HoneyDew",
- "Azure",
- "SandyBrown",
- "Wheat",
- "Beige",
- "WhiteSmoke",
- "MintCream",
- "GhostWhite",
- "Salmon",
- "AntiqueWhite",
- "Linen",
- "LightGoldenRodYellow",
- "OldLace",
- "Red",
- "Fuchsia",
- "Magenta",
- "DeepPink",
- "OrangeRed",
- "Tomato",
- "HotPink",
- "Coral",
- "DarkOrange",
- "LightSalmon",
- "Orange",
- "LightPink",
- "Pink",
- "Gold",
- "PeachPuff",
- "NavajoWhite",
- "Moccasin",
- "Bisque",
- "MistyRose",
- "BlanchedAlmond",
- "PapayaWhip",
- "LavenderBlush",
- "SeaShell",
- "Cornsilk",
- "LemonChiffon",
- "FloralWhite",
- "Snow",
- "Yellow",
- "LightYellow",
- "Ivory",
- "White",
-]
-
-
-@ultroid_cmd(
- pattern="(rc|c)arbon",
-)
-async def crbn(event):
- xxxx = await event.eor(get_string("com_1"))
- te = event.text
- col = random.choice(all_col) if te[1] == "r" else "White"
- if event.reply_to_msg_id:
- temp = await event.get_reply_message()
- if temp.media:
- b = await event.client.download_media(temp)
- with open(b) as a:
- code = a.read()
- os.remove(b)
- else:
- code = temp.message
- else:
- try:
- code = event.text.split(" ", maxsplit=1)[1]
- except IndexError:
- return await eor(xxxx, get_string("carbon_2"))
- xx = await Carbon(code=code, file_name="ultroid_carbon", backgroundColor=col)
- await xxxx.delete()
- await event.reply(
- f"Carbonised by {inline_mention(event.sender)}",
- file=xx,
- )
-
-
-@ultroid_cmd(
- pattern="ccarbon( (.*)|$)",
-)
-async def crbn(event):
- match = event.pattern_match.group(1).strip()
- if not match:
- return await event.eor(get_string("carbon_3"))
- msg = await event.eor(get_string("com_1"))
- if event.reply_to_msg_id:
- temp = await event.get_reply_message()
- if temp.media:
- b = await event.client.download_media(temp)
- with open(b) as a:
- code = a.read()
- os.remove(b)
- else:
- code = temp.message
- else:
- try:
- match = match.split(" ", maxsplit=1)
- code = match[1]
- match = match[0]
- except IndexError:
- return await eor(msg, get_string("carbon_2"))
- xx = await Carbon(code=code, backgroundColor=match)
- await msg.delete()
- await event.reply(
- f"Carbonised by {inline_mention(event.sender)}",
- file=xx,
- )
diff --git a/plugins/chats.py b/plugins/chats.py
index 90ce699..53259d0 100644
--- a/plugins/chats.py
+++ b/plugins/chats.py
@@ -98,7 +98,7 @@ 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, title = None, None, None
+ request, usage, title, link = None, None, None, None
if match:
split = match.split(maxsplit=1)
request = bool(split[0] in ["r", "request"])
diff --git a/plugins/core.py b/plugins/core.py
index cab6d8d..24dce2b 100644
--- a/plugins/core.py
+++ b/plugins/core.py
@@ -24,19 +24,15 @@
• `{i}help `
Shows you a help menu (like this) for every plugin.
-• `{i}pick addons`
- `{i}pick vcbot`
- Instantly load 'Addons' or 'VcBot'.
-
• `{i}getaddons `
Load Plugins from the given raw link.
"""
import os
-from pyUltroid.startup.loader import Loader, load_addons
+from pyUltroid.startup.loader import load_addons
-from . import async_searcher, eod, get_string, safeinstall, udB, ultroid_cmd, un_plug
+from . import async_searcher, eod, get_string, safeinstall, ultroid_cmd, un_plug
@ultroid_cmd(pattern="install", fullsudo=True)
@@ -115,27 +111,6 @@ async def load(event):
)
-@ultroid_cmd(pattern="pick( (.*)|$)", fullsudo=True)
-async def pickup_call(ult):
- match_ = ult.pattern_match.group(1).strip()
- match = match_.lower()
- proc = await ult.eor(get_string("com_1"))
- if match == "addons":
- if udB.get_key("ADDONS"):
- return await proc.eor("`Addons are Already Enabled!`", time=8)
- udB.set_key("ADDONS", True)
- Loader(path="addons", key="Addons").load(func=load_addons)
- elif match == "vcbot":
- if udB.get_key("VCBOT"):
- return await proc.eor("`VcBot is Already Active!`", time=8)
- Loader(path="vcbot", key="VCBot").load()
- else:
- return await proc.eor(
- "`Found Nothing to pick!\nSpecify what to pick..`", time=8
- )
- await proc.eor(f"`Successfully Activated {match_}`", time=8)
-
-
@ultroid_cmd(pattern="getaddons( (.*)|$)", fullsudo=True)
async def get_the_addons_lol(event):
thelink = event.pattern_match.group(1).strip()
diff --git a/plugins/devtools.py b/plugins/devtools.py
index 267ddc0..70cf8b4 100644
--- a/plugins/devtools.py
+++ b/plugins/devtools.py
@@ -28,8 +28,10 @@
Shows System Info.
"""
+import inspect
import sys
import traceback
+from datetime import datetime
from io import BytesIO, StringIO
from os import remove
from pprint import pprint
@@ -58,6 +60,8 @@ _ignore_eval = []
async def _(e):
xx = await e.eor(get_string("com_1"))
x, y = await bash("neofetch|sed 's/\x1B\\[[0-9;\\?]*[a-zA-Z]//g' >> neo.txt")
+ if y and y.endswith("NOT_FOUND"):
+ return await xx.edit(f"Error: `{y}`")
with open("neo.txt", "r") as neo:
p = (neo.read()).replace("\n\n", "")
haa = await Carbon(code=p, file_name="neofetch", backgroundColor=choice(ATRA_COL))
@@ -68,7 +72,7 @@ async def _(e):
@ultroid_cmd(pattern="bash", fullsudo=True, only_devs=True)
async def _(event):
- carb = None
+ carb, yamlf = None, False
try:
cmd = event.text.split(" ", maxsplit=1)[1]
if cmd.split()[0] in ["-c", "--carbon"]:
@@ -82,14 +86,15 @@ async def _(event):
"`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)
+ stdout, stderr = await bash(cmd, run_code=1)
OUT = f"**☞ BASH\n\n• COMMAND:**\n`{cmd}` \n\n"
err, out = "", ""
if stderr:
err = f"**• ERROR:** \n`{stderr}`\n\n"
if stdout:
if (carb or udB.get_key("CARBON_ON_BASH")) and (
- event.chat.admin_rights
+ event.is_private
+ or event.chat.admin_rights
or event.chat.creator
or event.chat.default_banned_rights.embed_links
):
@@ -104,7 +109,24 @@ async def _(event):
out = "**• OUTPUT:**"
remove(li)
else:
- out = f"**• OUTPUT:**\n`{stdout}`"
+ if all(":" in line for line in stdout.split("\n")):
+ try:
+ from strings.strings import safe_load
+
+ load = safe_load(stdout)
+ stdout = ""
+ for data in list(load.keys()):
+ res = load[data] or ""
+ if res and "http" not in str(res):
+ res = f"`{res}`"
+ stdout += f"**{data}** : {res}\n"
+ yamlf = True
+ except Exception as er:
+ stdout = f"`{stdout}`"
+ LOGS.exception(er)
+ else:
+ stdout = f"`{stdout}`"
+ out = f"**• OUTPUT:**\n{stdout}"
if not stderr and not stdout:
out = "**• OUTPUT:**\n`Success`"
OUT += err + out
@@ -124,7 +146,7 @@ async def _(event):
await xx.delete()
else:
- await xx.edit(OUT, link_preview=True)
+ await xx.edit(OUT, link_preview=not yamlf)
pp = pprint # ignore: pylint
@@ -153,21 +175,30 @@ async def _(event):
cmd = event.text.split(" ", maxsplit=1)[1]
except IndexError:
return await event.eor(get_string("devs_2"), time=5)
- silent = False
- if cmd.split()[0] in ["-s", "--silent"]:
+ silent, gsource, xx = False, False, None
+ spli = cmd.split()
+
+ async def get_():
try:
- cmd = cmd.split(maxsplit=1)[1]
+ cm = cmd.split(maxsplit=1)[1]
except IndexError:
- return await event.eor("->> Wrong Format <<-")
+ await event.eor("->> Wrong Format <<-")
+ cm = None
+ return cm
+
+ if spli[0] in ["-s", "--silent"]:
await event.delete()
silent = True
- elif cmd.split()[0] in ["-n", "-noedit"]:
- try:
- cmd = cmd.split(maxsplit=1)[1]
- except IndexError:
- return await event.eor("->> Wrong Format <<-")
+ cmd = await get_()
+ elif spli[0] in ["-n", "-noedit"]:
+ cmd = await get_()
xx = await event.reply(get_string("com_1"))
- else:
+ elif spli[0] in ["-gs", "--source"]:
+ gsource = True
+ cmd = await get_()
+ if not cmd:
+ return
+ if not silent and not xx:
xx = await event.eor(get_string("com_1"))
if black:
try:
@@ -195,15 +226,23 @@ async def _(event):
old_stdout = sys.stdout
redirected_output = sys.stdout = StringIO()
redirected_error = sys.stderr = StringIO()
- stdout, stderr, exc = None, None, None
+ stdout, stderr, exc, timeg = None, None, None, None
try:
+ start = datetime.now()
value = await aexec(cmd, event)
+ timeg = time_formatter((datetime.now() - start).microseconds / 1000)
except Exception:
+ value = None
exc = traceback.format_exc()
stdout = redirected_output.getvalue()
stderr = redirected_error.getvalue()
sys.stdout = old_stdout
sys.stderr = old_stderr
+ if value and gsource:
+ try:
+ exc = inspect.getsource(value)
+ except Exception:
+ exc = traceback.format_exc()
evaluation = exc or stderr or stdout or _parse_eval(value) or get_string("instu_4")
if silent:
if exc:
@@ -219,11 +258,13 @@ async def _(event):
await event.client.send_message(log_chat, msg, parse_mode="html")
return
final_output = (
- "__►__ **EVALPy**\n```{}``` \n\n __►__ **OUTPUT**: \n```{}``` \n".format(
+ "__►__ **EVAL**\n```{}``` \n\n __►__ **OUTPUT**: \n```{}``` \n".format(
cmd,
evaluation,
)
)
+ if timeg:
+ final_output += f"Time Taken: `{timeg}`"
if len(final_output) > 4096:
final_output = evaluation
with BytesIO(str.encode(final_output)) as out_file:
diff --git a/plugins/downloadupload.py b/plugins/downloadupload.py
index d3b217e..97992d1 100644
--- a/plugins/downloadupload.py
+++ b/plugins/downloadupload.py
@@ -38,6 +38,7 @@ from . import (
downloader,
eor,
fast_download,
+ get_all_files,
get_string,
progress,
time_formatter,
@@ -178,7 +179,7 @@ async def _(event):
for result in results:
if os.path.isdir(result):
c, s = 0, 0
- for files in sorted(glob.glob(result + "/*")):
+ for files in get_all_files(result):
attributes = None
if stream:
try:
@@ -220,6 +221,5 @@ async def _(event):
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/extra.py b/plugins/extra.py
index 6ebbce0..52c2af9 100644
--- a/plugins/extra.py
+++ b/plugins/extra.py
@@ -32,11 +32,8 @@ async def delete_it(delme):
msg_src = await delme.get_reply_message()
if not msg_src:
return
- try:
- await msg_src.delete()
- await delme.delete()
- except Exception as e:
- await delme.eor(f"Couldn't delete the message.\n\n**ERROR:**\n`{e}`", time=5)
+ await msg_src.try_delete()
+ await delme.try_delete()
@ultroid_cmd(
diff --git a/plugins/fontgen.py b/plugins/fontgen.py
index 9fa11e9..b7b3293 100644
--- a/plugins/fontgen.py
+++ b/plugins/fontgen.py
@@ -12,15 +12,17 @@
To get list of fonts
"""
+import string
from . import HNDLR, eod, ultroid_cmd
-fonts = ["small caps", "monospace", "double stroke", "script royal"]
-_default = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-_small_caps = "ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘϙʀsᴛᴜᴠᴡxʏᴢABCDEFGHIJKLMNOPQRSTUVWXYZ"
-_monospace = "𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉"
-_double_stroke = "𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ"
-_script_royal = "𝒶𝒷𝒸𝒹𝑒𝒻𝑔𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝑜𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵"
+_default = string.ascii_letters
+Fonts = {
+ "small caps": "ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘϙʀsᴛᴜᴠᴡxʏᴢABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "monospace": "𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉",
+ "double stroke": "𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ",
+ "script royal": "𝒶𝒷𝒸𝒹𝑒𝒻𝑔𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝑜𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵",
+}
@ultroid_cmd(
@@ -32,7 +34,7 @@ async def _(e):
help = __doc__.format(i=HNDLR)
if not input:
m = "**Available Fonts**\n\n"
- for x in fonts:
+ for x in Fonts.keys():
m += f"• `{x}`\n"
return await e.eor(m, time=5)
if not reply:
@@ -47,16 +49,9 @@ async def _(e):
else:
font = input
text = reply.message
- if font not in fonts:
+ if font not in Fonts.keys():
return await e.eor(f"`{font} not in font list`.", time=5)
- if font == "small caps":
- msg = gen_font(text, _small_caps)
- elif font == "monospace":
- msg = gen_font(text, _monospace)
- elif font == "double stroke":
- msg = gen_font(text, _double_stroke)
- elif font == "script royal":
- msg = gen_font(text, _script_royal)
+ msg = gen_font(text, Fonts[font])
await e.eor(msg)
diff --git a/plugins/imagetools.py b/plugins/imagetools.py
index 197ee7b..b1528a0 100644
--- a/plugins/imagetools.py
+++ b/plugins/imagetools.py
@@ -85,32 +85,6 @@ from . import (
)
-@ultroid_cmd(
- pattern="sketch$",
-)
-async def sketch(e):
- ureply = await e.get_reply_message()
- xx = await e.eor("`...`")
- if not (ureply and (ureply.media)):
- await xx.edit(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- if ultt.endswith(".tgs"):
- await xx.edit(get_string("sts_9"))
- 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
- blurred_img = cv2.GaussianBlur(inverted_gray_image, (21, 21), 0)
- inverted_blurred_img = 255 - blurred_img
- pencil_sketch_IMG = cv2.divide(gray_image, inverted_blurred_img, scale=256.0)
- cv2.imwrite("ultroid.png", pencil_sketch_IMG)
- await e.reply(file="ultroid.png")
- await xx.delete()
- os.remove(file)
- os.remove("ultroid.png")
-
-
@ultroid_cmd(pattern="color$")
async def _(event):
reply = await event.get_reply_message()
@@ -141,20 +115,67 @@ async def _(event):
await xx.delete()
-@ultroid_cmd(
- pattern="grey$",
-)
-async def ultd(event):
+@ultroid_cmd(pattern="(grey|blur|negative|danger|mirror|quad|sketch|flip|toon)$")
+async def ult_tools(event):
+ match = event.pattern_match.group(1)
ureply = await event.get_reply_message()
if not (ureply and (ureply.media)):
await event.eor(get_string("cvt_3"))
return
ultt = await ureply.download_media()
+ xx = await event.eor(get_string("com_1"))
if ultt.endswith(".tgs"):
- xx = await event.eor(get_string("sts_9"))
+ xx = await xx.edit(get_string("sts_9"))
file = await con.convert(ultt, convert_to="png", outname="ult")
ult = cv2.imread(file)
- ultroid = cv2.cvtColor(ult, cv2.COLOR_BGR2GRAY)
+ if match == "grey":
+ ultroid = cv2.cvtColor(ult, cv2.COLOR_BGR2GRAY)
+ elif match == "blur":
+ ultroid = cv2.GaussianBlur(ult, (35, 35), 0)
+ elif match == "negative":
+ ultroid = cv2.bitwise_not(ult)
+ elif match == "danger":
+ dan = cv2.cvtColor(ult, cv2.COLOR_BGR2RGB)
+ ultroid = cv2.cvtColor(dan, cv2.COLOR_HSV2BGR)
+ elif match == "mirror":
+ ish = cv2.flip(ult, 1)
+ ultroid = cv2.hconcat([ult, ish])
+ elif match == "flip":
+ trn = cv2.flip(ult, 1)
+ ish = cv2.rotate(trn, cv2.ROTATE_180)
+ ultroid = cv2.vconcat([ult, ish])
+ elif match == "quad":
+ ult = cv2.imread(file)
+ roid = cv2.flip(ult, 1)
+ mici = cv2.hconcat([ult, roid])
+ fr = cv2.flip(mici, 1)
+ trn = cv2.rotate(fr, cv2.ROTATE_180)
+ ultroid = cv2.vconcat([mici, trn])
+ elif match == "sketch":
+ gray_image = cv2.cvtColor(ult, cv2.COLOR_BGR2GRAY)
+ inverted_gray_image = 255 - gray_image
+ blurred_img = cv2.GaussianBlur(inverted_gray_image, (21, 21), 0)
+ inverted_blurred_img = 255 - blurred_img
+ ultroid = cv2.divide(gray_image, inverted_blurred_img, scale=256.0)
+ elif match == "toon":
+ height, width, _ = ult.shape
+ samples = np.zeros([height * width, 3], dtype=np.float32)
+ count = 0
+ for x in range(height):
+ for y in range(width):
+ samples[count] = ult[x][y]
+ count += 1
+ _, labels, centers = cv2.kmeans(
+ samples,
+ 12,
+ None,
+ (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10000, 0.0001),
+ 5,
+ cv2.KMEANS_PP_CENTERS,
+ )
+ centers = np.uint8(centers)
+ ish = centers[labels.flatten()]
+ ultroid = ish.reshape(ult.shape)
cv2.imwrite("ult.jpg", ultroid)
await event.client.send_file(
event.chat_id,
@@ -163,227 +184,8 @@ async def ultd(event):
reply_to=event.reply_to_msg_id,
)
await xx.delete()
- os.remove("ult.png")
os.remove("ult.jpg")
- os.remove(ultt)
-
-
-@ultroid_cmd(
- pattern="blur$",
-)
-async def ultd(event):
- ureply = await event.get_reply_message()
- if not (ureply and (ureply.media)):
- await event.eor(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- if ultt.endswith(".tgs"):
- xx = await event.eor(get_string("sts_9"))
- 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)
- await event.client.send_file(
- event.chat_id,
- "ult.jpg",
- force_document=False,
- reply_to=event.reply_to_msg_id,
- )
- await xx.delete()
- for i in ["ult.png", "ult.jpg", ultt]:
- if os.path.exists(i):
- os.remove(i)
-
-
-@ultroid_cmd(
- pattern="negative$",
-)
-async def ultd(event):
- ureply = await event.get_reply_message()
- xx = await event.eor("`...`")
- if not (ureply and (ureply.media)):
- await xx.edit(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- if ultt.endswith(".tgs"):
- await xx.edit(get_string("sts_9"))
- file = await con.convert(ultt, convert_to="png", outname="ult")
- ult = cv2.imread(file)
- ultroid = cv2.bitwise_not(ult)
- cv2.imwrite("ult.jpg", ultroid)
- await event.client.send_file(
- event.chat_id,
- "ult.jpg",
- force_document=False,
- reply_to=event.reply_to_msg_id,
- )
- await xx.delete()
- os.remove("ult.png")
- os.remove("ult.jpg")
- os.remove(ultt)
-
-
-@ultroid_cmd(
- pattern="mirror$",
-)
-async def ultd(event):
- ureply = await event.get_reply_message()
- xx = await event.eor("`...`")
- if not (ureply and (ureply.media)):
- await xx.edit(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- file = await con.convert(ultt, convert_to="png", outname="ult")
- ult = cv2.imread(file)
- ish = cv2.flip(ult, 1)
- ultroid = cv2.hconcat([ult, ish])
- cv2.imwrite("ult.jpg", ultroid)
- await event.client.send_file(
- event.chat_id,
- "ult.jpg",
- force_document=False,
- reply_to=event.reply_to_msg_id,
- )
- await xx.delete()
- os.remove("ult.png")
- os.remove("ult.jpg")
- os.remove(ultt)
-
-
-@ultroid_cmd(
- pattern="flip$",
-)
-async def ultd(event):
- ureply = await event.get_reply_message()
- xx = await event.eor("`...`")
- if not (ureply and (ureply.media)):
- await xx.edit(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- if ultt.endswith(".tgs"):
- await xx.edit(get_string("sts_9"))
- 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)
- ultroid = cv2.vconcat([ult, ish])
- cv2.imwrite("ult.jpg", ultroid)
- await event.client.send_file(
- event.chat_id,
- "ult.jpg",
- force_document=False,
- reply_to=event.reply_to_msg_id,
- )
- await xx.delete()
- os.remove("ult.png")
- os.remove("ult.jpg")
- os.remove(ultt)
-
-
-@ultroid_cmd(
- pattern="quad$",
-)
-async def ultd(event):
- ureply = await event.get_reply_message()
- xx = await event.eor("`...`")
- if not (ureply and (ureply.media)):
- await xx.edit(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- if ultt.endswith(".tgs"):
- await xx.edit(get_string("sts_9"))
- file = await con.convert(ultt, convert_to="png", outname="ult")
- ult = cv2.imread(file)
- roid = cv2.flip(ult, 1)
- mici = cv2.hconcat([ult, roid])
- fr = cv2.flip(mici, 1)
- trn = cv2.rotate(fr, cv2.ROTATE_180)
- ultroid = cv2.vconcat([mici, trn])
- cv2.imwrite("ult.jpg", ultroid)
- await event.client.send_file(
- event.chat_id,
- "ult.jpg",
- force_document=False,
- reply_to=event.reply_to_msg_id,
- )
- await xx.delete()
- os.remove("ult.png")
- os.remove("ult.jpg")
- os.remove(ultt)
-
-
-@ultroid_cmd(
- pattern="toon$",
-)
-async def ultd(event):
- ureply = await event.get_reply_message()
- xx = await event.eor("`...`")
- if not (ureply and (ureply.media)):
- await xx.edit(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- if ultt.endswith(".tgs"):
- await xx.edit(get_string("sts_9"))
- 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)
- count = 0
- for x in range(height):
- for y in range(width):
- samples[count] = ult[x][y]
- count += 1
- compactness, labels, centers = cv2.kmeans(
- samples,
- 12,
- None,
- (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10000, 0.0001),
- 5,
- cv2.KMEANS_PP_CENTERS,
- )
- centers = np.uint8(centers)
- ish = centers[labels.flatten()]
- ultroid = ish.reshape(ult.shape)
- cv2.imwrite("ult.jpg", ultroid)
- await event.client.send_file(
- event.chat_id,
- "ult.jpg",
- force_document=False,
- reply_to=event.reply_to_msg_id,
- )
- await xx.delete()
- os.remove("ult.png")
- os.remove("ult.jpg")
- os.remove(ultt)
-
-
-@ultroid_cmd(
- pattern="danger$",
-)
-async def ultd(event):
- ureply = await event.get_reply_message()
- xx = await event.eor("`...`")
- if not (ureply and (ureply.media)):
- await xx.edit(get_string("cvt_3"))
- return
- ultt = await ureply.download_media()
- if ultt.endswith(".tgs"):
- await xx.edit(get_string("sts_9"))
- 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)
- cv2.imwrite("ult.jpg", ultroid)
- await event.client.send_file(
- event.chat_id,
- "ult.jpg",
- force_document=False,
- reply_to=event.reply_to_msg_id,
- )
- await xx.delete()
- os.remove("ult.png")
- os.remove("ult.jpg")
- os.remove(ultt)
+ os.remove(file)
@ultroid_cmd(pattern="csample (.*)")
diff --git a/plugins/megadl.py b/plugins/megadl.py
deleted file mode 100644
index b1f2c21..0000000
--- a/plugins/megadl.py
+++ /dev/null
@@ -1,67 +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 -
-
-•`{i}megadl `
- It Downloads and Upload Files from mega.nz links.
-"""
-import time
-from datetime import datetime
-
-from . import (
- HNDLR,
- LOGS,
- bash,
- get_all_files,
- get_string,
- humanbytes,
- os,
- time_formatter,
- ultroid_cmd,
- uploader,
-)
-
-
-@ultroid_cmd(pattern="megadl( (.*)|$)")
-async def _(e):
- link = e.pattern_match.group(1).strip()
- if os.path.isdir("mega"):
- await bash("rm -rf mega")
- os.mkdir("mega")
- xx = await e.eor(f"{get_string('com_1')}\nTo Check Progress : `{HNDLR}ls mega`")
- s = datetime.now()
- x, y = await bash(f"megadl {link} --path mega")
- ok = get_all_files("mega")
- tt = time.time()
- c = 0
- for kk in ok:
- try:
- res = await uploader(kk, kk, tt, xx, get_string("com_6"))
- await e.client.send_file(
- e.chat_id,
- res,
- caption="`" + kk.split("/")[-1] + "`",
- force_document=True,
- thumb="resources/extras/ultroid.jpg",
- )
- c += 1
- except Exception as er:
- LOGS.info(er)
- ee = datetime.now()
- t = time_formatter(((ee - s).seconds) * 1000)
- size = 0
- for path, dirs, files in os.walk("mega"):
- for f in files:
- fp = os.path.join(path, f)
- size += os.path.getsize(fp)
- await xx.delete()
- await e.client.send_message(
- e.chat_id,
- f"Downloaded And Uploaded Total - `{c}` files of `{humanbytes(size)}` in `{t}`",
- )
- await bash("rm -rf mega")
diff --git a/plugins/nsfwfilter.py b/plugins/nsfwfilter.py
index 8eb0bcc..0810dc6 100644
--- a/plugins/nsfwfilter.py
+++ b/plugins/nsfwfilter.py
@@ -94,7 +94,7 @@ async def nsfw_check(e):
NWARN.update({e.sender_id: count})
return await ultroid_bot.send_message(
chat,
- f"**NSFW Warn {count}/3** To [{e.sender.first_name}](tg://user?id={e.sender_id})\nDon't Send NSFW stuffs Here Or You will Be Get {action}",
+ f"**NSFW Warn {count}/3** To [{e.sender.first_name}](tg://user?id={e.sender_id})\nNSFW prohibited! Repeated violation would lead to {action}",
)
if "mute" in action:
try:
@@ -108,7 +108,7 @@ async def nsfw_check(e):
except BaseException:
await ultroid_bot.send_message(
chat,
- f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\nCan't Able to {action}.",
+ f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\nUnable to {action}.",
)
elif "ban" in action:
try:
@@ -122,7 +122,7 @@ async def nsfw_check(e):
except BaseException:
await ultroid_bot.send_message(
chat,
- f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\nCan't Able to {action}.",
+ f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\nUnable to {action}.",
)
elif "kick" in action:
try:
@@ -134,14 +134,14 @@ async def nsfw_check(e):
except BaseException:
await ultroid_bot.send_message(
chat,
- f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\nCan't Able to {action}.",
+ f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\nUnable to {action}.",
)
NWARN.pop(e.sender_id)
else:
NWARN.update({e.sender_id: 1})
return await ultroid_bot.send_message(
chat,
- f"**NSFW Warn 1/3** To [{e.sender.first_name}](tg://user?id={e.sender_id})\nDon't Send NSFW stuffs Here Or You will Be Get {action}",
+ f"**NSFW Warn 1/3** To [{e.sender.first_name}](tg://user?id={e.sender_id})\nNSFW prohibited! Repeated violation would lead to {action}",
)
diff --git a/plugins/pmpermit.py b/plugins/pmpermit.py
index 9f64c67..8b08872 100644
--- a/plugins/pmpermit.py
+++ b/plugins/pmpermit.py
@@ -375,9 +375,7 @@ if udB.get_key("PMSETTING"):
f"**{mention}** [`{user.id}`] was Blocked for spamming.",
)
- @ultroid_cmd(
- pattern="(start|stop|clear)archive$",
- )
+ @ultroid_cmd(pattern="(start|stop|clear)archive$", fullsudo=True)
async def _(e):
x = e.pattern_match.group(1).strip()
if x == "start":
@@ -393,9 +391,7 @@ if udB.get_key("PMSETTING"):
except Exception as mm:
await e.eor(str(mm), time=5)
- @ultroid_cmd(
- pattern="(a|approve)(?: |$)",
- )
+ @ultroid_cmd(pattern="(a|approve)(?: |$)", fullsudo=True)
async def approvepm(apprvpm):
if apprvpm.reply_to_msg_id:
user = (await apprvpm.get_reply_message()).sender
@@ -446,9 +442,7 @@ if udB.get_key("PMSETTING"):
else:
await apprvpm.eor("`User may already be approved.`", time=5)
- @ultroid_cmd(
- pattern="(da|disapprove)(?: |$)",
- )
+ @ultroid_cmd(pattern="(da|disapprove)(?: |$)", fullsudo=True)
async def disapprovepm(e):
if e.reply_to_msg_id:
user = (await e.get_reply_message()).sender
@@ -520,7 +514,7 @@ async def blockpm(block):
)
await block.client(BlockRequest(user))
aname = await block.client.get_entity(user)
- await block.eor(f"{inline_mention(aname)} `has been blocked!`")
+ await block.eor(f"{inline_mention(aname)} [`{user}`] `has been blocked!`")
try:
disapprove_user(user)
except AttributeError:
@@ -546,11 +540,12 @@ async def blockpm(block):
pass
-@ultroid_cmd(pattern="unblock( (.*)|$)")
+@ultroid_cmd(pattern="unblock( (.*)|$)", fullsudo=True)
async def unblockpm(event):
match = event.pattern_match.group(1).strip()
- if event.reply_to_msg_id:
- user = (await event.get_reply_message()).sender_id
+ reply = await event.get_reply_message()
+ if reply:
+ user = reply.sender_id
elif match:
if match == "all":
msg = await event.eor(get_string("com_1"))
@@ -576,14 +571,10 @@ async def unblockpm(event):
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
+ elif event.is_private:
+ user = event.chat_id
else:
return await event.eor(NO_REPLY, time=10)
- try:
- user = await event.client.parse_id(match)
- except Exception as er:
- return await event.eor(str(er))
try:
await event.client(UnblockRequest(user))
aname = await event.client.get_entity(user)
diff --git a/plugins/profile.py b/plugins/profile.py
index 814f772..3786ada 100644
--- a/plugins/profile.py
+++ b/plugins/profile.py
@@ -112,6 +112,9 @@ async def remove_profilepic(delpfp):
async def gpoto(e):
ult = e.pattern_match.group(1).strip()
a = await e.eor(get_string("com_1"))
+ just_dl = ult in ["-dl", "--dl"]
+ if just_dl:
+ ult = None
if not ult:
if e.is_reply:
gs = await e.get_reply_message()
@@ -121,6 +124,8 @@ async def gpoto(e):
okla = await e.client.download_profile_photo(ult)
if not okla:
return await eor(a, "`Pfp Not Found...`")
- await a.delete()
- await e.reply(file=okla)
- os.remove(okla)
+ if not just_dl:
+ await a.delete()
+ await e.reply(file=okla)
+ return os.remove(okla)
+ await a.edit(f"Downloaded pfp to [ `{okla}` ].")
diff --git a/plugins/specialtools.py b/plugins/specialtools.py
index fc720bf..7bded4c 100644
--- a/plugins/specialtools.py
+++ b/plugins/specialtools.py
@@ -56,7 +56,7 @@ from . import (
ultroid_cmd,
uploader,
)
-from .carbon import all_col
+from .beautify import all_col
File = []
diff --git a/plugins/tools.py b/plugins/tools.py
index 04c051b..8c376ee 100644
--- a/plugins/tools.py
+++ b/plugins/tools.py
@@ -63,7 +63,7 @@ from telethon.tl.types import (
)
from telethon.utils import pack_bot_file_id
-from . import HNDLR, async_searcher, bash, con, eor, get_string
+from . import HNDLR, LOGS, async_searcher, bash, con, eor, get_string
from . import humanbytes as hb
from . import inline_mention, is_url_ok, mediainfo, ultroid_cmd
@@ -94,6 +94,7 @@ async def _(event):
output_str = f"**TRANSLATED** from {fr} to {lan}\n{tt}"
await event.eor(output_str)
except Exception as exc:
+ LOGS.exception(exc)
await event.eor(str(exc), time=5)
diff --git a/plugins/usage.py b/plugins/usage.py
index 78e15e1..b435f11 100644
--- a/plugins/usage.py
+++ b/plugins/usage.py
@@ -41,6 +41,8 @@ if HOSTED_ON == "heroku":
heroku_api, app_name = Var.HEROKU_API, Var.HEROKU_APP_NAME
try:
if heroku_api and app_name:
+ import heroku3
+
Heroku = heroku3.from_key(heroku_api)
app = Heroku.app(app_name)
HEROKU_API = heroku_api
diff --git a/plugins/writer.py b/plugins/writer.py
index dc08e30..96abcf6 100644
--- a/plugins/writer.py
+++ b/plugins/writer.py
@@ -4,6 +4,7 @@
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
# .
+
"""
✘ Commands Available -
diff --git a/plugins/ziptools.py b/plugins/ziptools.py
index d8d305d..518a06b 100644
--- a/plugins/ziptools.py
+++ b/plugins/ziptools.py
@@ -76,11 +76,12 @@ async def zipp(event):
await xx.delete()
-@ultroid_cmd(pattern="unzip$")
+@ultroid_cmd(pattern="unzip( (.*)|$)")
async def unzipp(event):
reply = await event.get_reply_message()
+ file = event.pattern_match.group(1).strip()
t = time.time()
- if not reply:
+ if not ((reply and reply.media) or file):
await event.eor(get_string("zip_1"))
return
xx = await event.eor(get_string("com_1"))
@@ -117,7 +118,7 @@ async def unzipp(event):
async def azipp(event):
reply = await event.get_reply_message()
t = time.time()
- if not reply:
+ if not (reply and reply.media):
await event.eor(get_string("zip_1"))
return
xx = await event.eor(get_string("com_1"))
diff --git a/requirements.txt b/requirements.txt
index dc5bdf4..28f1031 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
# Important Requirements here.
-https://github.com/New-dev0/Telethon/archive/PlayTime.zip
-py-Ultroid==2022.3.20
+https://github.com/New-dev0/Telethon/archive/Cartoon.zip
+py-Ultroid==2022.6.6
pytgcalls==3.0.0.dev21
diff --git a/resources/colorlist.txt b/resources/colorlist.txt
new file mode 100644
index 0000000..6e3f3c3
--- /dev/null
+++ b/resources/colorlist.txt
@@ -0,0 +1,148 @@
+AliceBlue
+AntiqueWhite
+Aqua
+Aquamarine
+Azure
+Beige
+Bisque
+Black
+BlanchedAlmond
+Blue
+BlueViolet
+Brown
+BurlyWood
+CadetBlue
+Chartreuse
+Chocolate
+Coral
+CornflowerBlue
+Cornsilk
+Crimson
+Cyan
+DarkBlue
+DarkCyan
+DarkGoldenRod
+DarkGray
+DarkGreen
+DarkGrey
+DarkKhaki
+DarkMagenta
+DarkOliveGreen
+DarkOrange
+DarkOrchid
+DarkRed
+DarkSalmon
+DarkSeaGreen
+DarkSlateBlue
+DarkSlateGray
+DarkSlateGrey
+DarkTurquoise
+DarkViolet
+DeepPink
+DeepSkyBlue
+DimGray
+DimGrey
+DodgerBlue
+FireBrick
+FloralWhite
+ForestGreen
+Fuchsia
+Gainsboro
+GhostWhite
+Gold
+GoldenRod
+Gray
+Green
+GreenYellow
+Grey
+HoneyDew
+HotPink
+IndianRed
+Indigo
+Ivory
+Khaki
+Lavender
+LavenderBlush
+LawnGreen
+LemonChiffon
+LightBlue
+LightCoral
+LightCyan
+LightGoldenRodYellow
+LightGray
+LightGreen
+LightGrey
+LightPink
+LightSalmon
+LightSeaGreen
+LightSkyBlue
+LightSlateGray
+LightSlateGrey
+LightSteelBlue
+LightYellow
+Lime
+LimeGreen
+Linen
+Magenta
+Maroon
+MediumAquaMarine
+MediumBlue
+MediumOrchid
+MediumPurple
+MediumSeaGreen
+MediumSlateBlue
+MediumSpringGreen
+MediumTurquoise
+MediumVioletRed
+MidnightBlue
+MintCream
+MistyRose
+Moccasin
+NavajoWhite
+Navy
+OldLace
+Olive
+OliveDrab
+Orange
+OrangeRed
+Orchid
+PaleGoldenRod
+PaleGreen
+PaleTurquoise
+PaleVioletRed
+PapayaWhip
+PeachPuff
+Peru
+Pink
+Plum
+PowderBlue
+Purple
+RebeccaPurple
+Red
+RosyBrown
+RoyalBlue
+SaddleBrown
+Salmon
+SandyBrown
+SeaGreen
+SeaShell
+Sienna
+Silver
+SkyBlue
+SlateBlue
+SlateGray
+SlateGrey
+Snow
+SpringGreen
+SteelBlue
+Tan
+Teal
+Thistle
+Tomato
+Turquoise
+Violet
+Wheat
+White
+WhiteSmoke
+Yellow
+YellowGreen
\ No newline at end of file
diff --git a/resources/startup/_termux.py b/resources/startup/_termux.py
index c6146bb..939e98d 100644
--- a/resources/startup/_termux.py
+++ b/resources/startup/_termux.py
@@ -16,8 +16,8 @@ def clear():
system("clear")
MANDATORY_REQS = [
- "https://github.com/New-dev0/Telethon/archive/PlayTime.zip",
- "py-Ultroid==2022.3.20",
+ "https://github.com/New-dev0/Telethon/archive/Cartoon.zip",
+ "py-Ultroid==2022.6.6",
"gitpython",
"enhancer==0.3.4",
"telegraph",
@@ -252,4 +252,4 @@ print("\nYou can head over to @UltroidSupport, if you get stuck somewhere, and n
sleep(0.5)
print("\nMade with ❤️ by @TeamUltroid...")
-system("pip3 uninstall colorama -y")
+system("pip3 uninstall -q colorama -y")
diff --git a/resources/startup/optional-requirements.txt b/resources/startup/optional-requirements.txt
index 1cbe503..95586d3 100644
--- a/resources/startup/optional-requirements.txt
+++ b/resources/startup/optional-requirements.txt
@@ -16,6 +16,7 @@ git+https://github.com/buddhhu/img2html.git
git+https://github.com/programmingerror/heroku3.py.git
gitpython
google-api-python-client
+feedparser
html-telegraph-poster
htmlwebshot
lottie
diff --git a/resources/startup/termux.sh b/resources/startup/termux.sh
index 645cc55..4d608e4 100644
--- a/resources/startup/termux.sh
+++ b/resources/startup/termux.sh
@@ -13,7 +13,7 @@ then
fi
printf "*Putting some magical effect...*"
-pip install colorama
+pip install -q colorama
printf "Running up Installation tool.\n"
python resources/startup/_termux.py
diff --git a/strings/README.md b/strings/README.md
index bbaa39e..458c8f0 100644
--- a/strings/README.md
+++ b/strings/README.md
@@ -3,28 +3,29 @@
| Code | Language | Translated | Remaining |
|----|-------|-------|---|
-| en | English [English] | 413 | 0 |
-| 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 [हिंदी] | 413 | NULL |
-| az | Azerbaijan [Azərbaycan] | 382 | 31 |
-| 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 |
+| en | English [English] | 418 | 0 |
+| ar | Arabic [العربية] | 418 | NULL |
+| si | sinhala [සිංහල] | 112 | 306 |
+| hi | Hindi [हिंदी] | 413 | 5 |
+| fr | French [Français] | 110 | 308 |
+| jp | Japanese [日本] | 413 | 5 |
+| fa | Persian [Farsi] | 391 | 27 |
+| id | Indonesia [Indonesia] | 413 | 5 |
+| pt-br | Portuguese [Português] | 413 | 5 |
+| gu | Gujarati [ગુજરાતી] | 109 | 309 |
+| ml | Malayalam [മലയാളം] | 112 | 306 |
+| ru | Russian [Русский] | 413 | 5 |
+| ta | தமிழ் [தமிழ்] | 112 | 306 |
+| my | Malay [Bahasa Melayu] | 112 | 306 |
+| es | Spanish [Español] | 409 | 9 |
+| od | Odia [ଓଡିଆ] | 112 | 306 |
+| tr | Turkish [Türk] | 112 | 306 |
+| mr | Marathi [मराठी] | 131 | 287 |
+| cn | Chinese [简体中文] | 112 | 306 |
+| ka | Kannada [ಕನ್ನಡ] | 112 | 306 |
+| bn | Bengali [বাংলা] | 382 | 36 |
+| it | Italian [italiano] | 111 | 307 |
+| az | Azerbaijan [Azərbaycan] | 382 | 36 |
If Strings are not present, Google Translation will be used to Translate them at time of Usage.
diff --git a/strings/remaining.csv b/strings/remaining.csv
index 8dcf2ae..ee0a09c 100644
--- a/strings/remaining.csv
+++ b/strings/remaining.csv
@@ -1,310 +1,399 @@
--,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,,,,❌,,,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
-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,,,,❌,,,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
-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,,,,❌,,,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
-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
+-,Arabic,Azerbaijan,Bengali,Chinese,Spanish,Persian,French,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,,,,❌,,,,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+afk_1,,,,,,,❌,,,,,,,,,,,,,,,
+afk_2,,,,,,,❌,,,,,,,,,,,,,,,
+afk_3,,,,,,,❌,,,,,,,,,,,,,,,
+afk_4,,,,,,,❌,,,,,,,,,,,,,,,
+afk_5,,,,,,,❌,,,,,,,,,,,,,,,
+afk_6,,,,,,,❌,,,,,,,,,,,,,,,
+bot_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+bot_2,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+bot_3,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+bot_4,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+bot_5,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+alive_1,,,,,,,❌,,,,,,,,,,,,,,,
+log,,,,,,,❌,,,,,,,,❌,,,,,,,
+ping,,,,,,,❌,,,,,,,,❌,,,,,,,
+usage,,,,,,,❌,,,,,,,,❌,,,,,,,
+usage_simple,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+shutdown,,,,,,,❌,,,,,,,,❌,,,,,,,
+blk_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+blk_2,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+blk_3,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+blk_4,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+blk_5,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+blk_6,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+bd_1,,,,,,,❌,,,,,,,,,,,,,,,
+bd_2,,,,,,,❌,,,,,,,,,,,,,,,
+bd_3,,,,,,,❌,,,,,,,,,,,,,,,
+bd_4,,,,,,,❌,,,,,,,,,,,,,,,
+bd_5,,,,,,,❌,,,,,,,,,,,,,,,
+bd_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_1,,,,,,,❌,,,,,,,,,,,,,,,
+carbon_2,,,,,,,❌,,,,,,,,,,,,,,,
+carbon_3,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+chab_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+chab_2,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+chab_3,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+chats_1,,,,,,,❌,,,,,,,,,,,,,,,
+chats_2,,,,,,,❌,,,,,,,,,,,,,,,
+chats_3,,,,,,,❌,,,,,,,,,,,,,,,
+chats_4,,,,,,,❌,,,,,,,,,,,,,,,
+chats_5,,,,,,,❌,,,,,,,,,,,,,,,
+chats_6,,,,,,,❌,,,,❌,,,,,,,,,,,
+clan_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+clan_2,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+clan_3,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+clan_4,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+clan_5,,❌,❌,❌,,❌,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+cvt_1,,,,,,,❌,,,,,,,,,,,,,,,
+cvt_2,,,,,,,❌,,,,,,,,,,,,,,,
+cvt_3,,,,,,,❌,,,,,,,,,,,,,,,
+cvt_4,,,,,,,❌,,,,,,,,,,,,,,,
+cvt_5,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+cvt_6,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+cvt_7,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+cvt_8,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+eod_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+eod_2,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+core_1,,,,,,,❌,,,,,,,,,,,,,,,
+core_2,,,,,,,❌,,,,,,,,,,,,,,,
+core_3,,,,,,,❌,,,,,,,,,,,,,,,
+core_4,,,,,,,❌,,,,,,,,,,,,,,,
+core_5,,,,,,,❌,,,,,,,,,,,,,,,
+core_6,,,,,,,❌,,,,,,,,,,,,,,,
+core_7,,,,,,,❌,,,,,,,,,,,,,,,
+core_8,,,,,,,❌,,,,,,,,,,,,,,,
+core_9,,,,,,,❌,,,,,,,,,,,,,,,
+core_10,,,,,,,❌,,,,,,,,,,,,,,,
+core_11,,,,,,,❌,,,,,,,,,,,,,,,
+core_12,,,,,,,❌,,,,,,,,,,,,,,,
+core_13,,,,,,,❌,,,,,,,,,,,,,,,
+core_14,,,,,,,❌,,,,,,,,,,,,,,,
+core_15,,,,,,,❌,,,,,,,,,,,,,,,
+core_16,,,,,,,❌,,,,,,,,,,,,,,,
+core_17,,,,,,,❌,,,,,,,,,,,,,,,
+core_18,,,,,,,❌,,,,,,,,,,,,,,,
+devs_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+devs_2,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+devs_3,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+dm_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+dm_2,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+dm_3,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+dm_4,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+dm_5,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+dm_6,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+echo_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+fka_1,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+sf_1,,,,,,,❌,,,,,,,,,,,,,,,
+sf_2,,,,,,,❌,,,,,,,,,,,,,,,
+sf_3,,,,,,,❌,,,,,,,,,,,,,,,
+sf_4,,,,,,,❌,,,,,,,,,,,,,,,
+sf_5,,,,,,,❌,,,,,,,,,,,,,,,
+sf_6,,,,,,,❌,,,,,,,,,,,,,,,
+sf_7,,,,,,,❌,,,,,,,,,,,,,,,
+sf_8,,,,,,,❌,,,,,,,,,,,,,,,
+sf_9,,,,,,,❌,,,,,,,,,,,,,,,
+sf_10,,,,,,,❌,,,,,,,,,,,,,,,
+sf_11,,,,,,,❌,,,,,,,,,,,,,,,
+sf_12,,,,,,,❌,,,,,,,,,,,,,,,
+sf_13,,,,,,,❌,,,,,,,,,,,,,,,
+sf_14,,,,,,,❌,,,,,,,,,,,,,,,
+sf_15,,,,,,,❌,,,,,,,,,,,,,,,
+sf_16,,,,,,,❌,,,,,,,,,,,,,,,
+sf_17,,,,,,,❌,,,,,,,,,,,,,,,
+sf_18,,,,,,,❌,,,,,,,,,,,,,,,
+sf_19,,,,,,,❌,,,,,,,,,,,,,,,
+sf_20,,,,,,,❌,,,,,,,,,,,,,,,
+sf_21,,,,,,,❌,,,,,,,,,,,,,,,
+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,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+gdrive_1,,,,,,,❌,,,,,,,,,,,,,,,
+gdrive_2,,,,,,,❌,,,,,,,,,,,,,,,
+gdrive_3,,,,,,,❌,,,,,,,,,,,,,,,
+gdrive_4,,,,,,,❌,,,,,,,,,,,,,,,
+gdrive_5,,,,,,,❌,,,,,,,,,,,,,,,
+gdrive_6,,,,,,,❌,,,,,,,,,,,,,,,
+gdrive_7,,,,,,,❌,,,,,,,,,,,,,,,
+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,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+pmperm_1,,,,,,,❌,,,,,,,,,,,,,,,
+pmperm_2,,,,,,,❌,,,,,,,,,,,,,,,
+pmperm_3,,,,,,,❌,,,,,,,,,,,,,,,
+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_1,,,,,,,❌,,,,,,,,,,,,,,,
+upd_2,,,,,,,❌,,,,,,,,,,,,,,,
+upd_3,,,,,,,❌,,,,,,,,,,,,,,,
+upd_4,,,,,,,❌,,,,,,,,,,,,,,,
+upd_5,,,,❌,❌,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+upd_6,,,,,,,❌,,,,,,,,,,,,,,,
+upd_7,,,,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+udl_1,,,,,,,❌,,,,,,,,,,,,,,,
+udl_2,,,,,,,❌,,,,,,,,,,,,,,,
+udl_3,,,,,,,❌,,,,,,,,,,,,,,,
+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,,❌,❌,❌,,❌,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+ast_1,,,,,,,❌,,,,,,,,,,,,,,,
+ast_2,,,,,,,❌,,,,,,,,,,,,,,,
+ast_3,,,,,,,❌,,,,,,,,,,,,,,,
+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,,❌,❌,❌,,,❌,❌,,,❌,,❌,❌,❌,❌,❌,,,❌,❌,❌
+rss_1,,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌
+rss_2,,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌
+rss_3,,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌
+rss_4,,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌
+rss_5,,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌,❌
+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 62008b3..9174ed3 100644
--- a/strings/strings.py
+++ b/strings/strings.py
@@ -13,32 +13,7 @@ except ImportError:
try:
from yaml import safe_load
except ModuleNotFoundError:
-
- 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
+ from pyUltroid.functions.tools import safe_load
language = [udB.get_key("language") or "en"]
languages = {}
diff --git a/strings/strings/ar.yml b/strings/strings/ar.yml
index 14c5fe2..31b151b 100644
--- a/strings/strings/ar.yml
+++ b/strings/strings/ar.yml
@@ -230,6 +230,8 @@ upd_2: "`┇أوبــس .. الــمــحــدث غــيــر قــادر
upd_3: "**┇يــتــوفــر تــحــديــث جــديــد لــ [[{}]]({}/tree/{}):\n\n**┇ســجــل الــتــغــيــيــرات \n\n{}"
upd_4: "`┇حــجــم ســجــل الــتــغــيــيــرات كــبــيــر جــداً , اعــرض الــمــلــف لــرؤيــتــه `"
upd_6: "\n`┇بــوتــك` **بــأخــر تــحــديــث** `بـــ` **[[{}]]({}/tree/{})**\n"
+upd_5: "اضغط علي الزر بالاسفل للتحديث."
+upd_7: "`جار التحديث السريع...`"
# upload download
udl_1: "`┇قــم بــالــرد عــلــى الــمــلــف / الــمــيــديــا الــمــراد تــحــمــيــلــهــا ♻️`"
@@ -294,7 +296,7 @@ bot_1: "مرحبا، انا علي قيد الحياة."
bot_2: "احصائيات"
bot_3: "Repo"
bot_4: "مجموعة المساعدة"
-bot_5: "• `جار اعدة التشغيل...`"
+bot_5: "• `جار إعادة التشغيل...`"
usage_simple: "**مساحة الذاكرة**: `{}`\n**المستخدم**: `{}`\n**المتاح**: `{}`\n\n**📊 البيانات المستخدمة 📊**\n**رفع**: `{}`\n**تنزيل**: `{}`\n\n**CPU**: `{}%`\n**RAM**: `{}%`\n**الذاكرة**: `{}%`"
blk_1: "`قم بإعطاء كلمة لحظرها..`"
blk_2: "تم حظر كلمة : `{}` هنا."
@@ -499,6 +501,13 @@ pmbot_5: "من فضلك قم بالرد علي احدهم لالغاء حظره.
pmbot_6: "هذ المستخدم لم يتم حظره ابدا!"
pmbot_7: "`مبروك! تم الغاء حظرك.`"
+# rss feeds
+rss_1: "`قم بإعطاء عنوان Rss لإضافته..`"
+rss_2: "فشل تأكيد عنوان Rss\n__خطأ: {}__"
+rss_3: "`لم يتم اضافة احداث Rss لهذه المحادثة.`"
+rss_4: "`تم حذف احداث Rss من هذه المحادثة..`"
+rss_5: "`تم الاضافة لهذه المحادثة بنجاح.`"
+
# vcbot
vcbot_1: "`تم مغادرة المحادثة الصوتية.`"
vcbot_2: "**حدث خطأ:**\n{}"
diff --git a/strings/strings/en.yml b/strings/strings/en.yml
index 38fdb47..b30a2eb 100644
--- a/strings/strings/en.yml
+++ b/strings/strings/en.yml
@@ -2,7 +2,6 @@ name: English
natively: English
authors:
- - karboncopy
- xditya
- rojserbest
- sppidy
@@ -55,7 +54,7 @@ pro_2: "{} `is now an admin in {} with title {}.`"
de_1: "`Reply to a user to demote him!`"
de_2: "{} `is no longer an admin in {}`"
ban_1: "`Reply to a user or give username to ban him!`"
-ban_2: " `LoL, I can't Ban my Developer 😂`"
+ban_2: " `Sorry, but I can't Ban my Developer 😂`"
ban_3: "`I don't have the right to ban a user.`"
ban_4: "{} **was banned by** {} **in** `{}`"
ban_5: "\n**Reason**: `{}`"
@@ -65,7 +64,7 @@ unban_1: "`Reply to a user or give username to unban him!`"
unban_2: "`I don't have the right to unban a user.`"
unban_3: "{} **was unbanned by** {} **in** `{}`"
kick_1: "`I don't have the right to kick a user.`"
-kick_2: " `Lol, I can't Kick my Developer`😂"
+kick_2: " `Sorry, but I can't Kick my Developer`😂"
kick_3: "`I Cant kick him ever...`"
kick_4: "{} **was kicked by** {} **in** `{}`"
pin_1: "`Reply to a message to pin it!`"
@@ -535,6 +534,13 @@ pmbot_5: "Please reply to someone to Unban him."
pmbot_6: "User was never banned!"
pmbot_7: "`Congrats! You have been unbanned.`"
+# rss feeds
+rss_1: "`Provide Rss url to add..`"
+rss_2: "Failed to verify rss url\n__Error: {}__"
+rss_3: "`No rss feed has been added to this chat.`"
+rss_4: "`Removed rss feed from this chat..`"
+rss_5: "`Successfully added to this chat.`"
+
# -------------------------- VcBot ------------------------------- #
vcbot_1: "`Left the voice chat.`"
diff --git a/strings/strings/ru.yml b/strings/strings/ru.yml
index 4d252cd..84104cd 100644
--- a/strings/strings/ru.yml
+++ b/strings/strings/ru.yml
@@ -404,7 +404,9 @@ upd_1: "`Проверка обновлений, пожалуйста подож
upd_2: "`Упс.. Компонент обновления не может продолжить из-за ошибки`\n\n**LOGTRACE:**\n"
upd_3: "**Новое обновление доступно для [[{}]]({}/tree/{}):\n\nИзменения**\n\n{}"
upd_4: "`Список изменений слишком большой, откройте файл для просмотра изменений`"
+upd_5: "Нажмите на кнопку ниже для обновления"
upd_6: "\n`Ваш бот` **актуален** `с` **[[{}]]({}/tree/{})**\n"
+upd_7: "`Быстрое обновление...`"
#upload download
udl_1: "`Ответьте на сообщение с медиафайлом/документом которые вы хотите загрузить..`"