diff --git a/.gitignore b/.gitignore
index c71fb25..a8bff80 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,21 +1,24 @@
.env
-venv/
-__pycache__
-ultroid.session-journal
-ultroid.session
+*.session-journal
+*.session
+build
*.mp3
*.webm
*.webp
*.mp4
*.tgs
-.vscode/*
/*.jpg
/*.png
/*.mp4
-addons/
-ultroid.log
+*.log
target/npmlist.json
+package-lock.json
+# Directories
+addons/
+__pycache__/
+venv/
node_modules/
glitch_me/
-.idea
-venv/
+.idea/
+.vscode/
+temp/
diff --git a/Dockerfile b/Dockerfile
index 9426aba..67b590c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,19 +1,18 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in .
-FROM programmingerror/ultroid:v0.0.2
+FROM programmingerror/ultroid:b0.1
ENV TZ=Asia/Kolkata
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
-RUN apt-get autoremove --purge
RUN git clone https://github.com/TeamUltroid/Ultroid.git /root/TeamUltroid/
WORKDIR /root/TeamUltroid/
-RUN pip3 install -r requirements.txt
-RUN npm install -g npm@7.12.1 -g
+RUN pip3 install --no-cache-dir -r requirements.txt
+RUN npm install -g npm@7.16.0 -g
RUN npm install
RUN npm run build
diff --git a/app.json b/app.json
index f4cee6c..5e6e0f4 100644
--- a/app.json
+++ b/app.json
@@ -48,13 +48,9 @@
}
},
"formation": {
- "worker": {
+ "ultroid": {
"quantity": 1,
"size": "free"
- },
- "web": {
- "quantity": 0,
- "size": "free"
}
}
}
diff --git a/assistant/__init__.py b/assistant/__init__.py
index 84b9599..9ff002d 100644
--- a/assistant/__init__.py
+++ b/assistant/__init__.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
diff --git a/assistant/api_setter.py b/assistant/api_setter.py
index 81e0cec..e745ae4 100644
--- a/assistant/api_setter.py
+++ b/assistant/api_setter.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -16,15 +16,14 @@ async def apiset(event):
await event.edit(
get_string("ast_1"),
buttons=[
- [Button.inline("Remove.bg", data="rmbg")],
+ [Button.inline("Remove.bg API", data="rmbg")],
+ [Button.inline("DEEP API", data="dapi")],
+ [Button.inline("OCR API", data="oapi")],
[Button.inline("« Back", data="setter")],
],
)
-# remove.bg api
-
-
@callback("rmbg")
@owner
async def rmbgapi(event):
@@ -48,3 +47,53 @@ async def rmbgapi(event):
f"{name} changed to {themssg}",
buttons=get_back_button("apiset"),
)
+
+
+@callback("dapi")
+@owner
+async def rmbgapi(event):
+ await event.delete()
+ pru = event.sender_id
+ var = "DEEP_API"
+ name = "DEEP AI API Key"
+ async with event.client.conversation(pru) as conv:
+ await conv.send_message("Get Your Deep Api from deepai.org and send here.")
+ response = conv.wait_event(events.NewMessage(chats=pru))
+ response = await response
+ themssg = response.message.message
+ if themssg == "/cancel":
+ return await conv.send_message(
+ "Cancelled!!",
+ buttons=get_back_button("apiset"),
+ )
+ else:
+ await setit(event, var, themssg)
+ await conv.send_message(
+ f"{name} changed to {themssg}",
+ buttons=get_back_button("apiset"),
+ )
+
+
+@callback("oapi")
+@owner
+async def rmbgapi(event):
+ await event.delete()
+ pru = event.sender_id
+ var = "OCR_API"
+ name = "OCR API Key"
+ async with event.client.conversation(pru) as conv:
+ await conv.send_message("Get Your OCR api from ocr.space Send Send Here.")
+ response = conv.wait_event(events.NewMessage(chats=pru))
+ response = await response
+ themssg = response.message.message
+ if themssg == "/cancel":
+ return await conv.send_message(
+ "Cancelled!!",
+ buttons=get_back_button("apiset"),
+ )
+ else:
+ await setit(event, var, themssg)
+ await conv.send_message(
+ f"{name} changed to {themssg}",
+ buttons=get_back_button("apiset"),
+ )
diff --git a/assistant/inlinestuff.py b/assistant/inlinestuff.py
index c08921e..6f4d6bf 100644
--- a/assistant/inlinestuff.py
+++ b/assistant/inlinestuff.py
@@ -1,15 +1,16 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
# .
import base64
+import os
+import urllib
from random import choice
from re import compile as re_compile
from re import findall
-from urllib.request import urlopen
import requests
from bs4 import BeautifulSoup
@@ -19,6 +20,8 @@ from search_engine_parser import GoogleSearch, YahooSearch
from telethon import Button
from telethon.tl.types import InputWebDocument as wb
+from plugins._inline import SUP_BUTTONS
+
from . import *
from . import humanbytes as hb
@@ -153,15 +156,7 @@ async def repo(e):
description="Userbot | Telethon",
thumb=wb(ultpic, 0, "image/jpeg", []),
text="• **ULTROID USERBOT** •",
- buttons=[
- [
- Button.url("Repo", url="https://github.com/TeamUltroid/Ultroid"),
- Button.url(
- "Addons", url="https://github.com/TeamUltroid/UltroidAddons"
- ),
- ],
- [Button.url("Support", url="t.me/UltroidSupport")],
- ],
+ buttons=SUP_BUTTONS,
),
]
await e.answer(res, switch_pm="Ultroid Repo.", switch_pm_param="start")
@@ -426,22 +421,75 @@ async def _(e):
await e.answer(modss, switch_pm="Search Mod Applications.", switch_pm_param="start")
-@in_pattern("clipart")
+@in_pattern("ebooks")
@in_owner
async def clip(e):
try:
quer = e.text.split(" ", maxsplit=1)[1]
except IndexError:
- await e.answer([], switch_pm="ClipArt Search.", switch_pm_param="start")
+ await e.answer(
+ [], switch_pm="Enter Query to Look for EBook", switch_pm_param="start"
+ )
+ return
quer = quer.replace(" ", "+")
- sear = f"https://clipartix.com/search/{quer}"
- html = urlopen(sear)
- bs = BeautifulSoup(html, "html.parser", from_encoding="utf-8")
- resul = bs.find_all("img", "attachment-full size-full")
+ sear = f"http://www.gutenberg.org/ebooks/search/?query={quer}&submit_search=Go%21"
+ magma = requests.get(sear).content
+ bs = BeautifulSoup(magma, "html.parser", from_encoding="utf-8")
+ out = bs.find_all("img")
+ Alink = bs.find_all("a", "link")
+ if len(out) == 0:
+ return await e.answer(
+ [], switch_pm="No Results Found !", switch_pm_param="start"
+ )
buil = e.builder
+ dont_take = [
+ "Authors",
+ "Did you mean",
+ "Sort Alpha",
+ "Sort by",
+ "Subjects",
+ "Bookshelves",
+ ]
hm = []
- for res in resul:
- hm += [buil.photo(include_media=True, file=res["src"])]
- await e.answer(
- hm, gallery=True, switch_pm="Clipart Searcher.", switch_pm_param="start"
- )
+ titles = []
+ for num in Alink:
+ try:
+ rt = num.find("span", "title").text
+ if not rt.startswith(tuple(dont_take)):
+ titles.append(rt)
+ except BaseException:
+ pass
+ for rs in range(len(out)):
+ if "/cache/epub" in out[rs]["src"]:
+ link = out[rs]["src"]
+ num = link.split("/")[3]
+ hm.append(
+ buil.document(
+ title=titles[rs],
+ description="GutenBerg Search",
+ file="https://gutenberg.org" + link.replace("small", "medium"),
+ text=f"**• Ebook Search**\n\n->> `{titles[rs]}`",
+ buttons=Button.inline("Get as Doc", data=f"ebk_{num}"),
+ )
+ )
+ await e.answer(hm, switch_pm="Ebooks Search", switch_pm_param="start")
+
+
+@callback(re_compile("ebk_(.*)"))
+async def eupload(event):
+ match = event.pattern_match.group(1).decode("utf-8")
+ await event.answer("Uploading..")
+ try:
+ await event.edit(
+ file=f"https://www.gutenberg.org/files/{match}/{match}-pdf.pdf"
+ )
+ except BaseException:
+ book = "Ultroid-Book.epub"
+ urllib.request.urlretrieve(
+ "https://www.gutenberg.org/ebooks/132.epub.images", book
+ )
+ fn, media, _ = await asst._file_to_media(
+ book, thumb="resources/extras/ultroid.jpg"
+ )
+ await event.edit(file=media)
+ os.remove(book)
diff --git a/assistant/localization.py b/assistant/localization.py
index 1ac30f0..22a17d8 100644
--- a/assistant/localization.py
+++ b/assistant/localization.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
diff --git a/assistant/othervars.py b/assistant/othervars.py
index 05b6959..568c2f8 100644
--- a/assistant/othervars.py
+++ b/assistant/othervars.py
@@ -1,12 +1,14 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
# .
import re
+from glob import glob
from os import remove
+from random import choices
import requests
from telegraph import Telegraph
@@ -24,9 +26,14 @@ auth_url = r["auth_url"]
TOKEN_FILE = "resources/auths/auth_token.txt"
-@callback(re.compile("sndplug_(.*)"))
+@callback(
+ re.compile("sndplug_(.*)"),
+)
async def send(eve):
name = (eve.data_match.group(1)).decode("UTF-8")
+ thumb = ""
+ for m in choices(sorted(glob("resources/extras/*.jpg"))):
+ thumb += m
if name.startswith("def"):
plug_name = name.replace(f"def_plugin_", "")
plugin = f"plugins/{plug_name}.py"
@@ -57,7 +64,7 @@ async def send(eve):
Button.inline("••Cʟᴏꜱᴇ••", data="close"),
],
]
- await eve.edit(file=plugin, buttons=buttons)
+ await eve.edit(file=plugin, thumb=thumb, buttons=buttons)
@callback("updatenow")
@@ -74,14 +81,12 @@ async def update(eve):
heroku_app = None
heroku_applications = heroku.apps()
except BaseException:
- return await eve.edit(
- "`Invalid Heroku credentials for updating userbot dyno.`"
- )
+ return await eve.edit("`Wrong HEROKU_API.`")
for app in heroku_applications:
if app.name == Var.HEROKU_APP_NAME:
heroku_app = app
if not heroku_app:
- await eve.edit("`Invalid Heroku credentials for updating userbot dyno.`")
+ await eve.edit("`Wrong HEROKU_APP_NAME.`")
repo.__del__()
return
await eve.edit(
@@ -105,6 +110,9 @@ async def update(eve):
return
await eve.edit("`Successfully Updated!\nRestarting, please wait...`")
else:
+ await eve.edit(
+ "`Userbot dyno build in progress, please wait for it to complete.`"
+ )
try:
ups_rem.pull(ac_br)
except GitCommandError:
@@ -143,7 +151,11 @@ async def changes(okk):
)
-@callback(re.compile("pasta-(.*)"))
+@callback(
+ re.compile(
+ "pasta-(.*)",
+ ),
+)
@owner
async def _(e):
ok = (e.data_match.group(1)).decode("UTF-8")
@@ -296,6 +308,7 @@ async def otvaar(event):
Button.inline("Eᴍᴏᴊɪ ɪɴ Hᴇʟᴘ", data="emoj"),
Button.inline("Sᴇᴛ ɢDʀɪᴠᴇ", data="gdrive"),
],
+ [Button.inline("Inline Pic", data="inli_pic")],
[Button.inline("« Bᴀᴄᴋ", data="setter")],
],
)
@@ -405,7 +418,27 @@ async def hndlrr(event):
@callback("taglog")
@owner
-async def tagloggerr(event):
+async def tagloggrr(e):
+ await e.edit(
+ "Choose Options",
+ buttons=[
+ [Button.inline("SET TAG LOG", data="settag")],
+ [Button.inline("DELETE TAG LOG", data="deltag")],
+ [Button.inline("« Bᴀᴄᴋ", data="otvars")],
+ ],
+ )
+
+
+@callback("deltag")
+@owner
+async def delfuk(e):
+ udB.delete("TAG_LOG")
+ await e.answer("Done!!! TAG lOG Off")
+
+
+@callback("settag")
+@owner
+async def taglogerr(event):
await event.delete()
pru = event.sender_id
var = "TAG_LOG"
@@ -420,13 +453,13 @@ async def tagloggerr(event):
if themssg == "/cancel":
return await conv.send_message(
"Cancelled!!",
- buttons=get_back_button("otvars"),
+ buttons=get_back_button("taglog"),
)
else:
await setit(event, var, themssg)
await conv.send_message(
f"{name} changed to {themssg}",
- buttons=get_back_button("otvars"),
+ buttons=get_back_button("taglog"),
)
@@ -1039,3 +1072,48 @@ async def name(event):
),
buttons=get_back_button("vcb"),
)
+
+
+@callback("inli_pic")
+@owner
+async def media(event):
+ await event.delete()
+ pru = event.sender_id
+ var = "INLINE_PIC"
+ name = "Inline Media"
+ async with event.client.conversation(pru) as conv:
+ await conv.send_message(
+ "**Inline Media**\nSend me a pic/gif/ or link to set as inline media.\n\nUse /cancel to terminate the operation.",
+ )
+ response = await conv.get_response()
+ try:
+ themssg = response.message.message
+ if themssg == "/cancel":
+ return await conv.send_message(
+ "Operation cancelled!!",
+ buttons=get_back_button("setter"),
+ )
+ except BaseException:
+ pass
+ media = await event.client.download_media(response, "inlpic")
+ if (
+ not (response.text).startswith("/")
+ and not response.text == ""
+ and not response.media
+ ):
+ url = response.text
+ else:
+ try:
+ x = upl(media)
+ url = f"https://telegra.ph/{x[0]}"
+ remove(media)
+ except BaseException:
+ return await conv.send_message(
+ "Terminated.",
+ buttons=get_back_button("setter"),
+ )
+ await setit(event, var, url)
+ await conv.send_message(
+ f"{name} has been set.",
+ buttons=get_back_button("setter"),
+ )
diff --git a/assistant/ping.py b/assistant/ping.py
index 1b4bbdd..1c75b1b 100644
--- a/assistant/ping.py
+++ b/assistant/ping.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -8,7 +8,7 @@
from datetime import datetime
-@asst_cmd("ping")
+@asst_cmd("ping$")
@owner
async def _(event):
start = datetime.now()
@@ -16,5 +16,5 @@ async def _(event):
ms = (end - start).microseconds / 1000
await asst.send_message(
event.chat_id,
- f"**Pong!!**\n `{ms}ms`",
+ f"**Pong!!**\n `{ms} milliseconds`",
)
diff --git a/assistant/pmbot/banuser.py b/assistant/pmbot/banuser.py
index cc49157..987d292 100644
--- a/assistant/pmbot/banuser.py
+++ b/assistant/pmbot/banuser.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -7,8 +7,12 @@
from . import *
+
@asst_cmd("ban")
+@owner
async def banhammer(event):
+ if not event.is_private:
+ return
x = await event.get_reply_message()
if x is None:
return await event.edit("Please reply to someone to ban him.")
@@ -25,7 +29,10 @@ async def banhammer(event):
@asst_cmd("unban")
+@owner
async def banhammer(event):
+ if not event.is_private:
+ return
x = await event.get_reply_message()
if x is None:
return await event.edit("Please reply to someone to ban him.")
diff --git a/assistant/pmbot/incoming.py b/assistant/pmbot/incoming.py
index ea56e28..157a316 100644
--- a/assistant/pmbot/incoming.py
+++ b/assistant/pmbot/incoming.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
diff --git a/assistant/pmbot/outgoing.py b/assistant/pmbot/outgoing.py
index aa1b4ff..2a4e9a9 100644
--- a/assistant/pmbot/outgoing.py
+++ b/assistant/pmbot/outgoing.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -21,9 +21,15 @@ async def on_out_mssg(event):
return
who = event.sender_id
if who == OWNER_ID:
- if event.text.startswith("/"):
- return
to_user = get_who(x.id)
+ if event.text.startswith("/who"):
+ try:
+ k = await asst.get_entity(int(to_user))
+ return await event.reply(f"[{k.first_name}](tg://user?id={k.id})")
+ except BaseException:
+ return
+ elif event.text.startswith("/"):
+ return
if event.media:
if event.text:
await asst.send_file(int(to_user), event.media, caption=event.text)
diff --git a/assistant/start.py b/assistant/start.py
index 41af483..744af2f 100644
--- a/assistant/start.py
+++ b/assistant/start.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -8,8 +8,8 @@
from datetime import datetime
from pyUltroid.functions.asst_fns import *
-from pyUltroid.misc._decorators import sed
-from telethon import Button, events
+from pyUltroid.misc import owner_and_sudos
+from telethon import events
from telethon.utils import get_display_name
from plugins import *
@@ -25,21 +25,63 @@ Owner_info_msg = f"""
__Ultroid {ultroid_version}, powered by @TeamUltroid__
"""
+_settings = [
+ [
+ Button.inline("API Kᴇʏs", data="apiset"),
+ Button.inline("Pᴍ Bᴏᴛ", data="chatbot"),
+ ],
+ [
+ Button.inline("Aʟɪᴠᴇ", data="alvcstm"),
+ Button.inline("PᴍPᴇʀᴍɪᴛ", data="ppmset"),
+ ],
+ [Button.inline("Fᴇᴀᴛᴜʀᴇs", data="otvars")],
+ [Button.inline("VC Sᴏɴɢ Bᴏᴛ", data="vcb")],
+ [Button.inline("« Bᴀᴄᴋ", data="mainmenu")],
+]
-@asst_cmd("start")
-async def assistant(event):
- if event.is_group and event.sender_id in sed:
- bnn = (await asst.get_me()).username
- return await event.reply(
- "`I dont work in groups`",
- buttons=[Button.url("⚙️Sᴛᴀʀᴛ⚙️", url=f"https://t.me/{bnn}?start=set")],
- )
- else:
- if not is_added(event.sender_id) and event.sender_id not in sed:
+_start = [
+ [
+ Button.inline("Lᴀɴɢᴜᴀɢᴇ 🌐", data="lang"),
+ Button.inline("Sᴇᴛᴛɪɴɢs ⚙️", data="setter"),
+ ],
+ [
+ Button.inline("Sᴛᴀᴛs ✨", data="stat"),
+ Button.inline("Bʀᴏᴀᴅᴄᴀsᴛ 📻", data="bcast"),
+ ],
+]
+
+
+@callback("ownerinfo")
+async def own(event):
+ await event.edit(
+ Owner_info_msg,
+ buttons=[Button.inline("Close", data=f"closeit")],
+ )
+
+
+@callback("closeit")
+async def closet(lol):
+ await lol.delete()
+
+
+@asst_cmd("start ?(.*)")
+async def ultroid(event):
+ if event.is_group:
+ if str(event.sender_id) in owner_and_sudos():
+ return await event.reply(
+ "`I dont work in groups`",
+ buttons=[
+ Button.url(
+ "⚙️Sᴛᴀʀᴛ⚙️", url=f"https://t.me/{asst.me.username}?start=set"
+ )
+ ],
+ )
+ if (
+ not is_added(event.sender_id)
+ and str(event.sender_id) not in owner_and_sudos()
+ ):
add_user(event.sender_id)
ok = ""
- if event.is_private and event.sender_id in sed:
- return
u = await event.client.get_entity(event.chat_id)
if not udB.get("STARTMSG"):
if udB.get("PMBOT") == "True":
@@ -55,45 +97,20 @@ async def assistant(event):
Redis("STARTMSG").format(me=me, mention=mention),
buttons=[Button.inline("Info.", data="ownerinfo")],
)
+ else:
+ name = get_display_name(event.sender_id)
+ if event.pattern_match.group(1) == "set":
+ await event.reply(
+ "Choose from the below options -",
+ buttons=_settings,
+ )
+ else:
+ await event.reply(
+ get_string("ast_3").format(name),
+ buttons=_start,
+ )
-@callback("ownerinfo")
-async def own(event):
- await event.edit(Owner_info_msg, buttons=[Button.inline("Close", data="closeit")])
-
-
-@callback("closeit")
-async def closet(lol):
- await lol.delete()
-
-
-@asst_cmd("start ?(.*)")
-@owner
-async def ultroid(event):
- if event.pattern_match.group(1):
- return
- if event.is_group:
- return
- name = event.sender.first_name
- if event.sender.last_name:
- name += f" {event.sender.last_name}"
- await asst.send_message(
- event.chat_id,
- get_string("ast_3").format(name),
- buttons=[
- [
- Button.inline("Language 🌐", data="lang"),
- Button.inline("Sᴇᴛᴛɪɴɢs ⚙️", data="setter"),
- ],
- [
- Button.inline("Sᴛᴀᴛs ✨", data="stat"),
- Button.inline("Bʀᴏᴀᴅᴄᴀsᴛ 📻", data="bcast"),
- ],
- ],
- )
-
-
-# aah, repeat the codes..
@callback("mainmenu")
@owner
async def ultroid(event):
@@ -101,16 +118,7 @@ async def ultroid(event):
return
await event.edit(
get_string("ast_3").format(OWNER_NAME),
- buttons=[
- [
- Button.inline("Language 🌐", data="lang"),
- Button.inline("Sᴇᴛᴛɪɴɢs ⚙️", data="setter"),
- ],
- [
- Button.inline("Sᴛᴀᴛs ✨", data="stat"),
- Button.inline("Bʀᴏᴀᴅᴄᴀsᴛ 📻", data="bcast"),
- ],
- ],
+ buttons=_start,
)
@@ -166,38 +174,5 @@ Failed for {fail} user(s).""",
async def setting(event):
await event.edit(
"Choose from the below options -",
- buttons=[
- [
- Button.inline("API Kᴇʏs", data="apiset"),
- Button.inline("Pᴍ Bᴏᴛ", data="chatbot"),
- ],
- [
- Button.inline("Aʟɪᴠᴇ", data="alvcstm"),
- Button.inline("PᴍPᴇʀᴍɪᴛ", data="ppmset"),
- ],
- [Button.inline("Fᴇᴀᴛᴜʀᴇs", data="otvars")],
- [Button.inline("VC Sᴏɴɢ Bᴏᴛ", data="vcb")],
- [Button.inline("« Bᴀᴄᴋ", data="mainmenu")],
- ],
- )
-
-
-@asst_cmd("start set")
-@owner
-async def set(event):
- await event.reply(
- "Choose from the below options -",
- buttons=[
- [
- Button.inline("API Kᴇʏs", data="apiset"),
- Button.inline("Pᴍ Bᴏᴛ", data="chatbot"),
- ],
- [
- Button.inline("Aʟɪᴠᴇ", data="alvcstm"),
- Button.inline("PᴍPᴇʀᴍɪᴛ", data="ppmset"),
- ],
- [Button.inline("Fᴇᴀᴛᴜʀᴇs", data="otvars")],
- [Button.inline("VC Sᴏɴɢ Bᴏᴛ", data="vcb")],
- [Button.inline("« Bᴀᴄᴋ", data="mainmenu")],
- ],
+ buttons=_settings,
)
diff --git a/assistant/ytdl.py b/assistant/ytdl.py
index 6f6ca30..c54625d 100644
--- a/assistant/ytdl.py
+++ b/assistant/ytdl.py
@@ -6,19 +6,21 @@
# .
-import asyncio
import os
import re
import time
+from urllib.request import urlretrieve
+from numerize import numerize
from pyUltroid.functions.all import *
from telethon import Button
-from telethon.errors import UserNotParticipantError
-from telethon.tl.types import DocumentAttributeAudio
+from telethon.tl.types import DocumentAttributeAudio, DocumentAttributeVideo
from telethon.tl.types import InputWebDocument as wb
+from youtube_dl import YoutubeDL
from youtubesearchpython import VideosSearch
ytt = "https://telegra.ph/file/afd04510c13914a06dd03.jpg"
+_yt_base_url = "https://www.youtube.com/watch?v="
@in_pattern("yt")
@@ -44,9 +46,9 @@ async def _(event):
nub = search.result()
nibba = nub["result"]
for v in nibba:
- link = v["link"]
- title = v["title"]
ids = v["id"]
+ link = _yt_base_url + ids
+ title = v["title"]
duration = v["duration"]
thumb = f"https://img.youtube.com/vi/{ids}/hqdefault.jpg"
text = f"**•Tɪᴛʟᴇ•** `{title}`\n\n**••[Lɪɴᴋ]({link})••**\n\n**••Dᴜʀᴀᴛɪᴏɴ••** `{duration}`\n\n\n"
@@ -60,8 +62,8 @@ async def _(event):
include_media=True,
buttons=[
[
- Button.inline("Audio", data=f"audio{link}"),
- Button.inline("Video", data=f"video{link}"),
+ Button.inline("Audio", data=f"ytdl_audio_{ids}"),
+ Button.inline("Video", data=f"ytdl_video_{ids}"),
],
[
Button.switch_inline(
@@ -81,181 +83,120 @@ async def _(event):
await event.answer(results)
-@callback(re.compile("audio(.*)"))
+@callback(
+ re.compile(
+ "ytdl_(.*)",
+ ),
+)
@owner
-async def _(sur):
- url = sur.pattern_match.group(1).decode("UTF-8")
- sur.sender_id
- opts = {
- "format": "bestaudio",
- "addmetadata": True,
- "key": "FFmpegMetadata",
- "writethumbnail": True,
- "prefer_ffmpeg": True,
- "geo_bypass": True,
- "nocheckcertificate": True,
- "postprocessors": [
- {
- "key": "FFmpegExtractAudio",
- "preferredcodec": "mp3",
- "preferredquality": "320",
- },
- ],
- "outtmpl": "%(id)s.mp3",
- "quiet": True,
- "logtostderr": False,
- }
- song = True
- ytdl_data = await dler(sur, opts, url)
- jpg = f"{ytdl_data['id']}.mp3.jpg"
- png = f"{ytdl_data['id']}.mp3.png"
- webp = f"{ytdl_data['id']}.mp3.webp"
- dir = os.listdir()
-
- if jpg in dir:
- thumb = jpg
- elif png in dir:
- thumb = png
- elif webp in dir:
- thumb = webp
- else:
- thumb = None
-
- c_time = time.time()
- if song:
- await sur.edit(
- f"`Preparing to upload song:`\
- \n**{ytdl_data['title']}**\
- \nby *{ytdl_data['uploader']}*",
- )
- MSG = f"**{ytdl_data['title']}** Uploaded Successfully !"
- chat = sur.chat_id
- whome = ultroid_bot
- if sur.is_private and sur.sender_id != ultroid_bot.uid:
- chat = sur.sender_id
- whome = asst
- MSG += f"\nGet at {asst.me.username}"
- try:
- await whome.send_file(
- chat,
- f"{ytdl_data['id']}.mp3",
- thumb=thumb,
- caption=f"**{ytdl_data['title']}\n{time_formatter((ytdl_data['duration'])*1000)}\n{ytdl_data['uploader']}**",
- supports_streaming=True,
- attributes=[
- DocumentAttributeAudio(
- duration=int(ytdl_data["duration"]),
- title=str(ytdl_data["title"]),
- performer=str(ytdl_data["uploader"]),
- ),
- ],
- progress_callback=lambda d, t: asyncio.get_event_loop().create_task(
- progress(
- d,
- t,
- sur,
- c_time,
- "Uploading..",
- f"{ytdl_data['title']}.mp3",
- ),
- ),
- )
- except UserNotParticipantError:
- await asst.send_file(
- sur.sender_id,
- f"{ytdl_data['id']}.mp3",
- thumb=thumb,
- caption=f"**{ytdl_data['title']}\n{time_formatter((ytdl_data['duration'])*1000)}\n{ytdl_data['uploader']}**",
- supports_streaming=True,
- attributes=[
- DocumentAttributeAudio(
- duration=int(ytdl_data["duration"]),
- title=str(ytdl_data["title"]),
- performer=str(ytdl_data["uploader"]),
- ),
- ],
- )
- os.system(f"rm {ytdl_data['id']}.mp*")
- await sur.edit(
- MSG,
- buttons=Button.switch_inline("Search More", query="yt ", same_peer=True),
- )
+async def _(e):
+ _e = e.pattern_match.group(1).decode("UTF-8")
+ _lets_split = _e.split("_", maxsplit=1)
+ _ytdl_data = await dler(e, _yt_base_url + _lets_split[1])
+ _data = get_data(_lets_split[0], _ytdl_data)
+ _buttons = get_buttons(
+ "ytdownload_" + _lets_split[0] + "_" + _lets_split[1] + ":", _data
+ )
+ _text = "`Select Your Format.`"
+ if not _buttons:
+ _text = "`Error domwloading from YouTube.\nTry Restarting your bot.`"
+ await e.edit(_text, buttons=_buttons)
-@callback(re.compile("video(.*)"))
+@callback(
+ re.compile(
+ "ytdownload_(.*)",
+ ),
+)
@owner
-async def _(fuk):
- url = fuk.pattern_match.group(1).decode("UTF-8")
- fuk.sender_id
- event = fuk
- opts = {
- "format": "best",
- "addmetadata": True,
- "key": "FFmpegMetadata",
- "writethumbnail": True,
- "prefer_ffmpeg": True,
- "geo_bypass": True,
- "nocheckcertificate": True,
- "postprocessors": [{"key": "FFmpegVideoConvertor", "preferedformat": "mp4"}],
- "outtmpl": "%(id)s.mp4",
- "logtostderr": False,
- "quiet": True,
- }
- video = True
- ytdl_data = await dler(fuk, opts, url)
-
- c_time = time.time()
- if video:
- await fuk.edit(
- f"`Preparing to upload video:`\
- \n**{ytdl_data['title']}**\
- \nby *{ytdl_data['uploader']}*",
+async def _(event):
+ url = event.pattern_match.group(1).decode("UTF-8")
+ lets_split = url.split("_", maxsplit=1)
+ vid_id = lets_split[1].split(":")[0]
+ link = _yt_base_url + vid_id
+ format = url.split(":")[1]
+ if lets_split[0] == "audio":
+ opts = {
+ "format": str(format),
+ "addmetadata": True,
+ "key": "FFmpegMetadata",
+ "prefer_ffmpeg": True,
+ "geo_bypass": True,
+ "outtmpl": "%(id)s.mp3",
+ "quiet": True,
+ "logtostderr": False,
+ }
+ ytdl_data = await dler(event, link)
+ YoutubeDL(opts).download([link])
+ title = ytdl_data["title"]
+ artist = ytdl_data["uploader"]
+ views = numerize.numerize(ytdl_data["view_count"])
+ urlretrieve(f"https://i.ytimg.com/vi/{vid_id}/hqdefault.jpg", f"{title}.jpg")
+ thumb = f"{title}.jpg"
+ duration = ytdl_data["duration"]
+ os.rename(f"{ytdl_data['id']}.mp3", f"{title}.mp3")
+ c_time = time.time()
+ file = await uploader(
+ f"{title}.mp3", f"{title}.mp3", c_time, event, "Uploading " + title + "..."
)
- MSG = f"**{ytdl_data['title']}** Uploaded Successfully !"
- chat = fuk.chat_id
- whome = ultroid_bot
- if event.is_private and event.sender_id != ultroid_bot.uid:
- chat = fuk.sender_id
- whome = asst
- MSG += f"\nGet at {asst.me.username}"
+ attributes = [
+ DocumentAttributeAudio(
+ duration=int(duration),
+ title=title,
+ performer=artist,
+ ),
+ ]
+ elif lets_split[0] == "video":
+ opts = {
+ "format": str(format),
+ "addmetadata": True,
+ "key": "FFmpegMetadata",
+ "prefer_ffmpeg": True,
+ "geo_bypass": True,
+ "outtmpl": "%(id)s.mp4",
+ "logtostderr": False,
+ "quiet": True,
+ }
+ ytdl_data = await dler(event, link)
+ YoutubeDL(opts).download([link])
+ title = ytdl_data["title"]
+ artist = ytdl_data["uploader"]
+ views = numerize.numerize(ytdl_data["view_count"])
+ urlretrieve(f"https://i.ytimg.com/vi/{vid_id}/hqdefault.jpg", f"{title}.jpg")
+ thumb = f"{title}.jpg"
+ duration = ytdl_data["duration"]
try:
- await whome.send_file(
- chat,
- f"{ytdl_data['id']}.mp4",
- thumb=f"./resources/extras/ultroid.jpg",
- caption=f"**{ytdl_data['title']}\n{time_formatter((ytdl_data['duration'])*1000)}\n{ytdl_data['uploader']}**",
- supports_streaming=True,
- progress_callback=lambda d, t: asyncio.get_event_loop().create_task(
- progress(
- d,
- t,
- fuk,
- c_time,
- "Uploading..",
- f"{ytdl_data['title']}.mp4",
- ),
- ),
- )
- except UserNotParticipantError:
- await asst.send_file(
- chat,
- f"{ytdl_data['id']}.mp4",
- thumb=f"./resources/extras/ultroid.jpg",
- caption=f"**{ytdl_data['title']}\n{time_formatter((ytdl_data['duration'])*1000)}\n{ytdl_data['uploader']}**",
- supports_streaming=True,
- progress_callback=lambda d, t: asyncio.get_event_loop().create_task(
- progress(
- d,
- t,
- fuk,
- c_time,
- "Uploading..",
- f"{ytdl_data['title']}.mp4",
- ),
- ),
- )
- os.remove(f"{ytdl_data['id']}.mp4")
- await fuk.edit(
- MSG,
- buttons=Button.switch_inline("Search More", query="yt ", same_peer=True),
+ os.rename(f"{ytdl_data['id']}.mp4", f"{title}.mp4")
+ except FileNotFoundError:
+ try:
+ os.rename(f"{ytdl_data['id']}.mkv", f"{title}.mp4")
+ except FileNotFoundError:
+ os.rename(f"{ytdl_data['id']}.webm", f"{title}.mp4")
+ except Exception as ex:
+ return await event.edit(str(ex))
+ wi, _ = await bash(f'mediainfo "{title}.mp4" | grep "Width"')
+ hi, _ = await bash(f'mediainfo "{title}.mp4" | grep "Height"')
+ c_time = time.time()
+ file = await uploader(
+ f"{title}.mp4", f"{title}.mp4", c_time, event, "Uploading " + title + "..."
)
+ attributes = [
+ DocumentAttributeVideo(
+ duration=int(duration),
+ w=int(wi.split(":")[1].split()[0]),
+ h=int(hi.split(":")[1].split()[0]),
+ supports_streaming=True,
+ ),
+ ]
+ text = f"**Title:** `{title}`\n"
+ text += f"**Duration:** `{time_formatter(int(duration)*1000)}`\n"
+ text += f"**Views:** `{views}`\n"
+ text += f"**Artist:** `{artist}`"
+ await event.edit(
+ text,
+ file=file,
+ attributes=attributes,
+ thumb=thumb,
+ buttons=Button.switch_inline("Search More", query="yt ", same_peer=True),
+ )
+ os.system(f'rm "{title}"*')
diff --git a/heroku.yml b/heroku.yml
index 2c9bc4b..ce83d37 100644
--- a/heroku.yml
+++ b/heroku.yml
@@ -1,7 +1,5 @@
build:
docker:
- worker: Dockerfile
- web: Dockerfile
+ ultroid: Dockerfile
run:
- worker: bash resources/startup/startup.sh
- web: python vcstarter.py
+ ultroid: bash resources/startup/startup.sh
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 98b3f7e..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,4091 +0,0 @@
-{
- "name": "ultroid-vcbot",
- "version": "1.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "ultroid-vcbot",
- "version": "1.0.0",
- "license": "AGPL-3.0",
- "dependencies": {
- "@mapbox/node-pre-gyp": "^1.0.0",
- "@youtwitface/escape-html": "^1.0.0",
- "dotenv": "^8.2.0",
- "envalid": "^7.0.0",
- "redis": "^3.0.2",
- "telegraf": "^4.3.0",
- "tgcalls": "^0.1.2",
- "ws": "^7.4.3"
- },
- "devDependencies": {
- "@types/node": "^14.14.25",
- "@types/redis": "^2.8.28",
- "@types/ws": "^7.4.0",
- "nodemon": "^2.0.7",
- "ts-node": "^9.1.1",
- "typegram": "^3.1.9",
- "typescript": "^4.1.3"
- }
- },
- "node_modules/@mapbox/node-pre-gyp": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.1.tgz",
- "integrity": "sha512-CUBdThIZMoLEQQxACwhLsPg/puxBca0abTH3ixuvBQkhjJ80Hdp99jmVjxFCOa52/tZqN9d70IbGUf+OuKDHGA==",
- "dependencies": {
- "detect-libc": "^1.0.3",
- "http-proxy-agent": "^4.0.1",
- "make-dir": "^3.1.0",
- "node-fetch": "^2.6.1",
- "nopt": "^5.0.0",
- "npmlog": "^4.1.2",
- "rimraf": "^3.0.2",
- "semver": "^7.3.4",
- "tar": "^6.1.0"
- },
- "bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
- }
- },
- "node_modules/@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "dev": true,
- "dependencies": {
- "defer-to-connect": "^1.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@types/node": {
- "version": "14.14.35",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz",
- "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==",
- "dev": true
- },
- "node_modules/@types/redis": {
- "version": "2.8.28",
- "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.28.tgz",
- "integrity": "sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/ws": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.0.tgz",
- "integrity": "sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@youtwitface/escape-html": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@youtwitface/escape-html/-/escape-html-1.1.3.tgz",
- "integrity": "sha512-ZTE6NDvovm1S9jtzITZJvTiq4At09bDQjH4M/MNiZJq78LehIltGodCBZA5RROIE3bkQGJa9EwN37d5qgSFCfg=="
- },
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "dependencies": {
- "event-target-shim": "^5.0.0"
- },
- "engines": {
- "node": ">=6.5"
- }
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/ansi-align": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
- "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
- "dev": true,
- "dependencies": {
- "string-width": "^3.0.0"
- }
- },
- "node_modules/ansi-align/node_modules/ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-align/node_modules/is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-align/node_modules/string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-align/node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "node_modules/are-we-there-yet": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "node_modules/arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
- "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
- "dev": true,
- "dependencies": {
- "ansi-align": "^3.0.0",
- "camelcase": "^5.3.1",
- "chalk": "^3.0.0",
- "cli-boxes": "^2.2.0",
- "string-width": "^4.1.0",
- "term-size": "^2.1.0",
- "type-fest": "^0.8.1",
- "widest-line": "^3.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/boxen/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/buffer-alloc": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
- "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
- "dependencies": {
- "buffer-alloc-unsafe": "^1.1.0",
- "buffer-fill": "^1.0.0"
- }
- },
- "node_modules/buffer-alloc-unsafe": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
- "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
- },
- "node_modules/buffer-fill": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
- "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
- },
- "node_modules/buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "node_modules/cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "dev": true,
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cacheable-request/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cacheable-request/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chalk/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
- "dev": true,
- "dependencies": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.1"
- }
- },
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "node_modules/cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "dev": true,
- "dependencies": {
- "mimic-response": "^1.0.0"
- }
- },
- "node_modules/code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "node_modules/configstore": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
- "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
- "dev": true,
- "dependencies": {
- "dot-prop": "^5.2.0",
- "graceful-fs": "^4.1.2",
- "make-dir": "^3.0.0",
- "unique-string": "^2.0.0",
- "write-file-atomic": "^3.0.0",
- "xdg-basedir": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "node_modules/create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
- },
- "node_modules/crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "dev": true,
- "dependencies": {
- "mimic-response": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
- "dev": true
- },
- "node_modules/delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
- },
- "node_modules/denque": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
- "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==",
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
- "bin": {
- "detect-libc": "bin/detect-libc.js"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/domexception": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
- "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
- "optional": true,
- "dependencies": {
- "webidl-conversions": "^4.0.2"
- }
- },
- "node_modules/dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dotenv": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
- "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/envalid": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/envalid/-/envalid-7.1.0.tgz",
- "integrity": "sha512-C5rtCxfj+ozW5q79fBYKcBEf0KSNklKwZudjCzXy9ANT8Pz1MKxPBn6unZnYXXy6e+cqVgnEURQeXmdueG9/kA==",
- "engines": {
- "node": ">=8.12"
- }
- },
- "node_modules/escape-goat": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
- "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "dependencies": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/global-dirs": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz",
- "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==",
- "dev": true,
- "dependencies": {
- "ini": "1.3.7"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/global-dirs/node_modules/ini": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
- "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
- "dev": true
- },
- "node_modules/got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "dev": true,
- "dependencies": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
- "dev": true
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
- },
- "node_modules/has-yarn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
- "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
- "node_modules/http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
- "dependencies": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ignore-by-default": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
- "dev": true
- },
- "node_modules/ignore-walk": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
- "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
- "dependencies": {
- "minimatch": "^3.0.4"
- }
- },
- "node_modules/import-lazy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
- "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
- "dependencies": {
- "ci-info": "^2.0.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dependencies": {
- "number-is-nan": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-installed-globally": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
- "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
- "dev": true,
- "dependencies": {
- "global-dirs": "^2.0.1",
- "is-path-inside": "^3.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-npm": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
- "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "node_modules/is-yarn-global": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
- "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
- "dev": true
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
- "dev": true
- },
- "node_modules/keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "dev": true,
- "dependencies": {
- "json-buffer": "3.0.0"
- }
- },
- "node_modules/latest-version": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
- "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
- "dev": true,
- "dependencies": {
- "package-json": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "node_modules/minipass": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
- "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/module-alias": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz",
- "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q=="
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/needle": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
- "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
- "dependencies": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- },
- "bin": {
- "needle": "bin/needle"
- },
- "engines": {
- "node": ">= 4.4.x"
- }
- },
- "node_modules/needle/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
- "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
- "engines": {
- "node": "4.x || >=6.0.0"
- }
- },
- "node_modules/nodemon": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz",
- "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "chokidar": "^3.2.2",
- "debug": "^3.2.6",
- "ignore-by-default": "^1.0.1",
- "minimatch": "^3.0.4",
- "pstree.remy": "^1.1.7",
- "semver": "^5.7.1",
- "supports-color": "^5.5.0",
- "touch": "^3.1.0",
- "undefsafe": "^2.0.3",
- "update-notifier": "^4.1.0"
- },
- "bin": {
- "nodemon": "bin/nodemon.js"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/nodemon/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/nodemon/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-url": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
- "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm-bundled": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
- "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
- "dependencies": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "node_modules/npm-normalize-package-bin": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
- },
- "node_modules/npm-packlist": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
- "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
- "dependencies": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1",
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "node_modules/npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "dependencies": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "node_modules/number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "dependencies": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "node_modules/p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/p-timeout": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz",
- "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/package-json": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
- "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
- "dev": true,
- "dependencies": {
- "got": "^9.6.0",
- "registry-auth-token": "^4.0.0",
- "registry-url": "^5.0.0",
- "semver": "^6.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/package-json/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "node_modules/pstree.remy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/pupa": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
- "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
- "dev": true,
- "dependencies": {
- "escape-goat": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/redis": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz",
- "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==",
- "dependencies": {
- "denque": "^1.4.1",
- "redis-commands": "^1.5.0",
- "redis-errors": "^1.2.0",
- "redis-parser": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/redis-commands": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
- "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
- },
- "node_modules/redis-errors": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
- "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/redis-parser": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
- "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
- "dependencies": {
- "redis-errors": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/registry-auth-token": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
- "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
- "dev": true,
- "dependencies": {
- "rc": "^1.2.8"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/registry-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
- "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
- "dev": true,
- "dependencies": {
- "rc": "^1.2.8"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "dev": true,
- "dependencies": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/safe-compare": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz",
- "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==",
- "dependencies": {
- "buffer-alloc": "^1.2.0"
- }
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/sandwich-stream": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz",
- "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver-diff": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
- "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
- "dev": true,
- "dependencies": {
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/semver-diff/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "node_modules/signal-exit": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dependencies": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/tar": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
- "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/telegraf": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.3.0.tgz",
- "integrity": "sha512-MuDUtSMipzMzQp8fXbQx76jp4ZD70KREdnpH1idUzN9Zlgm6EzatBQFU4Ps0ipxtEmnBBdghBMumQwrjRe3eqg==",
- "dependencies": {
- "abort-controller": "^3.0.0",
- "debug": "^4.3.1",
- "minimist": "^1.2.5",
- "module-alias": "^2.2.2",
- "node-fetch": "^2.6.1",
- "p-timeout": "^4.1.0",
- "safe-compare": "^1.1.4",
- "sandwich-stream": "^2.0.2",
- "typegram": "^3.2.0"
- },
- "bin": {
- "telegraf": "bin/telegraf"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/term-size": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
- "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tgcalls": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/tgcalls/-/tgcalls-0.1.2.tgz",
- "integrity": "sha512-b4hGcMPtTWn3pNY3GhgSh+fWHRO4seeoGBuTfg5CBQkD5LlSRYYqwjpAptaYzBJDgU4pDnwp8N+sBs05PwzuSw==",
- "dependencies": {
- "wrtc": "^0.4.7"
- }
- },
- "node_modules/to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
- "dev": true,
- "dependencies": {
- "nopt": "~1.0.10"
- },
- "bin": {
- "nodetouch": "bin/nodetouch.js"
- }
- },
- "node_modules/touch/node_modules/nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
- "dev": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/ts-node": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
- "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
- "dev": true,
- "dependencies": {
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- },
- "bin": {
- "ts-node": "dist/bin.js",
- "ts-node-script": "dist/bin-script.js",
- "ts-node-transpile-only": "dist/bin-transpile.js",
- "ts-script": "dist/bin-script-deprecated.js"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
- },
- "node_modules/typegram": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/typegram/-/typegram-3.2.3.tgz",
- "integrity": "sha512-zlkY7vNTLcwQhLUyYXAUzRelzH752LBFl8m4u04d5g5P7lM9bGegeIRwzd3mVCHJH6R3s48pKeFTVSdVlN+omg=="
- },
- "node_modules/typescript": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
- "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/undefsafe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
- "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
- "dev": true,
- "dependencies": {
- "debug": "^2.2.0"
- }
- },
- "node_modules/undefsafe/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/undefsafe/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "node_modules/unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "dev": true,
- "dependencies": {
- "crypto-random-string": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/update-notifier": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
- "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
- "dev": true,
- "dependencies": {
- "boxen": "^4.2.0",
- "chalk": "^3.0.0",
- "configstore": "^5.0.1",
- "has-yarn": "^2.1.0",
- "import-lazy": "^2.1.0",
- "is-ci": "^2.0.0",
- "is-installed-globally": "^0.3.1",
- "is-npm": "^4.0.0",
- "is-yarn-global": "^0.3.0",
- "latest-version": "^5.0.0",
- "pupa": "^2.0.1",
- "semver-diff": "^3.1.1",
- "xdg-basedir": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "dev": true,
- "dependencies": {
- "prepend-http": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "node_modules/webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "optional": true
- },
- "node_modules/wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "dependencies": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "node_modules/widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/widest-line/node_modules/ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/widest-line/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/widest-line/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/widest-line/node_modules/string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/widest-line/node_modules/strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "node_modules/wrtc": {
- "version": "0.4.7",
- "resolved": "https://registry.npmjs.org/wrtc/-/wrtc-0.4.7.tgz",
- "integrity": "sha512-P6Hn7VT4lfSH49HxLHcHhDq+aFf/jd9dPY7lDHeFhZ22N3858EKuwm2jmnlPzpsRGEPaoF6XwkcxY5SYnt4f/g==",
- "hasInstallScript": true,
- "dependencies": {
- "node-pre-gyp": "^0.13.0"
- },
- "engines": {
- "node": "^8.11.2 || >=10.0.0"
- },
- "optionalDependencies": {
- "domexception": "^1.0.1"
- }
- },
- "node_modules/wrtc/node_modules/chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "node_modules/wrtc/node_modules/fs-minipass": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
- "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
- "dependencies": {
- "minipass": "^2.6.0"
- }
- },
- "node_modules/wrtc/node_modules/minipass": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
- "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
- "dependencies": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "node_modules/wrtc/node_modules/minizlib": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
- "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
- "dependencies": {
- "minipass": "^2.9.0"
- }
- },
- "node_modules/wrtc/node_modules/mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dependencies": {
- "minimist": "^1.2.5"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/wrtc/node_modules/node-pre-gyp": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz",
- "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==",
- "dependencies": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- },
- "bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
- }
- },
- "node_modules/wrtc/node_modules/nopt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
- "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
- "dependencies": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/wrtc/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/wrtc/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/wrtc/node_modules/tar": {
- "version": "4.4.13",
- "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
- "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
- "dependencies": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- },
- "engines": {
- "node": ">=4.5"
- }
- },
- "node_modules/wrtc/node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- },
- "node_modules/ws": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
- "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
- "engines": {
- "node": ">=8.3.0"
- }
- },
- "node_modules/xdg-basedir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
- "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- }
- },
- "dependencies": {
- "@mapbox/node-pre-gyp": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.1.tgz",
- "integrity": "sha512-CUBdThIZMoLEQQxACwhLsPg/puxBca0abTH3ixuvBQkhjJ80Hdp99jmVjxFCOa52/tZqN9d70IbGUf+OuKDHGA==",
- "requires": {
- "detect-libc": "^1.0.3",
- "http-proxy-agent": "^4.0.1",
- "make-dir": "^3.1.0",
- "node-fetch": "^2.6.1",
- "nopt": "^5.0.0",
- "npmlog": "^4.1.2",
- "rimraf": "^3.0.2",
- "semver": "^7.3.4",
- "tar": "^6.1.0"
- }
- },
- "@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "dev": true
- },
- "@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "dev": true,
- "requires": {
- "defer-to-connect": "^1.0.1"
- }
- },
- "@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
- },
- "@types/node": {
- "version": "14.14.35",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz",
- "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==",
- "dev": true
- },
- "@types/redis": {
- "version": "2.8.28",
- "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.28.tgz",
- "integrity": "sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/ws": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.0.tgz",
- "integrity": "sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@youtwitface/escape-html": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@youtwitface/escape-html/-/escape-html-1.1.3.tgz",
- "integrity": "sha512-ZTE6NDvovm1S9jtzITZJvTiq4At09bDQjH4M/MNiZJq78LehIltGodCBZA5RROIE3bkQGJa9EwN37d5qgSFCfg=="
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "requires": {
- "event-target-shim": "^5.0.0"
- }
- },
- "agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "requires": {
- "debug": "4"
- }
- },
- "ansi-align": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
- "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
- "dev": true,
- "requires": {
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "boxen": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
- "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
- "dev": true,
- "requires": {
- "ansi-align": "^3.0.0",
- "camelcase": "^5.3.1",
- "chalk": "^3.0.0",
- "cli-boxes": "^2.2.0",
- "string-width": "^4.1.0",
- "term-size": "^2.1.0",
- "type-fest": "^0.8.1",
- "widest-line": "^3.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "buffer-alloc": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
- "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
- "requires": {
- "buffer-alloc-unsafe": "^1.1.0",
- "buffer-fill": "^1.0.0"
- }
- },
- "buffer-alloc-unsafe": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
- "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
- },
- "buffer-fill": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
- "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "dev": true,
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "dependencies": {
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true
- }
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.3.1",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
- }
- },
- "chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
- },
- "ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true
- },
- "clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "dev": true,
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "configstore": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
- "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
- "dev": true,
- "requires": {
- "dot-prop": "^5.2.0",
- "graceful-fs": "^4.1.2",
- "make-dir": "^3.0.0",
- "unique-string": "^2.0.0",
- "write-file-atomic": "^3.0.0",
- "xdg-basedir": "^4.0.0"
- }
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
- },
- "crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "dev": true
- },
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "dev": true,
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
- },
- "defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
- "dev": true
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
- },
- "denque": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
- "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ=="
- },
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "domexception": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
- "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
- "optional": true,
- "requires": {
- "webidl-conversions": "^4.0.2"
- }
- },
- "dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "requires": {
- "is-obj": "^2.0.0"
- }
- },
- "dotenv": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
- "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
- "dev": true
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- },
- "envalid": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/envalid/-/envalid-7.1.0.tgz",
- "integrity": "sha512-C5rtCxfj+ozW5q79fBYKcBEf0KSNklKwZudjCzXy9ANT8Pz1MKxPBn6unZnYXXy6e+cqVgnEURQeXmdueG9/kA=="
- },
- "escape-goat": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
- "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
- "dev": true
- },
- "event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "global-dirs": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz",
- "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==",
- "dev": true,
- "requires": {
- "ini": "1.3.7"
- },
- "dependencies": {
- "ini": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
- "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
- "dev": true
- }
- }
- },
- "got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "dev": true,
- "requires": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
- },
- "has-yarn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
- "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
- "dev": true
- },
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
- "http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
- "requires": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-by-default": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
- "dev": true
- },
- "ignore-walk": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
- "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "import-lazy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
- "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
- "dev": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
- "requires": {
- "ci-info": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-installed-globally": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
- "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
- "dev": true,
- "requires": {
- "global-dirs": "^2.0.1",
- "is-path-inside": "^3.0.1"
- }
- },
- "is-npm": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
- "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true
- },
- "is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-yarn-global": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
- "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
- "dev": true
- },
- "keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "dev": true,
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "latest-version": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
- "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
- "dev": true,
- "requires": {
- "package-json": "^6.3.0"
- }
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "requires": {
- "semver": "^6.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "dev": true
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "minipass": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
- "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "requires": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
- },
- "module-alias": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz",
- "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q=="
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "needle": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
- "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
- "requires": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "node-fetch": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
- "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
- },
- "nodemon": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz",
- "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==",
- "dev": true,
- "requires": {
- "chokidar": "^3.2.2",
- "debug": "^3.2.6",
- "ignore-by-default": "^1.0.1",
- "minimatch": "^3.0.4",
- "pstree.remy": "^1.1.7",
- "semver": "^5.7.1",
- "supports-color": "^5.5.0",
- "touch": "^3.1.0",
- "undefsafe": "^2.0.3",
- "update-notifier": "^4.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
- }
- },
- "nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "normalize-url": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
- "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
- "dev": true
- },
- "npm-bundled": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
- "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
- "requires": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npm-normalize-package-bin": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
- },
- "npm-packlist": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
- "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1",
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "dev": true
- },
- "p-timeout": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz",
- "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw=="
- },
- "package-json": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
- "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
- "dev": true,
- "requires": {
- "got": "^9.6.0",
- "registry-auth-token": "^4.0.0",
- "registry-url": "^5.0.0",
- "semver": "^6.2.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
- },
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "pstree.remy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "pupa": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
- "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
- "dev": true,
- "requires": {
- "escape-goat": "^2.0.0"
- }
- },
- "rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "redis": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz",
- "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==",
- "requires": {
- "denque": "^1.4.1",
- "redis-commands": "^1.5.0",
- "redis-errors": "^1.2.0",
- "redis-parser": "^3.0.0"
- }
- },
- "redis-commands": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
- "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
- },
- "redis-errors": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
- "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60="
- },
- "redis-parser": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
- "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
- "requires": {
- "redis-errors": "^1.0.0"
- }
- },
- "registry-auth-token": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
- "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
- "dev": true,
- "requires": {
- "rc": "^1.2.8"
- }
- },
- "registry-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
- "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
- "dev": true,
- "requires": {
- "rc": "^1.2.8"
- }
- },
- "responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "dev": true,
- "requires": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safe-compare": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz",
- "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==",
- "requires": {
- "buffer-alloc": "^1.2.0"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "sandwich-stream": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz",
- "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ=="
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "semver-diff": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
- "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
- "dev": true,
- "requires": {
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "signal-exit": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "tar": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
- "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
- "requires": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- }
- },
- "telegraf": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.3.0.tgz",
- "integrity": "sha512-MuDUtSMipzMzQp8fXbQx76jp4ZD70KREdnpH1idUzN9Zlgm6EzatBQFU4Ps0ipxtEmnBBdghBMumQwrjRe3eqg==",
- "requires": {
- "abort-controller": "^3.0.0",
- "debug": "^4.3.1",
- "minimist": "^1.2.5",
- "module-alias": "^2.2.2",
- "node-fetch": "^2.6.1",
- "p-timeout": "^4.1.0",
- "safe-compare": "^1.1.4",
- "sandwich-stream": "^2.0.2",
- "typegram": "^3.2.0"
- }
- },
- "term-size": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
- "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
- "dev": true
- },
- "tgcalls": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/tgcalls/-/tgcalls-0.1.2.tgz",
- "integrity": "sha512-b4hGcMPtTWn3pNY3GhgSh+fWHRO4seeoGBuTfg5CBQkD5LlSRYYqwjpAptaYzBJDgU4pDnwp8N+sBs05PwzuSw==",
- "requires": {
- "wrtc": "^0.4.7"
- }
- },
- "to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
- "dev": true
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
- "dev": true,
- "requires": {
- "nopt": "~1.0.10"
- },
- "dependencies": {
- "nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- }
- }
- },
- "ts-node": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
- "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
- "dev": true,
- "requires": {
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "typegram": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/typegram/-/typegram-3.2.3.tgz",
- "integrity": "sha512-zlkY7vNTLcwQhLUyYXAUzRelzH752LBFl8m4u04d5g5P7lM9bGegeIRwzd3mVCHJH6R3s48pKeFTVSdVlN+omg=="
- },
- "typescript": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
- "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
- "dev": true
- },
- "undefsafe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
- "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
- "dev": true,
- "requires": {
- "debug": "^2.2.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "dev": true,
- "requires": {
- "crypto-random-string": "^2.0.0"
- }
- },
- "update-notifier": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
- "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
- "dev": true,
- "requires": {
- "boxen": "^4.2.0",
- "chalk": "^3.0.0",
- "configstore": "^5.0.1",
- "has-yarn": "^2.1.0",
- "import-lazy": "^2.1.0",
- "is-ci": "^2.0.0",
- "is-installed-globally": "^0.3.1",
- "is-npm": "^4.0.0",
- "is-yarn-global": "^0.3.0",
- "latest-version": "^5.0.0",
- "pupa": "^2.0.1",
- "semver-diff": "^3.1.1",
- "xdg-basedir": "^4.0.0"
- }
- },
- "url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "dev": true,
- "requires": {
- "prepend-http": "^2.0.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "optional": true
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "requires": {
- "string-width": "^4.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "wrtc": {
- "version": "0.4.7",
- "resolved": "https://registry.npmjs.org/wrtc/-/wrtc-0.4.7.tgz",
- "integrity": "sha512-P6Hn7VT4lfSH49HxLHcHhDq+aFf/jd9dPY7lDHeFhZ22N3858EKuwm2jmnlPzpsRGEPaoF6XwkcxY5SYnt4f/g==",
- "requires": {
- "domexception": "^1.0.1",
- "node-pre-gyp": "^0.13.0"
- },
- "dependencies": {
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "fs-minipass": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
- "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
- "requires": {
- "minipass": "^2.6.0"
- }
- },
- "minipass": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
- "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
- "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
- "requires": {
- "minipass": "^2.9.0"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "node-pre-gyp": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz",
- "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==",
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- }
- },
- "nopt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
- "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- },
- "tar": {
- "version": "4.4.13",
- "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
- "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- }
- }
- },
- "ws": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
- "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw=="
- },
- "xdg-basedir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
- "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
- "dev": true
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true
- }
- }
-}
diff --git a/package.json b/package.json
index 2043dd3..b75a025 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
"redis": "^3.0.2",
"telegraf": "^4.3.0",
"tgcalls": "^0.1.2",
- "ws": "^7.4.3"
+ "ws": "^7.4.6"
},
"devDependencies": {
"@types/node": "^14.14.25",
diff --git a/plugins/__init__.py b/plugins/__init__.py
index 11658d8..da97728 100644
--- a/plugins/__init__.py
+++ b/plugins/__init__.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -10,14 +10,14 @@ import time
from pyUltroid.dB import *
from pyUltroid.dB.core import *
from pyUltroid.functions.all import *
+from pyUltroid.functions.asstcmd_db import *
from pyUltroid.functions.broadcast_db import *
from pyUltroid.functions.gban_mute_db import *
-from pyUltroid.functions.goodbye_db import *
-from pyUltroid.functions.google_image import googleimagesdownload
+from pyUltroid.functions.nsfw_db import *
from pyUltroid.functions.sudos import *
-from pyUltroid.functions.welcome_db import *
-from pyUltroid.functions.ytdl import *
from pyUltroid.utils import *
+from telethon import Button
+from telethon.tl import functions, types
from strings import get_string
@@ -30,7 +30,7 @@ except ModuleNotFoundError:
start_time = time.time()
-ultroid_version = "v0.0.7.2"
+ultroid_version = "v0.0.8"
OWNER_NAME = ultroid_bot.me.first_name
OWNER_ID = ultroid_bot.me.id
@@ -43,7 +43,7 @@ def grt(seconds: int) -> str:
count = 0
up_time = ""
time_list = []
- time_suffix_list = ["s", "m", "h", "days"]
+ time_suffix_list = ["s", "m", "h", "d"]
while count < 4:
count += 1
@@ -67,6 +67,283 @@ def grt(seconds: int) -> str:
return up_time
+_default = [
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z",
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+]
+
+
+_small_caps = [
+ "ᴀ",
+ "ʙ",
+ "ᴄ",
+ "ᴅ",
+ "ᴇ",
+ "ғ",
+ "ɢ",
+ "ʜ",
+ "ɪ",
+ "ᴊ",
+ "ᴋ",
+ "ʟ",
+ "ᴍ",
+ "ɴ",
+ "ᴏ",
+ "ᴘ",
+ "ϙ",
+ "ʀ",
+ "s",
+ "ᴛ",
+ "ᴜ",
+ "ᴠ",
+ "ᴡ",
+ "x",
+ "ʏ",
+ "ᴢ",
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+]
+
+_monospace = [
+ "𝚊",
+ "𝚋",
+ "𝚌",
+ "𝚍",
+ "𝚎",
+ "𝚏",
+ "𝚐",
+ "𝚑",
+ "𝚒",
+ "𝚓",
+ "𝚔",
+ "𝚕",
+ "𝚖",
+ "𝚗",
+ "𝚘",
+ "𝚙",
+ "𝚚",
+ "𝚛",
+ "𝚜",
+ "𝚝",
+ "𝚞",
+ "𝚟",
+ "𝚠",
+ "𝚡",
+ "𝚢",
+ "𝚣",
+ "𝙰",
+ "𝙱",
+ "𝙲",
+ "𝙳",
+ "𝙴",
+ "𝙵",
+ "𝙶",
+ "𝙷",
+ "𝙸",
+ "𝙹",
+ "𝙺",
+ "𝙻",
+ "𝙼",
+ "𝙽",
+ "𝙾",
+ "𝙿",
+ "𝚀",
+ "𝚁",
+ "𝚂",
+ "𝚃",
+ "𝚄",
+ "𝚅",
+ "𝚆",
+ "𝚇",
+ "𝚈",
+ "𝚉",
+]
+
+_double_stroke = [
+ "𝕒",
+ "𝕓",
+ "𝕔",
+ "𝕕",
+ "𝕖",
+ "𝕗",
+ "𝕘",
+ "𝕙",
+ "𝕚",
+ "𝕛",
+ "𝕜",
+ "𝕝",
+ "𝕞",
+ "𝕟",
+ "𝕠",
+ "𝕡",
+ "𝕢",
+ "𝕣",
+ "𝕤",
+ "𝕥",
+ "𝕦",
+ "𝕧",
+ "𝕨",
+ "𝕩",
+ "𝕪",
+ "𝕫",
+ "𝔸",
+ "𝔹",
+ "ℂ",
+ "𝔻",
+ "𝔼",
+ "𝔽",
+ "𝔾",
+ "ℍ",
+ "𝕀",
+ "𝕁",
+ "𝕂",
+ "𝕃",
+ "𝕄",
+ "ℕ",
+ "𝕆",
+ "ℙ",
+ "ℚ",
+ "ℝ",
+ "𝕊",
+ "𝕋",
+ "𝕌",
+ "𝕍",
+ "𝕎",
+ "𝕏",
+ "𝕐",
+ "ℤ",
+]
+
+_script_royal = [
+ "𝒶",
+ "𝒷",
+ "𝒸",
+ "𝒹",
+ "𝑒",
+ "𝒻",
+ "𝑔",
+ "𝒽",
+ "𝒾",
+ "𝒿",
+ "𝓀",
+ "𝓁",
+ "𝓂",
+ "𝓃",
+ "𝑜",
+ "𝓅",
+ "𝓆",
+ "𝓇",
+ "𝓈",
+ "𝓉",
+ "𝓊",
+ "𝓋",
+ "𝓌",
+ "𝓍",
+ "𝓎",
+ "𝓏",
+ "𝒜",
+ "ℬ",
+ "𝒞",
+ "𝒟",
+ "ℰ",
+ "ℱ",
+ "𝒢",
+ "ℋ",
+ "ℐ",
+ "𝒥",
+ "𝒦",
+ "ℒ",
+ "ℳ",
+ "𝒩",
+ "𝒪",
+ "𝒫",
+ "𝒬",
+ "ℛ",
+ "𝒮",
+ "𝒯",
+ "𝒰",
+ "𝒱",
+ "𝒲",
+ "𝒳",
+ "𝒴",
+ "𝒵",
+]
+
+
KANGING_STR = [
"Using Witchery to kang this sticker...",
"Plagiarising hehe...",
diff --git a/plugins/_help.py b/plugins/_help.py
index 8dd88d6..e15dafd 100644
--- a/plugins/_help.py
+++ b/plugins/_help.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
diff --git a/plugins/_inline.py b/plugins/_inline.py
index 44550e8..2a0cee2 100644
--- a/plugins/_inline.py
+++ b/plugins/_inline.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -10,19 +10,18 @@ import time
from datetime import datetime
from math import ceil
from os import remove
-from platform import python_version as PyVer
from git import Repo
-from pyUltroid import __version__ as UltVer
+from pyUltroid.misc import owner_and_sudos
from support import *
-from telethon import Button, __version__
-from telethon.tl.types import InputWebDocument
+from telethon.tl.types import InputBotInlineResult, InputWebDocument
from . import *
# ================================================#
notmine = f"This bot is for {OWNER_NAME}"
-ULTROID_PIC = "https://telegra.ph/file/115f149ed8e154641708b.jpg"
+
+TLINK = "https://telegra.ph/file/d9c9bc13647fa1d96e764.jpg"
helps = get_string("inline_1")
add_ons = udB.get("ADDONS")
@@ -30,49 +29,74 @@ if add_ons == "True" or add_ons is None:
zhelps = get_string("inline_2")
else:
zhelps = get_string("inline_3")
-if udB.get("INLINE_PIC"):
- _file_to_replace = udB.get("INLINE_PIC")
+
+C_PIC = udB.get("INLINE_PIC")
+
+if C_PIC:
+ _file_to_replace = C_PIC
+ TLINK = C_PIC
else:
_file_to_replace = "resources/extras/inline.jpg"
# ============================================#
+# --------------------BUTTONS--------------------#
+
+_main_help_menu = [
+ [
+ Button.inline("• Pʟᴜɢɪɴs", data="hrrrr"),
+ Button.inline("• Aᴅᴅᴏɴs", data="frrr"),
+ ],
+ [
+ Button.inline("Oᴡɴᴇʀ•ᴛᴏᴏʟꜱ", data="ownr"),
+ Button.inline("Iɴʟɪɴᴇ•Pʟᴜɢɪɴs", data="inlone"),
+ ],
+ [
+ Button.url("⚙️Sᴇᴛᴛɪɴɢs⚙️", url=f"https://t.me/{asst.me.username}?start=set"),
+ ],
+ [Button.inline("••Cʟᴏꜱᴇ••", data="close")],
+]
+
+SUP_BUTTONS = [
+ [
+ Button.url("Repo", url="https://github.com/TeamUltroid/Ultroid"),
+ Button.url("Addons", url="https://github.com/TeamUltroid/UltroidAddons"),
+ ],
+ [Button.url("Support", url="t.me/UltroidSupport")],
+]
+
+# --------------------BUTTONS--------------------#
+
+
@in_pattern("")
@in_owner
-async def e(o):
+async def inline_alive(o):
if len(o.text) == 0:
b = o.builder
+ MSG = "• **Ultroid Userbot •**"
uptime = grt(time.time() - start_time)
- header = udB.get("ALIVE_TEXT") if udB.get("ALIVE_TEXT") else "Hey, I am alive."
- ALIVEMSG = get_string("alive_1").format(
- header,
- OWNER_NAME,
- ultroid_version,
- UltVer,
- uptime,
- PyVer(),
- __version__,
- Repo().active_branch,
+ MSG += f"\n\n• **Uptime** - `{uptime}`\n"
+ MSG += f"• **OWNER** - `{OWNER_NAME}`"
+ WEB0 = InputWebDocument(
+ "https://telegra.ph/file/55dd0f381c70e72557cb1.jpg", 0, "image/jpg", []
)
- res = [
- await b.article(
+ RES = [
+ InputBotInlineResult(
+ str(o.id),
+ "photo",
+ send_message=await b._message(
+ text=MSG,
+ media=True,
+ buttons=SUP_BUTTONS,
+ ),
title="Ultroid Userbot",
- url="https://t.me/TeamUltroid",
- description="Userbot | Telethon ",
- text=ALIVEMSG,
- thumb=InputWebDocument(ULTROID_PIC, 0, "image/jpeg", []),
- buttons=[
- [Button.url(text="Support Group", url="t.me/UltroidSupport")],
- [
- Button.url(
- text="Repo",
- url="https://github.com/Teamultroid/Ultroid",
- ),
- ],
- ],
- ),
+ description="Userbot | Telethon",
+ url=TLINK,
+ thumb=WEB0,
+ content=InputWebDocument(TLINK, 0, "image/jpg", []),
+ )
]
- await o.answer(res, switch_pm=f"👥 ULTROID PORTAL", switch_pm_param="start")
+ await o.answer(RES, switch_pm=f"👥 ULTROID PORTAL", switch_pm_param="start")
@in_pattern("ultd")
@@ -82,8 +106,6 @@ async def inline_handler(event):
for x in LIST.values():
for y in x:
z.append(y)
- cmd = len(z)
- bnn = asst.me.username
result = event.builder.photo(
file=_file_to_replace,
link_preview=False,
@@ -91,24 +113,11 @@ async def inline_handler(event):
OWNER_NAME,
len(PLUGINS),
len(ADDONS),
- cmd,
+ len(z),
),
- buttons=[
- [
- Button.inline("• Pʟᴜɢɪɴs", data="hrrrr"),
- Button.inline("• Aᴅᴅᴏɴs", data="frrr"),
- ],
- [
- Button.inline("Oᴡɴᴇʀ•ᴛᴏᴏʟꜱ", data="ownr"),
- Button.inline("Iɴʟɪɴᴇ•Pʟᴜɢɪɴs", data="inlone"),
- ],
- [
- Button.url("⚙️Sᴇᴛᴛɪɴɢs⚙️", url=f"https://t.me/{bnn}?start=set"),
- ],
- [Button.inline("••Cʟᴏꜱᴇ••", data="close")],
- ],
+ buttons=_main_help_menu,
)
- await event.answer([result])
+ await event.answer([result], gallery=True)
@in_pattern("paste")
@@ -129,6 +138,24 @@ async def _(event):
await event.answer([result])
+@in_pattern("dog")
+@in_owner
+async def _(event):
+ ok = event.text.split(" ")[1]
+ link = "https://del.dog/"
+ result = event.builder.article(
+ title="Paste",
+ text="Pᴀsᴛᴇᴅ Tᴏ Dᴏɢʙɪɴ!",
+ buttons=[
+ [
+ Button.url("DogBin", url=f"{link}{ok}"),
+ Button.url("Raw", url=f"{link}raw/{ok}"),
+ ],
+ ],
+ )
+ await event.answer([result])
+
+
@callback("ownr")
@owner
async def setting(event):
@@ -202,8 +229,8 @@ async def _(event):
async def _(event):
start = datetime.now()
end = datetime.now()
- ms = (end - start).microseconds / 1000
- pin = f"🌋Pɪɴɢ = {ms}ms"
+ ms = (end - start).microseconds
+ pin = f"🌋Pɪɴɢ = {ms} microseconds"
await event.answer(pin, cache_time=0, alert=True)
@@ -256,8 +283,8 @@ async def _(e):
],
[
Button.switch_inline(
- "CʟɪᴘAʀᴛ Sᴇᴀʀᴄʜ",
- query="clipart frog",
+ "EBᴏᴏᴋs Uᴘʟᴏᴀᴅᴇʀ",
+ query="ebooks India",
same_peer=True,
),
Button.switch_inline(
@@ -384,37 +411,18 @@ async def backr(event):
@callback("open")
@owner
async def opner(event):
- bnn = asst.me.username
- buttons = [
- [
- Button.inline("• Pʟᴜɢɪɴs ", data="hrrrr"),
- Button.inline("• Aᴅᴅᴏɴs", data="frrr"),
- ],
- [
- Button.inline("Oᴡɴᴇʀ•Tᴏᴏʟꜱ", data="ownr"),
- Button.inline("Iɴʟɪɴᴇ•Pʟᴜɢɪɴs", data="inlone"),
- ],
- [
- Button.url(
- "⚙️Sᴇᴛᴛɪɴɢs⚙️",
- url=f"https://t.me/{bnn}?start={ultroid_bot.me.id}",
- ),
- ],
- [Button.inline("••Cʟᴏꜱᴇ••", data="close")],
- ]
z = []
for x in LIST.values():
for y in x:
z.append(y)
- cmd = len(z) + 10
await event.edit(
get_string("inline_4").format(
OWNER_NAME,
len(PLUGINS),
len(ADDONS),
- cmd,
+ len(z),
),
- buttons=buttons,
+ buttons=_main_help_menu,
link_preview=False,
)
@@ -425,7 +433,7 @@ async def on_plug_in_callback_query_handler(event):
await event.edit(
get_string("inline_5"),
file=_file_to_replace,
- buttons=Button.inline("Oᴘᴇɴ Mᴀɪɴ Mᴇɴᴜ Aɢᴀɪɴ", data="open"),
+ buttons=Button.inline("Oᴘᴇɴ Aɢᴀɪɴ", data="open"),
)
@@ -461,7 +469,7 @@ async def on_plug_in_callback_query_handler(event):
],
]
try:
- if event.query.user_id in sed:
+ if str(event.query.user_id) in owner_and_sudos():
await event.edit(
reply_pop_up_alert,
buttons=buttons,
@@ -520,7 +528,7 @@ async def on_plug_in_callback_query_handler(event):
],
]
try:
- if event.query.user_id in sed:
+ if str(event.query.user_id) in owner_and_sudos():
await event.edit(
reply_pop_up_alert,
buttons=buttons,
diff --git a/plugins/_ultroid.py b/plugins/_ultroid.py
index d266299..17f36c9 100644
--- a/plugins/_ultroid.py
+++ b/plugins/_ultroid.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
diff --git a/plugins/_userlogs.py b/plugins/_userlogs.py
index 0f377bc..26ecaa0 100644
--- a/plugins/_userlogs.py
+++ b/plugins/_userlogs.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -107,7 +107,11 @@ async def _(e):
async def when_asst_added_to_chat(event):
if event.user_added:
user = await event.get_user()
- chat = (await event.get_chat()).title
+ chat = await event.get_chat()
+ if chat.username:
+ chat = f"[{chat.title}](https://t.me/{chat.username}/{event.action_message.id})"
+ else:
+ chat = f"[{chat.title}](https://t.me/c/{chat.id}/{event.action_message.id})"
tmp = event.added_by
if user.is_self:
buttons = Button.inline("Leave Chat", data=f"leave_ch_{event.chat_id}|bot")
@@ -125,7 +129,11 @@ async def when_asst_added_to_chat(event):
async def when_ultd_added_to_chat(event):
if event.user_added:
user = await event.get_user()
- chat = (await event.get_chat()).title
+ chat = await event.get_chat()
+ if chat.username:
+ chat = f"[{chat.title}](https://t.me/{chat.username}/{event.action_message.id})"
+ else:
+ chat = f"[{chat.title}](https://t.me/c/{chat.id}/{event.action_message.id})"
tmp = event.added_by
if user.is_self:
buttons = Button.inline("Leave Chat", data=f"leave_ch_{event.chat_id}|user")
@@ -136,7 +144,11 @@ async def when_ultd_added_to_chat(event):
)
elif event.user_joined:
user = await event.get_user()
- chat = (await event.get_chat()).title
+ chat = await event.get_chat()
+ if chat.username:
+ chat = f"[{chat.title}](https://t.me/{chat.username}/{event.action_message.id})"
+ else:
+ chat = f"[{chat.title}](https://t.me/c/{chat.id}/{event.action_message.id})"
if user.is_self:
buttons = Button.inline("Leave Chat", data=f"leave_ch_{event.chat_id}|user")
return await asst.send_message(
diff --git a/plugins/_wspr.py b/plugins/_wspr.py
index 0b71e32..2a4d1e0 100644
--- a/plugins/_wspr.py
+++ b/plugins/_wspr.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -22,7 +22,7 @@ from telethon.tl.types import UserStatusRecently as rec
from . import *
snap = {}
-buddhhu = []
+buddhhu = {}
@ultroid_cmd(
@@ -32,8 +32,7 @@ async def _(e):
if e.reply_to_msg_id:
okk = (await e.get_reply_message()).sender_id
try:
- zyx = await ultroid_bot(gu(id=okk))
- put = zyx.user.username
+ put = okk
except ValueError as ex:
return await eor(e, str(ex))
except AttributeError:
@@ -57,16 +56,19 @@ async def _(e):
@in_pattern("msg")
+@in_owner
async def _(e):
vvv = e.text
zzz = vvv.split(" ", maxsplit=1)
try:
ggg = zzz[1]
sed = ggg.split(" wspr ", maxsplit=1)
- query = sed[0]
+ query = sed[0].replace(" ", "")
+ if query.isdigit():
+ query = int(query)
except IndexError:
return
- meme = e.query.user_id
+ iuser = e.query.user_id
try:
desc = sed[1]
except IndexError:
@@ -77,6 +79,7 @@ async def _(e):
name = logi.user.first_name
ids = logi.user.id
username = logi.user.username
+ mention = f"[{name}](tg://user?id={ids})"
x = logi.user.status
bio = logi.about
if isinstance(x, on):
@@ -93,11 +96,16 @@ async def _(e):
status = "Can't Tell"
text = f"**Name:** `{name}`\n"
text += f"**Id:** `{ids}`\n"
- text += f"**Username:** `{username}`\n"
+ if username:
+ text += f"**Username:** `{username}`\n"
+ url = f"https://t.me/{username}"
+ else:
+ text += f"**Mention:** `{mention}`\n"
+ url = f"tg://user?id={ids}"
text += f"**Status:** `{status}`\n"
text += f"**About:** `{bio}`"
button = [
- Button.url("Private", url=f"t.me/{username}"),
+ Button.url("Private", url=url),
Button.switch_inline(
"Secret msg",
query=f"msg {query} wspr Hello 👋",
@@ -120,8 +128,8 @@ async def _(e):
try:
logi = await ultroid_bot.get_entity(query)
button = [
- Button.inline("Secret Msg", data=f"dd_{logi.id}"),
- Button.inline("Delete Msg", data=f"del"),
+ Button.inline("Secret Msg", data=f"dd_{e.id}"),
+ Button.inline("Delete Msg", data=f"del_{e.id}"),
]
us = logi.username
sur = e.builder.article(
@@ -130,9 +138,8 @@ async def _(e):
text=get_string("wspr_1").format(us),
buttons=button,
)
- buddhhu.append(meme)
- buddhhu.append(logi.id)
- snap.update({logi.id: desc})
+ buddhhu.update({e.id: [logi.id, iuser]})
+ snap.update({e.id: desc})
except ValueError:
sur = e.builder.article(
title="Type ur msg",
@@ -148,21 +155,22 @@ async def _(e):
)
async def _(e):
ids = int(e.pattern_match.group(1).decode("UTF-8"))
- if e.sender_id in buddhhu:
- await e.answer(snap[ids], alert=True)
+ if buddhhu.get(ids):
+ if e.sender_id in buddhhu[ids]:
+ await e.answer(snap[ids], alert=True)
+ else:
+ await e.answer("Not For You", alert=True)
else:
- await e.answer("Not For You", alert=True)
+ await e.answer("Message Deleted", alert=True)
-@callback("del")
+@callback(re.compile("del_(.*)"))
async def _(e):
- if e.sender_id in buddhhu:
- for k in buddhhu:
- try:
- del snap[k]
- buddhhu.clear()
- except KeyError:
- pass
+ ids = int(e.pattern_match.group(1).decode("UTF-8"))
+ if buddhhu.get(ids):
+ if e.sender_id in buddhhu[ids]:
+ buddhhu.pop(ids)
+ snap.pop(ids)
try:
await e.edit(get_string("wspr_2"))
except np:
diff --git a/plugins/admintools.py b/plugins/admintools.py
index 152f667..1442049 100644
--- a/plugins/admintools.py
+++ b/plugins/admintools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -50,6 +50,7 @@ import asyncio
from telethon.errors import BadRequestError
from telethon.errors.rpcerrorlist import ChatNotModifiedError, UserIdInvalidError
from telethon.tl.functions.channels import DeleteUserHistoryRequest, EditAdminRequest
+from telethon.tl.functions.channels import ExportMessageLinkRequest as ExpLink
from telethon.tl.functions.messages import SetHistoryTTLRequest
from telethon.tl.types import ChatAdminRights, InputMessagesFilterPinned
@@ -236,10 +237,7 @@ async def kck(ult):
pattern="pin ?(.*)",
)
async def pin(msg):
- if not msg.is_private:
- # for pin(s) in private messages
- await msg.get_chat()
- cht = await ultroid_bot.get_entity(msg.chat_id)
+ mss = "`Pinned.`"
xx = msg.reply_to_msg_id
tt = msg.text
try:
@@ -250,22 +248,24 @@ async def pin(msg):
pass
if not msg.is_reply:
return
+ if not msg.is_private:
+ link = (await ultroid_bot(ExpLink(msg.chat_id, xx))).link
+ mss = f"`Pinned` [This Message]({link})"
ch = msg.pattern_match.group(1)
if ch != "silent":
slnt = True
- x = await eor(msg, get_string("com_1"))
try:
await ultroid_bot.pin_message(msg.chat_id, xx, notify=slnt)
except BadRequestError:
- return await x.edit("`Hmm, I'm have no rights here...`")
+ return await eor(msg, "`Hmm.. Guess I have no rights here!`")
except Exception as e:
- return await x.edit(f"**ERROR:**`{str(e)}`")
- await x.edit(f"`Pinned` [this message](https://t.me/c/{cht.id}/{xx})!")
+ return await eor(msg, f"**ERROR:**`{str(e)}`")
+ await eor(msg, mss)
else:
try:
await ultroid_bot.pin_message(msg.chat_id, xx, notify=False)
except BadRequestError:
- return await eor(msg, "`Hmm, I'm have no rights here...`")
+ return await eor(msg, "`Hmm.. Guess I have no rights here!`")
except Exception as e:
return await eor(msg, f"**ERROR:**`{str(e)}`")
try:
@@ -288,14 +288,14 @@ async def unp(ult):
try:
await ultroid_bot.unpin_message(ult.chat_id, msg)
except BadRequestError:
- return await xx.edit("`Hmm, I'm have no rights here...`")
+ return await xx.edit("`Hmm.. Guess I have no rights here!`")
except Exception as e:
return await xx.edit(f"**ERROR:**\n`{str(e)}`")
elif ch == "all":
try:
await ultroid_bot.unpin_message(ult.chat_id)
except BadRequestError:
- return await xx.edit("`Hmm, I'm have no rights here...`")
+ return await xx.edit("`Hmm.. Guess I have no rights here!`")
except Exception as e:
return await xx.edit(f"**ERROR:**`{str(e)}`")
else:
@@ -424,7 +424,9 @@ async def _(e):
async def get_pinned(event):
x = await eor(event, get_string("com_1"))
chat_id = (str(event.chat_id)).replace("-100", "")
- chat_name = (await event.get_chat()).title
+ chat_name = "This Chat"
+ if not event.is_private:
+ chat_name = (await event.get_chat()).title
tem = ""
c = 0
@@ -480,6 +482,3 @@ async def autodelte(ult): # Tg Feature
except ChatNotModifiedError:
return await eod(ult, f"Auto Delete Setting is Already same to `{match}`")
await eor(ult, f"Auto Delete Status Changed to {match} !")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/afk.py b/plugins/afk.py
index d8fc12a..9869071 100644
--- a/plugins/afk.py
+++ b/plugins/afk.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -249,6 +249,3 @@ async def _(event):
await ultroid_bot.send_message(LOG, get_string("afk_8"))
except BaseException:
pass
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/anime.py b/plugins/anime.py
new file mode 100644
index 0000000..781209a
--- /dev/null
+++ b/plugins/anime.py
@@ -0,0 +1,81 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+• `{i}airing`
+ Get details about currently airing anime.
+
+• `{i}anime `
+ Get anime details from anilist.
+
+• `{i}character `
+ Fetch anime character details.
+"""
+
+from os import remove
+
+import jikanpy
+
+from . import *
+
+
+@ultroid_cmd(pattern="airing")
+async def airing_anime(event):
+ try:
+ await eor(event, airing_eps())
+ except BaseException:
+ info = airing_eps()
+ t = info.replace("*", "").replace("`", "")
+ with open("animes.txt", "w") as f:
+ f.write(t)
+ await event.reply(file="animes.txt")
+ remove("anime.txt")
+ await event.delete()
+
+
+"""
+@ultroid_cmd(pattern="anime ?(.*)")
+async def anilist(event):
+ name = event.pattern_match.group(1)
+ x = await eor(event, get_string("com_1"))
+ if not name:
+ return await eod(x, "`Enter a anime name!`", time=5)
+ banner, title, year, episodes, info = get_anime_src_res(name)
+ msg = f"**{title}**\n{year} | {episodes} Episodes.\n\n{info}"
+ await event.reply(msg, file=banner, link_preview=True)
+ await x.delete()
+"""
+
+
+@ultroid_cmd(pattern="character ?(.*)")
+async def anime_char_search(event):
+ xx = await eor(event, get_string("com_1"))
+ char_name = event.pattern_match.group(1)
+ if not char_name:
+ await eod(xx, "`Enter the name of a character too please!`", time=5)
+ jikan = jikanpy.jikan.Jikan()
+ try:
+ s = jikan.search("character", char_name)
+ except jikanpy.exceptions.APIException:
+ return await eod(xx, "`Couldn't find character!`", time=5)
+ a = s["results"][0]["mal_id"]
+ char_json = jikan.character(a)
+ pic = char_json["image_url"]
+ msg = f"**[{char_json['name']}]({char_json['url']})**"
+ if char_json["name_kanji"] != "Japanese":
+ msg += f" [{char_json['name_kanji']}]\n"
+ else:
+ msg += "\n"
+ if char_json["nicknames"]:
+ nicknames_string = ", ".join(char_json["nicknames"])
+ msg += f"\n**Nicknames** : `{nicknames_string}`\n"
+ about = char_json["about"].split("\n", 1)[0].strip().replace("\n", "")
+ msg += f"\n**About**: __{about}__"
+ await event.reply(msg, file=pic, force_document=False)
+ await xx.delete()
diff --git a/plugins/antiflood.py b/plugins/antiflood.py
new file mode 100644
index 0000000..2f639fa
--- /dev/null
+++ b/plugins/antiflood.py
@@ -0,0 +1,137 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+• `{i}setflood `
+ Set flood limit in a chat.
+
+• `{i}remflood`
+ Remove flood limit from a chat.
+
+• `{i}getflood`
+ Get flood limit of a chat.
+"""
+
+
+import re
+
+from pyUltroid.functions.antiflood_db import (
+ get_flood,
+ get_flood_limit,
+ rem_flood,
+ set_flood,
+)
+from telethon.events import NewMessage as NewMsg
+
+from . import *
+
+_check_flood = {}
+
+
+if Redis("ANTIFLOOD") is not (None or ""):
+
+ @ultroid_bot.on(
+ NewMsg(
+ chats=list(get_flood().keys()),
+ ),
+ )
+ async def flood_checm(event):
+ count = 1
+ chat = (await event.get_chat()).title
+ if event.chat_id in _check_flood.keys():
+ if event.sender_id == [x for x in _check_flood[event.chat_id].keys()][0]:
+ count = _check_flood[event.chat_id][event.sender_id]
+ _check_flood[event.chat_id] = {event.sender_id: count + 1}
+ else:
+ _check_flood[event.chat_id] = {event.sender_id: count}
+ else:
+ _check_flood[event.chat_id] = {event.sender_id: count}
+ if await check_if_admin(event) or event.sender.bot:
+ return
+ if str(event.sender_id) in DEVLIST:
+ return
+ if _check_flood[event.chat_id][event.sender_id] >= int(
+ get_flood_limit(event.chat_id)
+ ):
+ try:
+ name = event.sender.first_name
+ await event.client.edit_permissions(
+ event.chat_id, event.sender_id, send_messages=False
+ )
+ del _check_flood[event.chat_id]
+ await event.reply("#AntiFlood\n\n`You have been muted.`")
+ await asst.send_message(
+ int(Redis("LOG_CHANNEL")),
+ f"#Antiflood\n\n`Muted `[{name}](tg://user?id={event.sender_id})` in {chat}`",
+ buttons=Button.inline(
+ "Unmute", data=f"anti_{event.sender_id}_{event.chat_id}"
+ ),
+ )
+ except BaseException:
+ pass
+
+
+@callback(
+ re.compile(
+ "anti_(.*)",
+ ),
+)
+async def unmuting(e):
+ ino = (e.data_match.group(1)).decode("UTF-8").split("_")
+ user = int(ino[0])
+ chat = int(ino[1])
+ user_name = (await ultroid_bot.get_entity(user)).first_name
+ chat_title = (await ultroid_bot.get_entity(chat)).title
+ await ultroid_bot.edit_permissions(chat, user, send_messages=True)
+ await e.edit(
+ f"#Antiflood\n\n`Unmuted `[{user_name}](tg://user?id={user})` in {chat_title}`"
+ )
+
+
+@ultroid_cmd(
+ pattern="setflood ?(\\d+)",
+ admins_only=True,
+)
+async def setflood(e):
+ input = e.pattern_match.group(1)
+ if not input:
+ return await eod(e, "`What?`")
+ if not input.isdigit():
+ return await eod(e, "`Invalid Input`")
+ m = set_flood(e.chat_id, input)
+ if m:
+ return await eod(
+ e, f"`Successfully Updated Antiflood Settings to {input} in this chat.`"
+ )
+
+
+@ultroid_cmd(
+ pattern="remflood$",
+ admins_only=True,
+)
+async def remove_flood(e):
+ hmm = rem_flood(e.chat_id)
+ try:
+ del _check_flood[e.chat_id]
+ except BaseException:
+ pass
+ if hmm:
+ return await eod(e, "`Antiflood Settings Disabled`")
+ await eod(e, "`No flood limits in this chat.`")
+
+
+@ultroid_cmd(
+ pattern="getflood$",
+ admins_only=True,
+)
+async def getflood(e):
+ ok = get_flood_limit(e.chat_id)
+ if ok:
+ return await eod(e, f"`Flood limit for this chat is {ok}.`")
+ await eod(e, "`No flood limits in this chat.`")
diff --git a/plugins/ascii.py b/plugins/ascii.py
new file mode 100644
index 0000000..b7ae9ea
--- /dev/null
+++ b/plugins/ascii.py
@@ -0,0 +1,39 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+• `{i}ascii `
+ Convert replied image into html.
+"""
+
+
+import os
+
+from img2html.converter import Img2HTMLConverter
+
+from . import *
+
+
+@ultroid_cmd(
+ pattern="ascii ?(.*)",
+)
+async def _(e):
+ if not e.reply_to_msg_id:
+ return await eor(e, "`Reply to image.`")
+ m = await eor(e, "`Converting to html...`")
+ img = await (await e.get_reply_message()).download_media()
+ char = "■" if not e.pattern_match.group(1) else e.pattern_match.group(1)
+ converter = Img2HTMLConverter(char=char)
+ html = converter.convert(img)
+ with open("html.html", "w") as t:
+ t.write(html)
+ await e.client.send_file(e.chat_id, "html.html", reply_to=e.reply_to_msg_id)
+ await m.delete()
+ os.remove(img)
+ os.remove("html.html")
diff --git a/plugins/asst_cmd.py b/plugins/asst_cmd.py
new file mode 100644
index 0000000..3552cb8
--- /dev/null
+++ b/plugins/asst_cmd.py
@@ -0,0 +1,95 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+•`{i}addcmd `
+ It will set new cmd for your assistant bot with that reply message.
+
+•`{i}remcmd `
+ It will remove your cmd.
+
+•`{i}listcmd`
+ To Get list of all your custom cmd.
+"""
+
+import os
+
+from pyUltroid.functions.asstcmd_db import *
+from telegraph import upload_file as uf
+from telethon.utils import pack_bot_file_id
+
+from . import *
+
+
+@ultroid_cmd(pattern="addcmd ?(.*)")
+async def ac(e):
+ wrd = (e.pattern_match.group(1)).lower()
+ wt = await e.get_reply_message()
+ if not (wt and wrd):
+ return await eod(e, "`Use this Command with Reply and word to use a command.`")
+ if "/" in wrd:
+ wrd = wrd.replace("/", "")
+ if wt and wt.media:
+ wut = mediainfo(wt.media)
+ if wut.startswith(("pic", "gif")):
+ dl = await bot.download_media(wt.media)
+ variable = uf(dl)
+ os.remove(dl)
+ m = "https://telegra.ph" + variable[0]
+ elif wut == "video":
+ if wt.media.document.size > 8 * 1000 * 1000:
+ return await eod(x, "`Unsupported Media`")
+ else:
+ dl = await bot.download_media(wt.media)
+ variable = uf(dl)
+ os.remove(dl)
+ m = "https://telegra.ph" + variable[0]
+ else:
+ m = pack_bot_file_id(wt.media)
+ if wt.text:
+ add_cmd(wrd, wt.text, m)
+ else:
+ add_cmd(wrd, None, m)
+ else:
+ add_cmd(wrd, wt.text, None)
+ await eor(e, f"Done Command : `/{wrd}` saved.")
+
+
+@ultroid_cmd(pattern="remcmd ?(.*)")
+async def rc(e):
+ wrd = (e.pattern_match.group(1)).lower()
+ if not wrd:
+ return await eod(e, "`Give me the command which you want to remove.`")
+ if wrd.startswith("/"):
+ wrd = wrd.replace("/", "")
+ rem_cmd(wrd)
+ await eor(e, f"Done Command: `/{wrd}` Removed.")
+
+
+@ultroid_cmd(pattern="listcmd$")
+async def lscmd(e):
+ if list_cmds():
+ ok = "**ALL ASSISTANT CMDS**\n\n"
+ for x in list_cmds():
+ ok += "/" + x + "\n"
+ return await eor(e, ok)
+ return await eor(e, "No commands found")
+
+
+@asst.on(events.NewMessage())
+async def ascmds(e):
+ xx = e.text
+ if not xx.startswith("/"):
+ return
+ xx = (xx.replace("/", "")).lower()
+ if " " in xx:
+ xx = xx.split(" ")[0]
+ if cmd_reply(xx):
+ msg, media = cmd_reply(xx)
+ await e.reply(msg, file=media)
diff --git a/plugins/autocorrect.py b/plugins/autocorrect.py
index c96fa61..6e8c700 100644
--- a/plugins/autocorrect.py
+++ b/plugins/autocorrect.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -53,6 +53,3 @@ async def gramme(event):
await event.edit(res)
except BaseException:
pass
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/autopic.py b/plugins/autopic.py
index 66db767..3410c24 100644
--- a/plugins/autopic.py
+++ b/plugins/autopic.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -37,6 +37,11 @@ async def autopic(e):
return await eod(e, get_string("autopic_2").format(search))
await eor(e, get_string("autopic_3").format(search))
udB.set("AUTOPIC", "True")
+ ST = udB.get("SLEEP_TIME")
+ if ST:
+ SLEEP_TIME = int(ST)
+ else:
+ SLEEP_TIME = 1221
while True:
for lie in clls:
ge = udB.get("AUTOPIC")
@@ -56,7 +61,7 @@ async def autopic(e):
file = await ultroid_bot.upload_file(kar)
await ultroid_bot(UploadProfilePhotoRequest(file))
os.remove(kar)
- await asyncio.sleep(1111)
+ await asyncio.sleep(SLEEP_TIME)
@ultroid_cmd(pattern="stoppic$")
@@ -66,6 +71,3 @@ async def stoppo(ult):
return await eod(ult, "AUTOPIC was not in used !!")
udB.set("AUTOPIC", "None")
await eod(ult, "AUTOPIC Stopped !!")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/blacklist.py b/plugins/blacklist.py
index 2387864..74f55b2 100644
--- a/plugins/blacklist.py
+++ b/plugins/blacklist.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -27,11 +27,8 @@ from pyUltroid.functions.blacklist_db import *
from . import *
-@ultroid_cmd(pattern="blacklist ?(.*)")
+@ultroid_cmd(pattern="blacklist ?(.*)", admins_only=True)
async def af(e):
- if e.is_group:
- if not e._chat.admin_rights:
- return await eod(e, "`You are Not Admin Here`")
wrd = e.pattern_match.group(1)
chat = e.chat_id
if not (wrd):
@@ -43,11 +40,8 @@ async def af(e):
await eor(e, f"Done : `{wrd}` Blacklisted here.")
-@ultroid_cmd(pattern="remblacklist ?(.*)")
+@ultroid_cmd(pattern="remblacklist ?(.*)", admins_only=True)
async def rf(e):
- if e.is_group:
- if not e._chat.admin_rights:
- return await eod(e, "`You are Not Admin Here`")
wrd = e.pattern_match.group(1)
chat = e.chat_id
if not wrd:
@@ -59,11 +53,8 @@ async def rf(e):
await eor(e, f"Done : `{wrd}` Removed from Blacklist.")
-@ultroid_cmd(pattern="listblacklist")
+@ultroid_cmd(pattern="listblacklist$", admins_only=True)
async def lsnote(e):
- if e.is_group:
- if not e._chat.admin_rights:
- return await eod(e, "`You are Not Admin Here`")
x = list_blacklist(e.chat_id)
if x:
sd = "Blacklist Found In This Chats Are\n\n"
@@ -83,6 +74,3 @@ async def bl(e):
if z in yy:
await e.delete()
break
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/bot.py b/plugins/bot.py
index 7dbef2d..4d506e8 100644
--- a/plugins/bot.py
+++ b/plugins/bot.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -34,30 +34,13 @@ import time
from datetime import datetime as dt
from platform import python_version as pyver
-import heroku3
-import re
-import requests
from git import Repo
-from pyUltroid import __version__ as UltVer
+from pyUltroid.version import __version__ as UltVer
from telethon import __version__, events
from telethon.errors.rpcerrorlist import ChatSendMediaForbiddenError
from . import *
-HEROKU_API = None
-HEROKU_APP_NAME = None
-
-try:
- if Var.HEROKU_API and Var.HEROKU_APP_NAME:
- HEROKU_API = Var.HEROKU_API
- HEROKU_APP_NAME = Var.HEROKU_APP_NAME
- Heroku = heroku3.from_key(Var.HEROKU_API)
- heroku_api = "https://api.heroku.com"
- app = Heroku.app(Var.HEROKU_APP_NAME)
-except BaseException:
- HEROKU_API = None
- HEROKU_APP_NAME = None
-
@ultroid_cmd(
pattern="alive$",
@@ -99,8 +82,7 @@ async def lol(ult):
await eor(ult, als, link_preview=False)
-
-@ultroid_bot.on(events.NewMessage(pattern=re.escape(f"{HNDLR}ping")))
+@ultroid_bot.on(events.NewMessage(pattern=f"\\{HNDLR}ping$"))
async def _(event):
if event.fwd_from:
return
@@ -125,32 +107,22 @@ async def cmds(event):
pattern="restart$",
)
async def restartbt(ult):
+ ok = await eor(ult, "`Restarting...`")
if Var.HEROKU_API:
- await restart(ult)
+ await restart(ok)
else:
await bash("pkill python3 && python3 -m pyUltroid")
-@ultroid_cmd(pattern="shutdown")
+@ultroid_cmd(pattern="shutdown$")
async def shutdownbot(ult):
if not ult.out:
if not is_fullsudo(ult.sender_id):
return await eod(ult, "`This Command Is Sudo Restricted.`")
- try:
- dyno = ult.text.split(" ", maxsplit=1)[1]
- except IndexError:
- dyno = None
- if dyno:
- if dyno not in ["userbot", "vcbot", "web", "worker"]:
- await eor(ult, "Invalid Dyno Type specified !")
- return
- await shutdown(ult, dyno)
- else:
- await shutdown(ult)
+ await shutdown(ult)
-
-@ultroid_bot.on(events.NewMessage(pattern=re.escape(f"{HNDLR}logs")))
+@ultroid_bot.on(events.NewMessage(pattern=f"\\{HNDLR}logs$"))
async def _(event):
if event.fwd_from:
return
@@ -166,52 +138,3 @@ async def _(event):
await def_logs(event)
else:
await def_logs(event)
-
-
-async def heroku_logs(event):
- if HEROKU_API is None and HEROKU_APP_NAME is None:
- return await eor(
- event, "Please set `HEROKU_APP_NAME` and `HEROKU_API` in vars."
- )
- await eor(event, "`Downloading Logs...`")
- ok = app.get_log()
- with open("ultroid-heroku.log", "w") as log:
- log.write(ok)
- key = (
- requests.post("https://nekobin.com/api/documents", json={"content": ok})
- .json()
- .get("result")
- .get("key")
- )
- url = f"https://nekobin.com/{key}"
- await ultroid.send_file(
- event.chat_id,
- file="ultroid-heroku.log",
- thumb="resources/extras/ultroid.jpg",
- caption=f"**Ultroid Heroku Logs.**\nPasted [here]({url}) too!",
- )
- os.remove("ultroid-heroku.log")
-
-
-async def def_logs(ult):
- xx = await eor(ult, "`Processing...`")
- with open("ultroid.log") as f:
- k = f.read()
- key = (
- requests.post("https://nekobin.com/api/documents", json={"content": k})
- .json()
- .get("result")
- .get("key")
- )
- url = f"https://nekobin.com/{key}"
- await ultroid.send_file(
- ult.chat_id,
- file="ultroid.log",
- thumb="resources/extras/ultroid.jpg",
- caption=f"**Ultroid Logs.**\nPasted [here]({url}) too!",
- )
- await xx.edit("Done")
- await xx.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/broadcast.py b/plugins/broadcast.py
index b15cc6f..8ca5347 100644
--- a/plugins/broadcast.py
+++ b/plugins/broadcast.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -248,6 +248,3 @@ async def sending(event):
)
except BaseException:
pass
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/calculator.py b/plugins/calculator.py
index 4d64021..3199a8d 100644
--- a/plugins/calculator.py
+++ b/plugins/calculator.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -141,6 +141,3 @@ async def _(e):
lst = list(zip(tultd[::4], tultd[1::4], tultd[2::4], tultd[3::4]))
lst.append([Button.inline("=", data="calc=")])
await e.edit("Noice Inline Calculator", buttons=lst)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/carbon.py b/plugins/carbon.py
index 1e39544..3472849 100644
--- a/plugins/carbon.py
+++ b/plugins/carbon.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -10,13 +10,14 @@
• `{i}carbon `
Carbonise the text with default settings.
+
• `{i}rcarbon `
Carbonise the text, with random bg colours.
"""
-import os
import random
+import requests
from carbonnow import Carbon
from . import *
@@ -190,16 +191,19 @@ async def crbn(event):
code = temp.message
else:
code = event.text.split(" ", maxsplit=1)[1]
- carbon = Carbon(code=code)
- xx = await carbon.save("ultroid_carbon")
+ webs = requests.get("https://carbonara.vercel.app/api/cook")
+ if webs.status_code == 502:
+ return await eor(
+ event, "`Temporary Server Error has Occured !\nPlease Try Again Later`"
+ )
+ carbon = Carbon(base_url="https://carbonara.vercel.app/api/cook", code=code)
+ xx = await carbon.memorize("ultroid_carbon")
await xxxx.delete()
await ultroid_bot.send_file(
event.chat_id,
xx,
caption=f"Carbonised by [{OWNER_NAME}](tg://user?id={OWNER_ID})",
- force_document=True,
)
- os.remove(xx)
@ultroid_cmd(
@@ -220,16 +224,18 @@ async def crbn(event):
else:
code = event.text.split(" ", maxsplit=1)[1]
col = random.choice(all_col)
- carbon = Carbon(code=code, background=col)
- xx = await carbon.save("ultroid_carbon")
+ webs = requests.get("https://carbonara.vercel.app/api/cook")
+ if webs.status_code == 502:
+ return await eor(
+ event, "`Temporary Server Error has Occured !\nPlease Try Again Later`"
+ )
+ carbon = Carbon(
+ base_url="https://carbonara.vercel.app/api/cook", code=code, background=col
+ )
+ xx = await carbon.memorize("ultroid_carbon")
await xxxx.delete()
await ultroid_bot.send_file(
event.chat_id,
xx,
caption=f"Carbonised by [{OWNER_NAME}](tg://user?id={OWNER_ID})",
- force_document=True,
)
- os.remove(xx)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/channelhacks.py b/plugins/channelhacks.py
index c9940f4..2ca35f9 100644
--- a/plugins/channelhacks.py
+++ b/plugins/channelhacks.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -87,7 +87,7 @@ async def _(e):
return
async for msg in ultroid_bot.iter_messages(int(c), reverse=True):
try:
- await asyncio.sleep(1.3)
+ await asyncio.sleep(2)
await ultroid_bot.send_message(int(d), msg)
except BaseException:
pass
@@ -260,6 +260,3 @@ async def list_all(event):
await x.delete()
else:
await x.edit(msg)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/chats.py b/plugins/chats.py
index 4ba371a..f72d06a 100644
--- a/plugins/chats.py
+++ b/plugins/chats.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -38,8 +38,6 @@ from . import *
groups_only=True,
)
async def _(e):
- if BOT_MODE:
- return await eor(e, "You Cant Use This Command in BOT_MODE")
xx = await eor(e, "`Processing...`")
try:
await e.client(DeleteChannelRequest(e.chat_id))
@@ -71,8 +69,6 @@ async def _(e):
pattern="create (b|g|c)(?: |$)(.*)",
)
async def _(e):
- if BOT_MODE:
- return await eor(e, "You Cant use this Command in BOT_MODE")
type_of_group = e.pattern_match.group(1)
group_name = e.pattern_match.group(2)
xx = await eor(e, "`Processing...`")
@@ -123,6 +119,3 @@ async def _(e):
)
except Exception as ex:
await xx.edit(str(ex))
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/clean_action.py b/plugins/clean_action.py
index 41ed080..34cbef4 100644
--- a/plugins/clean_action.py
+++ b/plugins/clean_action.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -63,6 +63,3 @@ async def _(event):
await event.delete()
except BaseException:
pass
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/compressor.py b/plugins/compressor.py
index c5e603f..dcc9e4e 100644
--- a/plugins/compressor.py
+++ b/plugins/compressor.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -27,6 +27,7 @@ from datetime import datetime as dt
from hachoir.metadata import extractMetadata
from hachoir.parser import createParser
+from telethon.errors.rpcerrorlist import MessageNotModifiedError
from telethon.tl.types import DocumentAttributeVideo
from . import *
@@ -74,16 +75,10 @@ async def _(e):
with open(progress, "w") as fk:
pass
proce = await asyncio.create_subprocess_shell(
- f'ffmpeg -hide_banner -loglevel quiet -progress {progress} -i """{file.name}""" -preset ultrafast -c:v libx265 -crf {crf} -map 0:v -c:a aac -map 0:a -c:s copy -map 0:s? """{out}""" -y',
+ f'ffmpeg -hide_banner -loglevel quiet -progress {progress} -i """{file.name}""" -preset ultrafast -vcodec libx265 -crf {crf} """{out}""" -y',
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
- if proce.returncode is None:
- proce = await asyncio.create_subprocess_shell(
- f'ffmpeg -hide_banner -loglevel quiet -progress {progress} -i """{file.name}""" -preset ultrafast -vcodec libx265 -crf {crf} """{out}""" -y',
- stdout=asyncio.subprocess.PIPE,
- stderr=asyncio.subprocess.PIPE,
- )
while proce.returncode != 0:
await asyncio.sleep(3)
with open(progress, "r+") as fil:
@@ -96,13 +91,31 @@ async def _(e):
if len(size):
size = int(size[-1])
per = elapse * 100 / int(total_frames)
- progress_str = "`[{0}{1}] {2}%\n`".format(
+ time_diff = time.time() - int(d_time)
+ speed = round(elapse / time_diff, 2)
+ eta = time_formatter(
+ ((int(total_frames) - elapse) / speed) * 1000
+ )
+ text = f"`Compressing {file_name} at {crf} CRF.\n`"
+ progress_str = "`[{0}{1}] {2}%\n\n`".format(
"".join(["●" for i in range(math.floor(per / 5))]),
"".join(["" for i in range(20 - math.floor(per / 5))]),
round(per, 2),
)
e_size = humanbytes(size)
- await xxx.edit(progress_str + "\n" + "`" + e_size + "`")
+ try:
+ await xxx.edit(
+ text
+ + progress_str
+ + "`"
+ + e_size
+ + "`"
+ + "\n\n`"
+ + eta
+ + "`"
+ )
+ except MessageNotModifiedError:
+ pass
os.remove(file.name)
c_size = os.path.getsize(out)
f_time = time.time()
@@ -158,6 +171,3 @@ async def _(e):
await eod(e, "`Reply To Video File Only`")
else:
await eod(e, "`Reply To Video File Only`")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/converter.py b/plugins/converter.py
index 2c75882..cda65f7 100644
--- a/plugins/converter.py
+++ b/plugins/converter.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -32,7 +32,6 @@ import os
import time
import cv2
-import requests
from PIL import Image
from telegraph import upload_file as uf
from telethon.tl.types import MessageMediaDocument as doc
@@ -43,7 +42,9 @@ from . import *
opn = []
-@ultroid_cmd(pattern="thumbnail$")
+@ultroid_cmd(
+ pattern="thumbnail$",
+)
async def _(e):
r = await e.get_reply_message()
pop = "`Reply to img or file with thumbnail.`"
@@ -64,7 +65,9 @@ async def _(e):
await eor(e, f"Added [This]({nn}) As Your Custom Thumbnail", link_preview=False)
-@ultroid_cmd(pattern="rename ?(.*)")
+@ultroid_cmd(
+ pattern="rename ?(.*)",
+)
async def imak(event):
reply = await event.get_reply_message()
t = time.time()
@@ -100,7 +103,9 @@ async def imak(event):
await xx.delete()
-@ultroid_cmd(pattern="mtoi$")
+@ultroid_cmd(
+ pattern="mtoi$",
+)
async def imak(event):
reply = await event.get_reply_message()
if not (reply and (reply.media)):
@@ -122,7 +127,9 @@ async def imak(event):
os.remove(image)
-@ultroid_cmd(pattern="mtos$")
+@ultroid_cmd(
+ pattern="mtos$",
+)
async def smak(event):
reply = await event.get_reply_message()
if not (reply and (reply.media)):
@@ -145,10 +152,12 @@ async def smak(event):
@ultroid_cmd(
- pattern="doc",
+ pattern="doc ?(.*)",
)
async def _(event):
- input_str = event.text[5:]
+ input_str = event.pattern_match.group(1)
+ if not input_str:
+ return await eod(event, "`Bsdk Give Name.`")
xx = await eor(event, get_string("com_1"))
if event.reply_to_msg_id:
a = await event.get_reply_message()
@@ -175,28 +184,26 @@ async def _(event):
a = await event.get_reply_message()
if a.media:
b = await a.download_media()
- c = open(b)
- d = c.read()
- c.close()
+ try:
+ c = open(b)
+ d = c.read()
+ c.close()
+ except UnicodeDecodeError:
+ return await eod(xx, "`Not A Readable File.`")
try:
await xx.edit(f"```{d}```")
except BaseException:
- key = (
- requests.post(
- "https://nekobin.com/api/documents", json={"content": d}
+ what, key = get_paste(message)
+ if "neko" in what:
+ await xx.edit(
+ f"**MESSAGE EXCEEDS TELEGRAM LIMITS**\n\nSo Pasted It On [NEKOBIN](https://nekobin.com/{key})"
+ )
+ elif "dog" in what:
+ await xx.edit(
+ f"**MESSAGE EXCEEDS TELEGRAM LIMITS**\n\nSo Pasted It On [DOGBIN](https://del.dog/{key})"
)
- .json()
- .get("result")
- .get("key")
- )
- await xx.edit(
- f"**MESSAGE EXCEEDS TELEGRAM LIMITS**\n\nSo Pasted It On [NEKOBIN](https://nekobin.com/{key})"
- )
os.remove(b)
else:
return await eod(xx, "`Reply to a readable file`", time=5)
else:
return await eod(xx, "`Reply to a readable file`", time=5)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/core.py b/plugins/core.py
index 36b5438..6ce6d39 100644
--- a/plugins/core.py
+++ b/plugins/core.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -108,6 +108,3 @@ async def load(event):
f"**Could not load** `{shortname}` **because of the following error.**\n`{str(e)}`",
time=3,
)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/dayevents.py b/plugins/dayevents.py
index cb56706..25b63d2 100644
--- a/plugins/dayevents.py
+++ b/plugins/dayevents.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -41,6 +41,3 @@ async def diela(e):
for eve in ml[:5]:
te += "• " + f'[{eve.text}]({eve["href"]})\n'
await m.edit(te, link_preview=False)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/deezer.py b/plugins/deezer.py
new file mode 100644
index 0000000..d81f4a4
--- /dev/null
+++ b/plugins/deezer.py
@@ -0,0 +1,13 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+• `{i}deez `
+ Download songs from Deezer
+"""
diff --git a/plugins/devtools.py b/plugins/devtools.py
index d6dd25a..8c15911 100644
--- a/plugins/devtools.py
+++ b/plugins/devtools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -37,13 +37,14 @@ from . import *
pattern="sysinfo$",
)
async def _(e):
- await eor(e, "`Sending...`")
+ xx = await eor(e, "`Sending...`")
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", "")
- ok = Carbon(code=p)
+ ok = Carbon(base_url="https://carbonara.vercel.app/api/cook", code=p)
haa = await ok.save("neofetch")
await e.client.send_file(e.chat_id, haa)
+ await xx.delete()
remove("neofetch.jpg")
remove("neo.txt")
@@ -93,7 +94,7 @@ async def _(event):
)
await xx.delete()
else:
- await eor(xx, OUT)
+ await xx.edit(OUT)
p = print # ignore: pylint
@@ -165,7 +166,7 @@ async def _(event):
)
await xx.delete()
else:
- await eor(xx, final_output)
+ await xx.edit(final_output)
async def aexec(code, event):
@@ -178,6 +179,3 @@ async def aexec(code, event):
)
return await locals()["__aexec"](event, event.client)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/dm.py b/plugins/dm.py
index ec41f5d..8f5cf02 100644
--- a/plugins/dm.py
+++ b/plugins/dm.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -16,6 +16,8 @@ from . import *
@ultroid_cmd(pattern="dm ?(.*)")
async def dm(e):
+ if not e.out and not is_fullsudo(e.sender_id):
+ return await eor(e, "`This Command is Full Sudo Restricted..`")
if len(e.text) > 3:
if not e.text[3] == " ": # weird fix
return
@@ -43,6 +45,3 @@ async def dm(e):
"`{i}help dm`",
time=4,
)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/download_upload.py b/plugins/download_upload.py
index a972980..9658af8 100644
--- a/plugins/download_upload.py
+++ b/plugins/download_upload.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -84,7 +84,7 @@ async def download(event):
),
),
)
- e = datetime.now()
+ e = dt.now()
t = time_formatter(((e - s).seconds) * 1000)
if t != "":
await eor(xx, get_string("udl_2").format(file_name, t))
@@ -253,7 +253,7 @@ async def download(event):
)
except Exception as ve:
return await eor(xx, str(ve))
- e = datetime.now()
+ e = dt.now()
t = time_formatter(((e - s).seconds) * 1000)
if t != "":
if os.path.isdir(kk):
@@ -272,6 +272,3 @@ async def download(event):
await eor(xx, f"Uploaded `{kk}` in `{t}`")
else:
await eor(xx, f"Uploaded `{kk}` in `0 second(s)`")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/echo.py b/plugins/echo.py
index 94a4493..2ed6735 100644
--- a/plugins/echo.py
+++ b/plugins/echo.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -93,6 +93,3 @@ async def lstecho(e):
await eor(e, user)
else:
await eod(e, "`List is Empty, For echo`")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/evaljs.py b/plugins/evaljs.py
index fe427f3..828c420 100644
--- a/plugins/evaljs.py
+++ b/plugins/evaljs.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -79,6 +79,3 @@ async def evaluateJs(event):
startTime=start,
)
).start()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/extra.py b/plugins/extra.py
index 6843147..5f962fb 100644
--- a/plugins/extra.py
+++ b/plugins/extra.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -50,7 +50,7 @@ async def delete_it(delme):
try:
await msg_src.delete()
await delme.delete()
- except BaseException:
+ except Exception as e:
await eod(
delme,
f"Couldn't delete the message.\n\n**ERROR:**\n`{str(e)}`",
@@ -113,6 +113,3 @@ async def _(e):
)
else:
await e.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/fakeaction.py b/plugins/fakeaction.py
index 79ca0b3..e7a65d7 100644
--- a/plugins/fakeaction.py
+++ b/plugins/fakeaction.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -94,6 +94,3 @@ async def _(e):
await eod(e, f"Starting Fake Game Playing For {t} sec.")
async with e.client.action(e.chat_id, "game"):
await asyncio.sleep(t)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/fedutils.py b/plugins/fedutils.py
index f4ef728..ff04aae 100644
--- a/plugins/fedutils.py
+++ b/plugins/fedutils.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -390,6 +390,3 @@ async def _(event):
await ok.edit(audio.text + "\n\nFedInfo Extracted by Ultroid")
except YouBlockedUserError:
await ok.edit("**Error**\n `Unblock` @MissRose_Bot `and try again!")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/filter.py b/plugins/filter.py
index 44ff97c..945c76e 100644
--- a/plugins/filter.py
+++ b/plugins/filter.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -107,6 +107,3 @@ async def fl(e):
msg = k["msg"]
media = k["media"]
await e.reply(msg, file=media)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/fontgen.py b/plugins/fontgen.py
new file mode 100644
index 0000000..2057e49
--- /dev/null
+++ b/plugins/fontgen.py
@@ -0,0 +1,47 @@
+"""
+• `{i}font `
+ Generate different fonts for the text.
+
+• `{i}font`
+ To get list of fonts
+"""
+
+from . import _default, _double_stroke, _monospace, _small_caps
+
+fonts = ["small caps ", "monospace ", "double stroke ", "script royal"]
+
+
+@ultroid_cmd(
+ pattern="font ?(.*)",
+)
+async def _(e):
+ input = e.pattern_match.group(1)
+ if not input:
+ m = "**Available Fonts**\n\n"
+ for x in fonts:
+ m += f"• `{x}`\n"
+ return await eod(e, m)
+ try:
+ font = input.split(":", maxsplit=1)[0]
+ text = input.split(":", maxsplit=1)[1]
+ except BaseException:
+ return await eod(e, "`fonts small caps : Your Message`")
+ if font not in fonts:
+ return await eod(e, f"`{font} not in font list`.")
+ if font == "small caps ":
+ msg = gen_font(text, _small_caps)
+ if font == "monospace ":
+ msg = gen_font(text, _monospace)
+ if font == "double stroke ":
+ msg = gen_font(text, _double_stroke)
+ if font == "script royal ":
+ msg = gen_font(text, _script_royal)
+ await eor(e, msg)
+
+
+def gen_font(text, new_font):
+ for q in text:
+ if q in _default:
+ new = new_font[_default.index(q)]
+ text = text.replace(q, new)
+ return text
diff --git a/plugins/forcesubscribe.py b/plugins/forcesubscribe.py
index 4aae24d..b5fefb8 100644
--- a/plugins/forcesubscribe.py
+++ b/plugins/forcesubscribe.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -138,6 +138,3 @@ async def diesoon(e):
e.chat_id, int(spli[0]), send_messages=True, until_date=None
)
await e.edit("Thanks For Joining ! ")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/gadgets.py b/plugins/gadgets.py
index e98b19e..aeaf53c 100644
--- a/plugins/gadgets.py
+++ b/plugins/gadgets.py
@@ -50,6 +50,3 @@ async def mobs(e):
except Exception as a:
print(a)
await eor(e, "No Results Found")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/gdrive.py b/plugins/gdrive.py
index 7fe972e..bfd0542 100644
--- a/plugins/gdrive.py
+++ b/plugins/gdrive.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -169,6 +169,3 @@ async def _(event):
await eod(event, "`Here is Your G-Drive Folder link : `\n" + folder_link)
else:
await eod(event, "Set GDRIVE_FOLDER_ID with value of your folder id")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/get_addons.py b/plugins/get_addons.py
index 83746c6..01b0782 100644
--- a/plugins/get_addons.py
+++ b/plugins/get_addons.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -46,6 +46,3 @@ async def get_the_addons_lol(event):
f"**Could not load** `{shortname}` **because of the following error.**\n`{str(e)}`",
time=3,
)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/giftools.py b/plugins/giftools.py
index 86c17b8..c65e53c 100644
--- a/plugins/giftools.py
+++ b/plugins/giftools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -132,6 +132,3 @@ async def vtogif(e):
os.remove(z)
os.remove("ult.gif")
await xx.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/github.py b/plugins/github.py
index 7d405f3..87edfc5 100644
--- a/plugins/github.py
+++ b/plugins/github.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -65,6 +65,3 @@ async def gitsearch(event):
caption=fullusr,
link_preview=False,
)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/glitch.py b/plugins/glitch.py
index 5f50020..bb00e95 100644
--- a/plugins/glitch.py
+++ b/plugins/glitch.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -37,6 +37,3 @@ async def _(e):
await xx.delete()
os.remove(ok)
os.remove("ult.gif")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/globaltools.py b/plugins/globaltools.py
index 514d4c7..93c7cdf 100644
--- a/plugins/globaltools.py
+++ b/plugins/globaltools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -33,7 +33,7 @@
•`{i}gpromote `
globally promote user where you are admin.
- You can also set where To promote only groups or only channels or all.
+ You can also set where To promote only groups or only channels or in all.
Like. `gpromote group boss` ~ it promote repied user in all groups.
Or. `gpromote @username all sar` ~ it promote the users in all group and channel.
@@ -45,10 +45,29 @@ import os
from telethon import events
from telethon.tl.functions.channels import EditAdminRequest
+from telethon.tl.functions.contacts import BlockRequest, UnblockRequest
from telethon.tl.types import ChatAdminRights
from . import *
+_gpromote_rights = ChatAdminRights(
+ add_admins=False,
+ invite_users=True,
+ change_info=False,
+ ban_users=True,
+ delete_messages=True,
+ pin_messages=True,
+)
+
+_gdemote_rights = ChatAdminRights(
+ add_admins=False,
+ invite_users=False,
+ change_info=False,
+ ban_users=False,
+ delete_messages=False,
+ pin_messages=False,
+)
+
@ultroid_cmd(
pattern="gpromote ?(.*)",
@@ -83,14 +102,7 @@ async def _(e):
EditAdminRequest(
x.id,
user.id,
- ChatAdminRights(
- add_admins=False,
- invite_users=True,
- change_info=False,
- ban_users=True,
- delete_messages=True,
- pin_messages=True,
- ),
+ _gpromote_rights,
rank,
),
)
@@ -104,14 +116,7 @@ async def _(e):
EditAdminRequest(
x.id,
user.id,
- ChatAdminRights(
- add_admins=False,
- invite_users=True,
- change_info=False,
- ban_users=True,
- delete_messages=True,
- pin_messages=True,
- ),
+ _gpromote_rights,
rank,
),
)
@@ -125,14 +130,7 @@ async def _(e):
EditAdminRequest(
x.id,
user.id,
- ChatAdminRights(
- add_admins=False,
- invite_users=True,
- change_info=False,
- ban_users=True,
- delete_messages=True,
- pin_messages=True,
- ),
+ _gpromote_rights,
rank,
),
)
@@ -168,14 +166,7 @@ async def _(e):
EditAdminRequest(
x.id,
user,
- ChatAdminRights(
- add_admins=False,
- invite_users=True,
- change_info=False,
- ban_users=True,
- delete_messages=True,
- pin_messages=True,
- ),
+ _gpromote_rights,
rank,
),
)
@@ -189,14 +180,7 @@ async def _(e):
EditAdminRequest(
x.id,
user,
- ChatAdminRights(
- add_admins=False,
- invite_users=True,
- change_info=False,
- ban_users=True,
- delete_messages=True,
- pin_messages=True,
- ),
+ _gpromote_rights,
rank,
),
)
@@ -210,14 +194,7 @@ async def _(e):
EditAdminRequest(
x.id,
user,
- ChatAdminRights(
- add_admins=False,
- invite_users=True,
- change_info=False,
- ban_users=True,
- delete_messages=True,
- pin_messages=True,
- ),
+ _gpromote_rights,
rank,
),
)
@@ -258,14 +235,7 @@ async def _(e):
EditAdminRequest(
x.id,
user.id,
- ChatAdminRights(
- add_admins=False,
- invite_users=False,
- change_info=False,
- ban_users=False,
- delete_messages=False,
- pin_messages=False,
- ),
+ _gdemote_rights,
rank,
),
)
@@ -279,14 +249,7 @@ async def _(e):
EditAdminRequest(
x.id,
user.id,
- ChatAdminRights(
- add_admins=False,
- invite_users=False,
- change_info=False,
- ban_users=False,
- delete_messages=False,
- pin_messages=False,
- ),
+ _gdemote_rights,
rank,
),
)
@@ -300,14 +263,7 @@ async def _(e):
EditAdminRequest(
x.id,
user.id,
- ChatAdminRights(
- add_admins=False,
- invite_users=False,
- change_info=False,
- ban_users=False,
- delete_messages=False,
- pin_messages=False,
- ),
+ _gdemote_rights,
rank,
),
)
@@ -341,14 +297,7 @@ async def _(e):
EditAdminRequest(
x.id,
user,
- ChatAdminRights(
- add_admins=False,
- invite_users=False,
- change_info=False,
- ban_users=False,
- delete_messages=False,
- pin_messages=False,
- ),
+ _gdemote_rights,
rank,
),
)
@@ -362,14 +311,7 @@ async def _(e):
EditAdminRequest(
x.id,
user,
- ChatAdminRights(
- add_admins=False,
- invite_users=False,
- change_info=False,
- ban_users=False,
- delete_messages=False,
- pin_messages=False,
- ),
+ _gdemote_rights,
rank,
),
)
@@ -383,14 +325,7 @@ async def _(e):
EditAdminRequest(
x.id,
user,
- ChatAdminRights(
- add_admins=False,
- invite_users=False,
- change_info=False,
- ban_users=False,
- delete_messages=False,
- pin_messages=False,
- ),
+ _gdemote_rights,
rank,
),
)
@@ -424,8 +359,12 @@ async def _(e):
chats += 1
except BaseException:
pass
- ungban(userid)
- delete_gban_reason(userid)
+ try:
+ ungban(userid)
+ delete_gban_reason(userid)
+ await e.client(UnblockRequest(int(userid)))
+ except Exception as ex:
+ return await eor(xx, str(ex))
await xx.edit(
f"`Ungbanned` [{name}](tg://user?id={userid}) `in {chats} chats.\nRemoved from gbanwatch.`",
)
@@ -479,8 +418,12 @@ async def _(e):
chats += 1
except BaseException:
pass
- gban(userid)
- add_gban_reason(userid, reason)
+ try:
+ gban(userid)
+ add_gban_reason(userid, reason)
+ await e.client(BlockRequest(int(userid)))
+ except Exception as ex:
+ return await eor(xx, str(ex))
gb_msg = f"**#Gbanned** [{name}](tg://user?id={userid}) `in {chats} chats and added to gbanwatch!`"
if reason != "":
gb_msg += f"\n**Reason** - {reason}"
@@ -665,7 +608,7 @@ async def list_gengbanned(event):
name = (await ultroid.get_entity(int(i))).first_name
except BaseException:
name = i
- msg += "**User**: " + name + "\n"
+ msg += f"**User**: {name}\n"
reason = get_gban_reason(i)
if reason is not None or "":
msg += f"**Reason**: {reason}\n\n"
@@ -721,6 +664,3 @@ async def gstat_(e):
else:
msg += "not Globally Banned.**"
await xx.edit(msg)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/google.py b/plugins/google.py
index 844804d..7deed7b 100644
--- a/plugins/google.py
+++ b/plugins/google.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -25,6 +25,7 @@ from shutil import rmtree
import requests
from bs4 import BeautifulSoup as bs
from PIL import Image
+from pyUltroid.functions.google_image import googleimagesdownload
from search_engine_parser import GoogleSearch
from search_engine_parser.core.exceptions import NoResultsOrTrafficError as GoglError
@@ -66,23 +67,25 @@ async def goimg(event):
if not query:
return await eor(event, "`Give something to search...`")
nn = await eor(event, "`Processing Keep Patience...`")
+ lmt = 5
if ";" in query:
try:
lmt = int(query.split(";")[1])
query = query.split(";")[0]
- except BaseExceptaion:
- lmt = 5
- else:
- lmt = 5
- gi = googleimagesdownload()
- args = {
- "keywords": query,
- "limit": lmt,
- "format": "jpg",
- "output_directory": "./resources/downloads/",
- }
- pth = gi.download(args)
- ok = pth[0][query]
+ except BaseException:
+ pass
+ try:
+ gi = googleimagesdownload()
+ args = {
+ "keywords": query,
+ "limit": lmt,
+ "format": "jpg",
+ "output_directory": "./resources/downloads/",
+ }
+ pth = gi.download(args)
+ ok = pth[0][query]
+ except BaseException:
+ return await nn.edit("No Results Found :(")
await event.client.send_file(event.chat_id, ok, caption=query, album=True)
rmtree(f"./resources/downloads/{query}/")
await nn.delete()
@@ -133,6 +136,3 @@ async def reverse(event):
)
rmtree(f"./resources/downloads/{text}/")
os.remove(dl)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/greetings.py b/plugins/greetings.py
index 82c59ea..13473f6 100644
--- a/plugins/greetings.py
+++ b/plugins/greetings.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -31,6 +31,7 @@
"""
import os
+from pyUltroid.functions.greetings_db import *
from telegraph import upload_file as uf
from telethon.utils import get_display_name, pack_bot_file_id
@@ -60,6 +61,8 @@ async def setwel(event):
variable = uf(dl)
os.remove(dl)
m = "https://telegra.ph" + variable[0]
+ elif wut == "web":
+ m = None
else:
m = pack_bot_file_id(r.media)
if r.text:
@@ -93,11 +96,105 @@ async def listwel(event):
await event.delete()
+@ultroid_cmd(pattern="setgoodbye")
+async def setgb(event):
+ x = await eor(event, get_string("com_1"))
+ r = await event.get_reply_message()
+ if event.is_private:
+ return await eod(x, "Please use this in a group and not PMs!", time=10)
+ if r and r.media:
+ wut = mediainfo(r.media)
+ if wut.startswith(("pic", "gif")):
+ dl = await bot.download_media(r.media)
+ variable = uf(dl)
+ os.remove(dl)
+ m = "https://telegra.ph" + variable[0]
+ elif wut == "video":
+ if r.media.document.size > 8 * 1000 * 1000:
+ return await eod(x, "`Unsupported Media`")
+ else:
+ dl = await bot.download_media(r.media)
+ variable = uf(dl)
+ os.remove(dl)
+ m = "https://telegra.ph" + variable[0]
+ elif wut == "web":
+ m = None
+ else:
+ m = pack_bot_file_id(r.media)
+ if r.text:
+ add_goodbye(event.chat_id, r.message, m)
+ else:
+ add_goodbye(event.chat_id, None, m)
+ await eor(x, "`Goodbye note saved`")
+ elif r and r.text:
+ add_goodbye(event.chat_id, r.message, None)
+ await eor(x, "`Goodbye note saved`")
+ else:
+ await eod(x, "`Reply to message which u want to set as goodbye`")
+
+
+@ultroid_cmd(pattern="cleargoodbye$")
+async def clearwgb(event):
+ if not get_goodbye(event.chat_id):
+ await eod(event, "`No goodbye was set!`", time=5)
+ delete_goodbye(event.chat_id)
+ await eod(event, "`Goodbye Note Deleted`")
+
+
+@ultroid_cmd(pattern="getgoodbye$")
+async def listgd(event):
+ wel = get_goodbye(event.chat_id)
+ if not wel:
+ await eod(event, "`No goodbye was set!`", time=5)
+ msgg = wel["goodbye"]
+ med = wel["media"]
+ await event.reply(f"**Goodbye Note in this chat**\n\n`{msgg}`", file=med)
+ await event.delete()
+
+
@ultroid_bot.on(events.ChatAction())
async def _(event):
- wel = get_welcome(event.chat_id)
- if wel:
- if event.user_joined or event.user_added:
+ if event.user_left or event.user_kicked:
+ wel = get_goodbye(event.chat_id)
+ if wel:
+ user = await event.get_user()
+ chat = await event.get_chat()
+ title = chat.title if chat.title else "this chat"
+ pp = await event.client.get_participants(chat)
+ count = len(pp)
+ mention = f"[{get_display_name(user)}](tg://user?id={user.id})"
+ name = user.first_name
+ last = user.last_name
+ if last:
+ fullname = f"{name} {last}"
+ else:
+ fullname = name
+ uu = user.username
+ if uu:
+ username = f"@{uu}"
+ else:
+ username = mention
+ msgg = wel["goodbye"]
+ med = wel["media"]
+ userid = user.id
+ if msgg:
+ await event.reply(
+ msgg.format(
+ mention=mention,
+ group=title,
+ count=count,
+ name=name,
+ fullname=fullname,
+ username=username,
+ userid=userid,
+ ),
+ file=med,
+ )
+ else:
+ await event.reply(file=med)
+ elif event.user_joined or event.user_added:
+ wel = get_welcome(event.chat_id)
+ if wel:
user = await event.get_user()
chat = await event.get_chat()
title = chat.title if chat.title else "this chat"
@@ -135,100 +232,4 @@ async def _(event):
await event.reply(file=med)
-@ultroid_cmd(pattern="setgoodbye")
-async def setgb(event):
- x = await eor(event, get_string("com_1"))
- r = await event.get_reply_message()
- if event.is_private:
- return await eod(x, "Please use this in a group and not PMs!", time=10)
- if r and r.media:
- wut = mediainfo(r.media)
- if wut.startswith(("pic", "gif")):
- dl = await bot.download_media(r.media)
- variable = uf(dl)
- os.remove(dl)
- m = "https://telegra.ph" + variable[0]
- elif wut == "video":
- if r.media.document.size > 8 * 1000 * 1000:
- return await eod(x, "`Unsupported Media`")
- else:
- dl = await bot.download_media(r.media)
- variable = uf(dl)
- os.remove(dl)
- m = "https://telegra.ph" + variable[0]
- else:
- m = pack_bot_file_id(r.media)
- if r.text:
- add_goodbye(event.chat_id, r.message, m)
- else:
- add_goodbye(event.chat_id, None, m)
- await eor(x, "`Goodbye note saved`")
- elif r and r.text:
- add_goodbye(event.chat_id, r.message, None)
- await eor(x, "`Goodbye note saved`")
- else:
- await eod(x, "`Reply to message which u want to set as goodbye`")
-
-
-@ultroid_cmd(pattern="cleargoodbye$")
-async def clearwgb(event):
- if not get_goodbye(event.chat_id):
- await eod(event, "`No goodbye was set!`", time=5)
- delete_goodbye(event.chat_id)
- await eod(event, "`Goodbye Note Deleted`")
-
-
-@ultroid_cmd(pattern="getgoodbye$")
-async def listgd(event):
- wel = get_goodbye(event.chat_id)
- if not wel:
- await eod(event, "`No goodbye was set!`", time=5)
- msgg = wel["goodbye"]
- med = wel["media"]
- await event.reply(f"**Goodbye Note in this chat**\n\n`{msgg}`", file=med)
- await event.delete()
-
-
-@ultroid_bot.on(events.ChatAction())
-async def _(event):
- wel = get_goodbye(event.chat_id)
- if wel:
- if event.user_left or event.user_kicked:
- user = await event.get_user()
- chat = await event.get_chat()
- title = chat.title if chat.title else "this chat"
- pp = await event.client.get_participants(chat)
- count = len(pp)
- mention = f"[{get_display_name(user)}](tg://user?id={user.id})"
- name = user.first_name
- last = user.last_name
- if last:
- fullname = f"{name} {last}"
- else:
- fullname = name
- uu = user.username
- if uu:
- username = f"@{uu}"
- else:
- username = mention
- msgg = wel["goodbye"]
- med = wel["media"]
- userid = user.id
- if msgg:
- await event.reply(
- msgg.format(
- mention=mention,
- group=title,
- count=count,
- name=name,
- fullname=fullname,
- username=username,
- userid=userid,
- ),
- file=med,
- )
- else:
- await event.reply(file=med)
-
-
HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}" + Note})
diff --git a/plugins/groups.py b/plugins/groups.py
index a4b46d1..f30f6c8 100644
--- a/plugins/groups.py
+++ b/plugins/groups.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -8,6 +8,9 @@
"""
✘ Commands Available -
+• `{i}setgpic `
+ Set Profile photo of Group.
+
• `{i}unbanall`
Unban all Members of a group.
@@ -16,7 +19,7 @@
"""
-from telethon.tl.functions.channels import EditBannedRequest
+from telethon.tl.functions.channels import EditBannedRequest, EditPhotoRequest
from telethon.tl.types import (
ChannelParticipantsKicked,
ChatBannedRights,
@@ -31,6 +34,25 @@ from telethon.tl.types import (
from . import *
+@ultroid_cmd(pattern="setgpic$", groups_only=True, admins_only=True)
+async def _(ult):
+ if not ult.is_reply:
+ return await eod(ult, "`Reply to a Media..`")
+ reply_message = await ult.get_reply_message()
+ replfile = await reply_message.download_media()
+ file = await ultroid_bot.upload_file(replfile)
+ mediain = mediainfo(reply_message.media)
+ try:
+ if "pic" in mediain:
+ await ultroid_bot(EditPhotoRequest(ult.chat_id, file))
+ else:
+ return await eod(ult, "`Invalid MEDIA Type !`")
+ await eod(ult, "`Group Photo has Successfully Changed !`")
+ except Exception as ex:
+ await eod(ult, "Error occured.\n`{}`".format(str(ex)))
+ os.remove(replfile)
+
+
@ultroid_cmd(
pattern="unbanall$",
groups_only=True,
@@ -205,6 +227,3 @@ async def _(event):
required_string += f"**••Empty** `Name with deleted Account`\n"
required_string += f"**••None** `Last Seen A Long Time Ago`\n"
await eod(xx, required_string)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/imagetools.py b/plugins/imagetools.py
index 10f7880..e1aa804 100644
--- a/plugins/imagetools.py
+++ b/plugins/imagetools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -572,6 +572,3 @@ async def ultd(event):
os.remove("ult.png")
os.remove("ult.webp")
os.remove(ultt)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/locks.py b/plugins/locks.py
index a58004e..a53d186 100644
--- a/plugins/locks.py
+++ b/plugins/locks.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -46,6 +46,3 @@ async def unlckho(e):
return await eod(e, "`Incorrect Input`")
await ultroid_bot(EditChatDefaultBannedRightsRequest(e.chat_id, ml))
await eor(e, f"Unlocked - `{mat}` ! ")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/logo.py b/plugins/logo.py
index 9ef888b..e89ac10 100644
--- a/plugins/logo.py
+++ b/plugins/logo.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -18,7 +18,6 @@
import glob
import os
import random
-import time
from PIL import Image, ImageDraw, ImageFont
from telethon.tl.types import InputMessagesFilterPhotos
@@ -51,9 +50,8 @@ async def logo_gen(event):
pics.append(i)
id_ = random.choice(pics)
bg_ = await id_.download_media()
- fpath_ = "./resources/fonts/"
- f = random.choice(os.listdir(fpath_))
- font_ = fpath_ + f
+ fpath_ = glob.glob("resources/fonts/*")
+ font_ = random.choice(fpath_)
if not bg_:
pics = []
async for i in ultroid.iter_messages(
@@ -95,13 +93,11 @@ async def logo_gen(event):
img.save(flnme, "png")
await xx.edit("`Done!`")
if os.path.exists(flnme):
- tt = time.time()
- up = await uploader(flnme, flnme, tt, xx, "Uploading...")
- await ultroid.send_file(
+ await event.client.send_file(
event.chat_id,
- file=up,
+ file=flnme,
caption=f"Logo by [{OWNER_NAME}](tg://user?id={OWNER_ID})",
- foce_document=True,
+ force_document=True,
)
os.remove(flnme)
await xx.delete()
@@ -110,6 +106,3 @@ async def logo_gen(event):
if os.path.exists(font_):
if not font_.startswith("resources/fonts"):
os.remove(font_)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/mediainfo.py b/plugins/mediainfo.py
index 3bff7f2..066a86f 100644
--- a/plugins/mediainfo.py
+++ b/plugins/mediainfo.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -56,6 +56,3 @@ async def mi(e):
f"**[{xx}]({url})**\n\n[More Explained Info]({urll})", link_preview=False
)
os.remove(naam)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/megadl.py b/plugins/megadl.py
index 47b5961..3bc61f3 100644
--- a/plugins/megadl.py
+++ b/plugins/megadl.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -12,7 +12,6 @@
It Downloads and Upload Files from mega.nz links.
"""
-import glob
import time
from datetime import datetime
@@ -30,48 +29,32 @@ async def _(e):
xx = await eor(e, f"Processing...\nTo Check Progress : `{HNDLR}ls mega`")
s = datetime.now()
x, y = await bash(f"megadl {link} --path mega")
- afl = glob.glob("mega/*")
- ok = [*sorted(afl)]
+ ok = get_all_files("mega")
tt = time.time()
c = 0
- k = []
- for x in ok:
- if os.path.isdir(x):
- k.append(x)
- break
- if k:
- await xx.edit(
- "Your Unzipped File Saved in `mega` folder.\nDo `{i}ls mega` and browse storage\nUse `{i}ul ` To upload.".format(
- i=HNDLR
+ for kk in ok:
+ try:
+ res = await uploader(kk, kk, tt, xx, "Uploading...")
+ await ultroid_bot.send_file(
+ e.chat_id,
+ res,
+ caption="`" + kk.split("/")[-1] + "`",
+ force_document=True,
+ thumb="resources/extras/ultroid.jpg",
)
- )
- else:
- for kk in ok:
- try:
- res = await uploader(kk, kk, tt, xx, "Uploading...")
- await ultroid_bot.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 ultroid_bot.send_message(
- e.chat_id,
- f"Downloaded And Uploaded Total - `{c}` files of `{humanbytes(size)}` in `{t}`",
- )
- os.system("rm -rf mega")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
+ 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 ultroid_bot.send_message(
+ e.chat_id,
+ f"Downloaded And Uploaded Total - `{c}` files of `{humanbytes(size)}` in `{t}`",
+ )
+ os.system("rm -rf mega")
diff --git a/plugins/mute.py b/plugins/mute.py
index c8104d9..1b12675 100644
--- a/plugins/mute.py
+++ b/plugins/mute.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -40,6 +40,8 @@ from . import *
async def watcher(event):
if is_muted(f"{event.sender_id}_{event.chat_id}"):
await event.delete()
+ if event.via_bot and is_muted(f"{event.via_bot_id}_{event.chat_id}"):
+ await event.delete()
@ultroid_cmd(
@@ -248,6 +250,3 @@ async def _(e):
)
except BaseException as m:
await eod(xx, f"`{str(m)}`")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/notes.py b/plugins/notes.py
index d973042..427782d 100644
--- a/plugins/notes.py
+++ b/plugins/notes.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -30,11 +30,8 @@ from telethon.utils import pack_bot_file_id
from . import *
-@ultroid_cmd(pattern="addnote ?(.*)")
+@ultroid_cmd(pattern="addnote ?(.*)", admins_only=True)
async def an(e):
- if e.is_group:
- if not e._chat.admin_rights:
- return await eod(e, "`You Are Not Admin Here.", time=5)
wrd = (e.pattern_match.group(1)).lower()
wt = await e.get_reply_message()
chat = e.chat_id
@@ -68,11 +65,8 @@ async def an(e):
await eor(e, f"Done Note : `#{wrd}` saved.")
-@ultroid_cmd(pattern="remnote ?(.*)")
+@ultroid_cmd(pattern="remnote ?(.*)", admins_only=True)
async def rn(e):
- if e.is_group:
- if not e._chat.admin_rights:
- return await eod(e, "`You Are Not Admin Here.", time=5)
wrd = (e.pattern_match.group(1)).lower()
chat = e.chat_id
if not wrd:
@@ -83,11 +77,8 @@ async def rn(e):
await eor(e, f"Done Note: `#{wrd}` Removed.")
-@ultroid_cmd(pattern="listnote$")
+@ultroid_cmd(pattern="listnote$", admins_only=True)
async def lsnote(e):
- if e.is_group:
- if not e._chat.admin_rights:
- return await eod(e, "`You Are Not Admin Here.", time=5)
x = list_note(e.chat_id)
if x:
sd = "Notes Found In This Chats Are\n\n"
@@ -112,6 +103,3 @@ async def notes(e):
msg = k["msg"]
media = k["media"]
await e.reply(msg, file=media)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/nsfw_filter.py b/plugins/nsfw_filter.py
new file mode 100644
index 0000000..8df5482
--- /dev/null
+++ b/plugins/nsfw_filter.py
@@ -0,0 +1,135 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+•`{i}addnsfw `
+ If someone sends 18+ content it will delete and takes action.
+
+•`{i}remnsfw`
+ Remove Chat from nsfw filter.
+"""
+
+import os
+
+import requests
+from ProfanityDetector import detector
+
+from . import *
+
+
+@ultroid_cmd(pattern="addnsfw ?(.*)", admins_only=True)
+async def addnsfw(e):
+ if not udB.get("DEEP_API"):
+ return await eor(
+ e, f"Get Api from deepai.org and Add It `{HNDLR}setredis DEEP_API your-api`"
+ )
+ action = e.pattern_match.group(1)
+ if not action:
+ action = "mute"
+ elif ("ban" or "kick" or "mute") not in action:
+ action = "mute"
+ nsfw_chat(e.chat_id, action)
+ await eor(e, "Added This Chat To Nsfw Filter")
+
+
+@ultroid_cmd(pattern="remnsfw", admins_only=True)
+async def remnsfw(e):
+ rem_nsfw(e.chat_id)
+ await eor(e, "Removed This Chat from Nsfw Filter.")
+
+
+NWARN = {}
+
+
+@ultroid_bot.on(events.NewMessage(incoming=True))
+async def checknsfw(e):
+ chat = e.chat_id
+ action = is_nsfw(chat)
+ if action and udB.get("DEEP_API") and e.media:
+ pic, name, nsfw = "", "", 0
+ try:
+ pic = await ultroid_bot.download_media(e.media, thumb=-1)
+ except BaseException:
+ pass
+ if e.file:
+ name = e.file.name
+ if name:
+ x, y = detector(name)
+ if y:
+ nsfw += 1
+ if pic and not nsfw:
+ r = requests.post(
+ "https://api.deepai.org/api/nsfw-detector",
+ files={
+ "image": open(pic, "rb"),
+ },
+ headers={"api-key": udB["DEEP_API"]},
+ )
+ k = float((r.json()["output"]["nsfw_score"]))
+ score = int(k * 100)
+ if score > 45:
+ nsfw += 1
+ os.remove(pic)
+ if nsfw:
+ await e.delete()
+ if NWARN.get(e.sender_id):
+ count = NWARN[e.sender_id] + 1
+ if count < 3:
+ 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}",
+ )
+ if "mute" in action:
+ try:
+ await ultroid_bot.edit_permissions(
+ chat, e.sender_id, until_date=None, send_messages=False
+ )
+ await ultroid_bot.send_message(
+ chat,
+ f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\n**Action Taken** : {action}",
+ )
+ 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}.",
+ )
+ elif "ban" in action:
+ try:
+ await ultroid_bot.edit_permissions(
+ chat, e.sender_id, view_messages=False
+ )
+ await ultroid_bot.send_message(
+ chat,
+ f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\n**Action Taken** : {action}",
+ )
+ 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}.",
+ )
+ elif "kick" in action:
+ try:
+ await ultroid_bot.kick_participant(chat, e.sender_id)
+ await ultroid_bot.send_message(
+ chat,
+ f"NSFW Warn 3/3 to [{e.sender.first_name}](tg://user?id={e.sender_id})\n\n**Action Taken** : {action}",
+ )
+ 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}.",
+ )
+ 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}",
+ )
diff --git a/plugins/pdftools.py b/plugins/pdftools.py
index ecec1a6..7e5e193 100644
--- a/plugins/pdftools.py
+++ b/plugins/pdftools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -10,9 +10,11 @@
• `{i}pdf `
Extract nd Send page as a Image.(note-: For Extraction all pages just use .pdf)
+ You Can use multi pages too like `{i}pdf 1-7`
• `{i}pdtext `
Extract Text From the Pdf.(note-: For Extraction all text just use .pdtext)
+ You Can use multi pages too like `{i}pdf 1-7`
• `{i}pdscan `
It scan, crop nd send img as pdf.
@@ -81,7 +83,21 @@ async def pdfseimg(event):
shutil.rmtree("pdf")
os.mkdir("pdf")
await xx.delete()
- if msg:
+ elif "-" in msg:
+ ok = int(msg.split("-")[-1]) - 1
+ for o in range(ok):
+ pw = PdfFileWriter()
+ pw.addPage(pdf.getPage(o))
+ with open(os.path.join("ult.png"), "wb") as f:
+ pw.write(f)
+ await event.client.send_file(
+ event.chat_id,
+ "ult.png",
+ reply_to=event.reply_to_msg_id,
+ )
+ os.remove("ult.png")
+ os.remove(pdfp)
+ elif msg:
o = int(msg) - 1
pw = PdfFileWriter()
pw.addPage(pdf.getPage(o))
@@ -136,8 +152,8 @@ async def pdfsetxt(event):
os.remove(text)
os.remove(dl)
return
- if "_" in msg:
- u, d = msg.split("_")
+ if "-" in msg:
+ u, d = msg.split("-")
a = PdfFileReader(dl)
str = ""
for i in range(int(u) - 1, int(d)):
@@ -319,6 +335,3 @@ async def sendpdf(event):
os.remove(ok)
shutil.rmtree("pdf/")
os.makedirs("pdf/")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/pinterest.py b/plugins/pinterest.py
index 7037638..9a18716 100644
--- a/plugins/pinterest.py
+++ b/plugins/pinterest.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -55,6 +55,3 @@ async def pinterest(e):
else:
await e.delete()
await e.client.send_file(e.chat_id, hulu[0]["href"], caption=f"Pin:- {m}")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/pmpermit.py b/plugins/pmpermit.py
index 70784d0..f6f6afd 100644
--- a/plugins/pmpermit.py
+++ b/plugins/pmpermit.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -60,22 +60,16 @@ UND = get_string("pmperm_1")
if not Redis("PM_TEXT"):
UNAPPROVED_MSG = """
**PMSecurity of {ON}!**
-
{UND}
-
You have {warn}/{twarn} warnings!"""
else:
UNAPPROVED_MSG = (
"""
**PMSecurity of {ON}!**"""
f"""
-
{Redis("PM_TEXT")}
"""
"""
-
-{UND}
-
You have {warn}/{twarn} warnings!"""
)
@@ -97,6 +91,8 @@ PMCMDS = [
f"{hndlr}block",
f"{hndlr}unblock",
]
+
+_not_approved = {}
# =================================================================
@@ -110,7 +106,7 @@ async def _(e):
nolog_user(str(e.chat_id))
return await eod(e, "`Now I Will log msgs from here.`", time=3)
else:
- return await eod(e, "`Wasn logging msgs from here.`", time=3)
+ return await eod(e, "`Wasn't logging msgs from here.`", time=3)
@ultroid_cmd(
@@ -148,7 +144,7 @@ async def permitpm(event):
sett = Redis("PMSETTING")
if sett is None:
sett = True
-if sett == "True" and sett != "False":
+if sett == "True":
@ultroid_bot.on(
events.NewMessage(
@@ -179,7 +175,7 @@ if sett == "True" and sett != "False":
name0 = str(name.first_name)
await asst.send_message(
int(udB.get("LOG_CHANNEL")),
- f"#AutoApproved\nßecoz of outgoing msg\nUser - [{name0}](tg://user?id={e.chat_id})",
+ f"#AutoApproved\n**OutGoing Message.**\nUser - [{name0}](tg://user?id={e.chat_id})",
)
@ultroid_bot.on(
@@ -198,7 +194,7 @@ if sett == "True" and sett != "False":
if not apprv and event.text != UND:
if Redis("MOVE_ARCHIVE") == "True":
try:
- await event.client.edit_folder(user.id, folder=1)
+ await ultroid.edit_folder(user.id, folder=1)
except BaseException:
pass
if event.media:
@@ -213,81 +209,42 @@ if sett == "True" and sett != "False":
count = len(get_approved())
try:
wrn = COUNT_PM[user.id] + 1
+ await asst.edit_message(
+ int(udB.get("LOG_CHANNEL")),
+ _not_approved[user.id],
+ f"Incoming PM from {mention} with {wrn}/{WARNS} warning!",
+ buttons=[
+ Button.inline("Approve PM", data=f"approve_{user.id}"),
+ Button.inline("Block PM", data=f"block_{user.id}"),
+ ],
+ )
except KeyError:
- try:
- await asst.send_message(
- int(udB.get("LOG_CHANNEL")),
- f"Incoming PM from {mention}!",
- buttons=[
- Button.inline("Approve PM", data=f"approve_{user.id}"),
- Button.inline("Block PM", data=f"block_{user.id}"),
- ],
- )
- except BaseException:
- await ultroid.send_message(
- int(udB.get("LOG_CHANNEL")), f"Incoming PM from {mention}!"
- )
+ _not_approved[user.id] = await asst.send_message(
+ int(udB.get("LOG_CHANNEL")),
+ f"Incoming PM from {mention} with 1/{WARNS} warning!",
+ buttons=[
+ Button.inline("Approve PM", data=f"approve_{user.id}"),
+ Button.inline("Block PM", data=f"block_{user.id}"),
+ ],
+ )
wrn = 1
if user.id in LASTMSG:
prevmsg = LASTMSG[user.id]
if event.text != prevmsg:
if "PMSecurity" in event.text:
return
- async for message in event.client.iter_messages(
+ async for message in ultroid.iter_messages(
user.id,
search=UND,
):
await message.delete()
- async for message in event.client.iter_messages(
+ async for message in ultroid.iter_messages(
user.id,
search=UNS,
):
await message.delete()
- await event.client.send_file(
- user.id,
- PMPIC,
- caption=UNAPPROVED_MSG.format(
- ON=OWNER_NAME,
- warn=wrn,
- twarn=WARNS,
- UND=UND,
- name=name,
- fullname=fullname,
- username=username,
- count=count,
- mention=mention,
- ),
- )
- elif event.text == prevmsg:
- async for message in event.client.iter_messages(
- user.id,
- search=UND,
- ):
- await message.delete()
- await event.client.send_file(
- user.id,
- PMPIC,
- caption=UNAPPROVED_MSG.format(
- ON=OWNER_NAME,
- warn=wrn,
- twarn=WARNS,
- UND=UND,
- name=name,
- fullname=fullname,
- username=username,
- count=count,
- mention=mention,
- ),
- )
- LASTMSG.update({user.id: event.text})
- else:
- async for message in event.client.iter_messages(user.id, search=UND):
- await message.delete()
- await event.client.send_file(
- user.id,
- PMPIC,
- caption=UNAPPROVED_MSG.format(
+ message_ = UNAPPROVED_MSG.format(
ON=OWNER_NAME,
warn=wrn,
twarn=WARNS,
@@ -297,7 +254,53 @@ if sett == "True" and sett != "False":
username=username,
count=count,
mention=mention,
- ),
+ )
+ await ultroid.send_file(
+ user.id,
+ PMPIC,
+ caption=message_,
+ )
+ elif event.text == prevmsg:
+ async for message in ultroid.iter_messages(
+ user.id,
+ search=UND,
+ ):
+ await message.delete()
+ message_ = UNAPPROVED_MSG.format(
+ ON=OWNER_NAME,
+ warn=wrn,
+ twarn=WARNS,
+ UND=UND,
+ name=name,
+ fullname=fullname,
+ username=username,
+ count=count,
+ mention=mention,
+ )
+ await ultroid.send_file(
+ user.id,
+ PMPIC,
+ caption=message_,
+ )
+ LASTMSG.update({user.id: event.text})
+ else:
+ async for message in ultroid.iter_messages(user.id, search=UND):
+ await message.delete()
+ message_ = UNAPPROVED_MSG.format(
+ ON=OWNER_NAME,
+ warn=wrn,
+ twarn=WARNS,
+ UND=UND,
+ name=name,
+ fullname=fullname,
+ username=username,
+ count=count,
+ mention=mention,
+ )
+ await ultroid.send_file(
+ user.id,
+ PMPIC,
+ caption=message_,
)
LASTMSG.update({user.id: event.text})
if user.id not in COUNT_PM:
@@ -305,24 +308,25 @@ if sett == "True" and sett != "False":
else:
COUNT_PM[user.id] = COUNT_PM[user.id] + 1
if COUNT_PM[user.id] >= WARNS:
- async for message in event.client.iter_messages(user.id, search=UND):
+ async for message in ultroid.iter_messages(user.id, search=UND):
await message.delete()
await event.respond(UNS)
try:
del COUNT_PM[user.id]
del LASTMSG[user.id]
except KeyError:
- await event.client.send_message(
+ await asst.send_message(
int(udB.get("LOG_CHANNEL")),
"PMPermit is messed! Pls restart the bot!!",
)
return LOGS.info("COUNT_PM is messed.")
- await event.client(BlockRequest(user.id))
- await event.client(ReportSpamRequest(peer=user.id))
- name = await event.client.get_entity(user.id)
+ await ultroid(BlockRequest(user.id))
+ await ultroid(ReportSpamRequest(peer=user.id))
+ name = await ultroid.get_entity(user.id)
name0 = str(name.first_name)
- await event.client.send_message(
+ await asst.edit_message(
int(udB.get("LOG_CHANNEL")),
+ _not_approved[user.id],
f"[{name0}](tg://user?id={user.id}) was Blocked for spamming.",
)
@@ -365,13 +369,18 @@ if sett == "True" and sett != "False":
await apprvpm.client.edit_folder(uid, folder=0)
except BaseException:
pass
- await apprvpm.edit(f"[{name0}](tg://user?id={uid}) `approved to PM!`")
- await asyncio.sleep(3)
- await apprvpm.delete()
+ await eod(apprvpm, f"[{name0}](tg://user?id={uid}) `approved to PM!`")
+ await asst.edit_message(
+ int(udB.get("LOG_CHANNEL")),
+ _not_approved[uid],
+ f"#APPROVED\n\n`User: `[{name0}](tg://user?id={uid})",
+ buttons=[
+ Button.inline("Disapprove PM", data=f"disapprove_{uid}"),
+ Button.inline("Block", data=f"block_{uid}"),
+ ],
+ )
else:
- await apprvpm.edit("`User may already be approved.`")
- await asyncio.sleep(5)
- await apprvpm.delete()
+ await eod(apprvpm, "`User may already be approved.`")
elif apprvpm.is_private:
user = await apprvpm.get_chat()
aname = await apprvpm.client.get_entity(user.id)
@@ -388,25 +397,22 @@ if sett == "True" and sett != "False":
await apprvpm.client.edit_folder(uid, folder=0)
except BaseException:
pass
- await apprvpm.edit(f"[{name0}](tg://user?id={uid}) `approved to PM!`")
+ await eod(apprvpm, f"[{name0}](tg://user?id={uid}) `approved to PM!`")
async for message in apprvpm.client.iter_messages(user.id, search=UND):
await message.delete()
async for message in apprvpm.client.iter_messages(user.id, search=UNS):
await message.delete()
- await asyncio.sleep(3)
- await apprvpm.delete()
- await apprvpm.client.send_message(
+ await asst.edit_message(
int(udB.get("LOG_CHANNEL")),
- f"#APPROVED\nUser: [{name0}](tg://user?id={uid})",
+ _not_approved[uid],
+ f"#APPROVED\n\n`User: `[{name0}](tg://user?id={uid})",
+ buttons=[
+ Button.inline("Disapprove PM", data=f"disapprove_{uid}"),
+ Button.inline("Block", data=f"block_{uid}"),
+ ],
)
else:
- await apprvpm.edit("`User may already be approved.`")
- await asyncio.sleep(5)
- await apprvpm.delete()
- await apprvpm.client.send_message(
- int(udB.get("LOG_CHANNEL")),
- f"#APPROVED\nUser: [{name0}](tg://user?id={uid})",
- )
+ await eod(apprvpm, "`User may already be approved.`")
else:
await apprvpm.edit(NO_REPLY)
@@ -424,13 +430,22 @@ if sett == "True" and sett != "False":
"`Lol, He is my Developer\nHe Can't Be DisApproved.`",
)
name0 = str(replied_user.first_name)
- if is_approved(replied_user.id):
- disapprove_user(replied_user.id)
+ if is_approved(aname):
+ disapprove_user(aname)
await e.edit(
f"[{name0}](tg://user?id={replied_user.id}) `Disaproved to PM!`",
)
await asyncio.sleep(5)
await e.delete()
+ await asst.edit_message(
+ int(udB.get("LOG_CHANNEL")),
+ _not_approved[aname],
+ f"#DISAPPROVED\n\n[{name0}](tg://user?id={bbb.id}) `was disapproved to PM you.`",
+ buttons=[
+ Button.inline("Approve PM", data=f"approve_{aname}"),
+ Button.inline("Block", data=f"block_{aname}"),
+ ],
+ )
else:
await e.edit(
f"[{name0}](tg://user?id={replied_user.id}) was never approved!",
@@ -451,9 +466,14 @@ if sett == "True" and sett != "False":
await e.edit(f"[{name0}](tg://user?id={bbb.id}) `Disaproved to PM!`")
await asyncio.sleep(5)
await e.delete()
- await e.client.send_message(
+ await asst.edit_message(
int(udB.get("LOG_CHANNEL")),
- f"[{name0}](tg://user?id={bbb.id}) was disapproved to PM you.",
+ _not_approved[bbb.id],
+ f"#DISAPPROVED\n\n[{name0}](tg://user?id={bbb.id}) `was disapproved to PM you.`",
+ buttons=[
+ Button.inline("Approve PM", data=f"approve_{bbb.id}"),
+ Button.inline("Block", data=f"block_{bbb.id}"),
+ ],
)
else:
await e.edit(f"[{name0}](tg://user?id={bbb.id}) was never approved!")
@@ -489,9 +509,11 @@ async def blockpm(block):
disapprove_user(user)
except AttributeError:
pass
- await ultroid_bot.send_message(
+ await asst.edit_message(
int(udB.get("LOG_CHANNEL")),
- f"#BLOCKED\nUser: [{aname.first_name}](tg://user?id={user})",
+ _not_approved[user],
+ f"#BLOCKED\n\n[{aname.first_name}](tg://user?id={user}) has been **blocked**.",
+ buttons=Button.inline("UnBlock", data=f"unblock_{user}"),
)
@@ -513,6 +535,15 @@ async def unblockpm(unblock):
await eor(unblock, f"`{aname.first_name} has been UnBlocked!`")
except Exception as et:
await eod(unblock, f"ERROR - {str(et)}")
+ await asst.edit_message(
+ int(udB.get("LOG_CHANNEL")),
+ _not_approved[user],
+ f"#UNBLOCKED\n\n[{aname.first_name}](tg://user?id={user}) has been **unblocked**.",
+ buttons=[
+ Button.inline("Block", data=f"block_{user}"),
+ Button.inline("Close", data="deletedissht"),
+ ],
+ )
@callback(
@@ -536,7 +567,7 @@ async def apr_in(event):
except BaseException:
user_name = ""
await event.edit(
- f"[{user_name}](tg://user?id={uid}) `approved to PM!`",
+ f"#APPROVED\n\n[{user_name}](tg://user?id={uid}) `approved to PM!`",
buttons=[
Button.inline("Disapprove PM", data=f"disapprove_{uid}"),
Button.inline("Block", data=f"block_{uid}"),
@@ -575,7 +606,7 @@ async def disapr_in(event):
except BaseException:
user_name = ""
await event.edit(
- f"[{user_name}](tg://user?id={uid}) `disapproved from PMs!`",
+ f"#DISAPPROVED\n\n[{user_name}](tg://user?id={uid}) `disapproved from PMs!`",
buttons=[
Button.inline("Approve PM", data=f"approve_{uid}"),
Button.inline("Block", data=f"block_{uid}"),
@@ -610,7 +641,7 @@ async def blck_in(event):
user_name = ""
await event.answer("Blocked.")
await event.edit(
- f"[{user_name}](tg://user?id={uid}) has been **blocked!**",
+ f"#BLOCKED\n\n[{user_name}](tg://user?id={uid}) has been **blocked!**",
buttons=Button.inline("UnBlock", data=f"unblock_{uid}"),
)
@@ -630,7 +661,7 @@ async def unblck_in(event):
user_name = ""
await event.answer("UnBlocked.")
await event.edit(
- f"[{user_name}](tg://user?id={uid}) has been **unblocked!**",
+ f"#UNBLOCKED\n\n[{user_name}](tg://user?id={uid}) has been **unblocked!**",
buttons=[
Button.inline("Block", data=f"block_{uid}"),
Button.inline("Close", data="deletedissht"),
@@ -642,6 +673,3 @@ async def unblck_in(event):
async def ytfuxist(e):
await e.answer("Deleted.")
await e.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/polls.py b/plugins/polls.py
index dbbfed2..5c48c22 100644
--- a/plugins/polls.py
+++ b/plugins/polls.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -69,6 +69,3 @@ async def uri_poll(e):
),
)
await m.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/profanity_filter.py b/plugins/profanity_filter.py
new file mode 100644
index 0000000..3f4c62c
--- /dev/null
+++ b/plugins/profanity_filter.py
@@ -0,0 +1,44 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+•`{i}addprofanity`
+ If someone sends bad word in a chat, Then bot will delete that message.
+
+•`{i}remprofanity`
+ From chat from Profanity list.
+
+"""
+
+
+from ProfanityDetector import detector
+
+from . import *
+
+
+@ultroid_cmd(pattern="addprofanity$", admins_only=True)
+async def addp(e):
+ # action features not added yet or not needed ig 😂😂
+ profan_chat(e.chat_id, "mute")
+ await eod(e, "`Added This Chat for Profanity Filtering!`", time=10)
+
+
+@ultroid_cmd(pattern="remprofanity", admins_only=True)
+async def remp(e):
+ rem_profan(e.chat_id)
+ await eod(e, "`Removed This Chat from Profanity Filtering!`", time=10)
+
+
+@ultroid_bot.on(events.NewMessage(incoming=True))
+async def checkprofan(e):
+ chat = e.chat_id
+ if is_profan(chat) and e.text:
+ x, y = detector(e.text)
+ if y:
+ await e.delete()
diff --git a/plugins/profile.py b/plugins/profile.py
index 26806c3..c6beb29 100644
--- a/plugins/profile.py
+++ b/plugins/profile.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -174,6 +174,3 @@ async def gpoto(e):
os.remove(okla)
except Exception as er:
await eor(e, f"ERROR - {str(er)}")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/qrcode.py b/plugins/qrcode.py
index 3ce61a8..018e0a5 100644
--- a/plugins/qrcode.py
+++ b/plugins/qrcode.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -105,6 +105,3 @@ async def decod(e):
except BaseException:
await kk.edit("`Reply To Media in Which Qr image present.`")
os.remove(dl)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/randomuser.py b/plugins/randomuser.py
new file mode 100644
index 0000000..d8534af
--- /dev/null
+++ b/plugins/randomuser.py
@@ -0,0 +1,23 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+• `{i}randomuser`
+ Generate details about a random user.
+"""
+
+from . import *
+
+
+@ultroid_cmd(pattern="randomuser")
+async def _gen_data(event):
+ x = await eor(event, get_string("com_1"))
+ msg, pic = get_random_user_data()
+ await ultroid_bot.send_file(event.chat_id, file=pic, caption=msg)
+ await x.delete()
diff --git a/plugins/redis.py b/plugins/redis.py
index efdd5f2..38aff0b 100644
--- a/plugins/redis.py
+++ b/plugins/redis.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -92,6 +92,3 @@ async def _(ult):
await ok.edit("Something went wrong ...")
else:
await ok.edit("Key not found")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/resize.py b/plugins/resize.py
index cc98dbb..16ac1c7 100644
--- a/plugins/resize.py
+++ b/plugins/resize.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -60,6 +60,3 @@ async def size(e):
await ultroid_bot.send_file(e.chat_id, img)
os.remove(img)
await k.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/saavn.py b/plugins/saavn.py
index 530fbe0..30e1ebf 100644
--- a/plugins/saavn.py
+++ b/plugins/saavn.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -15,6 +15,7 @@
import os
import time
+from json.decoder import JSONDecodeError
from urllib.request import urlretrieve
import requests as r
@@ -23,7 +24,9 @@ from telethon.tl.types import DocumentAttributeAudio
from . import *
-@ultroid_cmd(pattern="saavn ?(.*)")
+@ultroid_cmd(
+ pattern="saavn ?(.*)",
+)
async def siesace(e):
song = e.pattern_match.group(1)
if not song:
@@ -36,11 +39,16 @@ async def siesace(e):
k = (r.get(url)).json()[0]
except IndexError:
return await eod(lol, "`Song Not Found.. `")
- title = k["song"]
- urrl = k["media_url"]
- img = k["image"]
- duration = k["duration"]
- singers = k["singers"]
+ except Exception as ex:
+ return await eod(lol, f"`{str(ex)}`")
+ try:
+ title = k["song"]
+ urrl = k["media_url"]
+ img = k["image"]
+ duration = k["duration"]
+ singers = k["primary_artists"]
+ except Exception as ex:
+ return await eod(lol, f"`{str(ex)}`")
urlretrieve(urrl, title + ".mp3")
urlretrieve(img, title + ".jpg")
okk = await uploader(
@@ -65,4 +73,63 @@ async def siesace(e):
os.remove(title + ".jpg")
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
+@ultroid_cmd(
+ pattern="deez ?(.*)",
+)
+async def siesace(e):
+ song = e.pattern_match.group(1)
+ if not song:
+ return await eod(e, "Give me Something to Search")
+ quality = "mp3"
+ if "| flac" in song:
+ try:
+ song = song.split("|")[0]
+ quality = "flac"
+ except Exception as ex:
+ await eod(e, f"`{str(ex)}`")
+ hmm = time.time()
+ lol = await eor(e, "`Searching on Deezer...`")
+ sung = song.replace(" ", "%20")
+ url = f"https://jostapi.herokuapp.com/deezer?query={sung}&quality={quality}&count=1"
+ try:
+ k = (r.get(url)).json()[0]
+ except IndexError:
+ return await eod(lol, "`Song Not Found.. `")
+ except JSONDecodeError:
+ return await eod(
+ lol, f"`Tell `[sɪᴘᴀᴋ](tg://user?id=1303895686)`to turn on API.`"
+ )
+ try:
+ title = k["title"]
+ urrl = k["raw_link"]
+ img = k["album"]["cover_xl"]
+ duration = k["duration"]
+ singers = k["artist"]["name"]
+ except Exception as ex:
+ return await eod(lol, f"`{str(ex)}`")
+ urlretrieve(urrl, title + "." + quality)
+ urlretrieve(img, title + ".jpg")
+ okk = await uploader(
+ title + "." + quality,
+ title + "." + quality,
+ hmm,
+ lol,
+ "Uploading " + title + "...",
+ )
+ await ultroid_bot.send_file(
+ e.chat_id,
+ okk,
+ caption="`" + title + "`" + "\n`From Deezer`",
+ attributes=[
+ DocumentAttributeAudio(
+ duration=int(duration),
+ title=title,
+ performer=singers,
+ )
+ ],
+ supports_streaming=True,
+ thumb=title + ".jpg",
+ )
+ await lol.delete()
+ os.remove(title + "." + quality)
+ os.remove(title + ".jpg")
diff --git a/plugins/save.py b/plugins/save.py
index 78a3f72..3ba5fa4 100644
--- a/plugins/save.py
+++ b/plugins/save.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -11,6 +11,8 @@
• `{i}save `
Save that replied msg to ur saved messages box.
+• `{i}fsave `
+ Forward that replied msg to ur saved messages.
"""
from . import *
@@ -22,11 +24,22 @@ async def saf(e):
return await eod(
e, "Reply to Any Message to save it to ur saved messages", time=5
)
- MLA = e.sender_id
- if not MLA:
- MLA = ultroid_bot.uid
- await ultroid_bot.send_message(MLA, x)
+ if e.sender_id == ultroid_bot.uid:
+ await ultroid_bot.send_message("me", x)
+ else:
+ await ultroid_bot.send_message(e.sender_id, x)
await eod(e, "Message saved to Your Pm/Saved Messages.", time=5)
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
+@ultroid_cmd(pattern="fsave$")
+async def saf(e):
+ x = await e.get_reply_message()
+ if not x:
+ return await eod(
+ e, "Reply to Any Message to save it to ur saved messages", time=5
+ )
+ if e.sender_id == ultroid_bot.uid:
+ await x.forward_to("me")
+ else:
+ await x.forward_to(e.sender_id)
+ await eod(e, "Message saved to Your Pm/Saved Messages.", time=5)
diff --git a/plugins/schedule_msg.py b/plugins/schedule_msg.py
index e8401ef..b261c8b 100644
--- a/plugins/schedule_msg.py
+++ b/plugins/schedule_msg.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -21,6 +21,8 @@ from . import *
@ultroid_cmd(pattern="schedule ?(.*)")
async def _(e):
+ if not e.out and not is_fullsudo(e.sender_id):
+ return await eod(e, "`This Command is Full Sudo Restricted`")
x = e.pattern_match.group(1)
xx = await e.get_reply_message()
if x and not xx:
@@ -53,6 +55,3 @@ async def _(e):
await eod(e, "`Incorrect Format`")
else:
return await eod(e, "`Incorrect Format`")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/snips.py b/plugins/snips.py
index 3584c01..e5197f6 100644
--- a/plugins/snips.py
+++ b/plugins/snips.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -104,6 +104,3 @@ async def notes(e):
else:
await ultroid_bot.send_message(e.chat_id, msg, file=media)
await e.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/specialtools.py b/plugins/specialtools.py
index fc21695..fb3c753 100644
--- a/plugins/specialtools.py
+++ b/plugins/specialtools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -36,6 +36,7 @@ import moviepy.editor as m
import pytz
import requests
from bs4 import BeautifulSoup as b
+from pyUltroid.functions.google_image import googleimagesdownload
from . import *
@@ -243,6 +244,3 @@ async def wall(event):
await event.client.send_file(event.chat_id, f"./resources/downloads/{query}/{xx}")
rmtree(f"./resources/downloads/{query}/")
await nn.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/stickertools.py b/plugins/stickertools.py
index c3b60ad..12c53f9 100644
--- a/plugins/stickertools.py
+++ b/plugins/stickertools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -20,6 +20,9 @@
• `{i}kang `
Kang the sticker (add to your pack).
+• `{i}packkang `
+ Kang the Complete sticker set (with custom name).
+
• `{i}round `
To extract round sticker.
@@ -39,7 +42,8 @@ from os import remove
import cv2
import numpy as np
from PIL import Image, ImageDraw
-from telethon.errors import ChatSendInlineForbiddenError, ChatSendStickersForbiddenError
+from telethon import utils
+from telethon.errors import ChatSendStickersForbiddenError, PackShortNameOccupiedError
from telethon.tl.types import (
DocumentAttributeFilename,
DocumentAttributeSticker,
@@ -97,8 +101,6 @@ async def waifu(animu):
hide_via=True,
)
await xx.delete()
- except ChatSendInlineForbiddenError:
- await xx.edit("`Boss ! I cant use inline things here...`")
except ChatSendStickersForbiddenError:
await xx.edit("Sorry boss, I can't send Sticker Here !!")
@@ -139,6 +141,73 @@ async def uconverter(event):
await xx.delete()
+@ultroid_cmd(pattern="packkang")
+async def pack_kangish(_):
+ _e = await _.get_reply_message()
+ if not _e:
+ return await eor(_, "`Reply to Sticker.`")
+ if len(_.text) > 9:
+ _packname = _.text.split(" ", maxsplit=1)[1]
+ else:
+ _packname = f"Ultroid Kang Pack By {_.sender_id}"
+ if _e and _e.media and _e.media.document.mime_type == "image/webp":
+ _id = _e.media.document.attributes[1].stickerset.id
+ _hash = _e.media.document.attributes[1].stickerset.access_hash
+ _get_stiks = await ultroid_bot(
+ functions.messages.GetStickerSetRequest(
+ stickerset=types.InputStickerSetID(id=_id, access_hash=_hash)
+ )
+ )
+ stiks = []
+ for i in _get_stiks.documents:
+ x = utils.get_input_document(i)
+ stiks.append(
+ types.InputStickerSetItem(
+ document=x,
+ emoji=(i.attributes[1]).alt,
+ )
+ )
+ try:
+ eval(udB.get("PACKKANG"))
+ except BaseException:
+ udB.set("PACKKANG", "{}")
+ ok = eval(udB.get("PACKKANG"))
+ try:
+ pack = ok[_.sender_id] + 1
+ except BaseException:
+ pack = 1
+ try:
+ _r_e_s = await asst(
+ functions.stickers.CreateStickerSetRequest(
+ user_id=_.sender_id,
+ title=_packname,
+ short_name=f"ult_{_.sender_id}_{pack}_by_{(await tgbot.get_me()).username}",
+ stickers=stiks,
+ )
+ )
+ ok.update({_.sender_id: pack})
+ udB.set("PACKKANG", str(ok))
+ except PackShortNameOccupiedError:
+ time.sleep(1)
+ pack += 1
+ _r_e_s = await asst(
+ functions.stickers.CreateStickerSetRequest(
+ user_id=_.sender_id,
+ title=_packname,
+ short_name=f"ult_{_.sender_id}_{pack}_by_{(await tgbot.get_me()).username}",
+ stickers=stiks,
+ )
+ )
+ ok.update({_.sender_id: pack})
+ udB.set("PACKKANG", str(ok))
+ await eor(
+ _,
+ f"Pack Kanged Successfully.\nKanged Pack: [link](https://t.me/addstickers/{_r_e_s.set.short_name})",
+ )
+ else:
+ await eor(_, "Unsupported File")
+
+
@ultroid_cmd(
pattern="kang",
)
@@ -279,7 +348,7 @@ async def hehe(args):
await xx.edit(
f"`Sticker added in a Different Pack !\
\nThis Pack is Newly created!\
- \nYour pack can be found [here](t.me/addstickers/{packname})",
+ \nYour pack can be found` [here](t.me/addstickers/{packname})",
parse_mode="md",
)
return
@@ -518,6 +587,3 @@ async def ultiny(event):
await xx.delete()
os.remove(file)
os.remove(ik)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/sudo.py b/plugins/sudo.py
index b5c40d1..9c42331 100644
--- a/plugins/sudo.py
+++ b/plugins/sudo.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -18,8 +18,7 @@
List all sudo users.
"""
-
-from pyUltroid.misc._decorators import sed
+from pyUltroid.misc import sudoers
from . import *
@@ -31,15 +30,14 @@ async def _(ult):
if not ult.out and not is_fullsudo(ult.sender_id):
return await eod(ult, "`This Command is Sudo Restricted!..`")
inputs = ult.pattern_match.group(1)
- if BOT_MODE and ult.sender_id != int(Redis(OWNER_ID)):
+ if str(ult.sender_id) in sudoers():
return await eod(ult, "`Sudo users can't add new sudos!`", time=10)
ok = await eor(ult, "`Updating SUDO Users List ...`")
+ mmm = ""
if ult.reply_to_msg_id:
replied_to = await ult.get_reply_message()
id = await get_user_id(replied_to.sender_id)
name = (await ult.client.get_entity(int(id))).first_name
- sed.append(id)
- mmm = ""
if id == ultroid_bot.me.id:
mmm += "You cant add yourself as Sudo User..."
elif is_sudo(id):
@@ -49,16 +47,12 @@ async def _(ult):
mmm += f"**Added [{name}](tg://user?id={id}) as SUDO User**"
else:
mmm += "`SEEMS LIKE THIS FUNCTION CHOOSE TO BREAK ITSELF`"
- await eod(ok, mmm, time=5)
-
- if inputs:
+ elif inputs:
id = await get_user_id(inputs)
try:
name = (await ult.client.get_entity(int(id))).first_name
except BaseException:
name = ""
- sed.append(id)
- mmm = ""
if id == ultroid_bot.me.id:
mmm += "You cant add yourself as Sudo User..."
elif is_sudo(id):
@@ -74,9 +68,9 @@ async def _(ult):
mmm += f"**Added **`{id}`** as SUDO User**"
else:
mmm += "`SEEMS LIKE THIS FUNCTION CHOOSE TO BREAK ITSELF`"
- await eod(ok, mmm, time=5)
else:
- return await eod(ok, "`Reply to a msg or add it's id/username.`", time=5)
+ mmm += "`Reply to a msg or add it's id/username.`"
+ await eod(ok, mmm)
@ultroid_cmd(
@@ -86,35 +80,29 @@ async def _(ult):
if not ult.out and not is_fullsudo(ult.sender_id):
return await eod(ult, "`This Command is Sudo Restricted!..`")
inputs = ult.pattern_match.group(1)
- if BOT_MODE and ult.sender_id != int(Redis(OWNER_ID)):
+ if str(ult.sender_id) in sudoers():
return await eod(
ult,
- "You are sudo user, You cant add other sudo user.",
- time=5,
+ "You are sudo user, You cant remove other sudo user.",
)
ok = await eor(ult, "`Updating SUDO Users List ...`")
+ mmm = ""
if ult.reply_to_msg_id:
replied_to = await ult.get_reply_message()
id = await get_user_id(replied_to.sender_id)
name = (await ult.client.get_entity(int(id))).first_name
- sed.remove(id)
- mmm = ""
if not is_sudo(id):
mmm += f"[{name}](tg://user?id={id}) `wasn't a SUDO User ...`"
elif del_sudo(id):
mmm += f"**Removed [{name}](tg://user?id={id}) from SUDO User(s)**"
else:
mmm += "`SEEMS LIKE THIS FUNCTION CHOOSE TO BREAK ITSELF`"
- await eod(ok, mmm, time=5)
-
- if inputs:
+ elif inputs:
id = await get_user_id(inputs)
try:
name = (await ult.client.get_entity(int(id))).first_name
except BaseException:
name = ""
- sed.remove(id)
- mmm = ""
if not is_sudo(id):
if name != "":
mmm += f"[{name}](tg://user?id={id}) `wasn't a SUDO User ...`"
@@ -127,7 +115,9 @@ async def _(ult):
mmm += f"**Removed **`{id}`** from SUDO User(s)**"
else:
mmm += "`SEEMS LIKE THIS FUNCTION CHOOSE TO BREAK ITSELF`"
- await eod(ok, mmm, time=5)
+ else:
+ mmm += "`Reply to a msg or add it's id/username.`"
+ await eod(ok, mmm)
@ultroid_cmd(
@@ -155,6 +145,3 @@ async def _(ult):
return await ok.edit(
f"**SUDO MODE : {m}\n\nList of SUDO Users :**\n{msg}", link_preview=False
)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/tag.py b/plugins/tag.py
index 748a83c..71a6b9f 100644
--- a/plugins/tag.py
+++ b/plugins/tag.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -88,6 +88,3 @@ async def _(e):
xx += f"\n[{get_display_name(bb)}](tg://user?id={bb.id})"
await e.client.send_message(e.chat_id, xx)
await e.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/tools.py b/plugins/tools.py
index a5def64..badc1ba 100644
--- a/plugins/tools.py
+++ b/plugins/tools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -45,7 +45,6 @@ from hachoir.parser import createParser
from telethon.errors.rpcerrorlist import YouBlockedUserError
from telethon.tl.types import ChannelParticipantAdmin, ChannelParticipantsBots
from telethon.tl.types import DocumentAttributeVideo as video
-from telethon.tl.types import User
from telethon.utils import pack_bot_file_id
from . import *
@@ -355,8 +354,6 @@ async def _(e):
pattern="sg ?(.*)",
)
async def lastname(steal):
- if BOT_MODE:
- return await eor(steal, "`You cant Use This command in BOT_MODE..`")
mat = steal.pattern_match.group(1)
if not (steal.is_reply or mat):
await eor(steal, "`Use this command with reply or give Username/id...`")
@@ -368,9 +365,6 @@ async def lastname(steal):
user_id = message.sender.id
chat = "@SangMataInfo_bot"
id = f"/search_id {user_id}"
- check = await ultroid_bot.get_entity(user_id)
- if not isinstance(check, User) or check.bot:
- return await eor(steal, "Reply to Actual User's Message !")
lol = await eor(steal, "`Processing !...`")
try:
async with ultroid_bot.conversation(chat) as conv:
@@ -382,7 +376,11 @@ async def lastname(steal):
except YouBlockedUserError:
await lol.edit("Please unblock @sangmatainfo_bot and try again")
return
- if response.text.startswith("No records found"):
+ if (
+ response.text.startswith("No records found")
+ or respond.text.startswith("No records found")
+ or responds.text.startswith("No records found")
+ ):
await lol.edit("No records found for this user")
await steal.client.delete_messages(conv.chat_id, [msg.id, response.id])
return
@@ -402,6 +400,3 @@ async def lastname(steal):
)
except TimeoutError:
return await lol.edit("Error: @SangMataInfo_bot is not responding!.")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/unsplash.py b/plugins/unsplash.py
index 0f57632..dd26d52 100644
--- a/plugins/unsplash.py
+++ b/plugins/unsplash.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -54,6 +54,3 @@ async def searchunsl(ult):
ult.chat_id, CL, caption=f"Uploaded {len(qas)} Images\n", album=True
)
await tep.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/updater.py b/plugins/updater.py
index 3d591c0..bb2ba8c 100644
--- a/plugins/updater.py
+++ b/plugins/updater.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -24,6 +24,7 @@ if CL:
@ultroid_cmd(pattern="update$")
async def _(e):
+ xx = await eor(e, "`Checking for updates...`")
m = await updater()
branch = (Repo.init()).active_branch
if m:
@@ -35,15 +36,13 @@ async def _(e):
buttons=Button.inline("Changelogs", data="changes"),
)
Link = (await ultroid_bot(GetLink(x.chat_id, x.id))).link
- await eor(
- e,
+ await xx.edit(
f'[ChangeLogs]',
parse_mode="html",
link_preview=False,
)
else:
- await eor(
- e,
+ await xx.edit(
f'Your BOT is up-to-date with [{branch}]',
parse_mode="html",
link_preview=False,
@@ -61,6 +60,3 @@ async def updava(event):
force_document=False,
buttons=Button.inline("Changelogs", data="changes"),
)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/utilities.py b/plugins/utilities.py
index aaab816..8c989a0 100644
--- a/plugins/utilities.py
+++ b/plugins/utilities.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -46,7 +46,15 @@
• `{i}ipinfo `
Get info about that IP address.
+
+• `{i}cpy `
+ Copy the replied message, with formatting. Expires in 24hrs.
+
+• `{i}pst`
+ Paste the copied message, with formatting.
+
"""
+
import asyncio
import calendar
import html
@@ -81,13 +89,17 @@ TMP_DOWNLOAD_DIRECTORY = "resources/downloads/"
telegraph = Telegraph()
try:
telegraph.create_account(short_name=OWNER_NAME)
-except:
- telegraph.create_account(short_name='Ultroid')
-# ================================================================#
+
+except BaseException:
+ telegraph.create_account(short_name="Ultroid")
+
+_copied_msg = {}
-@ultroid_cmd(pattern="kickme$", groups_only=True, allow_sudo=False)
+@ultroid_cmd(pattern="kickme$")
async def leave(ult):
+ if not ult.out and not is_fullsudo(e.sender_id):
+ return await eod(ult, "`This Command Is Sudo Restricted.`")
await eor(ult, f"`{ultroid_bot.me.first_name} has left this group, bye!!.`")
await ultroid_bot(LeaveChannelRequest(ult.chat_id))
@@ -96,10 +108,9 @@ async def leave(ult):
pattern="date$",
)
async def date(event):
- k = pytz.timezone("Asia/Kolkata")
- m = dt.now(k).month
- y = dt.now(k).year
- d = dt.now(k).strftime("Date - %B %d, %Y\nTime- %H:%M:%S")
+ m = dt.now().month
+ y = dt.now().year
+ d = dt.now().strftime("Date - %B %d, %Y\nTime- %H:%M:%S")
k = calendar.month(y, m)
ultroid = await eor(event, f"`{k}\n\n{d}`")
@@ -125,8 +136,6 @@ async def info(event):
pattern="listreserved$",
)
async def _(event):
- if BOT_MODE:
- return await eor(ult, "You Cant Use this Command in BOT MODE")
result = await ultroid_bot(GetAdminedPublicChannelsRequest())
output_str = ""
r = result.chats
@@ -144,8 +153,6 @@ async def _(event):
async def stats(
event: NewMessage.Event,
) -> None:
- if BOT_MODE:
- return await eor(ult, "You Cant Use this Command in BOT_MODE")
ok = await eor(event, "`Collecting stats...`")
start_time = time.time()
private_chats = 0
@@ -249,24 +256,13 @@ async def _(event):
else:
downloaded_file_name = None
message = "`Include long text / Reply to text file`"
- if downloaded_file_name and downloaded_file_name.endswith(".py"):
- data = message
- key = (
- requests.post("https://nekobin.com/api/documents", json={"content": data})
- .json()
- .get("result")
- .get("key")
- )
- else:
- data = message
- key = (
- requests.post("https://nekobin.com/api/documents", json={"content": data})
- .json()
- .get("result")
- .get("key")
- )
- q = f"paste {key}"
- reply_text = f"• **Pasted to Nekobin :** [Neko](https://nekobin.com/{key})\n• **Raw Url :** : [Raw](https://nekobin.com/raw/{key})"
+ what, key = get_paste(message)
+ if "neko" in what:
+ q = f"paste {key}"
+ reply_text = f"• **Pasted to Nekobin :** [Neko](https://nekobin.com/{key})\n• **Raw Url :** : [Raw](https://nekobin.com/raw/{key})"
+ elif "dog" in what:
+ q = f"dog {key}"
+ reply_text = f"• **Pasted to Dog Bin :** [Dog](https://del.dog/{key})\n• **Raw Url :** : [Raw](https://del.dog/raw/{key})"
try:
ok = await ultroid_bot.inline_query(asst.me.username, q)
await ok[0].click(event.chat_id, reply_to=event.reply_to_msg_id, hide_via=True)
@@ -367,8 +363,6 @@ async def _(event):
groups_only=True,
)
async def _(ult):
- if BOT_MODE:
- return await eor(ult, "You Cant Use this Command in BOT_MODE")
xx = await eor(ult, get_string("com_1"))
to_add_users = ult.pattern_match.group(1)
if not ult.is_channel and ult.is_group:
@@ -453,7 +447,6 @@ async def rmbg(event):
)
async def telegraphcmd(event):
input_str = event.pattern_match.group(1)
- xx = await eor(event, get_string("com_1"))
if event.reply_to_msg_id:
getmsg = await event.get_reply_message()
if getmsg.photo or getmsg.video or getmsg.gif:
@@ -465,7 +458,17 @@ async def telegraphcmd(event):
amsg = f"Uploaded to [Telegraph]({nn}) !"
except Exception as e:
amsg = f"Error - {e}"
- await xx.edit(amsg)
+ await eor(event, amsg)
+ elif "pic" in mediainfo(getmsg.media):
+ getit = await ultroid_bot.download_media(getmsg)
+ try:
+ variable = uf(getit)
+ os.remove(getit)
+ nn = "https://telegra.ph" + variable[0]
+ amsg = f"Uploaded to [Telegraph]({nn}) !"
+ except Exception as e:
+ amsg = f"Error - {e}"
+ await eor(event, amsg)
elif getmsg.document:
getit = await ultroid_bot.download_media(getmsg)
ab = open(getit)
@@ -478,7 +481,7 @@ async def telegraphcmd(event):
makeit = telegraph.create_page(title=tcom, content=[f"{cd}"])
war = makeit["url"]
os.remove(getit)
- await xx.edit(f"Pasted to Telegraph : [Telegraph]({war})")
+ await eor(event, f"Pasted to Telegraph : [Telegraph]({war})")
elif getmsg.text:
if input_str:
tcom = input_str
@@ -486,11 +489,11 @@ async def telegraphcmd(event):
tcom = "Ultroid"
makeit = telegraph.create_page(title=tcom, content=[f"{getmsg.text}"])
war = makeit["url"]
- await xx.edit(f"Pasted to Telegraph : [Telegraph]({war})")
+ await eor(event, f"Pasted to Telegraph : [Telegraph]({war})")
else:
- await xx.edit("Reply to a Media or Text !")
+ await eor(event, "Reply to a Media or Text !")
else:
- await xx.edit("Reply to a Message !")
+ await eor(event, "Reply to a Message !")
@ultroid_cmd(pattern="json")
@@ -539,26 +542,23 @@ async def sugg(event):
return await eod(
event,
f"`Oops, you can't send polls here!\n\n{str(e)}`",
- time=5,
)
await event.delete()
else:
return await eod(
event,
"`Please reply to a message to make a suggestion poll!`",
- time=5,
)
@ultroid_cmd(pattern="ipinfo ?(.*)")
async def ipinfo(event):
- xx = await eor(event, get_string("com_1"))
ip = event.text.split(" ")
ipaddr = ""
try:
ipaddr = ip[1]
except BaseException:
- return await eod(xx, "`Give me an IP address you noob!`", time=5)
+ return await eod(event, "`Give me an IP address you noob!`")
if ipaddr == "":
return
url = f"https://ipinfo.io/{ipaddr}/geo"
@@ -569,9 +569,13 @@ async def ipinfo(event):
region = det["region"]
country = det["country"]
cord = det["loc"]
- zipc = det["postal"]
+ try:
+ zipc = det["postal"]
+ except KeyError:
+ zipc = "None"
tz = det["timezone"]
- await xx.edit(
+ await eor(
+ event,
"""
**IP Details Fetched.**
@@ -594,8 +598,41 @@ async def ipinfo(event):
)
except BaseException:
err = det["error"]["title"]
- msg = det["error"]["messsage"]
- await eod(xx, f"ERROR:\n{err}\n{msg}")
+ msg = det["error"]["message"]
+ await eod(event, f"ERROR:\n{err}\n{msg}")
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
+@ultroid_cmd(
+ pattern="cpy$",
+)
+async def copp(event):
+ msg = await event.get_reply_message()
+ if msg is None:
+ return await eod(event, f"Use `{hndlr}cpy` as reply to a message!")
+ _copied_msg["CLIPBOARD"] = msg
+ await eod(event, f"Copied. Use `{hndlr}pst` to paste!", time=10)
+
+
+@asst_cmd("pst")
+async def pepsodent(event):
+ await toothpaste(event)
+
+
+@ultroid_cmd(
+ pattern="pst$",
+)
+async def colgate(event):
+ await toothpaste(event)
+
+
+async def toothpaste(event):
+ try:
+ await event.client.send_message(event.chat_id, _copied_msg["CLIPBOARD"])
+ await event.delete()
+ except KeyError:
+ return await eod(
+ event,
+ f"Nothing was copied! Use `{hndlr}cpy` as reply to a message first!",
+ )
+ except Exception as ex:
+ return await eod(str(ex))
diff --git a/plugins/variables.py b/plugins/variables.py
index d2f9fca..cab76d9 100644
--- a/plugins/variables.py
+++ b/plugins/variables.py
@@ -88,6 +88,3 @@ async def get_var(event):
else:
msg += f"• `{i}`" + "\n"
await x.edit(f"**List of Redis Keys :**\n{msg}")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/vcplugin.py b/plugins/vcplugin.py
index 0a4023b..9bd34af 100644
--- a/plugins/vcplugin.py
+++ b/plugins/vcplugin.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -66,7 +66,6 @@ async def _(e):
try:
await e.client(stopvc(await get_call(e)))
await eor(e, "`Voice Chat Stopped...`")
- vcdyno("off")
except Exception as ex:
await eor(e, f"`{str(ex)}`")
@@ -76,10 +75,9 @@ async def _(e):
)
async def _(e):
zz = await eor(e, "`VC bot started...`")
- er, out = await bash("npm start")
+ er, out = await bash("python vcstarter.py & sleep 10 && npm start")
LOGS.info(er)
LOGS.info(out)
- vcdyno("on")
if er:
await zz.edit(f"Failed {er}\n\n{out}")
@@ -201,16 +199,3 @@ async def _(e):
)
except Exception as ex:
return await eod(xx, f"`{str(ex)}`", time=5)
-
-
-@asst_cmd("exitVc")
-async def evc(e):
- if e.sender.id == ultroid_bot.uid:
- vcdyno("off")
- elif is_sudo(e.sender.id):
- vcdyno("off")
- elif is_vcsudo(e.sender.id):
- vcdyno("off")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/warn.py b/plugins/warn.py
index 597eddb..43384b9 100644
--- a/plugins/warn.py
+++ b/plugins/warn.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -172,6 +172,3 @@ async def warnset(e):
)
else:
await eod(e, "`Incorrect Format`")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/webshot.py b/plugins/webshot.py
index 00bf229..896ad99 100644
--- a/plugins/webshot.py
+++ b/plugins/webshot.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -68,6 +68,3 @@ async def webss(event):
force_document=True,
)
await xx.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/webupload.py b/plugins/webupload.py
index 65740ac..798a6c6 100644
--- a/plugins/webupload.py
+++ b/plugins/webupload.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -68,6 +68,3 @@ async def _(event):
await results[0].click(event.chat_id, reply_to=event.reply_to_msg_id, hide_via=True)
await xx.delete()
await event.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/whichsong.py b/plugins/whichsong.py
new file mode 100644
index 0000000..f6f8056
--- /dev/null
+++ b/plugins/whichsong.py
@@ -0,0 +1,46 @@
+# Ultroid - UserBot
+# Copyright (C) 2021 TeamUltroid
+#
+# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+# PLease read the GNU Affero General Public License in
+# .
+
+"""
+✘ Commands Available -
+
+• `{i}whichsong`
+ Reply to a song file, to recognise the song.
+"""
+
+from os import remove
+
+from shazamio import Shazam
+
+from . import *
+
+shazam = Shazam()
+
+
+@ultroid_cmd(pattern="whichsong$")
+async def song_recog(event):
+ if not event.reply_to_msg_id:
+ return await eod(event, "`Reply to a song file to recognise it!`", time=10)
+ xx = await eor(event, get_string("com_1"))
+ reply = await event.get_reply_message()
+ t_ = mediainfo(reply.media)
+ if t_ != "audio":
+ return await eod(xx, "`Please use as reply to an audio file.`", time=5)
+ await xx.edit("`Downloading...`")
+ path_to_song = "./temp/shaazam_cache/unknown.mp3"
+ await reply.download_media(path_to_song)
+ await xx.edit("`Trying to identify the song....`")
+ try:
+ res = await shazam.recognize_song(path_to_song)
+ except Exception as e:
+ return await eod(xx, str(e), time=10)
+ try:
+ x = res["track"]
+ except KeyError:
+ return await eod(xx, "`Couldn't identify song :(`", time=5)
+ await xx.edit(f"**Song Recognised!**\nName: __{x['title']}__")
+ remove(path_to_song)
diff --git a/plugins/words.py b/plugins/words.py
index 403350a..c2a7b7f 100644
--- a/plugins/words.py
+++ b/plugins/words.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -140,6 +140,3 @@ async def _(event):
)
except asyncurban.WordNotFoundError:
await xx.edit(f"**No result found for** `{word}`")
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/youtube.py b/plugins/youtube.py
index 2041cb3..b415975 100644
--- a/plugins/youtube.py
+++ b/plugins/youtube.py
@@ -14,95 +14,83 @@
Search and download video from youtube.
"""
-from youtube_dl import YoutubeDL
+from pyUltroid.functions.ytdl import *
from . import *
-@ultroid_cmd(pattern="yt(a|v|sa|sv) ?(.*)")
+@ultroid_cmd(
+ pattern="yt(a|v|sa|sv) ?(.*)",
+)
async def download_from_youtube_(event):
opt = event.pattern_match.group(1)
+ xx = await eor(event, get_string("com_1"))
if opt == "a":
- ytd = YoutubeDL(
- {
- "format": "bestaudio",
- "writethumbnail": True,
- "addmetadata": True,
- "geo-bypass": True,
- "nocheckcertificate": True,
- "outtmpl": "%(id)s.mp3",
- }
- )
+ ytd = {
+ "format": "bestaudio",
+ "writethumbnail": True,
+ "addmetadata": True,
+ "geo-bypass": True,
+ "nocheckcertificate": True,
+ "outtmpl": "%(id)s.mp3",
+ }
url = event.pattern_match.group(2)
if not url:
- return await eor(event, "Give me a (youtube) URL to download audio from!")
+ return await eor(xx, "Give me a (youtube) URL to download audio from!")
try:
request.get(url)
except BaseException:
- return await eor(event, "`Give A Direct Audio Link To Download`")
- xx = await eor(event, get_string("com_1"))
+ return await eor(xx, "`Give A Direct Audio Link To Download`")
elif opt == "v":
- ytd = YoutubeDL(
- {
- "format": "best",
- "writethumbnail": True,
- "addmetadata": True,
- "geo-bypass": True,
- "nocheckcertificate": True,
- "outtmpl": "%(id)s.mp4",
- }
- )
+ ytd = {
+ "format": "best",
+ "writethumbnail": True,
+ "addmetadata": True,
+ "geo-bypass": True,
+ "nocheckcertificate": True,
+ "outtmpl": "%(id)s.mp4",
+ }
url = event.pattern_match.group(2)
if not url:
- return await eor(event, "Give me a (youtube) URL to download video from!")
+ return await eor(xx, "Give me a (youtube) URL to download video from!")
try:
request.get(url)
except BaseException:
- return await eor(event, "`Give A Direct Video Link To Download`")
- xx = await eor(event, get_string("com_1"))
+ return await eor(xx, "`Give A Direct Video Link To Download`")
elif opt == "sa":
- ytd = YoutubeDL(
- {
- "format": "bestaudio",
- "writethumbnail": True,
- "addmetadata": True,
- "geo-bypass": True,
- "nocheckcertificate": True,
- "outtmpl": "%(id)s.mp3",
- }
- )
+ ytd = {
+ "format": "bestaudio",
+ "writethumbnail": True,
+ "addmetadata": True,
+ "geo-bypass": True,
+ "nocheckcertificate": True,
+ "outtmpl": "%(id)s.mp3",
+ }
try:
query = event.text.split(" ", 1)[1]
except IndexError:
return await eor(
- event, "Give me a (youtube) search query to download audio from!"
+ xx, "Give me a (youtube) search query to download audio from!"
)
- xx = await eor(event, "`Searching on YouTube...`")
url = await get_yt_link(query)
- await xx.edit("`Downloading audio song...`")
+ await eor(xx, "`Downloading audio song...`")
elif opt == "sv":
- ytd = YoutubeDL(
- {
- "format": "best",
- "writethumbnail": True,
- "addmetadata": True,
- "geo-bypass": True,
- "nocheckcertificate": True,
- "outtmpl": "%(id)s.mp4",
- }
- )
+ ytd = {
+ "format": "best",
+ "writethumbnail": True,
+ "addmetadata": True,
+ "geo-bypass": True,
+ "nocheckcertificate": True,
+ "outtmpl": "%(id)s.mp4",
+ }
try:
query = event.text.split(" ", 1)[1]
except IndexError:
return await eor(
- event, "Give me a (youtube) search query to download video from!"
+ xx, "Give me a (youtube) search query to download video from!"
)
- xx = await eor(event, "`Searching YouTube...`")
url = await get_yt_link(query)
- await xx.edit("`Downloading video song...`")
+ await eor(xx, "`Downloading video song...`")
else:
return
await download_yt(xx, event, url, ytd)
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/plugins/ziptools.py b/plugins/ziptools.py
index 20540dd..c662528 100644
--- a/plugins/ziptools.py
+++ b/plugins/ziptools.py
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -22,7 +22,6 @@
"""
-import glob
import os
import time
@@ -91,30 +90,18 @@ async def unzipp(event):
os.system("rm -rf unzip")
os.mkdir("unzip")
await bash(f"7z x {file} -aoa -ounzip")
- ok = glob.glob("unzip/*")
- k = []
+ ok = get_all_files("unzip")
for x in ok:
- if os.path.isdir(x):
- k.append(x)
- break
- if k:
- await xx.edit(
- "Your Unzipped File Saved in `unzip` folder.\nDo `{i}ls unzip` and browse storage\nUse `{i}ul ` To upload.".format(
- i=HNDLR
- )
+ k = time.time()
+ xxx = await uploader(x, x, k, xx, "Uploading...")
+ await ultroid_bot.send_file(
+ event.chat_id,
+ xxx,
+ force_document=True,
+ thumb="resources/extras/ultroid.jpg",
+ caption=f"`{xxx.name}`",
)
- else:
- for x in ok:
- k = time.time()
- xxx = await uploader(x, x, k, xx, "Uploading...")
- await ultroid_bot.send_file(
- event.chat_id,
- xxx,
- force_document=True,
- thumb="resources/extras/ultroid.jpg",
- caption=f"`{xxx.name}`",
- )
- await xx.delete()
+ await xx.delete()
@ultroid_cmd(pattern="addzip$")
@@ -160,6 +147,3 @@ async def do_zip(event):
os.system("rm -rf zip")
os.remove("ultroid.zip")
await xx.delete()
-
-
-HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"})
diff --git a/requirements.txt b/requirements.txt
index 252a84d..520080b 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1,3 @@
-py-Ultroid==2021.5.24
+py-Ultroid==2021.6.17
+Shazamio
+https://github.com/New-dev0/Telethon/archive/BETTER.zip
diff --git a/resources/extras/local-requirements.txt b/resources/extras/local-requirements.txt
index 89f77cb..2b828b0 100644
--- a/resources/extras/local-requirements.txt
+++ b/resources/extras/local-requirements.txt
@@ -42,3 +42,4 @@ hachoir
aria2p
gdown
qrcode
+shazamio
diff --git a/resources/session/session.sh b/resources/session/session.sh
index 6a12414..0d11eb1 100644
--- a/resources/session/session.sh
+++ b/resources/session/session.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in .
diff --git a/resources/session/ssgen.py b/resources/session/ssgen.py
index 5c3f371..334d739 100644
--- a/resources/session/ssgen.py
+++ b/resources/session/ssgen.py
@@ -1,6 +1,6 @@
#!/bin/bash
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
@@ -34,6 +34,7 @@ try:
print("\b", frame, sep="", end="", flush=True)
sleep(0.1)
import telethon
+
x = "\bFound an existing installation of Telethon...\nSuccessfully Imported.\n\n"
except BaseException:
print("Installing Telethon...")
diff --git a/resources/startup/locals.py b/resources/startup/locals.py
index d22c2b1..639d4dd 100644
--- a/resources/startup/locals.py
+++ b/resources/startup/locals.py
@@ -1,6 +1,6 @@
# /usr/bin/python3
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# Please read the GNU Affero General Public License in
diff --git a/resources/startup/startup.sh b/resources/startup/startup.sh
index cf739b3..e509f09 100644
--- a/resources/startup/startup.sh
+++ b/resources/startup/startup.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in .
diff --git a/sessiongen b/sessiongen
index e4102fa..edba1d2 100644
--- a/sessiongen
+++ b/sessiongen
@@ -1,5 +1,5 @@
# Ultroid - UserBot
-# Copyright (C) 2020 TeamUltroid
+# Copyright (C) 2021 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in .
diff --git a/src/handlers/index.ts b/src/handlers/index.ts
index 5143ccf..59d247b 100644
--- a/src/handlers/index.ts
+++ b/src/handlers/index.ts
@@ -10,6 +10,7 @@
import { bot } from '../bot';
import { playHandler } from './play';
+import { filePlayHandler } from './playFile';
import { queueHandler } from './queue';
import { pauseCBHandler } from './pause-resume';
import { skipCBHandler, skipCommand } from './skip';
@@ -18,6 +19,7 @@ import { exitVcHandler, exitCommand } from './exitVc';
export const initHandlers = (): void => {
bot.use(playHandler);
+ bot.use(filePlayHandler);
bot.use(queueHandler);
bot.use(pauseCBHandler);
bot.use(skipCBHandler);
diff --git a/src/handlers/pause-resume.ts b/src/handlers/pause-resume.ts
index 1c7d135..bf07e07 100644
--- a/src/handlers/pause-resume.ts
+++ b/src/handlers/pause-resume.ts
@@ -13,7 +13,7 @@ import { getDuration } from '../utils';
import escapeHtml from '@youtwitface/escape-html';
import checkExpired from '../middlewares/checkExpired';
-export const pauseCBHandler = Composer.action(/^pause:[a-zA-Z0-9.\-_]+$/, checkExpired, async ctx => {
+export const pauseCBHandler = Composer.action(/^pause:[a-zA-Z0-9.\-_]+$/, checkExpired, async (ctx) => {
const chat = ctx.callbackQuery.message?.chat;
let data: string = '';
diff --git a/src/handlers/playFile.ts b/src/handlers/playFile.ts
new file mode 100644
index 0000000..175b7e0
--- /dev/null
+++ b/src/handlers/playFile.ts
@@ -0,0 +1,85 @@
+/**
+* Ultroid - UserBot
+* Copyright (C) 2020 TeamUltroid
+*
+* This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
+* PLease read the GNU Affero General Public License in
+* .
+**/
+
+import { Composer, Markup } from 'telegraf';
+import { addFileToQueue, getQueue } from '../tgcalls';
+import { getCurrentSong } from '../tgcalls';
+import { getDuration } from '../utils';
+import { logger as log } from '../bot';
+import escapeHtml from '@youtwitface/escape-html';
+
+export const filePlayHandler = Composer.command('playFile', async (ctx) => {
+ const { chat } = ctx.message;
+
+ if (chat.type !== 'supergroup') {
+ return await ctx.reply('I can only play in groups.');
+ }
+ if (ctx.message.reply_to_message && JSON.parse(JSON.stringify(ctx.message.reply_to_message)).audio) {
+ await ctx.reply('Starting FilePlay [beta]', {parse_mode: 'HTML'});
+ } else {
+ return await ctx.reply("Its Not An Audio File...");
+ }
+
+ const file = JSON.parse(JSON.stringify(ctx.message.reply_to_message)).audio;
+ const fileLink = (await ctx.telegram.getFileLink(file.file_id)).href;
+
+ if (!fileLink) {
+ return await ctx.reply('You need to reply to a audio file not an Voice or Message!');
+ }
+
+ const index = await addFileToQueue(
+ chat, fileLink,
+ {
+ id: ctx.from.id,
+ f_name: ctx.from.first_name
+ },
+ JSON.parse(JSON.stringify(ctx.message.reply_to_message)).audio.duration,
+ JSON.parse(JSON.stringify(ctx.message.reply_to_message)).audio.file_name,
+ );
+ const song = getCurrentSong(chat.id);
+
+ switch (index) {
+ case -1:
+ await ctx.reply("Failed to download song ...")
+ break;
+ case 0:
+ if (song) {
+ const { id } = song.song;
+ ctx.replyWithPhoto("https://9to5google.com/wp-content/uploads/sites/4/2018/09/youtube_logo_dark.jpg?quality=82&strip=all", {
+ caption: `Playing : ${escapeHtml(JSON.parse(JSON.stringify(ctx.message.reply_to_message)).audio.file_name)}\n` +
+ `Duration: ${getDuration(JSON.parse(JSON.stringify(ctx.message.reply_to_message)).audio.duration)}\n` +
+ `Requested by : ${song.by.f_name}`,
+ parse_mode: 'HTML',
+ ...Markup.inlineKeyboard([
+ [
+ Markup.button.callback('Pause', `pause:${escapeHtml(id)}`),
+ Markup.button.callback('Skip', `skip:${escapeHtml(id)}`)
+ ],
+ [
+ Markup.button.callback('Exit', `exitVc`),
+ ]
+ ])
+ })
+ }
+ break;
+ default:
+ const queue = getQueue(chat.id);
+ if (queue) {
+ let queueId = queue.length - 1
+ const { info, from } = queue[queueId];
+ await ctx.replyWithHTML(`Queued : ${escapeHtml(info.title)} (${getDuration(info.duration)})\n` +
+ `At position ${index}.\n` +
+ `Requested By : ${from.f_name}`, {
+ disable_web_page_preview: true,
+ });
+ } else {
+ await log("Queue not found in " + chat.title)
+ }
+ }
+});
diff --git a/src/tgcalls.ts b/src/tgcalls.ts
index 1abf018..47890f4 100644
--- a/src/tgcalls.ts
+++ b/src/tgcalls.ts
@@ -76,7 +76,21 @@ ws.on('message', (response: any) => {
}
});
-const downloadSong = async (url: string): Promise => {
+const downloadSong = async (url: string, file: boolean = false, title: string = '', duration: string | number = 0): Promise => {
+ if (file == true && url.startsWith("https://api.telegram.org/file/bot")) {
+ return new Promise((resolve, reject) => {
+ const ffmpeg = spawn('ffmpeg', ['-y', '-nostdin', '-i', url, ...ffmpegOptions.split(' ')]);
+
+ resolve({
+ stream: ffmpeg.stdout,
+ info: {
+ id: url.replace("https://api.telegram.org/file/bot", "").replace("/", '.'),
+ title: title,
+ duration: typeof (duration) === 'string' ? parseInt(duration) : duration,
+ },
+ });
+ });
+ }
return new Promise((resolve, reject) => {
const ytdlChunks: string[] = [];
const ytdl = spawn('youtube-dl', ['-x', '--print-json', '-g', `${url}`]);
@@ -111,7 +125,16 @@ const downloadSong = async (url: string): Promise => {
};
-export const getSongInfo = async (url: string): Promise => {
+export const getSongInfo = async (url: string, file: boolean = false, duration: string | number = 0, link: string = '', title: string = ''): Promise => {
+ if (file == true || link.startsWith("https://api.telegram.org/file/bot")) {
+ return new Promise((resolve, reject) => {
+ resolve({
+ id: link,
+ title: title,
+ duration: typeof (duration) === 'string' ? parseInt(duration) : duration,
+ });
+ });
+ }
return new Promise((resolve, reject) => {
const ytdlChunks: string[] = [];
const ytdl = spawn('youtube-dl', ['-x', '--print-json', '-g', `ytsearch:"${url}"`]);
@@ -142,11 +165,11 @@ export const getSongInfo = async (url: string): Promise
});
};
-export const closeConnection = async(): Promise => {
+export const closeConnection = async (): Promise => {
connection.close();
}
-const createConnection = async(chat: Chat.SupergroupChat): Promise => {
+const createConnection = async (chat: Chat.SupergroupChat): Promise => {
if (cache.has(chat.id)) {
return;
}
@@ -244,24 +267,65 @@ const createConnection = async(chat: Chat.SupergroupChat): Promise => {
};
ws.send(JSON.stringify(data));
cachedConnection.leftVC = true;
+ cachedConnection.connection.close();
});
};
export const leaveVc = (chatId: number) => {
if (cache.has(chatId)) {
- const { stream } = cache.get(chatId)!;
+ const { stream, connection } = cache.get(chatId)!;
try {
stream.emit('leave');
} catch (error) {
console.log(error.toString());
stream.emit('leave');
}
- process.exit(0);
+ // process.exit(0);
} else {
return false;
}
}
+export const addFileToQueue = async (chat: Chat.SupergroupChat, url: string, by: Queue['from'], duration: string | number, title: string): Promise => {
+ if (!cache.has(chat.id)) {
+ await createConnection(chat);
+ return addFileToQueue(chat, url, by, duration, title);
+ }
+
+ const connection = cache.get(chat.id)!;
+ if (connection.leftVC) {
+ cache.delete(chat.id);
+ await createConnection(chat);
+ return addFileToQueue(chat, url, by, duration, title);
+ }
+ const { stream, queue } = connection;
+
+ let songInfo: DownloadedSong['info'];
+ if (stream.finished) {
+ try {
+ const song = await downloadSong(url, true, title, duration);
+ stream.setReadable(song.stream);
+ connection.currentSong = {
+ song: song.info,
+ by: by
+ };
+ songInfo = song.info;
+ cache.set(chat.id, connection);
+ } catch (error) {
+ console.error(error);
+ return -1;
+ }
+ return 0;
+ } else {
+ songInfo = await getSongInfo(url, true, duration, url, title);
+ }
+ return queue.push({
+ url: url,
+ from: by,
+ info: songInfo
+ });
+};
+
export const addToQueue = async (chat: Chat.SupergroupChat, url: string, by: Queue['from']): Promise => {
if (!cache.has(chat.id)) {
await createConnection(chat);
diff --git a/strings/strings/en.yml b/strings/strings/en.yml
index 8bfc748..01edff4 100644
--- a/strings/strings/en.yml
+++ b/strings/strings/en.yml
@@ -172,7 +172,7 @@ gdrive_7: "**Successfully Uploaded File on G-Drive :**\n\n[{}]({})"
# pmpermit
pmperm_1: "Please wait for me to respond or you will be blocked and reported as spam!!"
pmperm_2: "You were spamming my Master's PM, which I didn't like.\nYou have been BLOCKED and reported as SPAM, until further notice."
-pmperm_3: "Reply to someone's msg or try this command in private."
+pmperm_3: "Reply to someone's message or try this command in private."
# updater
upd_1: "`Checking for updates, please wait....`"
diff --git a/strings/strings/ka.yml b/strings/strings/ka.yml
new file mode 100644
index 0000000..963e1d1
--- /dev/null
+++ b/strings/strings/ka.yml
@@ -0,0 +1,203 @@
+name: Kannada
+natively: ಕನ್ನಡ
+
+author:
+ - anishgowda21
+
+#commons
+com_1: "`ಪ್ರಕ್ರಿಯೆ ಪ್ರಾರಂಭ ...`"
+com_2: "`ಹುಡುಕಾಟ ಪ್ರಾರಂಭ...`"
+
+#help
+help_1: "`{}` ಮಾನ್ಯವಾದ ಪ್ಲಗಿನ್ ಅಲ್ಲ!"
+help_2: "ಬೊಟ್ ಇನ್ಲೈನ್ ಕ್ವೆರಿ ಗೆ ಉತ್ತರಿಸಲಿಲ್ಲ.\n`{}restart` ಕಮಾಂಡ್ ಅನ್ನು ಬಳಸಿ."
+help_3: "ದಯವಿಟ್ಟು ನಿಮ್ಮ ಬೋಟಿನ ಇನ್ಲೈನ್ ಕ್ವೆರಿ ಮೋಡ್ ಅನ್ನು @Botfather ನಿಂದ ಸಕ್ರಿಯಗೊಳಿಸಿ."
+help_4: "ನೀವು ಬಾಟ್ ಮೋಡ್ನಲ್ಲಿರುವಿರಿ.\nಬಾಟ್ ಮೋಡ್ ಬಳಕೆದಾರರು ನೇರವಾಗಿ ಸಹಾಯ ಪಡೆಯಲಾಗುವುದಿಲ್ಲ.\nನೀವು ಸಹಾಯ ಪಡೆಯಲು ಇಚ್ಚಿಸಿದಲ್ಲಿ ಈ ಕೆಳಗಿನ ಪದಗಳನ್ನು ನಕಲಿಸಿ ಚಾಟ್ ನಲ್ಲಿ ಅಂಟಿಸಿ ಪಾಪ್ ಅಪ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ \n\n `@{} ultd`"
+
+# autopic
+autopic_1: "ನನಗೆ ಕೆಲವು ವಿಷಯದ ವಾಕ್ಯಗಳನ್ನು ನೀಡಿ..."
+autopic_2: "`{}`ಗಾಗಿ ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ"
+autopic_3: "ನಿಮ್ಮ ಹುಡುಕಾಟಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಸಂಗ್ರಹ `{}` ಸಿಕ್ಕಿದೆ!\nಆಟೋಪಿಕ್ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ!!"
+
+#inline
+inline_1: "[ಅಲ್ಟ್ರಾಯ್ಡ್ ಸಪೋರ್ಟ್](t.me/ultroidsupport)\n\n
+**{}ನ ಸಹಾಯ ಮೆನು.\n\n
+ಪ್ಲಗಿನ್ಸ್ ~ {}**"
+inline_2: "[ಅಲ್ಟ್ರಾಯ್ಡ್ ಸಪೋರ್ಟ್](t.me/ultroidsupport)\n\n
+**{}ನ ಸಹಾಯ ಮೆನು.\n\n
+ಆಡ್ಅನ್ಸ್ ~ {}**"
+inline_3: "[ಅಲ್ಟ್ರಾಯ್ಡ್ ಸಪೋರ್ಟ್](t.me/ultroidsupport)\n\n
+**{}ನ ಸಹಾಯ ಮೆನು.\n\n
+ಆಡ್ಅನ್ಸ್ ~ {}
+ಹೋಗಿ `ADDONS` Var ಗೆ True ಮೌಲ್ಯ ವನ್ನು ಸೇರಿಸಿ.**"
+inline_4: "**{}ನ ಬೊಟ್\n\nಮೈನ್ ಮೆನು\n\nಪ್ಲಗಿನ್ಸ್ ~ {}\nಆಡ್ಅನ್ಸ್ ~ {}\nಒಟ್ಟು ಕಮಾಂಡ್ಗಳು ~ {}**"
+inline_5: "**ಮೆನು ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ**"
+
+#tagnotif
+tagnot_1: "{} ನಿಮ್ಮನ್ನು {} ಅಲ್ಲಿ ಟ್ಯಾಗ್ ಮಾಡಿದ್ದಾರೆ\n\n```{}```[📨 Message 📨]({})"
+tagnot_2: "{} ನಿಮ್ಮನ್ನು {} ಅಲ್ಲಿ ಟ್ಯಾಗ್ ಮಾಡಿದ್ದಾರೆ\n\n [📨 Message 📨]({})"
+
+#whisper
+
+wspr_1: "@{}ನಿಮಗೆ ಒಂದು ಗುಪ್ತ ಸಂದೇಶ.\nಓದಿದ ನಂತರ ಸಂದೇಶವನ್ನು ಅಳಿಸಿ ಹಾಕಿ.\nಇಲ್ಲದಿದ್ದರೆ ಮುಂದಿನ ಸಂದೇಶ ಅಪ್ಡೇಟ್ ಆಗುವುದಿಲ್ಲ."
+wspr_2: "ಸಂದೇಶವನ್ನು ಅಳಿಸಿ ಹಾಕಲಾಗಿದೆ."
+
+#afk
+
+afk_1: "`ಇನ್ನು ಮುಂದೆ ನೀವು afk ಆಗಿಲ್ಲ\n\n
+ದೂರವಿದ್ದಿದ್ದು ~ {}`"
+afk_2: "#AFK\n
+afk ಮೋಡ್ ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ.\n
+ದೂರವಿದ್ದಿದ್ದು ~ `{}`"
+afk_3: "`ನಾನು ಸದ್ಯಕ್ಕೆ AFK ಆಗಿದ್ದೇನೆ.\n
+ಕೊನೆಯದಾಗಿ ಕಂಡಿದ್ದು {} ಮೊದಲು.`\n\n
+**ಕಾರಣ:** `{}`"
+afk_4: "`ನಾನು ಸದ್ಯಕ್ಕೆ AFK ಆಗಿದ್ದೇನೆ.\n
+ಕೊನೆಯದಾಗಿ ಕಂಡಿದ್ದು {} ಮೊದಲು.`"
+afk_5: "`AFK ಹೋಗುತ್ತಿದ್ದೆನೆ.`\n\n
+**ಕಾರಣ:** `{}`"
+afk_6: "`ನಾನು AFK ಹೋಗುತ್ತಿದ್ದೆನೆ.`"
+afk_7: "ಸದ್ಯಕ್ಕೆ AFK ಅಲ್ಲಿ ಇದ್ದೇನೆ ಕಾರಣ {}"
+afk_8: "ಸದ್ಯಕ್ಕೆ AFK ಅಲ್ಲಿ ಇದ್ದೇನೆ."
+
+#bot
+
+alive_1: "**ಅಲ್ಟ್ರಾಯ್ಡ್ ಬಳಕೆದಾರ ಬೋಟ್...**\n\n
+**{}**\n\n
+┏━━━━━━━━━━━━━━━━━━━━━\n
+┣ **ಮಾಲೀಕರು** - `{}`\n
+┣ **ಆವೃತ್ತಿ** - `{}`\n
+┣ **ಪೈ-ಅಲ್ಟ್ರಾಯ್ಡ್** - `{}`\n
+┣ **ಸಕ್ರಿಯ ಅವಧಿ** - `{}`\n
+┣ **ಪೈಥಾನ್** - `{}`\n
+┣ **ಟೆಲಿಥಾನ್** - `{}`\n
+┣ **ಬ್ರಾಂಚ್** - `{}`\n
+┗━━━━━━━━━━━━━━━━━━━━━"
+log: "**ಹಿರೋಕು** ಅಲ್ಟ್ರಾಯ್ಡ್ ಲಾಗ್ಸ್.\n[ಇಲ್ಲಿಯೂ]({}) ಅಂಟಿಸಲಾಗಿದೆ!"
+ping: "**ಪಾಂಗ್ !!** `{}ms`\n**ಸಕ್ರಿಯ ಅವಧಿ** - `{}`"
+usage: "**⚙️ ಡೈನೋ ಬಳಕೆ ⚙️**:\n\n
+ -> `ಡೈನೋ ಬಳಸಿದ್ದು` **{}**:\n
+ • `{}`**h** `{}`**m**
+**|** [`{}`**%**]\n\n
+ -> `ಈ ತಿಂಗಳು ಉಳಿದಿರುವ ಡೈನೋ ಗಂಟೆಗಳ ಕೋಟಾ`:\n
+ • `{}`**h** `{}`**m**
+**|** [`{}`**%**]\n\n
+**ಒಟ್ಟು ಡಿಸ್ಕ್ ಸ್ಥಳ: {}\n\n**
+**ಬಳಸಿದ್ದು: {} ಉಳಿದಿರುವುದು: {}\n\n**
+**📊ಡೇಟಾ ಬಳಕೆ📊\n\nಅಪ್ಲೋಡ್: {}\nಡೌನ್ಲೋಡ್: {}\n\n**
+**CPU: {}%\nRAM: {}%\nDISK: {}%**"
+shutdown: "ವಿದಾಯಗಳು {}.\n`ಮುಚ್ಚಲಾಗುತ್ತಿದೆ...`"
+
+#brodcast
+bd_1: "`dbಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...`"
+bd_2: "`dbಗೆ ಎಲ್ಲ ಅಡ್ಮಿನ್ ಚಾನೆಲ್ಗಳನ್ನೂ ಸೇರಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವೆ...`"
+bd_3: "**ಮುಗಿಯಿತು.**\nಡಾಟಾಬೇಸ್ನಲ್ಲಿ ಈಗಾಗಲೇ ಇರುವ ಚಾಟ್ ಗಳು: {}\nಹೊಸದಾಗಿ ಸೇರಿಸಿದ್ದು: {}"
+bd_4: "`ಚಾನೆಲ್ ಅನ್ನು ಸೇರಿಸಲಾಗಿದೆ!`"
+bd_5: "`ಡೇಟಾಬೇಸ್ ಗೆ ಸೇರಿಸಲಾಗಿದೆ!`"
+bd_6: "`ಚಾನೆಲ್ ಈಗಾಗಲೇ ಡೇಟಾಬೇಸ್ ನಲ್ಲಿ ಪ್ರಸ್ತುತವಿದೆ!`"
+
+#carbon
+
+carbon_1: "ಪ್ರಕ್ರಿಯೆ ಪ್ರಾರಂಭ ..."
+carbon_2: "[{}](tg://user?id={}) ಅವರಿಂದ ಕಾರ್ಬೊನೈಸ್ಡ್ ಮಾಡಲಾಗಿದೆ."
+
+#chats
+
+chats_1: "ಪ್ರಕ್ರಿಯೆ ಪ್ರಾರಂಭ ..."
+chats_2: "`ಈ ಚಾಟ್ ಅನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ`"
+chats_3 : "`ನಾನು ನಿರ್ವಾಹಕನಲ್ಲ`"
+chats_4: "#ಅಳಿಸಲಾಗಿದೆ\nಅಳಿಸಲಾಗಿದೆ {}"
+chats_5: "ನಿಮ್ಮ [{}]({}) ಗ್ರೂಪ್ ಅನ್ನು ಸೃಷ್ಟಿಸಲಾಗಿದೆ!"
+chats_6: "@TeamUltroid ಸೇರಿಕೊಳ್ಳಿ"
+
+# converter
+
+cvt_1: "ಯಾವುದೇ ಮಾಧ್ಯಮ/ಡಾಕ್ಯುಮೆಂಟ್ಗೆ ಪ್ರತ್ಯುತ್ತರಿಸಿ"
+cvt_2: "ಫೈಲ್ ಹೆಸರು ಮತ್ತು ವಿಸ್ತರಣೆಯನ್ನು ನೀಡಿ"
+cvt_3: "`ಪ್ರಕ್ರಿಯೆ ಪ್ರಾರಂಭ ...`"
+cvt_4: "ಯಾವುದೇ ಮಾಧ್ಯಮಕ್ಕೆ ಪ್ರತ್ಯುತ್ತರಿಸಿ..."
+
+#core
+core_1: "ಮಾಡ್ಯೂಲ್ ಕಂಡುಬಂದಿದೆ"
+core_2: "{}.py neko ಹಾಗು rawನಲ್ಲಿ ಅಂಟಿಸಲು .paste ಅನ್ನು ಬಳಸಿ"
+core_3: "ಮತ್ತೆ ಹುಡುಕಿ ..?"
+core_4: "ಮಾಡ್ಯೂಲ್ {} ಕಂಡುಬಂದಿದೆ"
+core_5: "{}.py neko ಹಾಗು rawನಲ್ಲಿ ಅಂಟಿಸಲು .paste ಅನ್ನು ಬಳಸಿ"
+core_6: "ಮಾಡ್ಯೂಲ್ {}.py ಕಂಡುಬಂದಿಲ್ಲ"
+core_7: "ಅಂತಹ ಮಾಡ್ಯೂಲ್ ಇಲ್ಲ"
+core_8: "{}.py ಹೆಸರಿನ ಯಾವುದೇ ಮಾಡ್ಯೂಲ್ ಕಂಡುಬಂದಿಲ್ಲ"
+core_9: "`ನೀವು ಅನ್ಲೋಡ್ ಮಾಡಲು ಬಯಸುವ ಪ್ಲಗಿನ್ ಹೆಸರನ್ನು ನೀಡಿ.`"
+core_10: "`{}` ಅನ್ನು **ಯಶಸ್ವಿಯಾಗಿ ಅನ್ಲೋಡ್ ಮಾಡಲಾಗಿದೆ**"
+core_11: "ನೀವು ಅಧಿಕೃತ ಪ್ಲಗಿನ್ಗಳನ್ನು ಅನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"
+core_12: "{} ಹೆಸರಿನ ಯಾವುದೇ ಪ್ಲಗಿನ್ ಕಂಡುಬಂದಿಲ್ಲ"
+core_13: "ನೀವು ಅನಿನ್ಸ್ಟಾಲ್ ಬಯಸುವ ಪ್ಲಗಿನ್ನ ಹೆಸರನ್ನು ನೀಡಿ"
+core_14: "`{}` ಅನ್ನು **ಯಶಸ್ವಿಯಾಗಿ ಅನಿನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ**"
+core_15: "ನೀವು ಅಧಿಕೃತ ಪ್ಲಗಿನ್ಗಳನ್ನು ಅನಿನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"
+core_16: "ನೀವು ಲೋಡ್ ಮಾಡಲು ಬಯಸುವ ಪ್ಲಗಿನ್ನ ಹೆಸರನ್ನು ನೀಡಿ"
+core_17: "`{}` ಅನ್ನು **ಯಶಸ್ವಿಯಾಗಿ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ**"
+core_18: "**`{}` ಅನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ **ಕೆಳಗಿನ ದೋಷದಿಂದಾಗಿ.**\n`{}`"
+
+# fedutils
+sf_1: "ಮಾಸ್-ಫೆಡ್ಬಾನ್ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ..."
+sf_2: "`ಯಾವುದೇ ಬಳಕೆದಾರರನ್ನು ಗೊತ್ತುಪಡಿಸಲಾಗಿಲ್ಲ!`"
+sf_3: "ನೀವು ನನ್ನ ತಯಾರಕನನ್ನು ನಿಷೇಧಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ !!"
+sf_4: "`Rose ಸ್ಪಂದಿಸುತ್ತಿಲ್ಲ ಅಥವಾ ಪ್ಲಗಿನ್ ತಪ್ಪಾಗಿ ವರ್ತಿಸುತ್ತಿದೆ ಎಂದು ತೋರುತ್ತದೆ`"
+sf_5: "ನೀವು ಪ್ರತಿ 5 ನಿಮಿಷಕ್ಕೊಮ್ಮೆ ಮಾತ್ರ ಫೇಡ್ ಕಮಾಂಡ್ಸ್ ಬಳಸಬಹುದು"
+sf_6: "5 ನಿಮಿಷಗಳ ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."
+sf_7: "ಫೆಡ್ಆಡ್ಮಿನ್ಲಿಸ್ಟ್ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮರುಪ್ರಯತ್ನಿಸಲಾಗುತ್ತಿದೆ ({}/3)..."
+sf_8: "ದೋಷ"
+sf_9: "ಫೆಡ್ಆಡ್ಮಿನ್ಲಿಸ್ಟ್ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+sf_10: "FBaning {} feds."
+sf_11: "ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ FBan ಗ್ರೂಪಿನ ID ತಪ್ಪಾಗಿದೆ."
+sf_12: "{} ಅನ್ನು ಹೊರಗಿಡಲಾಗಿದೆ."
+sf_13: "ಫೆಡ್ಅಡ್ಮಿನ್ ಫೈಲ್ ತೆಗೆದುಹಾಕುವಲ್ಲಿ ದೋಷ.\n{}"
+sf_14: "ಸೂಪರ್ಎಫ್ಬಾನ್ ಪೂರ್ಣಗೊಂಡಿದೆ.\nಒಟ್ಟು ಫೆಡ್ಗಳು - {}.\nಹೊರಗಿಡಲಾಗಿರುವುದು - {}.\nಬಾಧಿತ {} ಫೆಡ್ಗಳು.\n#TB"
+sf_15: "ಮಾಸ್-ಅನ್ಫೆಡ್ಬಾನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ ..."
+sf_16: "ಸೂಪರ್ಅನ್ಫೆಡ್ಬಾನ್ ಪೂರ್ಣಗೊಂಡಿದೆ.\nಒಟ್ಟು ಫೆಡ್ಗಳು - {}.\nಹೊರಗಿಡಲಾಗಿರುವುದು - {}.\nಬಾಧಿತ {} ಫೆಡ್ಗಳು.\n#TB"
+sf_17: "ಅವನ/ಅವಳ ಫೆಡ್ಸ್ಟಾಟ್ ಅನ್ನು ತಿಳಿಯಲು ನನಗೆ ಅವರ ಐಡಿ ಅನ್ನು ನೀಡಿ ಅಥವಾ ಅವರ ಸಂದೇಶಕ್ಕೆ ಪ್ರತ್ಯುತ್ತರಿಸಿ."
+sf_18: "List of feds {} has been banned in.\n\nCollected using Ultroid."
+sf_19: "**ದೋಷ**\n `@MissRose_Bot`ಅನ್ನು ಅಂಬ್ಲಾಕ್ ಮಾಡಿ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."
+sf_20: "`ಮಾಹಿತಿಯನ್ನು ಹೊರತೆಗೆಯಲಾಗುತ್ತಿದೆ ...`"
+sf_21: "\n\n ಫೆಡ್ ಮಾಹಿತಿಯನ್ನು ಅಲ್ಟ್ರಾಯ್ಡ್ನಿಂದ ಹೊರತೆಗೆಯಲಾಗಿದೆ"
+
+#gdrive
+
+gdrive_1: "ನೀವು ಈಗಾಗಲೇ ಗೂಗಲ್ ಡ್ರೈವ್ನೊಂದಿಗೆ ಅಧಿಕೃತಗೊಳಿಸಿದ್ದೀರಿ"
+gdrive_2: "[ಇಲ್ಲಿ](https://console.developers.google.com/flows/enableapi?apiid=drive) ಹೋಗಿ ನಿಮ್ಮ `GDRIVE_CLIENT_ID` ಹಾಗು `GDRIVE_CLIENT_SECRET` ಅನ್ನು ಪಡೆದುಕೊಳ್ಳಿ\n\n
+ನಿಮ್ಮ GDRIVE_CLIENT_ID ಮತ್ತು GDRIVE_CLIENT_SECRET ಅನ್ನು ಈ ರೀತಿ ಕಳುಹಿಸಿ.\n`GDRIVE_CLIENT_ID GDRIVE_CLIENT_SECRET` ಅನ್ನು ಒಂದು ಅಂತರದಿಂದ ಬೇರ್ಪಡಿಸಲಾಗಿದೆ."
+gdrive_3: "`ತಪ್ಪಾದ CLIENT_ID`"
+gdrive_4: "ಏನೋ ತಪ್ಪಾಗಿದೆ! `/auth`ಅನ್ನು ಮತ್ತೊಮ್ಮೆ ಕಳಿಸಿ.\nಇದು ಮತ್ತೆ ಸಂಭವಿಸಿದಲ್ಲಿ ಸಂಪರ್ಕಿಸಿ - `@TheUltroid`"
+gdrive_5: "**ಯಶಸ್ವಿ!**\nಅಲ್ಟ್ರಾಯ್ಡ್ ಬಳಕೆದಾರ ಬೋಟಿನೊಂದಿಗೆ ನೀವು ಗೂಗಲ್ ಡ್ರೈವ್ ಅನ್ನು ಬಳಸಲು ಸಿದ್ಧರಾಗಿರುವಿರಿ."
+gdrive_6: "{} ಇಲ್ಲಿಗೆ ಹೋಗಿ `/auth`ಅನ್ನು ಕಳಿಸಿ."
+gdrive_7: "**ಜಿ-ಡ್ರೈವ್ನಲ್ಲಿ ಫೈಲ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಪ್ಲೋಡ್ ಮಾಡಲಾಗಿದೆ :**\n\n[{}]({})"
+
+# pmpermit
+pmperm_1: "ನಾನು ಪ್ರತಿಕ್ರಿಯಿಸಲು ದಯವಿಟ್ಟು ಕಾಯಿರಿ ಅಥವಾ ನಿಮ್ಮನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಸ್ಪ್ಯಾಮ್ ಎಂದು ವರದಿ ಮಾಡಲಾಗುತ್ತದೆ !!"
+pmperm_2: "ನನ್ನ ಮಾಸ್ಟರ್ಸ್ PM ಅನ್ನು ನೀವು ಸ್ಪ್ಯಾಮ್ ಮಾಡುತ್ತಿದ್ದೀರಿ, ಅದು ನನಗೆ ಇಷ್ಟವಾಗಲಿಲ್ಲ.\nಮುಂದಿನ ಸೂಚನೆ ಬರುವವರೆಗೂ ನಿಮ್ಮನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಮತ್ತು ಸ್ಪ್ಯಾಮ್ ಎಂದು ವರದಿ ಮಾಡಲಾಗಿದೆ."
+pmperm_3: "ಇನ್ನೊಬ್ಬರ ಸಂದೇಶಕ್ಕೆ ಪ್ರತ್ಯುತ್ತರಿಸಿ ಅಥವಾ ಈ ಆಜ್ಞೆಯನ್ನು ಖಾಸಗಿಯಾಗಿ ಪ್ರಯತ್ನಿಸಿ."
+
+#updater
+upd_1: "`ಅಪ್ಡೇಟ್ ಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ಕಾಯಿರಿ ....`"
+upd_2: "ಕೆಲವು ಸಮಸ್ಯೆಗಳಿಂದಾಗಿ ಅಪ್ಡೇಟರ್ ಮುಂದುವರಿಯಲು ಸಾಧ್ಯವಿಲ್ಲ.\n\n**ಲಾಗ್ ಟ್ರೇಸ್ :**\n"
+upd_3: "[[{}]]({}/tree/{})ಗಾಗಿ ಹೊಸ ಅಪ್ಡೇಟ್ ತಯಾರಾಗಿದೆ : \n\nಬದಲಾವಣೆಗಳು:\n\n{}"
+upd_4: "`ಬದಲಾವಣೆಗಳು ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ, ಅದನ್ನು ನೋಡಲು ಫೈಲ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ`"
+upd_5: "ಅಪ್ಡೇಟ್ ಮಾಡಲು `{}update` ಅನ್ನು ಬಳಸಿ "
+upd_6: "{}\n\nಅಪ್ಡೇಟ್ ಮಾಡಲು `{}update now` ಅನ್ನು ಬಳಸಿ"
+upd_7: "\n`ನಿಮ್ಮ ಬೊಟ್` **[[{}]]({}/tree/{})**`ನೊಂದಿಗೆ ಅಪ್ಡೇಟ್ ಆಗಿದೆ`"
+
+# upload download
+udl_1: "`ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಬಯಸುವ ಫೈಲ್/ಮಾಧ್ಯಮಕ್ಕೆ ಪ್ರತ್ಯುತ್ತರಿಸಿ ...`"
+udl_2: "ಡೌನ್ಲೋಡ್ ಯಶಸ್ವಿಯಾಗಿದೆ.\nಗೆ\n `{}`\nin `{}`"
+udl_3: "`ಫೈಲ್ ಮಾಡಲು ನಿರ್ದಿಷ್ಟ ಮಾರ್ಗವನ್ನು ನೀಡಿ`"
+
+#words
+wrd_1: "**ಪದ** - `{}`\n\n**ಅರ್ಥಗಳು** - \n"
+wrd_2: "**ಪದ** - `{}`\n\n**ಸಮಾನಾರ್ಥಕ** - \n"
+wrd_3: "**ಪದ** - `{}`\n\n**ವಿರುದ್ಧಾರ್ಥಕ ಪದಗಳು** - \n"
+
+# ---------------------------------------------------#
+
+# assisant
+ast_1: "ನೀವು ಯಾವ API ಅನ್ನು ಹೊಂದಿಸಲು ಬಯಸುತ್ತೀರಿ ಎಂಬುದನ್ನು ಆರಿಸಿ."
+ast_2: "**remove.bg API**\nremove.bg ಇಂದ ನಿಮ್ಮ API ಕೀ ಅನ್ನು ನಮೂದಿಸಿ\n\nಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅಂತ್ಯಗೊಳಿಸಲು `/cancel` ಅನ್ನು ಬಳಸಿ "
+ast_3: "ನಮಸ್ಕಾರ {}. ದಯವಿಟ್ಟು ಆಯ್ಕೆಗಳ ಮೂಲಕ ಬ್ರೌಸ್ ಮಾಡಿ"
diff --git a/strings/strings/my.yml b/strings/strings/my.yml
index 32edf50..13d3f5b 100644
--- a/strings/strings/my.yml
+++ b/strings/strings/my.yml
@@ -96,7 +96,7 @@ bd_6: "`Channel sudah berada di database`"
# carbon
carbon_1: "Memproses..."
-carbon_2: "Carbonised oleh [{}](tg://user?id={})"
+carbon_2: "Dikarbonkan oleh [{}](tg://user?id={})"
# chats
chats_1: "`Memproses...`"
@@ -181,7 +181,7 @@ upd_7: "\n`Bot Anda` **di versi terkini** `dengan` **[[{}]]({}/tree/{})**\n"
# upload download
udl_1: "`Balas fail / media yang ingin anda muat turun ...`"
-udl_2: "Muat turun Berjaya...\nKepada\n`{}`\nin `{}`"
+udl_2: "Muat turun Berjaya...\ndi\n`{}`\nin `{}`"
udl_3: "`Berikan spesifik tempat ke fail`"
# words
diff --git a/vcstarter.py b/vcstarter.py
index 50f6ed2..d7b0e87 100644
--- a/vcstarter.py
+++ b/vcstarter.py
@@ -4,7 +4,8 @@ from json.decoder import JSONDecodeError
from aiohttp import web
from aiohttp.http_websocket import WSMsgType
-from pyUltroid import Var, vcbot, udB
+from pyUltroid import vcbot, udB
+from pyUltroid.dB.database import Var
from telethon import TelegramClient
from telethon.tl.functions.channels import GetFullChannelRequest
from telethon.tl.functions.phone import (
@@ -15,9 +16,11 @@ from telethon.tl.functions.phone import (
from telethon.tl.types import DataJSON
LOG_CHANNEL = int(udB.get("LOG_CHANNEL"))
-if vcbot is not None:
+if vcbot:
- bot = TelegramClient("ultroid_vc", Var.API_ID, Var.API_HASH).start(bot_token=udB.get("BOT_TOKEN"))
+ bot = TelegramClient(None, Var.API_ID, Var.API_HASH).start(
+ bot_token=udB.get("BOT_TOKEN")
+ )
async def get_entity(chat):
try:
@@ -171,7 +174,7 @@ if vcbot is not None:
def main():
app = web.Application()
app.router.add_route("GET", "/", websocket_handler)
- web.run_app(app, port=os.environ.get("PORT", 6969))
+ web.run_app(app, host="localhost", port=6969)
vcbot.start()
main()