From 4e65f218f58eeb0d8dc9fb1abb83cf116b67f9b2 Mon Sep 17 00:00:00 2001 From: Anonymous <69723581+New-dev0@users.noreply.github.com> Date: Thu, 17 Jun 2021 21:18:55 +0530 Subject: [PATCH] Ultroid v0.0.8 | 17-6-21 Co-authored-by: Aditya Co-authored-by: Danish Co-authored-by: Amit Sharma <48654350+buddhhu@users.noreply.github.com> Co-authored-by: sppidy Co-authored-by: Arnab Paryali Co-authored-by: divkix Co-authored-by: hellboi_atul Co-authored-by: Programming Error Co-authored-by: New-dev0 --- .gitignore | 21 +- Dockerfile | 9 +- app.json | 6 +- assistant/__init__.py | 2 +- assistant/api_setter.py | 59 +- assistant/inlinestuff.py | 92 +- assistant/localization.py | 2 +- assistant/othervars.py | 100 +- assistant/ping.py | 6 +- assistant/pmbot/banuser.py | 9 +- assistant/pmbot/incoming.py | 2 +- assistant/pmbot/outgoing.py | 12 +- assistant/start.py | 167 +- assistant/ytdl.py | 297 +- heroku.yml | 6 +- package-lock.json | 4091 ----------------------- package.json | 2 +- plugins/__init__.py | 291 +- plugins/_help.py | 2 +- plugins/_inline.py | 170 +- plugins/_ultroid.py | 2 +- plugins/_userlogs.py | 20 +- plugins/_wspr.py | 56 +- plugins/admintools.py | 31 +- plugins/afk.py | 5 +- plugins/anime.py | 81 + plugins/antiflood.py | 137 + plugins/ascii.py | 39 + plugins/asst_cmd.py | 95 + plugins/autocorrect.py | 5 +- plugins/autopic.py | 12 +- plugins/blacklist.py | 20 +- plugins/bot.py | 93 +- plugins/broadcast.py | 5 +- plugins/calculator.py | 5 +- plugins/carbon.py | 32 +- plugins/channelhacks.py | 7 +- plugins/chats.py | 9 +- plugins/clean_action.py | 5 +- plugins/compressor.py | 36 +- plugins/converter.py | 55 +- plugins/core.py | 5 +- plugins/dayevents.py | 5 +- plugins/deezer.py | 13 + plugins/devtools.py | 14 +- plugins/dm.py | 7 +- plugins/download_upload.py | 9 +- plugins/echo.py | 5 +- plugins/evaljs.py | 5 +- plugins/extra.py | 7 +- plugins/fakeaction.py | 5 +- plugins/fedutils.py | 5 +- plugins/filter.py | 5 +- plugins/fontgen.py | 47 + plugins/forcesubscribe.py | 5 +- plugins/gadgets.py | 3 - plugins/gdrive.py | 5 +- plugins/get_addons.py | 5 +- plugins/giftools.py | 5 +- plugins/github.py | 5 +- plugins/glitch.py | 5 +- plugins/globaltools.py | 152 +- plugins/google.py | 34 +- plugins/greetings.py | 93 +- plugins/groups.py | 29 +- plugins/imagetools.py | 5 +- plugins/locks.py | 5 +- plugins/logo.py | 19 +- plugins/mediainfo.py | 5 +- plugins/megadl.py | 71 +- plugins/mute.py | 7 +- plugins/notes.py | 20 +- plugins/nsfw_filter.py | 135 + plugins/pdftools.py | 27 +- plugins/pinterest.py | 5 +- plugins/pmpermit.py | 228 +- plugins/polls.py | 5 +- plugins/profanity_filter.py | 44 + plugins/profile.py | 5 +- plugins/qrcode.py | 5 +- plugins/randomuser.py | 23 + plugins/redis.py | 5 +- plugins/resize.py | 5 +- plugins/saavn.py | 83 +- plugins/save.py | 25 +- plugins/schedule_msg.py | 7 +- plugins/snips.py | 5 +- plugins/specialtools.py | 6 +- plugins/stickertools.py | 82 +- plugins/sudo.py | 41 +- plugins/tag.py | 5 +- plugins/tools.py | 17 +- plugins/unsplash.py | 5 +- plugins/updater.py | 12 +- plugins/utilities.py | 133 +- plugins/variables.py | 3 - plugins/vcplugin.py | 19 +- plugins/warn.py | 5 +- plugins/webshot.py | 5 +- plugins/webupload.py | 5 +- plugins/whichsong.py | 46 + plugins/words.py | 5 +- plugins/youtube.py | 102 +- plugins/ziptools.py | 38 +- requirements.txt | 4 +- resources/extras/local-requirements.txt | 1 + resources/session/session.sh | 2 +- resources/session/ssgen.py | 3 +- resources/startup/locals.py | 2 +- resources/startup/startup.sh | 2 +- sessiongen | 2 +- src/handlers/index.ts | 2 + src/handlers/pause-resume.ts | 2 +- src/handlers/playFile.ts | 85 + src/tgcalls.ts | 76 +- strings/strings/en.yml | 2 +- strings/strings/ka.yml | 203 ++ strings/strings/my.yml | 4 +- vcstarter.py | 11 +- 119 files changed, 2730 insertions(+), 5508 deletions(-) delete mode 100644 package-lock.json create mode 100644 plugins/anime.py create mode 100644 plugins/antiflood.py create mode 100644 plugins/ascii.py create mode 100644 plugins/asst_cmd.py create mode 100644 plugins/deezer.py create mode 100644 plugins/fontgen.py create mode 100644 plugins/nsfw_filter.py create mode 100644 plugins/profanity_filter.py create mode 100644 plugins/randomuser.py create mode 100644 plugins/whichsong.py create mode 100644 src/handlers/playFile.ts create mode 100644 strings/strings/ka.yml diff --git a/.gitignore b/.gitignore index c71fb251cd..a8bff80e48 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 9426aba95f..67b590c911 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 f4cee6cfa1..5e6e0f4b9b 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 84b9599178..9ff002d22a 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 81e0cecf32..e745ae4bf7 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 c08921ed02..6f4d6bfa7d 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 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 1ac30f0675..22a17d8daa 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 05b6959bae..568c2f8d6e 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 @@ 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 1b4bbddb64..1c75b1b5c3 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 cc491578d1..987d2928a2 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 ea56e28727..157a3163ee 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 aa1b4ff2bf..2a4e9a9b86 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 41af4839f3..744af2f258 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 @@ __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")], +] + +_start = [ + [ + Button.inline("Lᴀɴɢᴜᴀɢᴇ 🌐", data="lang"), + Button.inline("Sᴇᴛᴛɪɴɢs ⚙️", data="setter"), + ], + [ + Button.inline("Sᴛᴀᴛs ✨", data="stat"), + Button.inline("Bʀᴏᴀᴅᴄᴀsᴛ 📻", data="bcast"), + ], +] -@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: + +@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 @@ async def bdcast(event): 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 6f6ca30f34..c54625d3d4 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 +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) - 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), - ) - -@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 2c9bc4b300..ce83d37360 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 98b3f7eb2f..0000000000 --- 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 2043dd319b..b75a025b1f 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 11658d8a76..da977287c9 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 @@ 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 @@ 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 8dd88d6891..e15dafd979 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 44550e893c..2a0cee2a5e 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 @@ 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 @@ 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,37 +113,42 @@ async def inline_handler(event): OWNER_NAME, len(PLUGINS), len(ADDONS), - cmd, + len(z), ), + buttons=_main_help_menu, + ) + await event.answer([result], gallery=True) + + +@in_pattern("paste") +@in_owner +async def _(event): + ok = event.text.split(" ")[1] + link = "https://nekobin.com/" + result = event.builder.article( + title="Paste", + text="Pᴀsᴛᴇᴅ Tᴏ Nᴇᴋᴏʙɪɴ!", 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.url("NekoBin", url=f"{link}{ok}"), + Button.url("Raw", url=f"{link}raw/{ok}"), ], - [Button.inline("••Cʟᴏꜱᴇ••", data="close")], ], ) await event.answer([result]) -@in_pattern("paste") +@in_pattern("dog") @in_owner async def _(event): ok = event.text.split(" ")[1] - link = "https://nekobin.com/" + link = "https://del.dog/" result = event.builder.article( title="Paste", - text="Pᴀsᴛᴇᴅ Tᴏ Nᴇᴋᴏʙɪɴ!", + text="Pᴀsᴛᴇᴅ Tᴏ Dᴏɢʙɪɴ!", buttons=[ [ - Button.url("NekoBin", url=f"{link}{ok}"), + Button.url("DogBin", url=f"{link}{ok}"), Button.url("Raw", url=f"{link}raw/{ok}"), ], ], @@ -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 d266299822..17f36c9fc7 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 0f377bc186..26ecaa0781 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 0b71e3266e..2a4d1e0884 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 . 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 152f667311..1442049004 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 @@ 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 d8fc12aac3..98690713e3 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 0000000000..781209a858 --- /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 0000000000..2f639fa1f5 --- /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 0000000000..b7ae9ea6e3 --- /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 0000000000..3552cb826d --- /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 c96fa61067..6e8c700123 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 66db7677ea..3410c24b04 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 23878643a4..74f55b241b 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 . 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 7dbef2d630..4d506e81f3 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 @@ 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 b15cc6f969..8ca5347a98 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 4d64021b60..3199a8d6cb 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 1e39544bac..3472849042 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 c9940f41c5..2ca35f9904 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 4ba371a3ee..f72d06af52 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 @@ 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 41ed0804e8..34cbef4481 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 c5e603f784..dcc9e4eda8 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 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 2c758821ae..cda65f7d5c 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 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 @@ 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 36b5438665..6ce6d39455 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 cb5670679c..25b63d2d90 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 0000000000..d81f4a4d05 --- /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 d6dd25aabf..8c15911222 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 @@ 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 ec41f5de5a..8f5cf026ff 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 @@ @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 a97298032b..9658af8d63 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 94a44935bf..2ed67357bf 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 fe427f34ef..828c42020f 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 6843147848..5f962fbbf3 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 79ca0b37b9..e7a65d7d58 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 f4ef728bbb..ff04aae5c3 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 44ff97c029..945c76e949 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 0000000000..2057e49e3e --- /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 4aae24d293..b5fefb8dcc 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 e98b19e007..aeaf53c0fc 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 7fe972ee58..bfd0542c6f 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 83746c603f..01b07820d4 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 86c17b83a6..c65e53c84d 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 7d405f33e4..87edfc53aa 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 5f50020705..bb00e95a64 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 514d4c723c..93c7cdf41b 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 @@ 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 844804de9d..7deed7b1ce 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 @@ 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 82c59eae1e..13473f6859 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,48 +96,6 @@ async def listwel(event): 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: - 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["welcome"] - 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) - - @ultroid_cmd(pattern="setgoodbye") async def setgb(event): x = await eor(event, get_string("com_1")) @@ -156,6 +117,8 @@ async def setgb(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: @@ -191,9 +154,9 @@ async def listgd(event): @ultroid_bot.on(events.ChatAction()) async def _(event): - wel = get_goodbye(event.chat_id) - if wel: - if event.user_left or event.user_kicked: + 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" @@ -229,6 +192,44 @@ async def _(event): ) 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" + 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["welcome"] + 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 a4b46d1e42..f30f6c8381 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 . 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 10f7880be6..e1aa804629 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 a58004ef9d..a53d1868e1 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 9ef888b041..e89ac10153 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 3bff7f20c1..066a86f17b 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 47b5961830..3bc61f36e5 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 c8104d968b..1b126758db 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 @@ 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 d973042c02..427782d7be 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 . 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 0000000000..8df5482377 --- /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 ecec1a6de7..7e5e193bcd 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 7037638a90..9a1871601a 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 70784d012b..f6f6afdda5 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 @@ 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 @@ 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 @@ async def autoappr(e): 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 @@ async def permitpm(event): 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,64 @@ async def permitpm(event): 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( + 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=UNAPPROVED_MSG.format( - ON=OWNER_NAME, - warn=wrn, - twarn=WARNS, - UND=UND, - name=name, - fullname=fullname, - username=username, - count=count, - mention=mention, - ), + caption=message_, ) elif event.text == prevmsg: - async for message in event.client.iter_messages( + async for message in ultroid.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 +276,31 @@ async def permitpm(event): 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 @@ async def permitpm(event): 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 @@ async def approvepm(apprvpm): 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 @@ async def approvepm(apprvpm): 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 @@ async def disapprovepm(e): "`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 @@ async def disapprovepm(e): 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 dbbfed2c28..5c48c22ddf 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 0000000000..3f4c62c222 --- /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 26806c3150..c6beb29a96 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 3ce61a8a79..018e0a5272 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 0000000000..d8534af62c --- /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 efdd5f2ad2..38aff0b92d 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 cc98dbb7f2..16ac1c7fa5 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 530fbe0fa8..30e1ebfc9c 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 . 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 78a3f72a0a..3ba5fa4b06 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 e8401efa69..b261c8bbba 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 @@ @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 3584c01520..e5197f619f 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 fc2169594e..fb3c753bcd 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 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 c3b60ad5c4..12c53f9c5f 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 @@ 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 b5c40d126d..9c42331f0e 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 748a83c17a..71a6b9f5bf 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 a5def64c6a..badc1ba698 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 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 0f57632738..dd26d524c6 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 3d591c098c..bb2ba8c6d0 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 @@ @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 aaab816b0b..8c989a0a16 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 @@ 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}") + + +@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) -HELP.update({f"{__name__.split('.')[1]}": f"{__doc__.format(i=HNDLR)}"}) +@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 d2f9fca054..cab76d9369 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 0a4023bca0..9bd34afa47 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 597eddbddd..43384b942b 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 00bf2291fa..896ad99b0b 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 65740ac0fe..798a6c6462 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 0000000000..f6f8056bea --- /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 403350a425..c2a7b7f4b3 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 2041cb3aab..b415975fa5 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 20540dd525..c66252875d 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 252a84dc6a..520080b273 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 89f77cb678..2b828b0ce0 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 6a12414dbb..0d11eb1338 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 5c3f371c52..334d739fdb 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 @@ 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 d22c2b172d..639d4dd991 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 cf739b3d66..e509f09e2c 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 e4102fa050..edba1d201b 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 5143ccf060..59d247b8ec 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 1c7d135284..bf07e07deb 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 0000000000..175b7e0a6b --- /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 1abf0181c4..47890f4a51 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 8bfc748cc7..01edff4fe4 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 0000000000..963e1d105d --- /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 32edf5047f..13d3f5b205 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 50f6ed24fd..d7b0e87c21 100644 --- a/vcstarter.py +++ b/vcstarter.py @@ -4,7 +4,8 @@ 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.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 @@ async def websocket_handler(request): 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()