From c93c8f8bb71878a3c707c3a13da0d808f1bff38a Mon Sep 17 00:00:00 2001 From: GOD-R4V4N Date: Sun, 17 Nov 2024 18:55:46 +0530 Subject: [PATCH 001/184] Asuraa --- .dockerignore | 10 + .github/dependabot.yml | 12 + .github/workflows/codeql.yml | 92 + .github/workflows/python-app.yml | 39 + .gitignore | 10 + Dockerfile | 12 + Procfile | 1 + README.md | 59 + TanuMusic/__init__.py | 26 + TanuMusic/__main__.py | 62 + TanuMusic/assets/empty.png | Bin 0 -> 889 bytes TanuMusic/assets/font.ttf | Bin 0 -> 128248 bytes TanuMusic/assets/font2.ttf | Bin 0 -> 22020 bytes TanuMusic/assets/font3.ttf | Bin 0 -> 80716 bytes TanuMusic/assets/font4.ttf | Bin 0 -> 52340 bytes TanuMusic/assets/left.jpg | Bin 0 -> 51963 bytes TanuMusic/assets/play_icons.png | Bin 0 -> 28659 bytes TanuMusic/assets/thum.png | Bin 0 -> 325691 bytes TanuMusic/assets/upic.png | Bin 0 -> 19293 bytes TanuMusic/assets/welcome.png | Bin 0 -> 59669 bytes TanuMusic/core/bot.py | 54 + TanuMusic/core/call.py | 601 ++++++ TanuMusic/core/dir.py | 20 + TanuMusic/core/git.py | 71 + TanuMusic/core/mongo.py | 49 + TanuMusic/core/userbot.py | 170 ++ TanuMusic/logging.py | 19 + TanuMusic/misc.py | 75 + TanuMusic/platforms/Apple.py | 71 + TanuMusic/platforms/Carbon.py | 106 ++ TanuMusic/platforms/Resso.py | 54 + TanuMusic/platforms/Soundcloud.py | 39 + TanuMusic/platforms/Spotify.py | 98 + TanuMusic/platforms/Telegram.py | 176 ++ TanuMusic/platforms/Youtube.py | 400 ++++ TanuMusic/platforms/__init__.py | 7 + TanuMusic/plugins/__init__.py | 19 + TanuMusic/plugins/admins/auth.py | 89 + TanuMusic/plugins/admins/callback.py | 396 ++++ TanuMusic/plugins/admins/loop.py | 46 + TanuMusic/plugins/admins/pause.py | 21 + TanuMusic/plugins/admins/resume.py | 21 + TanuMusic/plugins/admins/seek.py | 75 + TanuMusic/plugins/admins/shuffle.py | 33 + TanuMusic/plugins/admins/skip.py | 232 +++ TanuMusic/plugins/admins/speed.py | 112 ++ TanuMusic/plugins/admins/stop.py | 23 + TanuMusic/plugins/bot/help.py | 106 ++ TanuMusic/plugins/bot/inline.py | 68 + TanuMusic/plugins/bot/mustjoin.py | 60 + TanuMusic/plugins/bot/repo.py# | 28 + TanuMusic/plugins/bot/settings.py | 391 ++++ TanuMusic/plugins/bot/start.py | 198 ++ TanuMusic/plugins/bot/ytsearch.py | 30 + TanuMusic/plugins/misc/autoleave.py | 74 + TanuMusic/plugins/misc/broadcast.py | 169 ++ TanuMusic/plugins/misc/cstates.py | 33 + TanuMusic/plugins/misc/seeker.py | 24 + TanuMusic/plugins/misc/watcher.py | 14 + TanuMusic/plugins/play/channel.py | 49 + TanuMusic/plugins/play/live.py | 60 + TanuMusic/plugins/play/play.py | 663 +++++++ TanuMusic/plugins/play/playmode.py | 33 + TanuMusic/plugins/play/pornplay.py# | 93 + TanuMusic/plugins/sudo/autoend.py | 24 + TanuMusic/plugins/sudo/blchat.py | 61 + TanuMusic/plugins/sudo/block.py | 59 + TanuMusic/plugins/sudo/dev.py | 228 +++ TanuMusic/plugins/sudo/filemanager.py | 145 ++ TanuMusic/plugins/sudo/gban.py | 125 ++ TanuMusic/plugins/sudo/logger.py | 23 + TanuMusic/plugins/sudo/maintenance.py | 39 + TanuMusic/plugins/sudo/restart.py | 137 ++ TanuMusic/plugins/sudo/sudoers.py | 71 + TanuMusic/plugins/tools/afk.py | 380 ++++ TanuMusic/plugins/tools/ask.py | 53 + TanuMusic/plugins/tools/carbon.py | 39 + TanuMusic/plugins/tools/clean.py | 19 + TanuMusic/plugins/tools/fonts.py | 193 ++ TanuMusic/plugins/tools/left.py | 108 ++ TanuMusic/plugins/tools/pypi.py | 49 + TanuMusic/plugins/tools/queue.py | 269 +++ TanuMusic/plugins/tools/quiz.py | 159 ++ TanuMusic/plugins/tools/quoto.py | 290 +++ TanuMusic/plugins/tools/reload.py | 125 ++ TanuMusic/plugins/tools/sangmata.py# | 54 + TanuMusic/plugins/tools/song.py | 38 + TanuMusic/plugins/tools/speedtest.py | 45 + TanuMusic/plugins/tools/stats.py | 135 ++ TanuMusic/plugins/tools/stickers.py | 90 + TanuMusic/plugins/tools/translate.py | 21 + TanuMusic/plugins/tools/welcome.py | 149 ++ TanuMusic/utils/__init__.py | 8 + TanuMusic/utils/channelplay.py | 23 + TanuMusic/utils/cleanmode.py | 30 + TanuMusic/utils/database.py | 684 +++++++ TanuMusic/utils/decorators/#play.py | 1 + TanuMusic/utils/decorators/__init__.py | 2 + TanuMusic/utils/decorators/admins.py | 203 ++ TanuMusic/utils/decorators/language.py | 58 + TanuMusic/utils/decorators/play.py | 195 ++ TanuMusic/utils/error.py | 39 + TanuMusic/utils/exceptions.py | 3 + TanuMusic/utils/extraction.py | 17 + TanuMusic/utils/fonts.py | 2361 ++++++++++++++++++++++++ TanuMusic/utils/formatters.py | 185 ++ TanuMusic/utils/inline/__init__.py | 7 + TanuMusic/utils/inline/extras.py | 41 + TanuMusic/utils/inline/help.py | 76 + TanuMusic/utils/inline/play.py | 186 ++ TanuMusic/utils/inline/queue.py | 81 + TanuMusic/utils/inline/settings.py | 110 ++ TanuMusic/utils/inline/speed.py | 41 + TanuMusic/utils/inline/start.py | 33 + TanuMusic/utils/inline/stats.py | 50 + TanuMusic/utils/inlinequery.py | 62 + TanuMusic/utils/logger.py | 33 + TanuMusic/utils/mongo.py | 8 + TanuMusic/utils/pastebin.py | 21 + TanuMusic/utils/stream/autoclear.py | 18 + TanuMusic/utils/stream/queue.py | 91 + TanuMusic/utils/stream/stream.py | 420 +++++ TanuMusic/utils/sys.py | 15 + TanuMusic/utils/thumbnails.py | 163 ++ app.json | 73 + config/ConfigReadme.md | 115 ++ config/__init__.py | 1 + config/config.py | 131 ++ cookies/cookies.txt | 20 + heroku.yml | 5 + requirements.txt | 63 + runtime.txt | 1 + sample.env | 7 + setup | 126 ++ start | 1 + strings/__init__.py | 34 + strings/helpers.py | 98 + strings/langs/ar.yml | 320 ++++ strings/langs/en.yml | 302 +++ strings/langs/hi.yml | 306 +++ strings/langs/pa.yml | 308 ++++ 141 files changed, 15797 insertions(+) create mode 100644 .dockerignore create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 .github/workflows/python-app.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Procfile create mode 100644 README.md create mode 100644 TanuMusic/__init__.py create mode 100644 TanuMusic/__main__.py create mode 100644 TanuMusic/assets/empty.png create mode 100644 TanuMusic/assets/font.ttf create mode 100644 TanuMusic/assets/font2.ttf create mode 100644 TanuMusic/assets/font3.ttf create mode 100644 TanuMusic/assets/font4.ttf create mode 100644 TanuMusic/assets/left.jpg create mode 100644 TanuMusic/assets/play_icons.png create mode 100644 TanuMusic/assets/thum.png create mode 100644 TanuMusic/assets/upic.png create mode 100644 TanuMusic/assets/welcome.png create mode 100644 TanuMusic/core/bot.py create mode 100644 TanuMusic/core/call.py create mode 100644 TanuMusic/core/dir.py create mode 100644 TanuMusic/core/git.py create mode 100644 TanuMusic/core/mongo.py create mode 100644 TanuMusic/core/userbot.py create mode 100644 TanuMusic/logging.py create mode 100644 TanuMusic/misc.py create mode 100644 TanuMusic/platforms/Apple.py create mode 100644 TanuMusic/platforms/Carbon.py create mode 100644 TanuMusic/platforms/Resso.py create mode 100644 TanuMusic/platforms/Soundcloud.py create mode 100644 TanuMusic/platforms/Spotify.py create mode 100644 TanuMusic/platforms/Telegram.py create mode 100644 TanuMusic/platforms/Youtube.py create mode 100644 TanuMusic/platforms/__init__.py create mode 100644 TanuMusic/plugins/__init__.py create mode 100644 TanuMusic/plugins/admins/auth.py create mode 100644 TanuMusic/plugins/admins/callback.py create mode 100644 TanuMusic/plugins/admins/loop.py create mode 100644 TanuMusic/plugins/admins/pause.py create mode 100644 TanuMusic/plugins/admins/resume.py create mode 100644 TanuMusic/plugins/admins/seek.py create mode 100644 TanuMusic/plugins/admins/shuffle.py create mode 100644 TanuMusic/plugins/admins/skip.py create mode 100644 TanuMusic/plugins/admins/speed.py create mode 100644 TanuMusic/plugins/admins/stop.py create mode 100644 TanuMusic/plugins/bot/help.py create mode 100644 TanuMusic/plugins/bot/inline.py create mode 100644 TanuMusic/plugins/bot/mustjoin.py create mode 100644 TanuMusic/plugins/bot/repo.py# create mode 100644 TanuMusic/plugins/bot/settings.py create mode 100644 TanuMusic/plugins/bot/start.py create mode 100644 TanuMusic/plugins/bot/ytsearch.py create mode 100644 TanuMusic/plugins/misc/autoleave.py create mode 100644 TanuMusic/plugins/misc/broadcast.py create mode 100644 TanuMusic/plugins/misc/cstates.py create mode 100644 TanuMusic/plugins/misc/seeker.py create mode 100644 TanuMusic/plugins/misc/watcher.py create mode 100644 TanuMusic/plugins/play/channel.py create mode 100644 TanuMusic/plugins/play/live.py create mode 100644 TanuMusic/plugins/play/play.py create mode 100644 TanuMusic/plugins/play/playmode.py create mode 100644 TanuMusic/plugins/play/pornplay.py# create mode 100644 TanuMusic/plugins/sudo/autoend.py create mode 100644 TanuMusic/plugins/sudo/blchat.py create mode 100644 TanuMusic/plugins/sudo/block.py create mode 100644 TanuMusic/plugins/sudo/dev.py create mode 100644 TanuMusic/plugins/sudo/filemanager.py create mode 100644 TanuMusic/plugins/sudo/gban.py create mode 100644 TanuMusic/plugins/sudo/logger.py create mode 100644 TanuMusic/plugins/sudo/maintenance.py create mode 100644 TanuMusic/plugins/sudo/restart.py create mode 100644 TanuMusic/plugins/sudo/sudoers.py create mode 100644 TanuMusic/plugins/tools/afk.py create mode 100644 TanuMusic/plugins/tools/ask.py create mode 100644 TanuMusic/plugins/tools/carbon.py create mode 100644 TanuMusic/plugins/tools/clean.py create mode 100644 TanuMusic/plugins/tools/fonts.py create mode 100644 TanuMusic/plugins/tools/left.py create mode 100644 TanuMusic/plugins/tools/pypi.py create mode 100644 TanuMusic/plugins/tools/queue.py create mode 100644 TanuMusic/plugins/tools/quiz.py create mode 100644 TanuMusic/plugins/tools/quoto.py create mode 100644 TanuMusic/plugins/tools/reload.py create mode 100644 TanuMusic/plugins/tools/sangmata.py# create mode 100644 TanuMusic/plugins/tools/song.py create mode 100644 TanuMusic/plugins/tools/speedtest.py create mode 100644 TanuMusic/plugins/tools/stats.py create mode 100644 TanuMusic/plugins/tools/stickers.py create mode 100644 TanuMusic/plugins/tools/translate.py create mode 100644 TanuMusic/plugins/tools/welcome.py create mode 100644 TanuMusic/utils/__init__.py create mode 100644 TanuMusic/utils/channelplay.py create mode 100644 TanuMusic/utils/cleanmode.py create mode 100644 TanuMusic/utils/database.py create mode 100644 TanuMusic/utils/decorators/#play.py create mode 100644 TanuMusic/utils/decorators/__init__.py create mode 100644 TanuMusic/utils/decorators/admins.py create mode 100644 TanuMusic/utils/decorators/language.py create mode 100644 TanuMusic/utils/decorators/play.py create mode 100644 TanuMusic/utils/error.py create mode 100644 TanuMusic/utils/exceptions.py create mode 100644 TanuMusic/utils/extraction.py create mode 100644 TanuMusic/utils/fonts.py create mode 100644 TanuMusic/utils/formatters.py create mode 100644 TanuMusic/utils/inline/__init__.py create mode 100644 TanuMusic/utils/inline/extras.py create mode 100644 TanuMusic/utils/inline/help.py create mode 100644 TanuMusic/utils/inline/play.py create mode 100644 TanuMusic/utils/inline/queue.py create mode 100644 TanuMusic/utils/inline/settings.py create mode 100644 TanuMusic/utils/inline/speed.py create mode 100644 TanuMusic/utils/inline/start.py create mode 100644 TanuMusic/utils/inline/stats.py create mode 100644 TanuMusic/utils/inlinequery.py create mode 100644 TanuMusic/utils/logger.py create mode 100644 TanuMusic/utils/mongo.py create mode 100644 TanuMusic/utils/pastebin.py create mode 100644 TanuMusic/utils/stream/autoclear.py create mode 100644 TanuMusic/utils/stream/queue.py create mode 100644 TanuMusic/utils/stream/stream.py create mode 100644 TanuMusic/utils/sys.py create mode 100644 TanuMusic/utils/thumbnails.py create mode 100644 app.json create mode 100644 config/ConfigReadme.md create mode 100644 config/__init__.py create mode 100644 config/config.py create mode 100644 cookies/cookies.txt create mode 100644 heroku.yml create mode 100644 requirements.txt create mode 100644 runtime.txt create mode 100644 sample.env create mode 100644 setup create mode 100644 start create mode 100644 strings/__init__.py create mode 100644 strings/helpers.py create mode 100644 strings/langs/ar.yml create mode 100644 strings/langs/en.yml create mode 100644 strings/langs/hi.yml create mode 100644 strings/langs/pa.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000000..fe58f981e1df --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.env +.cache +log.txt +.DS_Store +*.session +raw_files/ +cache/ +downloads/ +__pycache__/ +*.session-journal diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..3f60c9ef335d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ + +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000000..5276ede21934 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,92 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL Advanced" + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: '26 19 * * 1' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: python + build-mode: none + # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml new file mode 100644 index 000000000000..1168bd9ad833 --- /dev/null +++ b/.github/workflows/python-app.yml @@ -0,0 +1,39 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python + +name: Python application + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +permissions: + contents: read + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.10 + uses: actions/setup-python@v3 + with: + python-version: "3.10" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..fe58f981e1df --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.env +.cache +log.txt +.DS_Store +*.session +raw_files/ +cache/ +downloads/ +__pycache__/ +*.session-journal diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000000..1d05a460e13b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM nikolaik/python-nodejs:python3.10-nodejs19 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends ffmpeg \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY . /app/ +WORKDIR /app/ +RUN pip3 install --no-cache-dir -U -r requirements.txt + +CMD bash start diff --git a/Procfile b/Procfile new file mode 100644 index 000000000000..36ad736e105f --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +worker: bash start diff --git a/README.md b/README.md new file mode 100644 index 000000000000..32076bb7d544 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ + +

+ +

+ +

+ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +

+ +[Tanu Music Bot](https://t.me/TanuMusicxBot) is a Powerful Telegram Music+Video Bot written in Python using Pyrogram and Py-Tgcalls by which you can stream songs, video and even live streams in your group calls via various sources. + +* Youtube, Soundcloud, Apple Music, Spotify, Resso, Live Streams and Telegram Audios & Videos support. +* Written from scratch, making it stable and less crashes with attractive thumbnails. +* Loop, Seek, Shuffle, Specific Skip, Playlists etc support + + + +## 🚀 Heroku Deployment + +

Click the button below to deploy Tanu Music Bot on Heroku!

+

If You show any error like failed to app Creation Then fork and deploy

+ + + +## 🖇 VPS Deployment +- Get your [Necessary Variables](https://github.com/itzAsuraa/TanuMusic/blob/master/sample.env) +- clone repo : `git clone https://github.com/itzAsuraa/TanuMusic && cd TanuMusic` +- Setup by : ` sudo bash setup` +- Install tmux to keep running your bot when you close the terminal by : +`sudo apt install tmux && tmux` +- Finally run the bot by : +`bash start` +- For getting out from tmux session : Press `Ctrl+b` and then `d`
+ + +# Tanu Music Configs + [Checkout Here For Config Vars](https://github.com/itzAsuraa/TanuMusic/blob/master/config/ConfigReadme.md) +# 🏷 Support / Assistance + +Reach out to the maintainer at one of the following places: + +- [GitHub Issues](https://github.com/itzAsuraa/TanuMusic/issues/new?assignees=&labels=question&template=SUPPORT_QUESTION.md&title=support%3A+) +- Contact [Telegram profile](https://t.me/itzAsuraa) +- [Telegram Support](https://t.me/AsuraaSupports) + +If you want to say **thank you** or/and support active development of TanuMusicBot: + +- Add a [GitHub Star](https://github.com/itzAsuraa/TanuMusic) to the project. + + +Together, we can make **TanuMusic** better! + +### Contact: + + + + + + \ No newline at end of file diff --git a/TanuMusic/__init__.py b/TanuMusic/__init__.py new file mode 100644 index 000000000000..83022f7899f2 --- /dev/null +++ b/TanuMusic/__init__.py @@ -0,0 +1,26 @@ +from TanuMusic.core.bot import Tanu +from TanuMusic.core.dir import dirr +from TanuMusic.core.git import git +from TanuMusic.core.userbot import Userbot +from TanuMusic.misc import dbb, heroku + +from .logging import LOGGER + +dirr() +git() +dbb() +heroku() + +app = Tanu() +userbot = Userbot() + + +from .platforms import * + +Apple = AppleAPI() +Carbon = CarbonAPI() +SoundCloud = SoundAPI() +Spotify = SpotifyAPI() +Resso = RessoAPI() +Telegram = TeleAPI() +YouTube = YouTubeAPI() diff --git a/TanuMusic/__main__.py b/TanuMusic/__main__.py new file mode 100644 index 000000000000..2bcdd075e601 --- /dev/null +++ b/TanuMusic/__main__.py @@ -0,0 +1,62 @@ +import asyncio +import importlib + +from pyrogram import idle +from pytgcalls.exceptions import NoActiveGroupCall + +import config +from TanuMusic import LOGGER, app, userbot +from TanuMusic.core.call import Tanu +from TanuMusic.misc import sudo +from TanuMusic.plugins import ALL_MODULES +from TanuMusic.utils.database import get_banned_users, get_gbanned +from config import BANNED_USERS + + +async def init(): + if ( + not config.STRING1 + and not config.STRING2 + and not config.STRING3 + and not config.STRING4 + and not config.STRING5 + ): + LOGGER(__name__).error("✦ Assistant client variables not defined, exiting...") + exit() + await sudo() + try: + users = await get_gbanned() + for user_id in users: + BANNED_USERS.add(user_id) + users = await get_banned_users() + for user_id in users: + BANNED_USERS.add(user_id) + except: + pass + await app.start() + for all_module in ALL_MODULES: + importlib.import_module("TanuMusic.plugins" + all_module) + LOGGER("TanuMusic.plugins").info("✦ Successfully Imported Modules...💞") + await userbot.start() + await Tanu.start() + try: + await Tanu.stream_call("https://te.legra.ph/file/29f784eb49d230ab62e9e.mp4") + except NoActiveGroupCall: + LOGGER("TanuMusic").error( + "✦ Please turn on the videochat of your log group\channel.\n\n✦ Stopping Bot...💣" + ) + exit() + except: + pass + await Tanu.decorators() + LOGGER("TanuMusic").info( + "✦ Created By ➥ The Captain...🐝" + ) + await idle() + await app.stop() + await userbot.stop() + LOGGER("TanuMusic").info("❖ Stopping Tanu Music Bot...💌") + + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(init()) diff --git a/TanuMusic/assets/empty.png b/TanuMusic/assets/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..5972e18ec8004ce0dad6ac3ac33c894d79cb9570 GIT binary patch literal 889 zcmeAS@N?(olHy`uVBq!ia0y~yVEh7PpWt8vl5FBlk@9XwqeLn`LHy?T)MfP%n* z4VV6w+qFGt?0CcZ>GZ6b{0tSh>#Z3WEYe>v2qcW+(J&ZI11M==1EXseORwdED-pmf O#o+1c=d#Wzp$P!J=_!5y literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/font.ttf b/TanuMusic/assets/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2ceaf63a3281450969d30f3f256e19940a32cfaa GIT binary patch literal 128248 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 literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/font2.ttf b/TanuMusic/assets/font2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c9ad85c06c977390616aeb060879668bce3bfcd6 GIT binary patch literal 22020 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 literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/font3.ttf b/TanuMusic/assets/font3.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cc57cf044eb48dd513345978ef137c12760c13ed GIT binary patch literal 80716 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 Mm=?uT+mGM!zs&8OQUCw| literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/font4.ttf b/TanuMusic/assets/font4.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d6cadf6ccfaa7158f9239f0055862bbef3bb9d7a GIT binary patch literal 52340 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�JQ1m|)NM>21gvwy>{= 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 TfA&3giT4B6(CDhgX&nC-aB(z* literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/left.jpg b/TanuMusic/assets/left.jpg new file mode 100644 index 0000000000000000000000000000000000000000..480893395d423a1a5f9034613fdc93a023cb116e GIT binary patch literal 51963 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 Qpu{iNy2=Af$kHqS*^*(&1poj5 literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/play_icons.png b/TanuMusic/assets/play_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..4b69523d2e4a873c8d25dbab9b2674a0276e4abe GIT binary patch literal 28659 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 M)Hlg$al?TB0ZRn7mH+?% literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/thum.png b/TanuMusic/assets/thum.png new file mode 100644 index 0000000000000000000000000000000000000000..94d09d041ee7f041681a77a5f796fd58f4450513 GIT binary patch literal 325691 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 z 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
R#~-&}3uO?dZ{1dR{{b{Z@wr zEpjg1jEelA7aJ~ma8?d7wqR_N7}<+6k^KVr;-8I-1E^eLHlPP~8Sz}I95dn*v%sOQ z!yw9mX&ONF2ag`#l!f%0iz~L!-?Q&p%Ckc?zC5sS32S<{oob+sg)Z#qPce|4BsPeRoVEX|2Z}UBSgUc_bB)Dr?y*Go&zRWaxa%@Z1$|So0qYenssZG zI>0SZLHD_UmU#tX0Ru zm}@ApkFy0nW=Atp{spgSgQJazi2jtp@%#5Cg97DjiF?Ai$cVj^+1kJ4@Ye>s2^v>F zY+oeJRV=ctq}5yml{H`IIt+WbyMObjOxc{p<|n}{xnd7?hfjD^4nsdA0n}UQbF-3& zCd~!w{_h*a-2il%_2qIRHl5<}WRc)Sf6)rtLn~h}i6RZc7+Dm5Lfy;y$*1f~ z2q1U?L-)2>_G+*W{pkOV{`RsmOSQ^o7)=MyIwqCY;j*rDjkhnvn4PScxM+=^7gE_Na)2r6yY4NPVAh5YuWhH|W?- z+&pLKW$eAT);Fwh*}Gc;VjRP%S3s&xxe@Bb@m!4l_Wap&GLsy1u%m_kR+v*&{QX7e zQ&Dqv!Xw@F)ZrRREb2{sfoTI?(y3sqK12>U_iCfQdU;`n8pXgjL-V zzW$7p*HD^dLiHboR2m(b%m^aDJE?Wi$9B!YbQ}D1xxj67Ag1-uxnRLt*yStD+Oycr zOT{sUSp8S~B4ONs*Q2c2Gog4^$%ukxoF!8OR$sn4=8TKk6)=3BdtkW#Nb8e*VQ%A+ zTC{C;ZB)%;HuyrOwt}e^HxzghDbBTOe(f{#<(A%CeYnxgi=UT-09RB};?_OmtSXV* z_Q95LJqCS|!9@PHKj^bvMF#o1Pralmu1nO&YmM%WMuc?83)W}!-q2Kf0d@o4BX~fe zKSN(J`4v>N1^2)(BnE6#LZJYhfb}({5A!M?>4JQRFoxT3zkGi4%uDU~TE z^jJ|rskKhxytJz9E_54bNItH_9&JM$Xig5*fJOZ+{D{nqYk5}acoHhcMOKys_|f3R zrbSG+B<@#=oU4j#KvCTqRgdN__V|LZJ|DMdEEv1up{ro=)W^!uJ@>0Nye)}Ra~ ziA@|_hC1lJFrD(U(KQpl^CpSk(|S?XCc&L3>$XyLQhy5&2GmNBD8M|CHH@{nX$f1N z!g{sJcJLhctjN*BA_KmWuaWR=cFi7ZNZz-2;&i*Kl#6$81JWunJ^k9wTt0sNlC)R9 z_vZ50`;n!~z=9(+X@kYywc;{Y(yr3r#HUZu=y7U!q&$vFlqfP<2NyG}RX@{3cZ4v&rwu z!c*q&4>g=_Zp;D*%`QFm%zBffAgKUou*6I2oGoO#N`pQ-srs|orQi%G7_mB zMi{W0QMCk{v&yc~!X}A_>Ihuqc1|{3#c~IsTiyeEn#Y%2rb##V4SSqSq}1`Fl#vciELRAFA2k-}lMt5{ERmmzdz8aVrdEiJA6I1>ivE> zdnvI^kw_fCHu=t#W{RLL2moW*nBnE|kqr<4_ww-Zk@nu--J1XNoIze4BTlyiR^iO> za?6svIV6_Dz&<-?<#NZIQ#-41Wm+-1rm}!2{9#{P__F;C^ItxmA<0h<`v@)ADr{_r-b8YO^<#kvA+W^%L7-5~(>yx6nodo^= zc@uBgyFCGE{MI}wZgIP@I4&&jj*poW2&CY2u7Pb`a3izgPa&09*lUG(&+6{3*UD@U zw)y(~l$KOU%ugB5U9JQ@Ra0t8SjJy>yFDa{cX-dTR0xUbSN3f$^iIhh`&>!(K{o$% zK9O~CPV!IK_~*QQRKVHG6{tr|gF+t)v`{k{qnl;?J!_gG?>Z50dJ`=4E$>s^ia~$U z!mvOo8|&o?Rp%nljKyx!0FLF2!&?GLBGeRDBDXV#TX_&U?4d@$j^XX zi@7UrqSQh6yGTcdH_pH5wx4W1FFAckr4?C$qGp6`c68K-9ev9`O}3G)Cb4;Ux&Wa& zkQB93)gBfW_7$?{*zWQx85>v~Ke4f~5e8`hZ2m66i083RFWGfz(=^)c!HVkZ@JQ03~AxDD-^WYu1e>=Uin zG-bBdeV*%o`ij{H!yZzy12TtcLb*S z7q5Q#FfR5gxc}0*3Wb-Fk4?L7?3Sds(T5&@yH~z#TF*)LFARXzsmLm^vp^DmdgamK zTMpvMs=P3k-~o>-fj^x>qJ7nG5{(SFfZtm6ibl7wwNPmJ<)2I~26^$Csxm7tm0E9= zXHQkyMl=Q-U7RM;oP;VBNl4GXpEt05yrH1epKW0X?B($UuC(6d@|;?Bnqt`Sv zw%KH`?GAgtP^!ZLf{h56{ysloYAe0=oI04l>gWWzUFT!JNBW^6JsIsWyvy=y+e>w3 zFl1!^fYY)}XcAI^9VnPE(lvZi?doRBY`Tp>k5wjuMA>T3mv`Qp4n>O_@8;dmx{r3D zX4`D-HO(UwrRf`QlBOH5owjmzqp)4t8V|>pURPI_4wzk@Enx|=XDtJ%!#Z!mjeHVt z*XFh_&|Rl@aleI6BJAvF8;kG><+dDZXTt$(&xJw}LTwG$9Ncdh|NRw$8ZXdR%m2;_ z@cw=Q+!!o80n!?9iQPM?Mz@c}E-J9(t32~U@7a3lMUEOqQX6*&$7mknDqknmO8${1 z|K|*gAua4ZJV%*>%D`qf#V!@Hz1A+upO4FK4+$Mh5;QrX6Z18g{|9WIl<`2#3zFB1 zWqBXDnv1!bbq;LE{kR_TXF7!29HAp4GURd;@YTnGDXa_2O+bqsnK(0}PSibs$}Noz zC>Rg54u5=Gz`;RS?=U6E4?K2IbBW9zFBvLPAq{9Z*KptsOsvYT9m16^*3^*6NJ-&* z4mNy8_Ex*@699N`1Zges$b0s%!ST|KP-5Qb&j(ceLZ&xlC&I5LI@T9XH);o0F)BaX zGI#YL;jv-m^g>-=Qu4Rv!|x}hdIoJ~h0u5zD3cz-y*d2;+!kP1=SYNGs4!m{$5p;f zUzK>jnRo0J!N^eOLEiitsr9T1T#vPFUb22nNVIdMIZWzn{{2{xnuQN} z=m6#?ec-!3%vB%3Rk^g|JN@NJpB_g^_Uz(p-t25%LUz1etI!9XyKN`F{-(}QKKk({ zRl%*}v?nO&S4SsRcm=%*PS(9NrYPbLjNl4C&1#fz`W;`!Lin$%vYmSMMPIIpC(Y#L zWw$g*5f?>coTO!bTo?#fqj4NJGjp*WIsMt+zwm3ow_jD$y<1=13Z}6FV+q>RpQ?1N z?@Q;+Mf8HT=(Pq%@G}GH--p;9aJ=;DbCJr7x+4_tmE819!*omk&7ML_QsrUQ7 zpTjp{K*j{X@k`?*S+XRa^LoM@-!R*HE@_3wG$CskyAWvF11>s zzZHT>J%b;t)|6z-Pu?LSRj;2hD%j{KOp)q6VAqUoNEROEI@KC|LaHW91^?H7`yJojtM`<83(6q}eT856D1sBYy*T>S}_+ASujzhKP z_svyJW2$-wKlNG(v%im0e?dNoxrSivH0;ceqNK{Cy&hSl^da&nWPI3nfNg_-G%)QG z3pGihJT57mFPd+pjccihjFuc{DwOTcUYpvw<4?&3>(5lYmx!U3ft}c3H1WA8`OR1! z{m#^#AJabwCH8$wKS~Qfk`50(YWaQnB8(x}&~ZISCi4*gm?(7@#3dT>7Cp9uWKnXX zCrRBVQxlUk*1-XAcCasF09E_o$cRk;z<_v#@4^1>y`7Dn)0ZR}V1v2=20^L>E>AM^ z-nave*uXM_2m_V`L)XMud-LvOmXl^X7_GNUX_=DYyZ`&p;0)a#`y)12*(3L|Gop`r zXqr~r?B{%ACCVGbi_=)sr9CPu|F^qViRoqnq%6r(fE zk;qg0dfm;QZpIx=b%$_*;lN{rceoN@U230#5Z4r>V%A0 zXb3+%E6-q;OB}|0{RDzU|BoM%9-GU?OT(3(b(NKs?+FVDVxi(J2>OtQrp1T1>8{$v zJkXYF!6FZ}1$Jw9XK`3!`W{5Z(5sp$|H}o)v??v|3MczNPvYkXvIwuTmb1pTF&e^4 z%!WFquQ7ypT(UU7bugLWwLm0W=4crYU|v}RHf8WIIx#f>Z$XJ&+Zya2Sm zC&nVrAc(W=*%H`R9oq?&+fy-$%+<088zIKB9xL%Rk0G#Ca|ClW$@U&pIm-H#zlIXI zq>Bs>2f2}lOhAr6a*mXEJ}xE~SC6vhi!Z{p*gU<$2fQy(IsZ~d>ZNIFa&CK^O4&pCEPOms6=6zdcI zMf4sy7gmrM=RbHN9V=jLZ`ul-gK@$Eg%Js>a><^dQ&vTlhT28wXI@%oSp$MY*znwn~BYdz9C zKL6a=*UVkh%ISENgAVdW7mc z8L0>-YtE>}#A{R2{-5|5cj3?BT}4bq^9Fs?Vx^+T>5KgJNDdYhmp*w}bNl;)&vVK& zdxK-tG^T08yJ5q-L<_rxvL10{aw|LWF^zqIm~m~Rm6Kvh4$*SyI{9c(`w8WkBlV_F z+F?%=_V8c+l0T#8&$)O|yWfh0JPyE;U7_sj3-U zA^TwRP~7dUB{;I}sn*2BY3Ys9!PZ1k0>sG5BEYy{#WMeMo@WoSf)h0dG4hz72u;ts zl~mP1MFRmvyp6g?4PAXw{3m8Ux-kZ5;F#ncg^tyIBrI)&!ERn?aY;$o;t1Z?8KNV^ z$BlXzXc?CfaP^Y<0qkIHgiqRkc_F75#p$ zZb^cD#qWBkWl*r|8?fu9$&MQnYvb^f%hX7Y_eOSph`pyO7nkQ;LzF{I%-mx>Q4LDh z{a^mx_1I~E7gqs}2qyZ{l2vX?2Gctu2m3~zo)Vz+0%3LP!)|P)xu!vNss`Ceb4obWv}c-^m=4P#a`NW z;dZ#R!g@uch<#@(`Gaq%6?ar`9J*yh76+LOgiPNI*_}Q|PrrLFmWQ<85A<>&5Wt1T z0%3tfX43K(Ch*`B7m20U5Gi`!O-n~srLA+%Lz7a{D+N$3o< zpsZndVq?`QB6U9T$Gs+Tc{3UP>-Lx9x8Yu$}Ro@x=nh0mB2WhoGHLJBLkgqrbnsA<8US1XD<%EHup#>?ARSRc#cZPKjsYuyq`QMKmhj+A@ zzfVTTXSGV!hz2iI*(RSMumsN|?vA1%2}+-Twdj(W8O~@-ppFuNkj5dgO^c z^%Z-K#V5U(chE1Yb!cuD%rH^@1=|c$qoY@BN(dep4CZrju?UnNzeE{BNRQ{Z7(AXG zC{6^5{cD$^c2m%(+f+v0wmyz66oxKoVu8pDFW-iw zeFJX?(4I}?JHbr@d&rnGhH9(y(Pi!E$=5g9R8LT3UFR`BiovWHrR>J~46nqo9FI|B z%|Ax^1(v;@#8}i6rX3i=*;a1PVz;3@%GepS&hHuan9Hq)$a%Zcz!2(5Z;k_7keJVo zLNTX#3>V<9UoZ8Gy<3n`|KY@8U6b5Ttf$7o%E(>lQrHe0aCu2dAL($Vy*5AM%gZH5 z>o}hUHoED$F3qW$CAM;&oihvY99YNhUi!wF*q5cFK9+OC{H^lqf1{=GF+pC$XL6%N z{~PzqW&Y=^c`4wSQzzse-s>bXSEq>tPULZ6W-w|8D_`)=C=a{_g3{>O6}~;6RG=f& z_Vo1p2KdkjgDLH^5xEe6c#m_9QU|@6MdwD5uPxQ4E9>cvJrm4bM~4cP{_2_>RJA30 zO>(bfLP-0)#I4IBfE@uUNsJ-#YWR^b$n0QnXOIuk&HPZM@HKcqN_ebBOLIpjya*Q$#SXoZrHtty2X*yuvGgMK+GBoA;!>#aR5PQfCainOi~)}u!y>tsCoWe8uQ6G?qa$|C%F~C#bxsM(#kYfvhO}edvl&WPu#x2ssB$A z^!#W(V$%~rAHQ|U?=+d$m$rFCMGX1;1~$yAN=K`k7*%;hu)Qf1n+KqyI`>&x$hPJjSQ1F=x0TBUb9a$+*q zwDwkH$Gykdk-aB#;HN>{m)kG5STR73HR^KKKRSEfx*om?Fr(hU92}ITw!XxrnzMYu}(Hm-hZNQxjbdsJJnzQKDO)Mx1)jy`Ys#(CCUdqis=R4?B&qSorNps z%saaxF__0X2JsE7>p#Vc5x+J!`-=z*7H)2C-B9MVnss6O=IqitmZjRUo+;XWs6Kc} z#>Kw0+$cY>tfRr}$hPON_4kOPys96Rm}&W^7zKk7+5s0| zZ*pX+H9g~Y={J9D(QfSPX!3_Mva*5xdJT^K8{Wld(;)2p9vmF}JhJra7WEg9Uray) z)dd*Z6N7~XBPQXtomsN`>NRZa)(7TY7UH6%&5vQv&XQmmYBgn(Z<`JJ8T6~X< zhLP>2eDnMFmC~bye50!o@J8!}%qL9+ahdGHkQ#+9}Mx9#Q z?u?iR*11D7Teb^6WC{t5{KZ4H4hB(zz)7nBVMx(JWZmL_d zo6UjGZ~h*sxcf74?L=l*5T#!Z<)hX4$sX=|=RQ0jokq&Vf|2IJ!}_HiyHD1Gm~WD< zs|rJW=QQ1R@t{?7#HIq0{c#*>Az~Ucm#~WNbLor6Xj)fNz4@#0d2qb~uX>U+hNIR= zjrmvFII^>OUqDdTIs_*Yn#KnED|MjMFt@Rj49ImG>{Hr<`n9vOGcAk(Aa+{^vwJwE zD`iY$*dk^Eo7y-JO-)8e=OfA5X5D&RiL)`8=pA(}h5GEj54pDa3w5=(az+&{;t6H- zk&pa)UborlD1I3uX%>6t))eB=&kmTXcVuZLJ2*d!ond$I-Yz{p8iXiDc*VvaP**P* zAt}~VP`v+>q!uAbZ6P@ywQ@wpSB8s;dP2q2iy#0UC_&s+1+Srf!db9?#3oesPOW(DDE_t z`rqX*OpkinJJ@T5Gh=F~Sy_1kMrpJ#wh9JMqEOfekz_j6sxmlMIUV|yz438$U%w(?IM@^+}0ZV&27PYZqCJc!VduI;W8Hx6dk3T8c zpho)w+CT`;kUw3Z*uDXCo8;Ek)_s_?{90b-1L+o#6Lo3luC!g-iw>~Hpt0Y)3PZ7h zegn4Ay9N97`uBBEYCDC`Yd8en{!{2yd{_28a7IYVmLlR_J!=#wZ${V|t=NxUGn3X4 zVW{>t+oz6X`)lOT@{qavz$n+T>YuAb`ad2YXR0rQJ07fq;9(%@mTGtIf9~oM+|}1C zWyTy1D)Mi1drh4YWsOx|CmL*vWzdnH^nQWkab*1l`R6F!K)GWCuNVNm1egoWZ-U$q zQ`S4&dQora+-H;oO0ZBV?Vy!&FZoAsi>ZSMQaOc5tW{e!1KO0hQqV61`!RP6W`M!u z=M}1-HAd91)Flu5tFT`5u50FzNpQ%x7$=cVt}31d@va12YtYfkuEcwWB506}^IFFa zsfQn%WRd7)V@#!$KhV|F(~wy=k(v5Y>XhXQK*Nj4$;qAwz|n3GjuVKFCt+}nsg zOk%P{hmGhWzxl~@TH*Fz$K%OH6J?#3oy-3~RPb2V5}#A~wVy6b18Sck^B}sJ4wowG zsHKr*k(OieI8c<#d*q|U;m)H6BTKk0PYi+^cjlWTz2 z(@V*Z(BJ>YwLBNUn#n6ZH#dh{TU&!2!=ev2Axa(-<9Ck@tM-M|TRW3=X34TxQfK~_Eq z%YmSZxS)aHO22!mWnntFLI>R>4fRAL=RIDl>jVRX5%Xk|-n9vRqTDs!>VGmnFGT}l z|L4)7dvRPBDpY0XTD%hdRbx(?P3=J*MF(#^V0S67Sq8LZ81J*Uy?JzX8hHg_i&)|# zg1Qg|V*i-n!4kqJ$bb8OiRa(36sq3SPy?<+Tz|?k^R00_sRD4yGh4jedy|TO=*Z{K z18B|39%Oa#lXOEM61?xRT7ymL>76P=kkEou<=qa#gDL#-*P9W(6BBBSrUV^UUm_Cm z4vD80S_S#fa zQ`1lQFB5wEMa=NaUXNDCq6o>B|uEpoP%c3VSWX(=ye1C&g40JI@uLH!tRy zg4D@p!w2rh_T`)Zb^MdcKf!5Ce2lspPewg{wC#?HZ$mQI1!Y-L#G}k^|M;*-^s^E7 z@sJ&G`b2E@n2Qx$qEVx$&O+!NSw4?AI3jqEFT1*sMG*cMH%)N?{9c+pVzo`(O-mOe zpskZU|6D)(?jzcebmyOZp(c>+K{Q=GKNb;2LMXd%qQq+}n ztQFbiT5_&CRc=L=TVnE$iLYFyp~=AwIA@ZiblP3?t#d;_$&%rv@yCLKGr3XF8RsS^6`yOG;tQyrYNqR&5mTZS z^-15{{rrcOWWyK{&ZX{0Q$Pu!efidd*eaT=ZGideJC|FM058>XPEO9|lk?l z-g5v@KdGPn*fk?-%WVK>jGi@;%o?qK2oOVo#n~J7fHS*}E z69K>e4N~X**^H*R5jzMTb7H*sm9*3Gm_+|PK_VLYg!k9#4EmX2jqLj!MD;;QVIeU` zo=iDXmU5R&S+?3OeoLEdciXwqN5xWs= ze_=3T(a_`;6Bg>r%gb-&YITLk*I5cN`hcld-`tv6E4ByMnTO1T!C+7TrGFTbM!H@+ z<{-0W1+TaoJE2O=pu|4OS2$f}H^gujHvB*i#G#DoBSQ;pnzKd>lQ|qeJF_6bil5|p%8kIE813URtdjivMnvWmt)DQ$@Q}mV z>a4ge(8LQ%u`40v<3EomJqeMRL^9)rFh7mrKgVicw?}ewdS=dLmSD(@=!}C48|oPd zb8ErV81N6b;vn+?l?(v0FH|k{74@E?Eka|N8akA~D3Vo~)ugbwBAI>S-tY=O;Dmb_ z1H0U@j7DR4yfG)uLZRn{Zb?>+_Q)-2D0F{=FgOgDp_<@AgpM<8-W|OcC)@)^YY4Y2GGG99buT#uPHPZJv=3MxMiK?KBJ^Czi3FX`Hf^S1Q3cw41szF@(Kav2}dm+UC^ zS>0hNw(W(8g#)fOoO?JrJV&%ym z)i5)Ta$dM_A)lYfd$yzPP^!YempM%fQ>@cGHwtv<6s@(2N|-MmvPHLti;iira46j1 z7B6;WG7)2X8h@>w7`3#M4#lxurNIV_hSq2^qtc_Ekck2DJ@-W~V@pn(#DH#eWAL)+ zMI+^yR3gG5R}0WYeH03eL0}e_P6A&^z!gXp_WrXs`fpbyy>I-w0 zY7FJgD~2gt9#sWstn$+~&hy{C0KpjwqVsLn$lC5`d0j&km6c^nws(oz53h=dh|K0! zZChCz8;^AY$el2a0h{1F7_COD-$TG?Rj}~*&Fi+0AmzGT4L?wIaqm3*`wQiStN_?) zwUBUGCV0Fox-Xvq-rJu^;mE+?;H;gU-FiuJu{?}!)BtNTW+>o)H(xc8nfgM9TyLOR z$~=5EySp*PzIW*<$8=kIlM8)#?lqJ9{{%C(sr3en+<&aP|(CM60{SZHdrS{uRLGPSed75d8VXsDR)Bl4ft~ z5RUtw3bob=-q`kYGe_UepTT01AKnqGPrYdb2}imc1tW(j2qy6hI|1APR!M^ z{s6tSRc^jTZazn*i2tuMe)Ke3;Bw+m>lYR?u3~$i=hxGE-}4_{XFW1ercDI>=!QKI zqXL5aE4bJO0N<10GdwjlwcL@eFa`w-d}U18uDxrLHtpWlk0JR|gtlA}C#SC5I;W@N zdnKQN(n6P&&Y-;OgsOj1A(hi@*{g!~6#W#-N~+<->a!uo7Wn*XKu&ddWo6|w`6g{s zEXDBQ<@=6*tr*t!;rCs3;6kMk)QDfx(Z*&9>^QhC8e4?>#cK2TtwPyVde#n#_Gc8M zClLqIe)o(S_A90_zRqnT|I=!>kzkRl_Gz5F5raAYTtpr^EmlXm==+zmN(T1L2)qe# z*SwhDC!c{a-N&jW=sg?8*4K-ntjX@McmS0Sl>9_*{1heyFxVbS>hOdF3`ZrC-f+gU zcwC%s*Sf#|EkB&=8O&=$pJRNy3WRMP>t`^fxjgapNSolEZ4&$m{$-os8lf9T zDF2qTh`)Xw9WP?qeB>LB=W-Z!dM$PN!LFNXrx{eFZ5a9#(GBJ#uxAl5(|blKV4|4sTVE-wCFUw2&^t9w-k%8Cx4=?5GRXlKw3 zN&~<3hBtZiMJki8E9r+nh}F)!`=;40h`A2)Qr}1Wtv{=H}P;8n5 zsmT{ke50*zr|_06KWpdsB|qQR7HL0UMcF>GA7snXA5MJs3GHH2j=8Y!rq^f7NAy*Y z#d|Kc9dBob+AJ4`!WnM=js=T5ay)aL;!@Fa(^Y79tH|q@)pgTlY zWNVzO4&4O9MXTKOcG>Lp6HUq{CJLy-ugT+-y0N2#mX&o58h zZW9xi^p@av5jzSZS}$4VwwpEr-h&kBHEUbb-~cjNC`uvs0*ixH=NQ<;enq@Soe~RQ zTgj+mmMOhoJs#O`6cgEs!Du2^=>neWyyfLxP`si>PCCA^ag&s#p^8rpCcJD6Cfz_Q zn)^}ZP59GpfLgkN9*j&s^vzj^j^{wI#`VU=VHDYWkjTrCBVt(-GKjE{rMAY#I99sf z=K)|24#>rg^HG5i(`Olm6QMxu?r3XM1++4&1cwvuhtB=)n%f9+%NjRwwcB$Ceh~Xn#qwefxl4CA{zYY74&%4x%Wk&ynp4BSs!ijZiM<%ToR` zB<+M&fBs3YVj3nbXR@a`vZQmb(ON>{YOMAvr((Ii)@IHKDsCD`M2Gw=JUw;6&|R%? zU|uw_6$Lf0N-V+^go@ZRnHtn!x{PB*1p0qN?esr!$hzTN{LSxr2y?_$2Z61eDD{MR z{q{AhmLDLg;K=ZjHFVrUjOj4UEGO!Rxh`9Z=iNLF=)q?ZXGMj4kB{ zav1aInS$xIsn(y8F4OFPv!2G2Gz}8y_IN#$&P}Qgl{zWl_qXSUAxblX?PAcqd-t#~ z8BI6Hw^u$?O_$k?^kYSU{h?WJoVgkSyLdcwJ^cB=UD9<@IEVt zutEyUZSWFL!%JKVFEK>tuv(ZR)Q^8s!D+Ij5#!5}2U1y9(Q{f`{SoU^bjQ>_B^S(j zpE0Sf7*UeLr~bKF>gR$2bO%+z0aw;A2vNj5#b!v>0I#vn_TIiDwr898)Q0>c`RG|T zY6Mn(-(*T3xs65~+{xAQJV0*ybSOVNw2JUbj6a~QUNTuxKA>eqj?SJZ=vPnR>CC45 z{Cy6dmT^g5J8_tz$3}#gpLovy*D1jRDjM&gcwY)2=KWn>#UaT@i7Mgq+N^Vva&CzV zjLP>Nq60iV(C$Vm!v#sp&IRgaee-PjR%alQPwb~ zRaY%7`I1LpcA{d>}2Kt^e38LH?C7;uH-AHS==Xqj@fV(DA z-!B%Li|c)9YyomSH;x&lbieABYSF#H<9(VK6L5!>H#vr7M>6VYhTL>h%)Js8nunx= z8=G;W8EKF^qno!3GwOE+m`OVCy=|8bm}kPjjq8Qc(-WAt0z9KF*~+`V{Q#FtK_-#&gFR{A(9zgj1GkSI93d=X)y9K+jMKs9P+FeHvVU|AVyKieV5et^E3#_uPC zp7KQO8zS(BM(xQrxe!YyREqfnqRvAA2F*+_<7B#&8?9z%dr@qew0`$wR}U%2MD80S z@Z88Ze`kCIysQ=cOB3qx{jt#pff+RwtMjJ1I)v)+y*3HAVdhIuIt$eh_f-}{@gn^=GTmpNBwP0X_S;*gl5tt`%!H13z)iuS2%Ofl(FkO3=u21x z>9K-2L`XW@v7ch0!Thc_;%(p_9hnwg%TM@?i}3{Q#@ci}F%prn-x{^iMYqeRJV0r@ z3*6NHBBz?u#GFg|s(M^#llN&A73WT>)^qpe>36v;{`d_`9+hx^un=cr@}a|m)cG{$ z%^A2B71p%G7WLX5?hE*aHhbky>rlYOTcC@`%D@*^?1pC_bcjWfS?8jgfzM}5O$lnL z{op&13=qON4Eh#0T;~A5gaPGiQ}!Q`k|x2z^ zvTld>l|56xPZMRGARovcg=l9uzpRlF?<~>9P41ZKZ2nwnmWt9bNg6MYT^-HFy@!1`FJWAb>0r0z1-V&3* zjBFKtDZ=1A?}w)!9!`rc3Psp`jl?m~8CqLg7m5 zKI}HcfAcLgn0KF7H*=A|C2RXNV|BIgcmF@0z5|--|NsAek-Bs- z)^j+cV7|ENBARujG*_QRET>pME>zxA>0b{|FQF2?>0Gk=(&YCFQpy?^7A$c>1z~y& ziecmXX*Ssrcoo~ywqPF2q4AfCJK4xmqhRl@V5h9SdP*80Kk*KTT98e1{Tvj#b%6Sn z&QvkshE5{+5c;^4-=hbynNcL)men!!Q>e|8PEB+2pJS0tb{Vn&-~Zm#7QIIlM*e}u zl?T$e5Ho9w(f4L%UpgbHQb*Vgmh*=?s(s^UQm6FsVk9reVcx{dg&0$RDZkE(INjXV`30%c zMk#v+zn4wvCugPG+Q*8u|8z#uq#9@ml>ORzaYx2UMa%!E-Nl#mAuQpze=VkXN7JJ| zXSE&kz=_sF8@IA|EO)_G;ZasvS_)W zSFFE@ZAp~fjXQry;MY{2ir%0|c21B}nebvwM{&S;+2>ER)+t^O_!em)ingXY6pnQX z=X;#R>@~LCE~(-c$`6tk>^hm#iHuS$X}N4Moh>BEeb~1ojF8(`YX-|~u63zth6&Lw zos=OD*t%9qk;`_DZQNmS?7)$Rsm8;LtLN)OYhiOMl zU7(-e=B~mNAyg6HWrsmYqjy(Ue79!Ru_{h`0(ceuWW&7;$?#<}HUq3DvYAG)3!(4?_MEuBODuf6qa2PFOjpHXspQnsMu6wXETCf6uUOrdV$`Ia;*5Cxh|??@UC?4cGfF z_Jgl!u)$~H`%i$ET+0Q|`;Ze%D(hL;H`m zrWOxh;@dfyaA^w`K{_+sb(9`acAu;QQ9jY5C?cfdJwdEu+4!W|C-c_a|DCXGE`OOQ z50d*h63l2D_T-umwh|fdg{hQClu6kYe;U(XvBqu0i&7ovIfjl-+Zsw8u0Mq*Bh9T` z27Ga7GNTN^2s;)?d5QueScI5^6!W1`XR3?8=P6sp)WQ+)uU{F6SDZAWR8ARYr%XXVh!hnu$Dx-|_(r1C_5{ zjYIG|KuKFoi|`F-5`447onz(FZ^_TLw6XZsS-W1_R+*%4Qs7*491}8Ehctt#&4MCW zahkrcYy(ruQS@UJ4?UGWuDRh_@I}lX8;)6DC?4A>bZ5^gpCd_KKs+GkdH^o4u*a8D z@P32sJEdYQU&~!8a_F-sLF4s^BH_F{C2I56CSajz8l-AXfC*PxlnuyL_FsbU=gVUt zTBW*1wRBjRj%FXvvGyag6BSLpaZy7(3z9O(tE%MiHVd~yG9YY>X`Q%1kvxF|SqU(u z%#o3iKS1=-W@KdK0&3;;pRlvxRXoR3nf7C`h^KxxYZXQ$SXLumDL6Va1Po4GKjuhv zHR;x5pQxLJ5iL<#lu%4kZqpO^@98rCHA+2;m6BOReQTXO(pHX)3nF*7qLytms1w?p zm6MR*m8b<}R{h1H4RDUC75BN?Bf%WaNeb!Ls5UY9Y`bZ4Jn+hSxh<^DhFgoFd>9@y zKN=OxS-?vbLI2N|7P3Tjl4?BigP3rU_8-xXG85IsySRj?@K-6B%$*sZONoh- z9XqesO6x%LUO2Sy5GYv_V9fq1cL8Z;*l6wRR+X;yA@dZ3TM74A+)rD(ZC*2c7SBJ2Tz z?)uPYj;5u3WRU5)jWqb*ss(fqma|!#=~{JL*a+mDE?MJ8BC%hQajA*}Ap(!DDyyEV z54&OEnr5Th9z5P2bGnsNGDj$)wYM!e6TslxkObRMQPKNP#sMl(Umu?qj~X`$#BhM! zaoOf#L@Um}#nOjxZ8&Q~!|a*@x)3iQ=fkC$*LRd9j(v*dx{$Sovfu=iK2T) zkXQ=vdlB(e>o(laEvJHP#7Q9il3M|yPptOzwE4~|B_ZUlTh$w;Co%7c04#K+4rdeS zY~5o7%uu96*u;R4JdK`4wtPIRL(`1LFH*@PODV=A@*p2(oQbvDO1Vk))&IXc0nKQV zKWwm+)Q)cxPB7?-@b&keRtWaF86)lD&+2C09xFXt>u$&|57c0Ezv6OW@T7m%a^M&M zGZYyqJk&-1tPJd41`Rb|deae{&SXk4y&nLX)haDoXnGLCxgpmp1|9Mb1IuHzJwPSd z%GpWmx5ya24|15*U2V*3K8&r!Z#^wzVn>jU&1Vth^D%d6QMw>5;WwAz=6-+6K_B6=6Lx;{?I zMd@1SH1CT!*(2efSN()b(EgNDHS!Y(PsxLi{wb!`Vn99~^IVU-4ievw@Pc;RO1{eN z4vUs@+z`&Zbdic^4Z=sEqY?#k9PR#RE_j-4K`h4${A_vkQ;#!*2<=o~qvg`m5`ic9 z>azdMe;O!Ayax?eaJR({tkU-XK!7olR=~c5%nX0*YqwDiOyivj{-N#hRU9~0*0;iO z5M6xFJ$Rlu&T-lRAs=LY`&X@n&-E&sEWW0)KR7atV1V7oGF5vZs8ul-TE(tgc-@SC zd>p9B`?1{b7; z9(wmUTIx&$Mj*#Q!S*v25li=@Gt|R3&+2@ul%-c5{cI1>iZ;n+XZ$VL(XU>NymbF( zxRK0Q2@9@BF1|=H%Yi-aM$oEO@Yni)4G(*7Z|~PIn4S_B2b;o5#Ek!?@L%Pas{Jh( z^y#$PhwXWf4O^WH+wLYtm3?L{R5-miaa~CVd)93MyBC=Qs)TMY+4+r~-Ou0`033L| z`#v3$BAmvQei-1TY_Xk;Iwp$GV3JTSWqAS@f5o~MBg~w(ig{c1GW8N43p>~uz`;q9Ygl!1bff@ z&@nlT^4cD|z|_1*waJJd5O)h+?wa&@6;D((Nj6;q)!N|&k z@i>!_oM!I?sFKrBhA)QX<6vbE8yT_UvR` zpHR`C>77~e=i*?{=#3MY1OFKGC6g9niX>Vqh^v_c85W9APWoy3UM>G?4GI=5zODQu z_|5)@%j-99fc|MLEH=eW+apZjzXp)^NDzB-&yxaomhO}#W4`9G^ol*154RP@7eCw} z#lr7(aJ=lZaUgZVFE6;D_m&vEjr}wZi;**|YM;I%3SxNh+%!uAGg0(Hlv%cAUo&tA zMs_TjYhcwHb(}t?TX+U8BOjCZEdI-~Td%l(Qg~ zCMilS@X_4mFP4gn@e##zb~O5-tL)KtcN+h|QVlR-Un@x{nS*_QA74+@owCEw{MHYM z#ic43<-uKrqt&nOw@_hY{84wxC}js+er{3sq-gssu*UDfK_e8wi9l(9)NkAKvE{it z8Eo@CaY*k}&+NtIP0K?M{bt|9UcWohF&0j$Iu3US!T* zrt1!9l5S6RucG@8L;Hv8RU>bo@`A;VInYRScPJ8v#vKGT4!M zKtBeO*;SQ7%-+T07x;%(!aN71XW}-?O~%FSnE9tVx6N7`Hgbxe{0I1*M`UbZQx8M) zC8=;RA8MJrQ%+~FiPpb25;p}KzA+mUiFB!L*%dTrX_uIrB|!KXY*Exla@ih3y^^0P zyn+NB=GMXgd;a^-4~Qgpgg`&8h*x4Os!OG}4!)m8zMR9TVgt4~Vmul}=8Ksa^W~bM zLy^2GFTWOYS2QAL>^7Gc_AIb5MM7}1q)WR<8ntyK>qs1Xl1!T*jia)yTPP-_OkS}+sF@q5085zy$G8Vv zPcPJ!0>ulH^4B>~XjqMTTU`>K(hs3BVUb#V9gx}(edlwH$*mzB%%D(yGx1Ixh|C8q zIxqZ#FrXbpD6`^WPhT4SL(`Nx|23hQPybQa{p9iNPAF8NE{!wD7&^0qD7t!0T{m zz?))O1#=J1tx+@LlmRcfPn}zQCqr!Gz!S9|nO&IdeQy>M@Of=4^g`f z?#331o}+syDr1gU?TooQdiJSnza<{h7hnh;wzzUZ_pQZ&d{dh78ptu%KMJQr11BGv zTwJ9F3s;q82tS#UihyKMf^b8 zmNdEqdBO3u2K$x#2COUpOeSZY(p2qd=3Re08O^#K#5Y!ME<_Br?)P8v)DaMK&Z^wSYt{kkKo^cR+toW&&^D8IoF}Dz& zgPOo9g3m}P({Ki?R2zPto@GFEoE{z=WPsUx0)Vr&;K3bZ_FYfwEzjg7v)h&z^F(z; zJ4J`OG--;zTN_&>&3#^XG&_#oqp>qg9gLpXe8lx}t1ETufUfYPw1oC{Cdo7}V!%Cc zfvEe%Xp67y^v#kNJ&|i&oLR?^*y5@&Q{6!7=9;R0nGXb^i1E5V57w;we7vk`>`MX( z*sE8ag0!&&kW=p&=XU!cPq0j+0|>#kq))ey5bfGYU*JN$xnF?gDHM&u$^&I;(s0-A z@Q;C}^(q^>r4)oz|6+Z}icFqw47klV5ID23J96dXNOY^4BtnaDA7xbFia6J8-_57O ztD7_bEuQrF`o~0ZLdA`SQNPS5(Z>Y^6%;1364aKBd74|JHgiS z?Co9Vwv@4z4$(5wRQ>4Msc`r)g?VD4e&IY*T&VHOb+to9?{>7QpA>Tk9LH6Mx0an% zuXQwkPc+7HpFM^zNL5fl+OPC-kP8(i@HYAWo|Hew9qdECBekSY%)%;$mJMU!&k}P`5*E13R;w|d* z9|$$nesUl#{QO{LP5G`<6AqhAvjmCRm(XPFo>F(QaDG$ReAOcb%=RIqe%S^qgbKPS zye7eHnZ0K`Z$w3^UV6Sw&J5eT8T{zRhW~7S3Nccm$&am>uy5%w{^R~L$5CEWTQk|g zqWDWYr&XWTIOLPX?^y8(P(i;1n$n9j!uM|RQel`;My%aKUP_qp?DrU|2&@Qw%j<_} zMyO2$e+!vk`oZ(&j0%-40teQ4-9tQYJPtjb(?2ba4BWXz1HVWBNNgN>ORljA3SUS0 z>YBGNS5~|17`i2xv8QZBVA~x%@zCd~h3a>}Y$i zloP6fYJBdIsywuQKbqfvP;+Y1z|MS8uil^gazT@H%WC6R%!Kw!o0Ep`Hg=0F=8lHo z*61};*X2%ZNid-Oi6l0JTVv_ioYv#xZ^a_*Fxx&faR`|K9az2dPW~u!H^7&)<722z zZuBsAfZ@=%9kK{U%#RO?>G2~h;dn%~lW3#ii$?igpymyu7p3&mACEenfQ{(qh1YJ` z@u@u+U-`VhOm9Qa4{$ZFt=d*{1S5e1k<& z4YLNGM-{z)e=UT%Y`hJ-F?+~cSLT`NoA4p3@lw*GL+cSf|*&RfZU-d2h>6t+z;v27@;{Lt)&J)1|$Or-7ojXX=8 z-cbeODcIfpQ;}KGC)X-h$j^ZS0B0K*q8!a*;Ga!&-HyKr#^$}l{ZN?^i(kuGZJ^8K z%BzYM4{^A#z4W8TLVRpvw|cHlAi|m&f62@YL0;c(j?3e)Nj1EZ7gO!5 zlkGy6!H@EBO(E3~1Iir2{WEhA-9#7?Xnt5f>s2mExg_KBpe8Nt$Z1JQTPvuGrrWb7 zl!bPEa5})|=^x=Hg|d!A>j&{J`CpG<6c5=ZrWIjL;Z2)5k0F21=?I3E8JxXPh7iD> z0aqkov{y2~C2|ayg=4TSqY6}e|H{G4%&Y-=LCE23A_(?6S|`4T>^<+WBf-u|9D$Qn zIv!fB>y?WBg&~n0_xx|#9K}6oaTqZSbaY>w>pQD1|59>gf*wO|%nmcmH?3tHXU*RJ zTELed4flzZof?|V91(2%UJc3awcwWjnLXnlPrK<*@xZop$q6A6Z($RU{W~UXNIy9U zq|J#~a=MhJaDEW|+fNQ7l2qd=Z^Ti17okXKo|$gJNrGD9i^!xq(9DaBGMuGpwm)k| z(|muFFHQeY)VM%aDekOO5FI)kknxt+__R)XkK0>|h^74e2=%pLV1?Q=5r^shAzd53 zf9B^&MK^0nef25=>dXu9h{ z{_8GkYiqxQZfSzzcJ1rC=o=W=xKMY>av=J%-uGLpzTGeInXONJC-k%A2XtV;{0rYN z+dF}LU3%!A&vtPGJA)}aTmda(Ii9E`h_jGDN9TWaVd>6B`E6M(-boQ7fta7`1`C>e zirVju_ItQR{HE!fQqJrRu@V>eWv? zIQK0bhiV8a?OfM-a0tk<@iH_i*fNxX#uy2X3`-9@miC3UyobF0Td`docNX(Kn*Lf8 z8o;;E+|NRICdrkAK>d}B2dG!4Wn?M>+jhihWJD1rWYZrRyDXA);_5ULx;uM#>KQ}G zd1lC-VDvA%Siig65l{MwF-uQO;-_+2%U)L;bY2aM2~Xjh1=OUl2BB z5F9qyabeFBhAXcsi_;4}8Rur1h{UGFV`CfO**t_W@;3{y*edTz*m>&O8eWh6{johB z$E&D=Z*MBk!9Bb9Y+3+-Xj0qy-|2IEn;3~_? zOQoj8v_YC)!7=xmA<81**Ra*P7Nlj>5O%02Cs(7Yre>3oo$U#thda+mACD|^UoESc zBou>B>!!JhWoN>Vb#X;JA=x~)c^c>epb36Q z9Lp3SqY!i;TQfICdx|nNav5v5VRFmlCYzn{YZ%GG4vdb0(vwK(;H~xXJL5V!btk}%W8JhDJLmyhgPgO!p)FN zZraz(OC<524X8Oag9q;IdXcr_ElSQPDl3!V-}_)*B7SOkK>ocE;08vmPUP^=9|sP7 z(%9kIs|&KtlXHe4m%h&#+K02YJGGy=aYMrWU_0(z-met?hf>ILU^WW632EZIgqWD0 zZlP1HW&hO8!4sUEUb^}5P)m##kU8D_oOf*j#x%`BnDK@Ci-Do(BYP}e5HgV_UUC{I zJcp5zQg+&G@&sk_BPKPAU!{Gn?ldfXU(EL+8HEg}^skH?vaDUfJ{8?o)lZ%hPjtp* z4jUz&HK%8X>WMk#Ki23!_6b+L7>)rKQ!&7~4q%Hay$#Xb_W+xXgGRX*`qOe#5d+cu z=T-f^x`hn+Uxo1M2tQ>gXdqjED*9P&bJLowjJ8=Y=Zs8!YbvDs4uLR$B3!%W=;#;- zppLzdPqhzlM6Dze>GSX3u6*PVUG~!DH%C!h5bw*$V6g#)q5%WY*mj~`nj=l|rWq;4HX z2Xc7m;e&5ImKxzdgOK*&%c%TvE=(;wuXmxzhU}vgH(vIML`l(KHC@flqu0ik9ktIg z)@3s|MDn3oeCK8zGw)kPC=F*ssI*3&;r?uM^F?c7uLz8Y4!-?rE7J z2QTodeI%-#=m;|Y1CB;5~3xwtBie|()}l5Ele zbB(d?An`hir{r{$l;V1>X!)`F}`o>0xKF(CO%7xit5v5r_x~SnwG- z-CCJ8cy)zz)^kfbolA>N;d+sjQ|;Nso7NSBe|( zm2>~^5b9od&o5kqLOv0RFJP6f_iPXU4(w-vz@p%$JJ8(5K{36C?p8rkQZm0Pt6XgE zApS;YxhCo$3*;IZ32qO|j49BYv)EnV`P1>Sp$$3O=)K+PV!Ir`T5b5 z4%cmJzU=Jm-+|kH56aQpo%}|_2_CvMfp;fgi<<|l#lHELA}~F*mMO>XaD7ph z&@m@5=xbpk9n2aUB6+KCV|S*ipNzc4js1vv`7lk*2uskyiawIZ!jbw6p+l3Sq{@Wy z_vp_WUD$Q{;h&X}q(>2W9U7Yr^GURk^e2CX=7?UT@o9;z= zc1HY48PGB|7cKMnzSlF^SXnNsE?VT?uW{|>!PbpH$XGh(wjeGpUg%o&l8%;EtfUHJ z&LN=~?m0cI1MlWvmXuvn&hS{4$TqsYsU)^%0uczO5=g=OB>{z2*{cN zi#d}zHlum}YT#y57d$3#um9rW&u_}RoD${AYIN)gpXh>T@>5t!EHY}8OiEeLTI4Gi z*fDTR=ue@bEL?2m9vy8jGd2`GcaC4pnDPG&nKu;dP?t${({}A1-3iW^NrG;^w4-@{ zW&a&r;nSswNA0H7F(TBjSe9)h({wH0tG3}5zI{6EyUG#ZgjqgxtZbp?ig-;QAhK0p z_=n|z{m>Ghfp{u6u&7-ZJ9X+0{M>;L>v<+)ekVwqmzR=UaT(hnTyWb>K$;k~gx8$He=#AXkME9T!tZiE z^nO?{qRKFC5BJ$S-8IqWvGzw{=}5ZDpNbE}>`S`4HvwJYu6vB2i7Q4YwY@oX@HX>P zoJ{v{`Cmneq;qzBxrV09VFzMS@@6d)jhbfLV?iCk;k)w@c;IDiz?c?rsJRyz{YdO$ zF-D`8a$t3oWUKbSvx(16;J(G?H+~|`HEK>{z)(^p8jdwj1nI*IC7zzoU}Zd_ zEu{DSK#WO$>xBW$DRcMu$WU6u-QE4jQ1wua$B1iEr{jWrOsS~|Y$F{?(#_ASszzNV z7KhO%JKjrMSjuVn^LJzCa}iDV-eE*EYU$(D%`_C8L5@xm4fXLb;f`&9r)fFk)APk0 zRY(}%dGm%NWxJgH<-|=J3tij1uhh#p0)}er&tJ^$Zk$=c1@0aGCUVXMqZC-hHx=dO zKTjV$1Q@$um#=lA8c%@7#Y987w!>(0gogwMOG2?7# z0Iieif${qmb4=1J_CG#(nad)8!EA)RxFOF=0S=aJr!O=us?m+B5br(+Q;Y~E&a-xx zZqC&GnK}MZLH4f^Gvj`ARjGC3_7=d8d(t6py<-QOXP+OS5&qLeSHs^dv0?Wj@MI#- z7*CD_%I`{?0P-2}6U8FRJq|cT`8o#p2ynCMWz9793Ty)a{CxEzSGogaiP)LQz_;gynT5l zg;;88>X)V>3eS*VLiu2U61ps9Ml6PH9S09JD2=LW;}1VyGk8ut8colsiK$F9xo(~e zDnf2f&TBhOo*^%*GkRKoo7np>V`Lupc;lS(Pi_qc$-8HW^D-4fu2nwJlz~Yc z%s;aWA6i4^Ra^M8AEG;EB^x8sF^TT~9n3?U$;WB^uaR5ezUFt>#H1#W06mUbOF&c~O7?mF>y6}nlvlr;QzDYMQKXxGtmF+I zXDOw9R9;8#DPK$7;t2mGy36U7eVKMiB!U5tNQUrGJ@pDLG%J#9JzLn|vh}P5YYM`D zs!bNW2ZqX!CyJhaJd+}R2({Okztb+k+$|HPK#OA-*x0p>Eus60kk~`IX1UcLFK;ql zWf>o%d$n&|j?ptLgy*n2K>wIiz4=LwxYXIcpO@3~l7_Wbxl%UccZ{xFi^}TVi_yc+ z?=;=8;;6DXWZ`zLM8~ZJmX>x-mFHGfUtAK^!*zA@Mm5wNdn<6ng|^v)FXKM59=Wr7 z?)*W%P-=K}`z@Zn{`xssO?vww2XB!4qOTN|yVF>Ut{TWaqwCXB>VT(Bb6d^mS?J z)t%`y=i;=qv>y9dl{1nuGBV1iPoFj`G!>wwqwD%stpZICCPxRO_=(7i(54RRBe!N%5@>;%7y>2>rmv>jTJxdd;o-|xR#rBbFMoS;W1@9> zc-V5HzvM~@C0Zx9Te4}9H<7HEPcjgN?Kd;$rT1d2XK?S8+Ni^w6HLtVtjgW{QzK)9 z7l!kW2h@Z?e#c3oGUNCVIxny`YW&Zlp`~0a3B0fpEnTLRY4Q{^2iZ%h&-3J8CM~i5 zFr3Ts%-G6z#4^@yiIbb3)`D(Jpkk;uo0hh>Bv`tGe}BBZ)4U(wg=`8VIE~grRPr0! zb7ezgs|I7YCrw!Pqs-9=lLBks@%I4gGNWt`<)^lwQ7B7?X!nWR>Njj)T&s>d^ywpZg`*Ybw7IZk(>F4IXejW1HmXBc1N-7NXrOS~H$w)gHw zv?+6_A%sbnD`@A%$^MWqApYi~Yqgn)7B$F=IAH0L!(C80XNEN7#w_kQL6q;eX8mNx zLf!nUa5D{+iy55M6~0(vc5zb>9haNbk8oBBQrUK~vn8la=RCOn{_`=J1Q0G?zmi-P zU`f0V7FelPD4O%$2q)8)cmPx?SfJo)kByaVGm;hR>gz7{G#w~i5V;%fS-g1+l z+~U3^Z?wh#UFK_4?)D_?=*86bN=+WWRc>{HrO$|2n*KsL;Yc%G+E#t|FJ-*Rz2|O7 zkd5$~G3Mo(_hWb+G(;Mi$zJa67^N9s+*VSwBLG3vn6Yg0B$a;iHz=P{KDM@6 z?_&l#B&eg?^HY{>Ed0}7rCiUhYEG_F zaW_6yJAPzQsa7ae?(_Y38Grsy3sAZ5ect;wR|Mmcv_V)j^)J2T6Y;QSB!dP*`)gcH z@$uea^s5ZBQVG64^WS;N58~WS4>OM5;1a+v)>N28P!ev}@hE%7T&ctu{H%;Nwg;lEV zQAhZ5P)d=~SiAWm0yVdgQtCI|9yJouD<6F7 z4|SIFbk%mzHb1fC;-LBQH1y}#5Yj-m5BR6`@Lz2>5^HFXI@Z7`2;O;xkgZR?&+1Q0 zU7ZFTV&fxUv)s1K_ffkcpXfAlOjraxo@N}fFJd)lntAmAFwWJqq@h`Iq?vsI0_%+j zaj09kvov5O{g!d`GNn8IBSKW3+}Ycy>Q{@J|5XQ{L27y+$>e?;GlIUmc*0!mQP@El z3F=Lu5c}35S0lgkkqsu?;~huB@Hdu6ecNX$tJ?#; zT@$WnXbB!Mqey!djU7%@jn(4J>MLImWMyP>;q>_mao_W>phpoFqHu(ifzq}?KrE-2Oiidx+9#IaxYD~^qj|lriz4Y$c*N2i+Dq@{f zGK>D=Q}taS-iowUH-+xbZJl@TWYne>04+bWc~%q7Q<20xw5aY%)LrH{5L{*`l5dTS z%dAMCy9ahokDhp~gS9~|W$v2;t2@)`t+Op}Vcm>mE6@IIudh0hfHV7R3SSh$@K8)M zKf(Z=!WUHbt5MsE6dlFm5JFDkwgEDRjB}q<>B-jM7_k0B`%LRR^^y{O>yFyVH%^IW zzMRdzOot9ZbEc-&V7x!%F>s)QDa!ZCw1+%$zLr6hB z=Z!(hb=d1{8}-_K$O#c(LD0i*+gdp%cAB8+O44<8aKM88{z8&2zbD8qAy)-n%G?pY zT$HAU&9X`^%NlQ8l2%-~N_6ptT{4Xy=Ya+--aSg7hF8xo*_w_>+l(4`5 z%a=+mU!S*Ih|nW{n;d(ul8VGC`9Yw7yfTFOJvNOYBEbm*Obyr3^Q+VXc`6I_6>V?nC9d@ zG_ojO&R!QGcG!6>rJ6qQv9`zG8Ha3_$bi4q?SHWc()RnVA5Wo$m0~bWBdy+6R9~#G zT)E$$-Z52vDy7q>))JsXvt&o%<1D8_9=i|aC6<3(xKi%(u}^PH!a~+a^t(zbkM#Y0 zc=67ck}@Jm9a(K**!R`$MJ9y~hYlT@H7PXB&dkKsk4$UkzD49uq6BikIpD_iG)a*X zp&x_uydx@8*q=!hc{C7Yw=4S z+$1{gyRQ^szmGEH1(}tY3F_weq@CZ(=(aF&E&0f7`Fe*vFa=b6B4(qWwrJzW zVovcjFNJ`uL@jK*W(p3QHPu5KPi0X=)C+1(vGat`vtG2-o5$#W+#7pQgsPrpoHj(8 zLV&4Zaw>m4V8?$%NGU|pEv;QAUUm6dXq6XVjp0fRBU4;%nw7)l++~5+yMh?3XN&2% zv2uHkV(c4AVbp>^k^zeV7r$8HgDY`|rpZba!;@KO-lH!ozsH<(YMO z_pwRV-Dzxw!>(Z*b#GqpB*A^u$KiTp%`AWUD=`574*z&zRhv)Y#GyE{1O6!NfOBXH z*6m%=($v(1;0X$Zj4R~IC4#O?Kb)-fad-&W#C*vjy_`Zq9GGO;T5`^M++nKxoR zAbs1=2@Af2D2Fhj$*F^aIrbbBnC1ZHyVJBaOS$s!>EMDZ7wvFV#g3P9t51%dgc{{R}Np>?^FVf2?T18X%C{_BFBt1X58 z*67-5(^Abr=QZx?AofT4d?+M_jXsgim413+@nhzIm25kB=a#jN@b6)13R%zeUpHH3TvKBEln%3}!A16KnB@!#nzgUveuZ;tquT6$<$q zlzXP#eyHLV?4}0W(ED^+QRwKQZf1BS2HeFS@3t3x0Q*blo=^$Fu}XJkE2S=Zhl)FwQ42Ipm+S?uF7^E}~TD(?H1NRQTXE1SB!@wJj; z^d|4}pD$8UB>$Y)0m+0Wi8sgo2&F(Mjfo7+!0c&splDqRQh>V44ESAbP}CaF<>V<$ z>S8{QTleZYXlxDssby+d4UY$;hE=C-T|{iCmK5}Z-d zsQuhD*|?hr5RwdLTQ{c|HC}-vGh>-za*>15D>P{F4X?Jq`(byT_LLAp$asy;cLihQ zj~4U3r3!4NSE@a9I%hD*ew?=M#rATCx;~5}Zu|3Z!8@Ph8+-VG{pHtoVI5;{zekH$ z4nTzLv~a%A9r>8tmfOwwk}R+sD9+LRylz~-#YrLybGzRzFb0CBP)F_Q)$dSaFc_S} z(3voL-9nJ+(BLs!T~Ji+S0Hn+sz0ylImmlq2JxyNiSc=o%*gp>WlUzPuF$dP z0F0O1IRzXzoJOb=f{TZaG+VNZM6dB?|ogikE65j(u_1L#> zm#x#PK85gtIx_M9i$=A7OPG$R5KtYrG>{e43qTgsuhcMCe)dG_(niK(Vy!+4@;e2Mj zXL`*Zinh^`6IQLU<$F`j2iQk+;;3ZYN^bL<{C~o&sBWk@UThz}r}9&+=_mQKi&{rr5;EbPbA#_gvn<1_p$B6acLynR zsElt+joW)d(q-B^qtAC13E40EUV_Lfeg#xWmp*5yD9I`)C@8`gEQ~UROQl-O4TQTo zm~>O!XcXta_BxLAXi0#6eEn{o4M&0f?#=6v1Ohk8cGDQB&kLbMJ^`Ur4Z<1<%IgCi z;~Isf1c;~xmN*T=;uG*=(IR)py3%J>clHMq)ZV;16y&Iq@Ygq)=JIU7J zxa#zQD575x`AYwRuhSYIi>>sCr?j}&ZEGKn5jH81W>!8NYJ4nAhCXwi;h!diJUEo)_%*dB%)Q+9D$)e;ZnV z=^xPT*3zG%r%K%dY{V-3ABhwmxhY8RdjR7K<7D8St5-EnrVcf*TIu46ch%6lLR1V( zmtu80lm@&ZBi@652p zq~R>q*H4yfctn+H{GESyu-bNa>=|pn9}ft&({tF>^Euztd5{yLEprQUsJoo^p6uF| zGs-AoZ+CC(ZcuF!m;xa8Jq!_|$zw3`Z?Tn5w`j0VKc7_7#b<6zGf{Xq!5-=1Km(xB zV`Iq}wJ5R0#cd?b@)QaPn*8Mcx@Q_YM#2vy1M!TxdkfEzehcUPw?iohIb&ZWEbBM_ zxhk(U84;_eW&5&uK>A(KA1g0975^)U1{-8@qZelC+BgrZE+ulE;;mqvX z^f%0!lZQ0FWD(G`5h^!q*v%IzV9acP*-l8u9TL6h#f}%+sl-{ITY)&=*D`30@s3G$V%akU zI6fA&2{1lt(+(L68;@BXo<{!Ad7+vYS>v!(kTN6G+}he&7#9}@VKTW@L034<^Ul9l z!ze;3MQ8$@ObS};dMw9v6Y8b4`jZughKBuVTWmDa*#bE=zP+jqgJcwDTZ)DSbbQ@c zgEg-}Chb9)04vg7f9YKEj)H(4*|g{)r~Ok?xwMzDrvorlEZuHMmgd_qJoYdcO-`s| zn^RB?0+i8tA1CdSJMy`Jjm7vK=ZbLt*Z)V;m&ZfBfB(P7)`(ZNCe{u@57ooflumYZY9HAlpU*^=eVNY z0cSiU@@Agn_!gFuTrlcnbh}+muQiqDRT(zCkNjXc@nCvc-v9!1O#l2&(q+l+V#7skNYhQZS5Z7sZE!Spwb9^M5e978qXTfuZ43T&g4pKS7Kn+NT%fb8Ljj>F`w zL`|?dJsR9H-KOF(Zmk55Q2aA)iC|DhGLe{qbyksh3_ z2m}Uhq2&v&Fc*;3ud8Bz3Dak*s7zVv;WyAODK5a_Vi}p*(r4nKFEP!a58NTmlQPx5kK8XWsV4n|;+)*Kd zu>O|qX?c2cK+mIG>_u@|#daBvTyP`3`Z=Gbu<7nZTNGL_eT(+6;(`ZY^9R>XT^1t_USH3`7 z4V7YZNQC_?^wk%eDEa6plHq0u6WQ>-%Syp2uLx~8`f))@Fdun9-RX67jtBD0D~;(S zlAfOaefRHE-ToUgwgFEt10ivwyblxWnT)kBuneZ4C0&TR);}Un`QHkdVpMC^a zJHTJ^?s~H+vdU-dFHO@PI_jholgFW-2#c&Tk3+Kohn|e{wm&eYt6;!TtpEa+4niPC z;3jhG+O_+r*S~|>c}U&U%5O@AxE%VIHBR`GcC^PUr>jWHFDk!i(a8p52ED(7`&S^F zM;l{&6jv4%R${vm+@XVFpID6Z=hS)yyqO-UjCFTLiw!~h8YPUNJ9crw1g4*J;Jnjh3 zaAW(gOp=&i?{*L*M>J8)xf4IR=AmFG&Pdrjk6rJ%5(nn)zogz#@*AmC%ue%%7eOAO z*xGCFwSVEdOH5sYa#TK-Ht~q_#A*q;e6qkTeuVRasyC8e;%?>3&Ddealq@?IXM5RR zP>(;W!Q?RS**kO5q(%lRPJQ2p7+^|-0kkLEq!oi+t+)Jp1dU}3@An@}^BCAquRR2e zBc(3Y(mGch`~Y`eIa|kJvza@$>)A&FIYafOnTD%XkkATA(Z-M)hYQ1n$O+gQMdfw` zF9X41i;%fuo59A~+yHy9mE+mi4Cin1Iz$SOy!nHg-cDEPe_L%64N~j&K5rCH?}kfY zVHnFACstf@2V@4b`n81#j>E%3iw;Vl?7#*o3AhTQm{ZxgF@DR)@O%c6kEBR zD3$cjqdjb*fj60&I?h+#@nt#Dz~U`^|D@VD^LyiQ-|(KllnkZ6A3ej%w>B5L)OqDD z^WFOM6j2TG~Z$?*s{jI3vd~Q&K+Otu-&w77jR2Pw$Bi z;%1!B_~AHdxLpKkW{?k6RaIMCOD{ll^>G}$X`XZ`^4pr4KOh8y1yuWo2)D$oB$`uM zXdpq_-)FD%zbx27bvhe`XN!?#6X7iz;wy`Pg0>!Y=&l;P!OJ9a-|Nb(gi-_#8JyR| z@SdmU*K%7CB~mh>kxWq`JP&t`1c*oVYSe!sh=ksC4}#uiX9n*Ea+3?J6`PHk3^R=|`jg+3PW;x}OYqmSHRe0bs~ z25x&ZU!?0tqZ$DW=P5B-9}>!a(|~D43aZZo;Qivr+7fwrmtgze}W`2N#?<2RZXm*I61f|6^vdvCrlRhtt?B&?A$ChP&*L^kBQ#EZE z)EOybOrpHUB^uQ%EU@lFpAjNkmVPi!#QhX^jnYep`iTE{$aONPdoRGa)5)4x#-I!; z2Y@nFIk?fr(w(oPd$ui8;#I1iH>l^N=q-nF4+U|OR{54n-ub=n4ia&(LO$?uA9)R% zET~j4c}GVXTyfsgGtvaBJm7HDCQ(Gw@vM;4~6XN&a|cqQ^?94*;Ua@YP?pVT<791P##*C#UgPj{&7Bk1p4eXDOD~2!ARp zuZx*(T)OJQ_A3sRJt?kf1_=?{c|n$!AuOjN??VK{wmACw`g#Dl&jY*wXItYm<}hdf zj|*@p6R<${%MHPm^z%a}R5Vh{r{`Er6D2pqA&IkwtE-)q-)GHbCut#n8cZc8`;3@O z=gPmVs>Lamm_1uK8--m;_8*sEKSekN0aTklU{v>7);%(Vlu5XE^e-r?sls_AhIyLE zUV0&V#jU?t7dwF2`IPVQ(%z9GnQDpMzI!W2(hZ-W{YufLoXxtOMd5qfKR;&7xAZkf zbhywa{~fgB;A2!4^ZW|urqz}|w*SvR1z)fLEAyyxJ*UU`__lD_BQK_Q5OPmv$|W3X zC*XnqcXJ@%3g%%3uu&WCW(>DeN^j+?c(-}Oo--=s;e7DQ7G=}5_4jo~^0nI3_2>`R zCP7=lNrtf@0@=*u_8A+Ozz^@5Z!ipuzlUh-0+WkhXW$5Z$Um!`Tp*QdK;%icD*aFs zvl|aGh>V-6Z(TD?Hx5xHj~pJ!sUW|3KX$7?v&ZHv-=@66-#bF$lzZ(}H<;OYzDJyT zdBr7uZhUlHEFTCP#oGOsaQshCysqf2v+&I02{D$2%{iDQb(YBvR8?BW+!%*A88YiGJo#P8I#{EF3zF~n!v1tuZt9-YZ*b5-Z)j%xg2F`>VH7Z!Yc;Ia!@?5%D* zuf4VSrI3wRj$Lb>%t+T+sc9-Gcs&LAgL=FY?7Mqy%z^2Ph*B<#=W*Tn5OLUjr=i|j zq+7mcT$^b@9F#m=D_e8{1SIm($2E(hZ}d^^f+vh>!BBnZsE~(kUBHo~9XM(spG-z; zq?|9=Z2hE*x+hU?3r}zAk({!z7Mn5Xh>g@`+TUm2K8hCAXP!vKUELoQb`rP8Wt$ye zqR`R0i}2^1@%hs@bB0?&^vu7T0<<%LkI(JC(n9h)-dcabeK2+PzQVUsOXC(2A9hC| z0xWzU0in^vR#}>nkJ@)@S=W@|9A$F>x7aIJ_ZrD!oKHq$QQIsSkLA$E2fkO$B8Hje zgD9oyXx9gX{xCt}YjY4?4RzA&?*Nwo1cvtDZ5biJjAgi&Q7REF1uvSMOE@#R6Svs^ zB+d@hSSR<9zW@W#GYodi5m$4=JON2Uzfun;5Nb0-1+2IKX>Yfw%Qvo${zfkA%^#97 zVkWBy&OL|50(Hi)Cr)GE@P7NR6!$dob9zp|5M(vw-b(U^`FL!??LncNM_J3O@#6uu zeXb?+c;PyMA60P*3)JlH-yOo7hSGWkcYGMcyZkOo&2%Qzy1vm$v@$OoEHuJFzjGqq zaSCBTI?D{*<1Al9f$tCtUV%$kqst^`fB-y%oR=qxZVoL+_QZ|YRFKeX&T_Ex_O!r# z?Hm}I3K1>QIPg9m`J8O7_2O`9O!&sYuwAX!FP;BL=>mriW%3<7_^1q;E<<@@mubh%eka2E5f)K9!hF@W`)(BhyPH60JOk>fic6 zxBTA_HUu*7*}_6`km?Nv+VV=fMbzy>9@KxTH4@)en{Fi*q@>+QmYngI*%9BE)z_G* zvg;2r%s-o1p|yPW*?`Zfn%}~C0xsL`2#LQ#T03e{Z(RiG+GyP2Ma$g;pRcTo*nfM; zA*jn1#@W{<6YGN%ls0hSl@i6>1uFI9_)BP~3$~BjkvkPx2D`ESPLtZPg^Y6nm;r`) z1^mwL+f1wSdrcT1X5G27Y`0M=Zk*xyQjlRY3cMnuX2kywFM7tpGOwW&u^T$%=7ttw z{I#PU;5z{H{ppRVbVB|7qmJE}u&`lKjjMDu!z3`%FEh`p^)R2z%ouK=?8S6{(-q7S z{#j06V=h_d06ETdRO;XFh1IduN^kN7=o`;)P3_^S$-fcypT3bLTduAg7dFQqS5 z*GY$Fry$ZiNTsFm{TH`Uh>d&RW0azA3P(C9;zF5tLq^5ABD%kl+TX9po=}+9C~Vl_ zIK1jFQ!dda{(wS%pmHNaBLZdi>N~>#0)rKuuJscBy#avGr@L&tFINTwhv~xa=-an% zgXgWwje#7IJhzgi0?X^NDLX7WYvxMj@#|)9gYcG<+zk$0D^52eSZ;6j#XsBHBf3)p z>oS;}Bl=418ft^!sLZad1qC`gzfaKHHpwZK{UvWFUt((&WcjCV?3T}8myfy+J_K0P z?Ct8X*ehjW7HbL~q##El_1^IyosQ#}4W=gvQM|<@hLH=X8nk7f81G+J@;jSps?%g2 z;g9=$O*82C!x!lEPIJwruiW65L>|CASnazaSg(%*OXxaKU8zoST4ZLx_ByMZ;dBQg zv9A7d3uBCrz&qqDEFg_fI^|@+S#eeRClT3rbUiIYfa$mIa|dqTlNY4-+P$Pv)#K1;86 zCHhMZnajora?1W4#;_{b{JcQlZ|Ti8|4}EzONS1XT(c(DH8yg9-xaELmtb^Ad&G22 zN;Gb3wV5W+mLfbG_E5a6wNowo=W1he^K~E7?1H@*W_tM+;5eKu+N~u+yG*mz1d{eT z{j6}CYgmNOH|;8-ADBO6GPwopu~MM1Av%9V(xJc{UEsrCK^W-~fcriffSg>bJv_uP zlgfl*`5}B!^5OGZlIoq4zs8Pz-n z;nxNXu{|hKA)E~tEpwcERB|UGs6DR8+N>D|K?LFL$&b`n&D(1ekffzUQwpy}#z0;c-~u5tqvIsj%ctIy=&WDE;# zOTocjH&{J!tMc3Ru$ps+8#qQTp+XPgeLuuYF)@ucIU~ui+oJ*&FYjKm6Gb3$T>0L% z8+79A1L%UXiWDy+eq=>)Arj}8PkPrcgsW(xkc3QjZQ{~qk05(x3L8O0%<$*g8ReK6 zDSbC(gtFo$tF!lm@s145{y69$Z*k*Su!KJ=ap>@8<2lMMLn3+d$STC=F_SOo8yNI$ zXxh>D@mI!w?s^#JXbzr{-*owV-iT~^RB-7Vg~=AiFpf0o3KE5Xeu2fr&(ld)ttyU~ z+4)tjF5k?nfA8FQt3kG1zEQJC_Jlrg>%f;4WFN~tJzN#NguGFa%Z4hg3Y-P3;NFN# zsB&Pw+|(@mDmW#dc(XKZMt|GH`2H`xc0TU)FsVz#yC8!>nq$cw3=S_i+q^$`^MkG& z!8==5ym@nbd8cbAbC;3N;7a!Ja7fU%?v)doyI9&r_z*_C5|b3fgerH`tVRz z=0>S*&nuOy0(C_s{zIn}ukQ3;G&=O_yT9tV?vqrHjM}{?x#aOFxU*ci`8$T3kr_D| zIgQl(m+Iw18?!V6-bU7&vxP( z$*~=q7blOGIbB*`NtZpKFeo`#Jy;fbRibDQOXRQR$Aguo7Q>NqGDUI7=V)$8*K5}d zw3fb}rGb9$wf1V$-dd2?Xtu=*9GaP)K2&t>FgMXzpj_7dGFnj|CyK1!<#(W{*+VcAJL0bS?+{(d?}ahqPmmpio9?3+zS=fD?}^II7~Lz{ega zg&SwAX`!4&8egTX=cUlZ5qVL2CNabx0iP2Q=?Pz(X%Y~C7#(mY-wl3{z`sZeW5z2Y zzmcCr24Ps-LKaWN=e|AzbSEk>$@L4vJXnkFdhN$EX7ag>lHfP51-@e;2C9PZQ0*p& z@=tc9OK_cmB*O4ybwwFJh91u6d9!C^0JnG$4??f|gvofn*YE)ZG%?PjY018Up~Ix_ z@BjUDTSZ<8>mp7rnFNViZL!E-L+{b}d+B9IEppD?kDc(oR9E&g$RoSJzhI-vWKVmh zU+mqZw==5~ZqIs=s0L#(^GB6Hv)~`qeDV@T z;c&uI0q5u`m+*MP_M;3?|8?pgSNN${>{>#S!C5Fw3bIu8!r(n7%Kzo|6qRa!WpdbH zb!Ut1gIS#soE!mqm}>&Tb@q8HZ{f;b&TdBW3vME&*F#sHw>qh+{->kzo8R&4`Zt;B z*$@0~?L8yhucjLb3je68{aulsjH}0+oy z-;+WG)zrOHE`bZm0+!_C~C}>jlXlHAgd~s=u$V zPf1H_2%H1-K?b2XP-T9Rc(xmrvU)zM&`0a`q4tBv@hhlRv{J-@4K{U3sA>$lA z^G$o43GZ^PFW)513kh3uyq zX9dfxE0V7)Y@1WWDw`Y>eg=&W;q(t@|SBIa@G7h!e-vIU5A%! zT7Zv_4`_#?ucqVcUWHJ~iXq!5*^)!iHPE!_}{h zlj<0;yVHX>$o^5zOZ^tn>zXVhv-$i3S2&IEBwGn<(wGlM)`h9vSl8E>T$?1uaM zgP+-z9-<$dY7FwydJjk&ZukeP2J#<47OeMlPp3rAueYG_EV{f3439-l6QwSEEq(sg zZHQKH)KIaRBEDEyomgE`%#&1K0Y%uaN62Tct-Ae<#703H)fjIq4Ug2}G&T_?0s)e` zI`$CIucqgWBXrOQ^y;}WgNuP`6qS(n_U&nHB+i@jU;WUNI8Mds4^jvK#7bcR!O zmy?)cX+zYD9}_lX$jZ$HKllRpOu9ZvcKP^7tdQ@ywSl{M2_vG1nbqIS^GV)-& zdHi_iXCr$kMhZW}Q^GX=;1l6oKMcqB zz=8%f-D9AwAO)N=cRLUW!BL#&U6u_W?hz(#1g>Pru4GQWCWSuyZYR5=sMO{h;kf2m z1h(uRH*UxR+g;Yo++5z&%uLR{F2G|JX30yym{kY<9JrQMS{@GHI+DDZmdZeg9ripJ z5bdnTaJg19jAR>R&r^KKiig6*Fko~?&2d0)qa%5T_6cR_F|}2H!+dB&DZB0alj=AbPsmjv05UL*bAN3TX-As|+Es_HYG3<58hU2Kv zOoCmc(I$LfAs94?@bIqw#lt@zCNR9V`7DQ8^mmhGd8e6xLG~DNxYJ}!0uE>1Ac~th z4<@8J$DJ@w=`cBHB+*sace=xM%40lEqzI>wVhK;r+S-|WX|&c2u9CptdN{G~C}g1O zBicmDT8D5E&vxxYemm`5R#ZY&vMGOTL(AYfGEVyxZa?z9>If%sPfFrzKH@G3uJ|!D z)S~IyGRqeqKzGj8<{bd*v#pjOi|;ZtXQMDTR^P7AO2i4HpzJe?sxrw;7xix*(X9&; zQ%wFvzqfw;RVjm0?q71gl78oen8n7%ey8tW>Et6%C#Qnr8X7;rvtXBdWj}E0q9;g> zIs}YJi?GrP!}Fu%Cb<1doqzfrR}PBSHcG)YwvP~d<$iUo^gTuW6z7dyr(PfEjDVA3 zLN7zf$;qAYf(`uz1CHZB2^bsKp4bTQosP&DCt)!P4GpqoU{OZb%f8i)YhP z7idK1ExU?R*^bL5yd~Ac0q`BSa9XfkiPomy0$c$%D*BHJV#hFlbT=0&`uXk=Z;_TQ zWXQh6YOIG0b!SO#&#;3k`y@CmKXneKie=QFVg;^0xTwUSBgSQ+O?~7Bu?WOh7 z^_v955nbHe5X3l3oIk*RFC=+()&neG(!NlTfZ7u|>YRHXTYRS&lS) zl)7)Vr-1pTA574d+*>_j&W*+GKk~jNYM>OPUpmLh*zQkHwN!()gr0kZ#l}!Ylc-pc zhbXVCb>6UKqn2daugjWLBWBZ7HZ2}Y){`OQx`+!;iYmxD*~eTPEqp5;x) zsP3^=^nH-A^}qH9VhX>3G(8o_oQ1&0d;j9aiwW3yl<3ihmqEG?x*Q*!Z5iYBx~Vh9 z6=^4O^4!}sy5&mktuE#8JRex>mKuskyp^t1m8U4`m>n={JvOE6|K^6auLpg|Vu^e* zjl+(JDVZ~Zq4r;>1!|u58QL{cWT5&=S2TEU9eRX>4fWiTM`Tf}q=J-O(Y%|)JsPbPA@MxR zos+lE|cXQp|Q=yJ=AK*Kpjk;#uBG@%Lrp zG(Rqf+S5)yTgObyqbB1F7&(olfii3({VmBdDTS-bqis}BuRX}YMPLg7mOZnQdi1!a zQ+ot+TZEKTDxic9HTnJkVb1jIAgh4uMo8yAjR6`k)|&}duGfMIP)l>G9@K@R#6;O zG1YvX7z>g2=;kES76LCah-%WHi8a@UJEv8$?#W^#bWbo3) zCya4mpnnu2yQ51*?5IyS+bHJ|bG;0(BkC;8}UWD;fP_<9cIY@jeTst{pd5*5~ ziG0x9DEP5sUSv%$k*8>0bIMH3^4{Z3$fjJ}dxx6eiqO|2U=`&{kC^=J9?x)PU{V^_j?U_l)``xRoSIX?XajlXYd6b^c2`QwbKd$9ge#$yArUd}^ zH$X|(+mj_jioX3l1N~09>~#9r2}jEg3lke%_BqKs!4m&$LVd;Nu9=Rly3!SAEu0ov z<>LwI9T7E>_YZsIc5iUo$`W$Zozn8^yfY^4$9wL|AsF&vz4c&AAxf>Xd>bpC|!0?%DLx z`ZSt3Cm`DPDuQ?yD8VvwC7IF8^H-pbzu+l3d5r*2IyUylp;` zSmY~Pzdt9_z~I5yCa+RQ7{B(jC=20i5d88;J7~5zYV;Ec)WF&Diz(jFeP@zz%2wP%_)JPhwTOFJnqAs_QSyT16V#a>`v054u*yZ*&_zos@>%8%-RN+Aw@Q)vitAxQZ z72N11=r3G*dpndS`O?OXxw=d^ZR+5-OTR58S)VD_&JKaIZ90`1ysA!WS2S*F9JvC1yrT|H*VxhfC&0CxqJcMb8-JI~g9 zhN*sz@(!)8JpG znu~;si-11E;aRs?RgPqd3&uuF{YNfk8GrrZ%dxEfHuw8U4ePG%u$aze45p$N+h0nE zC`j>E%N51~payEms+1m(9YSw3M<(M{0It(gP(UIy>Vm0tKe5-cv<8Q9Yqpafv zpVPD+mT@_l(x{{m!hwM!!R%EgL5G8XPQ*Qv-DSk03};AJaU*pzM#?x#ruNm3)7$Dn zw1QBuwg36$nfV2}u6>w=7ZrV@1>i&gsoZ9qYV{($&g1n9QS|VB5=_(fDG#g*(s@Tekucp!vcM;Uw?T* zTYDJ1Hz)Kvqd) zlMmmWv~>V5fT{d@>iBvlGUGXy8V^DXsqLZRCZoc=<-+hohJYD?1rnZmE|BM%!IMFG`?g!WkZ|* zBVTaiIuC8jOGqEPS!nr2pe?cc%`YG+Ga+&MjA#=D@lKUzl6F0J95$;(X0pjBuJ@EyAE zR~itb-T*fAk@VnSO-;>rIltqKlN_75@^uJTum_zc?XWN1N;Hw<&3k2VvOB2nqC0LS z>WyZ93L^fh-R7QFLjGHQ7|@2-fzk695bqvHGiwG=vj;potmNz)>%FIX3QM5%&Nkfs z0#@IbMa&mFlXo~4&eH0qo3TOiMdrlx3;MK98O&vuOF@nlF2+tl-5j2DgW4n0{S7l) zVv{!Q4hkt)uI^zS)!VC5&3+~6yYYLG)m#)4()f7`1MghOZ9lAVUJn_~O*d7+(hv>V zC{^YWjpiP*{YfbXySa{$y%^D*!BkULk!>b&8)`A_k0(lX*N9}sngF(6qo;eYNx?U_ zcOCxP7e3pi$MpS(ZRzk7nEk_kU(arBSRE{ElVreTjHwyUR`henf8bHEkPSacQ6e1n z$j@9l&k15@^Y7Jgr}Ekm*(H? z9RT9>3ysy0$S_!YxWX6ICdICW)`EwQMCUjLzWq9jjDJvPuDGNTWL<~|Znc4-zrl4N+ACIx-*OrwK9`Ypt+}ObrU?etxeo;}IAknzze=D_pyCV2 z5HfEO)oh=15dRxhk#3FYo*op;0$@InzzqquYC0GN>w`76*pYXL8L9>uxeu8jDz!X9~lPABLjnUauR@xglzr6|Z zNwF7$em{hsNV1t?$H`GNylUa~Ihxeh+;*t0;1i!bu0)zLZv6MpP1HCIxD7VEW$)b0WR5ySfa0(NPCDxoyHLbMj^im zKv8wD2FqLuwlzC_nzd`;4y0}&piX;+V)*eQ!np$_)Ve0MF7$!>!j}Y6eVae=b1)D0 zFA0G*KpdxMeh1AzE)@zY%TV5(|-*=fa9iw^7)aO1{j$RH$M~CRi>*v2E1jck7lXgVo>s?0c%MRL=4^1%UQ` zPv(+V=un{~wRV7iOAn1k8>QDJ0FA65g1X_qhtB=__3PKbQ-7^7*KC{dW`X=Q@f~rh z=5od%$?jNTl^1CR?4(p(&xivPGrYdW+UnTc0IqJv+E7WET|lX+h4_*7;lN} za9%lRfcyY$Z{UI0i($_)e1P+I0LO#WBmt(K)VnS&f;)hj7eORZS%J1I_aSJ6 z>hCziqRVmt*~H-YUiIv`Dbc<0UCFW|w|{788_1iJZ$gyDknlSh@_zH%jko95#$^nS zAAa}bY|%Gh#+wDbSHC0mk7|VEzV_I7hc2x)=-ytaWWj{7k&AGP&d6}N#{eM$ZmfbE z!>S-6gir3C!`4@Y=VwONo(0*m_vOBiCJ4Jji&5m0B0kh-FTRT84VqX{faN)#%%J9T z-F&o`7xhNlx2$a#Oy#=z%`9Gw0433r-A0;uc;#)k>-^@XMii%5)XB^H`4CnSPDw_F z&lF0|@1~^vtkSXyglK7zO+^mxGVOke=E2`9(F3BWM9~8eD|*EW#jspBvBDG`W9hq` zR$1upU%rejEiTr;O9VW4@LPfYHTg6cK)-%XMj#k=)icTejJ5ck2gGaLW?rY|4NmPG zJ?fyIaeVOE;Eo=~Mdzo30^iMtD_P%-eC!2hdyo}F*Z;qjt>2_|_KGHGjAm(t)%HUu z1*DNtVcv;^64g>x3@bK(v_*Adu3SCnGz#4l#;o8wPAtP3=Nu8Zl5D!^zMy6|H)7eh zZ`O${74#4#<+5Da3;y&f;LxA~>$(ely}d*LOL@WVB@GNvYkk&e6H8!NbsToe0bmVn z(@2#habl>l(mNC4JF^G$|E}aQk?WIF#JBdf`&xJQ=v-EBFHP18+VX2!hc_^ZSzV+d ztRTG0#w96c56iofs|U!_XgyMzQa{kNv6vsm(rFnx%3OZ*V*J4{2CqXf<3f$KcO;`t z7@<9v54iGY1B+%j%d#pru9Uk*S%0RzH3j0bOxz+2Yv)lK)Y`c&g#~%;?sbd!e`a?w zLNLUQZ6oY;nR5~~9Q1|l8sVOcDgz+d33;Pmu5gDLEx{pknB2?V?IZD@mUIP#Tn=RLY+QQ^l7FLdG2|#1=<7|zz_KL2D8;%prKR$l%V~Sc9PW~om?Fp8!(*J9-lZU({Ga1|NEw!=WU>04dYh+@ ziA25j$RrS=ICYHOz^5Ft5un_3?V)~878XEJwf2SN+7Hop4qF^7yZG}W!EnzVZCV9 zki4DIt%-WOz)`C5$CYRn!d#G&v6QI9+E;goCvInv2VRdeCVw z3>Hh!uD4Psu|ncIsfjx@CUQWYy-%I9kdT`j$BT`iPPKg-%a@j`feW$Ge#p1`&A32d z@0#&;_;;#|7oPr(i-ebM9mfwFs9FTc=9}*!FIXBINS}9}1ldN(&4h38mkn_eXMi~k z4^0tMDCe&zmn`(EUX;;Os^HcK^>-g40wqbS4@l49aG6Ks62Ly#4bc?8AizA&O*e&I z%0D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
{evaluation}
" + if len(final_output) > 4096: + filename = "output.txt" + with open(filename, "w+", encoding="utf8") as out_file: + out_file.write(str(evaluation)) + t2 = time() + keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⏳", + callback_data=f"runtime {t2-t1} Seconds", + ) + ] + ] + ) + await message.reply_document( + document=filename, + caption=f"⥤ ᴇᴠᴀʟ :\n{cmd[0:980]}\n\n⥤ ʀᴇsᴜʟᴛ :\nAttached Document", + quote=False, + reply_markup=keyboard, + ) + await message.delete() + os.remove(filename) + else: + t2 = time() + keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⏳", + callback_data=f"runtime {round(t2-t1, 3)} Seconds", + ), + InlineKeyboardButton( + text="🗑", + callback_data=f"forceclose abc|{message.from_user.id}", + ), + ] + ] + ) + await edit_or_reply(message, text=final_output, reply_markup=keyboard) + + +@app.on_callback_query(filters.regex(r"runtime")) +async def runtime_func_cq(_, cq): + runtime = cq.data.split(None, 1)[1] + await cq.answer(runtime, show_alert=True) + + +@app.on_callback_query(filters.regex("forceclose")) +async def forceclose_command(_, CallbackQuery): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + query, user_id = callback_request.split("|") + if CallbackQuery.from_user.id != int(user_id): + try: + return await CallbackQuery.answer( + "» ɪᴛ'ʟʟ ʙᴇ ʙᴇᴛᴛᴇʀ ɪғ ʏᴏᴜ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs ʙᴀʙʏ.", show_alert=True + ) + except: + return + await CallbackQuery.message.delete() + try: + await CallbackQuery.answer() + except: + return + + +@app.on_edited_message( + filters.command("sh") & SUDOERS & ~filters.forwarded & ~filters.via_bot +) +@app.on_message(filters.command("sh") & SUDOERS & ~filters.forwarded & ~filters.via_bot) +async def shellrunner(_, message: Message): + if len(message.command) < 2: + return await edit_or_reply(message, text="ᴇxᴀᴍᴩʟᴇ :\n/sh git pull") + text = message.text.split(None, 1)[1] + if "\n" in text: + code = text.split("\n") + output = "" + for x in code: + shell = re.split(""" (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", x) + try: + process = subprocess.Popen( + shell, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + except Exception as err: + await edit_or_reply(message, text=f"ERROR :\n
{err}
") + output += f"{code}\n" + output += process.stdout.read()[:-1].decode("utf-8") + output += "\n" + else: + shell = re.split(""" (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", text) + for a in range(len(shell)): + shell[a] = shell[a].replace('"', "") + try: + process = subprocess.Popen( + shell, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + except Exception as err: + print(err) + exc_type, exc_obj, exc_tb = sys.exc_info() + errors = traceback.format_exception( + etype=exc_type, + value=exc_obj, + tb=exc_tb, + ) + return await edit_or_reply( + message, text=f"ERROR :\n
{''.join(errors)}
" + ) + output = process.stdout.read()[:-1].decode("utf-8") + if str(output) == "\n": + output = None + if output: + if len(output) > 4096: + with open("output.txt", "w+") as file: + file.write(output) + await app.send_document( + message.chat.id, + "output.txt", + reply_to_message_id=message.id, + caption="Output", + ) + return os.remove("output.txt") + await edit_or_reply(message, text=f"OUTPUT :\n
{output}
") + else: + await edit_or_reply(message, text="OUTPUT :\nNone") + + await message.stop_propagation() + + +__MODULE__ = "Deᴠ" +__HELP__ = """ +🔰Aᴅᴅ Aɴᴅ Rᴇᴍᴏᴠᴇ Sᴜᴅᴏ Usᴇʀ's: + +★ /addsudo [Usᴇʀɴᴀᴍᴇ ᴏʀ Rᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] +★ /delsudo [Usᴇʀɴᴀᴍᴇ ᴏʀ Rᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] + +🛃Hᴇʀᴏᴋᴜ: + +★ /usage - Dʏɴᴏ Usᴀɢᴇ. +★ /get_var - Gᴇᴛ ᴀ ᴄᴏɴғɪɢ ᴠᴀʀ ғʀᴏᴍ Hᴇʀᴏᴋᴜ ᴏʀ .env +★ /del_var - Dᴇʟᴇᴛᴇ ᴀɴʏ ᴠᴀʀ ᴏɴ Hᴇʀᴏᴋᴜ ᴏʀ .ᴇɴᴠ. +★ /set_var [Vᴀʀ Nᴀᴍᴇ] [Vᴀʟᴜᴇ] - Sᴇᴛ ᴀ Vᴀʀ ᴏʀ Uᴘᴅᴀᴛᴇ ᴀ Vᴀʀ ᴏɴ ʜᴇʀᴏᴋᴜ ᴏʀ .ᴇɴᴠ. Sᴇᴘᴇʀᴀᴛᴇ Vᴀʀ ᴀɴᴅ ɪᴛs Vᴀʟᴜᴇ ᴡɪᴛʜ ᴀ sᴘᴀᴄᴇ. + +🤖Bᴏᴛ Cᴏᴍᴍᴀɴᴅs: + +★ /restart - Rᴇsᴛᴀʀᴛ ʏᴏᴜʀ Bᴏᴛ. +★ /update , /gitpull - Uᴘᴅᴀᴛᴇ Bᴏᴛ. +★ /speedtest - Cʜᴇᴄᴋ sᴇʀᴠᴇʀ sᴘᴇᴇᴅs +★ /maintenance [ᴇɴᴀʙʟᴇ / ᴅɪsᴀʙʟᴇ] +★ /logger [ᴇɴᴀʙʟᴇ / ᴅɪsᴀʙʟᴇ] - Bᴏᴛ ʟᴏɢs ᴛʜᴇ sᴇᴀʀᴄʜᴇᴅ ǫᴜᴇʀɪᴇs ɪɴ ʟᴏɢɢᴇʀ ɢʀᴏᴜᴘ. +★ /get_log [Nᴜᴍʙᴇʀ ᴏғ Lɪɴᴇs] - Gᴇᴛ ʟᴏɢ ᴏғ ʏᴏᴜʀ ʙᴏᴛ ғʀᴏᴍ ʜᴇʀᴏᴋᴜ ᴏʀ ᴠᴘs. Wᴏʀᴋs ғᴏʀ ʙᴏᴛʜ. +★ /autoend [ᴇɴᴀʙʟᴇ|ᴅɪsᴀʙʟᴇ] - Eɴᴀʙʟᴇ Aᴜᴛᴏ sᴛʀᴇᴀᴍ ᴇɴᴅ ᴀғᴛᴇʀ 𝟹 ᴍɪɴs ɪғ ɴᴏ ᴏɴᴇ ɪs ʟɪsᴛᴇɴɪɴɢ. + +""" + diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py new file mode 100644 index 000000000000..0ee944710b9c --- /dev/null +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -0,0 +1,145 @@ +import io +import os +import os.path +import time +from inspect import getfullargspec +from os.path import exists, isdir + +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.error import capture_err + +MAX_MESSAGE_SIZE_LIMIT = 4095 + + +@app.on_message(filters.command("ls") & ~filters.forwarded & ~filters.via_bot & SUDOERS) +@capture_err +async def lst(_, message): + prefix = message.text.split()[0][0] + chat_id = message.chat.id + path = os.getcwd() + text = message.text.split(" ", 1) + directory = None + if len(text) > 1: + directory = text[1].strip() + path = directory + if not exists(path): + await eor( + message, + text=f"There is no such directory or file with the name `{directory}` check again!", + ) + return + if isdir(path): + if directory: + msg = "Folders and Files in `{}` :\n\n".format(path) + lists = os.listdir(path) + else: + msg = "Folders and Files in Current Directory :\n\n" + lists = os.listdir(path) + files = "" + folders = "" + for contents in sorted(lists): + thepathoflight = path + "/" + contents + if not isdir(thepathoflight): + size = os.stat(thepathoflight).st_size + if contents.endswith((".mp3", ".flac", ".wav", ".m4a")): + files += "🎵 " + f"{contents}\n" + if contents.endswith((".opus")): + files += "🎙 " + f"{contents}\n" + elif contents.endswith( + (".mkv", ".mp4", ".webm", ".avi", ".mov", ".flv") + ): + files += "🎞 " + f"{contents}\n" + elif contents.endswith( + (".zip", ".tar", ".tar.gz", ".rar", ".7z", ".xz") + ): + files += "🗜 " + f"{contents}\n" + elif contents.endswith( + (".jpg", ".jpeg", ".png", ".gif", ".bmp", ".ico", ". webp") + ): + files += "🖼 " + f"{contents}\n" + elif contents.endswith((".exe", ".deb")): + files += "⚙️ " + f"{contents}\n" + elif contents.endswith((".iso", ".img")): + files += "💿 " + f"{contents}\n" + elif contents.endswith((".apk", ".apk")): + files += "📱 " + f"{contents}\n" + elif contents.endswith((".py")): + files += "🐍 " + f"{contents}\n" + else: + files += "📄 " + f"{contents}\n" + else: + folders += f"📁 {contents}\n" + if files or folders: + msg = msg + folders + files + else: + msg = msg + "__empty path__" + else: + size = os.stat(path).st_size + msg = "The details of given file :\n\n" + if path.endswith((".mp3", ".flac", ".wav", ".m4a")): + mode = "🎵 " + if path.endswith((".opus")): + mode = "🎙 " + elif path.endswith((".mkv", ".mp4", ".webm", ".avi", ".mov", ".flv")): + mode = "🎞 " + elif path.endswith((".zip", ".tar", ".tar.gz", ".rar", ".7z", ".xz")): + mode = "🗜 " + elif path.endswith((".jpg", ".jpeg", ".png", ".gif", ".bmp", ".ico", ". webp")): + mode = "🖼 " + elif path.endswith((".exe", ".deb")): + mode = "⚙️ " + elif path.endswith((".iso", ".img")): + mode = "💿 " + elif path.endswith((".apk", ".xapk")): + mode = "📱 " + elif path.endswith((".py")): + mode = "🐍 " + else: + mode = "📄 " + time.ctime(os.path.getctime(path)) + time2 = time.ctime(os.path.getmtime(path)) + time3 = time.ctime(os.path.getatime(path)) + msg += f"Location : {path}\n" + msg += f"Icon : {mode}\n" + msg += f"Size : {humanbytes(size)}\n" + msg += f"Last Modified Time: {time2}\n" + msg += f"Last Accessed Time: {time3}" + + if len(msg) > MAX_MESSAGE_SIZE_LIMIT: + with io.BytesIO(str.encode(msg)) as out_file: + out_file.name = "ls.txt" + await app.send_document( + chat_id, + out_file, + caption=path, + ) + await message.delete() + else: + await eor(message, text=msg) + + +@app.on_message(filters.command("rm") & ~filters.forwarded & ~filters.via_bot & SUDOERS) +@capture_err +async def rm_file(client, message): + if len(message.command) < 2: + return await eor(message, text="Please provide a file name to delete.") + file = message.text.split(" ", 1)[1] + if exists(file): + os.remove(file) + await eor(message, text=f"{file} has been deleted.") + else: + await eor(message, text=f"{file} doesn't exist!") + + +async def eor(msg: Message, **kwargs): + func = ( + (msg.edit_text if msg.from_user.is_self else msg.reply) + if msg.from_user + else msg.reply + ) + spec = getfullargspec(func.__wrapped__).args + return await func(**{k: v for k, v in kwargs.items() if k in spec}) \ No newline at end of file diff --git a/TanuMusic/plugins/sudo/gban.py b/TanuMusic/plugins/sudo/gban.py new file mode 100644 index 000000000000..b3ce64b3d4c7 --- /dev/null +++ b/TanuMusic/plugins/sudo/gban.py @@ -0,0 +1,125 @@ +import asyncio + +from pyrogram import filters +from pyrogram.errors import FloodWait +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils import get_readable_time +from TanuMusic.utils.database import ( + add_banned_user, + get_banned_count, + get_banned_users, + get_served_chats, + is_banned_user, + remove_banned_user, +) +from TanuMusic.utils.decorators.language import language +from TanuMusic.utils.extraction import extract_user +from config import BANNED_USERS + + +@app.on_message(filters.command(["gban", "globalban"]) & SUDOERS) +@language +async def global_ban(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + if user.id == message.from_user.id: + return await message.reply_text(_["gban_1"]) + elif user.id == app.id: + return await message.reply_text(_["gban_2"]) + elif user.id in SUDOERS: + return await message.reply_text(_["gban_3"]) + is_gbanned = await is_banned_user(user.id) + if is_gbanned: + return await message.reply_text(_["gban_4"].format(user.mention)) + if user.id not in BANNED_USERS: + BANNED_USERS.add(user.id) + served_chats = [] + chats = await get_served_chats() + for chat in chats: + served_chats.append(int(chat["chat_id"])) + time_expected = get_readable_time(len(served_chats)) + mystic = await message.reply_text(_["gban_5"].format(user.mention, time_expected)) + number_of_chats = 0 + for chat_id in served_chats: + try: + await app.ban_chat_member(chat_id, user.id) + number_of_chats += 1 + except FloodWait as fw: + await asyncio.sleep(int(fw.value)) + except: + continue + await add_banned_user(user.id) + await message.reply_text( + _["gban_6"].format( + app.mention, + message.chat.title, + message.chat.id, + user.mention, + user.id, + message.from_user.mention, + number_of_chats, + ) + ) + await mystic.delete() + + +@app.on_message(filters.command(["ungban"]) & SUDOERS) +@language +async def global_un(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + is_gbanned = await is_banned_user(user.id) + if not is_gbanned: + return await message.reply_text(_["gban_7"].format(user.mention)) + if user.id in BANNED_USERS: + BANNED_USERS.remove(user.id) + served_chats = [] + chats = await get_served_chats() + for chat in chats: + served_chats.append(int(chat["chat_id"])) + time_expected = get_readable_time(len(served_chats)) + mystic = await message.reply_text(_["gban_8"].format(user.mention, time_expected)) + number_of_chats = 0 + for chat_id in served_chats: + try: + await app.unban_chat_member(chat_id, user.id) + number_of_chats += 1 + except FloodWait as fw: + await asyncio.sleep(int(fw.value)) + except: + continue + await remove_banned_user(user.id) + await message.reply_text(_["gban_9"].format(user.mention, number_of_chats)) + await mystic.delete() + + +@app.on_message(filters.command(["gbannedusers", "gbanlist"]) & SUDOERS) +@language +async def gbanned_list(client, message: Message, _): + counts = await get_banned_count() + if counts == 0: + return await message.reply_text(_["gban_10"]) + mystic = await message.reply_text(_["gban_11"]) + msg = _["gban_12"] + count = 0 + users = await get_banned_users() + for user_id in users: + count += 1 + try: + user = await app.get_users(user_id) + user = user.first_name if not user.mention else user.mention + msg += f"❖ {count} ➥ {user}\n" + except Exception: + msg += f"❖ {count} ➥ {user_id}\n" + continue + if count == 0: + return await mystic.edit_text(_["gban_10"]) + else: + return await mystic.edit_text(msg) diff --git a/TanuMusic/plugins/sudo/logger.py b/TanuMusic/plugins/sudo/logger.py new file mode 100644 index 000000000000..858970935dfb --- /dev/null +++ b/TanuMusic/plugins/sudo/logger.py @@ -0,0 +1,23 @@ +from pyrogram import filters + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import add_off, add_on +from TanuMusic.utils.decorators.language import language + + +@app.on_message(filters.command(["logger"]) & SUDOERS) +@language +async def logger(client, message, _): + usage = _["log_1"] + if len(message.command) != 2: + return await message.reply_text(usage) + state = message.text.split(None, 1)[1].strip().lower() + if state == "enable": + await add_on(2) + await message.reply_text(_["log_2"]) + elif state == "disable": + await add_off(2) + await message.reply_text(_["log_3"]) + else: + await message.reply_text(usage) diff --git a/TanuMusic/plugins/sudo/maintenance.py b/TanuMusic/plugins/sudo/maintenance.py new file mode 100644 index 000000000000..8860cc0e9953 --- /dev/null +++ b/TanuMusic/plugins/sudo/maintenance.py @@ -0,0 +1,39 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import ( + get_lang, + is_maintenance, + maintenance_off, + maintenance_on, +) +from strings import get_string + + +@app.on_message(filters.command(["maintenance"]) & SUDOERS) +async def maintenance(client, message: Message): + try: + language = await get_lang(message.chat.id) + _ = get_string(language) + except: + _ = get_string("en") + usage = _["maint_1"] + if len(message.command) != 2: + return await message.reply_text(usage) + state = message.text.split(None, 1)[1].strip().lower() + if state == "enable": + if await is_maintenance() is False: + await message.reply_text(_["maint_4"]) + else: + await maintenance_on() + await message.reply_text(_["maint_2"].format(app.mention)) + elif state == "disable": + if await is_maintenance() is False: + await maintenance_off() + await message.reply_text(_["maint_3"].format(app.mention)) + else: + await message.reply_text(_["maint_5"]) + else: + await message.reply_text(usage) diff --git a/TanuMusic/plugins/sudo/restart.py b/TanuMusic/plugins/sudo/restart.py new file mode 100644 index 000000000000..bc3ec3d6eadb --- /dev/null +++ b/TanuMusic/plugins/sudo/restart.py @@ -0,0 +1,137 @@ +import asyncio +import os +import shutil +import socket +from datetime import datetime + +import urllib3 +from git import Repo +from git.exc import GitCommandError, InvalidGitRepositoryError +from pyrogram import filters + +import config +from TanuMusic import app +from TanuMusic.misc import HAPP, SUDOERS, XCB +from TanuMusic.utils.database import ( + get_active_chats, + remove_active_chat, + remove_active_video_chat, +) +from TanuMusic.utils.decorators.language import language +from TanuMusic.utils.pastebin import Bin + +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + +async def is_heroku(): + return "heroku" in socket.getfqdn() + + +@app.on_message(filters.command(["getlog", "logs", "getlogs"]) & SUDOERS) +@language +async def log_(client, message, _): + try: + await message.reply_document(document="log.txt") + except: + await message.reply_text(_["server_1"]) + + +@app.on_message(filters.command(["update", "gitpull"]) & SUDOERS) +@language +async def update_(client, message, _): + if await is_heroku(): + if HAPP is None: + return await message.reply_text(_["server_2"]) + response = await message.reply_text(_["server_3"]) + try: + repo = Repo() + except GitCommandError: + return await response.edit(_["server_4"]) + except InvalidGitRepositoryError: + return await response.edit(_["server_5"]) + to_exc = f"❖ git fetch origin ➥ {config.UPSTREAM_BRANCH} &> /dev/null" + os.system(to_exc) + await asyncio.sleep(7) + verification = "" + REPO_ = repo.remotes.origin.url.split(".git")[0] + for checks in repo.iter_commits(f"HEAD..origin/{config.UPSTREAM_BRANCH}"): + verification = str(checks.count()) + if verification == "": + return await response.edit(_["server_6"]) + updates = "" + ordinal = lambda format: "%d%s" % ( + format, + "tsnrhtdd"[(format // 10 % 10 != 1) * (format % 10 < 4) * format % 10 :: 4], + ) + for info in repo.iter_commits(f"HEAD..origin/{config.UPSTREAM_BRANCH}"): + updates += f"❖ #{info.count()} ➥ {info.summary} ʙʏ ➥ {info.author}\n\t\t\t\t➥ ᴄᴏᴍᴍɪᴛᴇᴅ ᴏɴ ➥ {ordinal(int(datetime.fromtimestamp(info.committed_date).strftime('%d')))} {datetime.fromtimestamp(info.committed_date).strftime('%b')}, {datetime.fromtimestamp(info.committed_date).strftime('%Y')}\n\n" + _update_response_ = "❖ ᴀ ɴᴇᴡ ᴜᴩᴅᴀᴛᴇ ɪs ᴀᴠᴀɪʟᴀʙʟᴇ ғᴏʀ ᴛʜᴇ ʙᴏᴛ !\n\n● ᴩᴜsʜɪɴɢ ᴜᴩᴅᴀᴛᴇs ɴᴏᴡ\n\n● <ᴜᴩᴅᴀᴛᴇs ➥\n\n" + _final_updates_ = _update_response_ + updates + if len(_final_updates_) > 4096: + url = await Bin(updates) + nrs = await response.edit( + f"❖ ᴀ ɴᴇᴡ ᴜᴩᴅᴀᴛᴇ ɪs ᴀᴠᴀɪʟᴀʙʟᴇ ғᴏʀ ᴛʜᴇ ʙᴏᴛ !\n\n● ᴩᴜsʜɪɴɢ ᴜᴩᴅᴀᴛᴇs ɴᴏᴡ\n\n● ᴜᴩᴅᴀᴛᴇs ➥\n\nᴄʜᴇᴄᴋ ᴜᴩᴅᴀᴛᴇs" + ) + else: + nrs = await response.edit(_final_updates_, disable_web_page_preview=True) + os.system("git stash &> /dev/null && git pull") + + try: + served_chats = await get_active_chats() + for x in served_chats: + try: + await app.send_message( + chat_id=int(x), + text=_["server_8"].format(app.mention), + ) + await remove_active_chat(x) + await remove_active_video_chat(x) + except: + pass + await response.edit(f"{nrs.text}\n\n{_['server_7']}") + except: + pass + + if await is_heroku(): + try: + os.system( + f"{XCB[5]} {XCB[7]} {XCB[9]}{XCB[4]}{XCB[0]*2}{XCB[6]}{XCB[4]}{XCB[8]}{XCB[1]}{XCB[5]}{XCB[2]}{XCB[6]}{XCB[2]}{XCB[3]}{XCB[0]}{XCB[10]}{XCB[2]}{XCB[5]} {XCB[11]}{XCB[4]}{XCB[12]}" + ) + return + except Exception as err: + await response.edit(f"{nrs.text}\n\n{_['server_9']}") + return await app.send_message( + chat_id=config.LOGGER_ID, + text=_["server_10"].format(err), + ) + else: + os.system("pip3 install -r requirements.txt") + os.system(f"kill -9 {os.getpid()} && bash start") + exit() + + +@app.on_message(filters.command(["restart"]) & SUDOERS) +async def restart_(_, message): + response = await message.reply_text("❖ ʀᴇsᴛᴀʀᴛɪɴɢ...") + ac_chats = await get_active_chats() + for x in ac_chats: + try: + await app.send_message( + chat_id=int(x), + text=f"❖ {app.mention} ɪs ʀᴇsᴛᴀʀᴛɪɴɢ...\n\n● ʏᴏᴜ ᴄᴀɴ sᴛᴀʀᴛ ᴩʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴀғᴛᴇʀ 15-20 sᴇᴄᴏɴᴅs.", + ) + await remove_active_chat(x) + await remove_active_video_chat(x) + except: + pass + + try: + shutil.rmtree("downloads") + shutil.rmtree("raw_files") + shutil.rmtree("cache") + except: + pass + await response.edit_text( + "❖ ʀᴇsᴛᴀʀᴛ ᴘʀᴏᴄᴇss sᴛᴀʀᴛᴇᴅ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ ғᴏʀ ғᴇᴡ sᴇᴄᴏɴᴅs ᴜɴᴛɪʟ ᴛʜᴇ ʙᴏᴛ sᴛᴀʀᴛs..." + ) + os.system(f"kill -9 {os.getpid()} && bash start") diff --git a/TanuMusic/plugins/sudo/sudoers.py b/TanuMusic/plugins/sudo/sudoers.py new file mode 100644 index 000000000000..dfb8ece08c4a --- /dev/null +++ b/TanuMusic/plugins/sudo/sudoers.py @@ -0,0 +1,71 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import add_sudo, remove_sudo +from TanuMusic.utils.decorators.language import language +from TanuMusic.utils.extraction import extract_user +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS, OWNER_ID + + +@app.on_message(filters.command(["addsudo"]) & filters.user(OWNER_ID)) +@language +async def useradd(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + if user.id in SUDOERS: + return await message.reply_text(_["sudo_1"].format(user.mention)) + added = await add_sudo(user.id) + if added: + SUDOERS.add(user.id) + await message.reply_text(_["sudo_2"].format(user.mention)) + else: + await message.reply_text(_["sudo_8"]) + + +@app.on_message(filters.command(["delsudo", "rmsudo"]) & filters.user(OWNER_ID)) +@language +async def userdel(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + if user.id not in SUDOERS: + return await message.reply_text(_["sudo_3"].format(user.mention)) + removed = await remove_sudo(user.id) + if removed: + SUDOERS.remove(user.id) + await message.reply_text(_["sudo_4"].format(user.mention)) + else: + await message.reply_text(_["sudo_8"]) + + +@app.on_message(filters.command(["sudolist", "listsudo", "sudoers"]) & ~BANNED_USERS) +@language +async def sudoers_list(client, message: Message, _): + text = _["sudo_5"] + user = await app.get_users(OWNER_ID) + user = user.first_name if not user.mention else user.mention + text += f"❖ {user}\n" + count = 0 + smex = 0 + for user_id in SUDOERS: + if user_id != OWNER_ID: + try: + user = await app.get_users(user_id) + user = user.first_name if not user.mention else user.mention + if smex == 0: + smex += 1 + text += _["sudo_6"] + count += 1 + text += f"❖ {count} ➥ {user}\n" + except: + continue + if not text: + await message.reply_text(_["sudo_7"]) + else: + await message.reply_text(text, reply_markup=close_markup(_)) diff --git a/TanuMusic/plugins/tools/afk.py b/TanuMusic/plugins/tools/afk.py new file mode 100644 index 000000000000..089448a2dae5 --- /dev/null +++ b/TanuMusic/plugins/tools/afk.py @@ -0,0 +1,380 @@ +import time, re +from config import BOT_USERNAME +from pyrogram.enums import MessageEntityType +from pyrogram import filters +from pyrogram.types import Message +from TanuMusic import app +from TanuMusic.utils.formatters import get_readable_time +from TanuMusic.utils.database import add_afk, is_afk, remove_afk + + +@app.on_message(filters.command(["afk", "brb"], prefixes=["/", "!"])) +async def active_afk(_, message: Message): + if message.sender_chat: + return + user_id = message.from_user.id + verifier, reasondb = await is_afk(user_id) + if verifier: + await remove_afk(user_id) + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time((int(time.time() - timeafk))) + if afktype == "text": + send = await message.reply_text( + f" ✦ {message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}", + disable_web_page_preview=True, + ) + if afktype == "text_reason": + send = await message.reply_text( + f"✦ {message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`", + disable_web_page_preview=True, + ) + if afktype == "animation": + if str(reasonafk) == "None": + send = await message.reply_animation( + data, + caption=f"✦ {message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}", + ) + else: + send = await message.reply_animation( + data, + caption=f"✦ {message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`", + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await message.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=f"✦ {message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}", + ) + else: + send = await message.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=f"✦ {message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠`{reasonafk}`", + ) + except Exception: + send = await message.reply_text( + f"✦ {message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ", + disable_web_page_preview=True, + ) + + if len(message.command) == 1 and not message.reply_to_message: + details = { + "type": "text", + "time": time.time(), + "data": None, + "reason": None, + } + elif len(message.command) > 1 and not message.reply_to_message: + _reason = (message.text.split(None, 1)[1].strip())[:100] + details = { + "type": "text_reason", + "time": time.time(), + "data": None, + "reason": _reason, + } + elif len(message.command) == 1 and message.reply_to_message.animation: + _data = message.reply_to_message.animation.file_id + details = { + "type": "animation", + "time": time.time(), + "data": _data, + "reason": None, + } + elif len(message.command) > 1 and message.reply_to_message.animation: + _data = message.reply_to_message.animation.file_id + _reason = (message.text.split(None, 1)[1].strip())[:100] + details = { + "type": "animation", + "time": time.time(), + "data": _data, + "reason": _reason, + } + elif len(message.command) == 1 and message.reply_to_message.photo: + await app.download_media( + message.reply_to_message, file_name=f"{user_id}.jpg" + ) + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": None, + } + elif len(message.command) > 1 and message.reply_to_message.photo: + await app.download_media( + message.reply_to_message, file_name=f"{user_id}.jpg" + ) + _reason = message.text.split(None, 1)[1].strip() + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": _reason, + } + elif len(message.command) == 1 and message.reply_to_message.sticker: + if message.reply_to_message.sticker.is_animated: + details = { + "type": "text", + "time": time.time(), + "data": None, + "reason": None, + } + else: + await app.download_media( + message.reply_to_message, file_name=f"{user_id}.jpg" + ) + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": None, + } + elif len(message.command) > 1 and message.reply_to_message.sticker: + _reason = (message.text.split(None, 1)[1].strip())[:100] + if message.reply_to_message.sticker.is_animated: + details = { + "type": "text_reason", + "time": time.time(), + "data": None, + "reason": _reason, + } + else: + await app.download_media( + message.reply_to_message, file_name=f"{user_id}.jpg" + ) + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": _reason, + } + else: + details = { + "type": "text", + "time": time.time(), + "data": None, + "reason": None, + } + + await add_afk(user_id, details) + await message.reply_text(f"{message.from_user.first_name} ɪs ɴᴏᴡ ᴀғᴋ!") + + + + +chat_watcher_group = 1 + + +@app.on_message( + ~filters.me & ~filters.bot & ~filters.via_bot, + group=chat_watcher_group, +) +async def chat_watcher_func(_, message): + if message.sender_chat: + return + userid = message.from_user.id + user_name = message.from_user.first_name + if message.entities: + possible = ["/afk", f"/afk@{BOT_USERNAME}"] + message_text = message.text or message.caption + for entity in message.entities: + if entity.type == MessageEntityType.BOT_COMMAND: + if (message_text[0 : 0 + entity.length]).lower() in possible: + return + + msg = "" + replied_user_id = 0 + + + + verifier, reasondb = await is_afk(userid) + if verifier: + await remove_afk(userid) + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time((int(time.time() - timeafk))) + if afktype == "text": + msg += f"✦ {user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n" + if afktype == "text_reason": + msg += f"✦ {user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n" + if afktype == "animation": + if str(reasonafk) == "None": + send = await message.reply_animation( + data, + caption=f"✦ {user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n", + ) + else: + send = await message.reply_animation( + data, + caption=f"✦ {user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n", + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await message.reply_photo( + photo=f"downloads/{userid}.jpg", + caption=f"✦ {user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n", + ) + else: + send = await message.reply_photo( + photo=f"downloads/{userid}.jpg", + caption=f"✦ {user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n", + ) + except: + msg += f"✦ {user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ\n\n" + + + if message.reply_to_message: + try: + replied_first_name = message.reply_to_message.from_user.first_name + replied_user_id = message.reply_to_message.from_user.id + verifier, reasondb = await is_afk(replied_user_id) + if verifier: + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time((int(time.time() - timeafk))) + if afktype == "text": + msg += ( + f"✦ {replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n" + ) + if afktype == "text_reason": + msg += f"✦ {replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠`{reasonafk}`\n\n" + if afktype == "animation": + if str(reasonafk) == "None": + send = await message.reply_animation( + data, + caption=f"✦ {replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n", + ) + else: + send = await message.reply_animation( + data, + caption=f"✦ {replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n", + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await message.reply_photo( + photo=f"downloads/{replied_user_id}.jpg", + caption=f"✦ {replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n", + ) + else: + send = await message.reply_photo( + photo=f"downloads/{replied_user_id}.jpg", + caption=f"✦ {replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠`{reasonafk}`\n\n", + ) + except Exception: + msg += f"✦ {replied_first_name} ɪs ᴀғᴋ,\n✽ ᴩᴀᴛᴀ ɴɪ ʙᴄ ᴋᴀʙ sᴇ\n\n" + except: + pass + + if message.entities: + entity = message.entities + j = 0 + for x in range(len(entity)): + if (entity[j].type) == MessageEntityType.MENTION: + found = re.findall("@([_0-9a-zA-Z]+)", message.text) + try: + get_user = found[j] + user = await app.get_users(get_user) + if user.id == replied_user_id: + j += 1 + continue + except: + j += 1 + continue + verifier, reasondb = await is_afk(user.id) + if verifier: + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time((int(time.time() - timeafk))) + if afktype == "text": + msg += ( + f"✦ {user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n" + ) + if afktype == "text_reason": + msg += f"✦ {user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n" + if afktype == "animation": + if str(reasonafk) == "None": + send = await message.reply_animation( + data, + caption=f"✦ {user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n", + ) + else: + send = await message.reply_animation( + data, + caption=f"✦ {user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n", + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await message.reply_photo( + photo=f"downloads/{user.id}.jpg", + caption=f"✦ {user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n", + ) + else: + send = await message.reply_photo( + photo=f"downloads/{user.id}.jpg", + caption=f"✦ {user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n", + ) + except: + msg += f"✦ {user.first_name[:25]} ɪs ᴀғᴋ\n\n" + elif (entity[j].type) == MessageEntityType.TEXT_MENTION: + try: + user_id = entity[j].user.id + if user_id == replied_user_id: + j += 1 + continue + first_name = entity[j].user.first_name + except: + j += 1 + continue + verifier, reasondb = await is_afk(user_id) + if verifier: + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time((int(time.time() - timeafk))) + if afktype == "text": + msg += f"✦ {first_name[:25]} is ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n" + if afktype == "text_reason": + msg += f"✦ {first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n" + if afktype == "animation": + if str(reasonafk) == "None": + send = await message.reply_animation( + data, + caption=f"✦ {first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n", + ) + else: + send = await message.reply_animation( + data, + caption=f"✦ {first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n", + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await message.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=f"✦ {first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n", + ) + else: + send = await message.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=f"✦ {first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n✽ ʀᴇᴀsᴏɴ ➠ `{reasonafk}`\n\n", + ) + except: + msg += f"✦ {first_name[:25]} ɪs ᴀғᴋ\n\n" + j += 1 + if msg != "": + try: + send = await message.reply_text(msg, disable_web_page_preview=True) + except: + return \ No newline at end of file diff --git a/TanuMusic/plugins/tools/ask.py b/TanuMusic/plugins/tools/ask.py new file mode 100644 index 000000000000..388379d7ac66 --- /dev/null +++ b/TanuMusic/plugins/tools/ask.py @@ -0,0 +1,53 @@ +from pyrogram import Client, filters +from pyrogram.types import Message +from pyrogram.enums import ChatAction +import requests +import urllib.parse +import asyncio +from TanuMusic import app + +# Function to process the query +def ask_query(query, model=None): + default_model = 'mistralai/Mixtral-8x7B-Instruct-v0.1' + system_prompt = """You are Tanu from One Piece Ai, a Telegram bot owned by 𝐓ʜᴇ 𝐂ᴀᴘᴛᴀɪɴ's (@itzAsuraa). You have a love personality, respond with emojis, and act as a Telegram bot. You love Indian people💖, and your favorite AI is @ResponseByAi_Bot . respond accurately, concisely, and professionally. """ + + model = model or default_model + + if model == default_model: + query = f"{system_prompt}\n\nUser: {query}" + + encoded_query = urllib.parse.quote(query) + url = f"https://darkness.ashlynn.workers.dev/chat/?prompt={encoded_query}&model={model}" + + response = requests.get(url) + + if response.status_code == 200: + return response.json().get("response", "😕 Sorry, no response found.") + else: + return f"⚠️ Error fetching response from API. Status code: {response.status_code}" + +# Command handler for the ask command +@app.on_message(filters.command("ask")) +async def ask_handler(client: Client, message: Message): + query = message.text.split(" ", 1) # Split the command to get the query + if len(query) > 1: + user_query = query[1] # Get the actual question part + + # Send typing action to simulate a response delay + await send_typing_action(client, message.chat.id) + + # Call the ask_query function to process the user query + reply = ask_query(user_query) + user_mention = message.from_user.mention + await message.reply_text(f"{user_mention}, {reply}🚀") + else: + await message.reply_text("📝 Please provide a query to ask Tanu.") + + +# Simulate Typing Action +async def send_typing_action(client, chat_id, duration=1): + """ + Simulate typing action. + """ + await client.send_chat_action(chat_id, ChatAction.TYPING) # Use ChatAction enum + await asyncio.sleep(duration) # Wait for the specified duration diff --git a/TanuMusic/plugins/tools/carbon.py b/TanuMusic/plugins/tools/carbon.py new file mode 100644 index 000000000000..e99153bfbf34 --- /dev/null +++ b/TanuMusic/plugins/tools/carbon.py @@ -0,0 +1,39 @@ +import aiohttp +from io import BytesIO +from TanuMusic import app +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +EVAA = [ + [ + InlineKeyboardButton(text="ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ", url=f"https://t.me/TanuMusicxBot?startgroup=true"), + ], +] + + +async def make_carbon(code): + url = "https://carbonara.solopov.dev/api/cook" + async with aiohttp.ClientSession() as session: + async with session.post(url, json={"code": code}) as resp: + image = BytesIO(await resp.read()) + image.name = "carbon.png" + return image + + + +@app.on_message(filters.command("carbon")) +async def _carbon(client, message): + replied = message.reply_to_message + if not replied: + await message.reply_text("ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ ᴍᴇssᴀɢᴇ ᴛᴏ ᴍᴀᴋᴇ ᴀ ᴄᴀʀʙᴏɴ. ") + return + if not (replied.text or replied.caption): + return await message.reply_text("ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ ᴍᴇssᴀɢᴇ ᴛᴏ ᴍᴀᴋᴇ ᴀ ᴄᴀʀʙᴏɴ. ") + text = await message.reply("Processing...") + carbon = await make_carbon(replied.text or replied.caption) + await text.edit(" ᴜᴘʟᴏᴀᴅɪɴɢ... ") + await message.reply_photo(carbon, caption=f"❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙゙", reply_markup=InlineKeyboardMarkup(EVAA), + ) + await text.delete() + carbon.close() + diff --git a/TanuMusic/plugins/tools/clean.py b/TanuMusic/plugins/tools/clean.py new file mode 100644 index 000000000000..a7d680f15a08 --- /dev/null +++ b/TanuMusic/plugins/tools/clean.py @@ -0,0 +1,19 @@ +import os +import shutil + +from pyrogram import filters + +from TanuMusic import app +from TanuMusic.misc import SUDOERS + + +@app.on_message(filters.command("clean") & SUDOERS) +async def clean(_, message): + A = await message.reply_text("ᴄʟᴇᴀɴɪɴɢ ᴛᴇᴍᴘ ᴅɪʀᴇᴄᴛᴏʀɪᴇs...") + dir = "downloads" + dir1 = "cache" + shutil.rmtree(dir) + shutil.rmtree(dir1) + os.mkdir(dir) + os.mkdir(dir1) + await A.edit("ᴛᴇᴍᴘ ᴅɪʀᴇᴄᴛᴏʀɪᴇs ᴀʀᴇ ᴄʟᴇᴀɴᴇᴅ") \ No newline at end of file diff --git a/TanuMusic/plugins/tools/fonts.py b/TanuMusic/plugins/tools/fonts.py new file mode 100644 index 000000000000..5f5c66029933 --- /dev/null +++ b/TanuMusic/plugins/tools/fonts.py @@ -0,0 +1,193 @@ +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from TanuMusic.utils.fonts import Fonts +from TanuMusic import app + +@app.on_message(filters.command(["font", "fonts"])) +async def style_buttons(c, m, cb=False): + buttons = [ + [ + InlineKeyboardButton("𝚃𝚢𝚙𝚎𝚠𝚛𝚒𝚝𝚎𝚛", callback_data="style+typewriter"), + InlineKeyboardButton("𝕆𝕦𝕥𝕝𝕚𝕟𝕖", callback_data="style+outline"), + InlineKeyboardButton("𝐒𝐞𝐫𝐢𝐟", callback_data="style+serif"), + ], + [ + InlineKeyboardButton("𝑺𝒆𝒓𝒊𝒇", callback_data="style+bold_cool"), + InlineKeyboardButton("𝑆𝑒𝑟𝑖𝑓", callback_data="style+cool"), + InlineKeyboardButton("Sᴍᴀʟʟ Cᴀᴘs", callback_data="style+small_cap"), + ], + [ + InlineKeyboardButton("𝓈𝒸𝓇𝒾𝓅𝓉", callback_data="style+script"), + InlineKeyboardButton("𝓼𝓬𝓻𝓲𝓹𝓽", callback_data="style+script_bolt"), + InlineKeyboardButton("ᵗⁱⁿʸ", callback_data="style+tiny"), + ], + [ + InlineKeyboardButton("ᑕOᗰIᑕ", callback_data="style+comic"), + InlineKeyboardButton("𝗦𝗮𝗻𝘀", callback_data="style+sans"), + InlineKeyboardButton("𝙎𝙖𝙣𝙨", callback_data="style+slant_sans"), + ], + [ + InlineKeyboardButton("𝘚𝘢𝘯𝘴", callback_data="style+slant"), + InlineKeyboardButton("𝖲𝖺𝗇𝗌", callback_data="style+sim"), + InlineKeyboardButton("Ⓒ︎Ⓘ︎Ⓡ︎Ⓒ︎Ⓛ︎Ⓒ︎", callback_data="style+circles"), + ], + [ + InlineKeyboardButton("🅒︎🅘︎🅡︎🅒︎🅛︎🅔︎🅢︎", callback_data="style+circle_dark"), + InlineKeyboardButton("𝔊𝔬𝔱𝔥𝔦𝔠", callback_data="style+gothic"), + InlineKeyboardButton("𝕲𝖔𝖙𝖍𝖎𝖈", callback_data="style+gothic_bolt"), + ], + [ + InlineKeyboardButton("C͜͡l͜͡o͜͡u͜͡d͜͡s͜͡", callback_data="style+cloud"), + InlineKeyboardButton("H̆̈ă̈p̆̈p̆̈y̆̈", callback_data="style+happy"), + InlineKeyboardButton("S̑̈ȃ̈d̑̈", callback_data="style+sad"), + ], + [InlineKeyboardButton("ᴄʟᴏsᴇ", callback_data="close_reply"), InlineKeyboardButton("ɴᴇxᴛ ➤", callback_data="nxt")], + ] + + if not cb: + text = m.text.split(' ', 1)[1] + await m.reply_text(f"`{text}`", reply_markup=InlineKeyboardMarkup(buttons), quote=True) + else: + await m.answer() + await m.message.edit_reply_markup(InlineKeyboardMarkup(buttons)) + + +@app.on_callback_query(filters.regex("^nxt")) +async def nxt(c, m): + if m.data == "nxt": + buttons = [ + [ + InlineKeyboardButton("🇸 🇵 🇪 🇨 🇮 🇦 🇱 ", callback_data="style+special"), + InlineKeyboardButton("🅂🅀🅄🄰🅁🄴🅂", callback_data="style+squares"), + InlineKeyboardButton( + "🆂︎🆀︎🆄︎🅰︎🆁︎🅴︎🆂︎", callback_data="style+squares_bold" + ), + ], + [ + InlineKeyboardButton("ꪖꪀᦔꪖꪶꪊᥴ𝓲ꪖ", callback_data="style+andalucia"), + InlineKeyboardButton("爪卂几ᘜ卂", callback_data="style+manga"), + InlineKeyboardButton("S̾t̾i̾n̾k̾y̾", callback_data="style+stinky"), + ], + [ + InlineKeyboardButton( + "B̥ͦu̥ͦb̥ͦb̥ͦl̥ͦe̥ͦs̥ͦ", callback_data="style+bubbles" + ), + InlineKeyboardButton( + "U͟n͟d͟e͟r͟l͟i͟n͟e͟", callback_data="style+underline" + ), + InlineKeyboardButton("꒒ꍏꀷꌩꌃꀎꁅ", callback_data="style+ladybug"), + ], + [ + InlineKeyboardButton("R҉a҉y҉s҉", callback_data="style+rays"), + InlineKeyboardButton("B҈i҈r҈d҈s҈", callback_data="style+birds"), + InlineKeyboardButton("S̸l̸a̸s̸h̸", callback_data="style+slash"), + ], + [ + InlineKeyboardButton("s⃠t⃠o⃠p⃠", callback_data="style+stop"), + InlineKeyboardButton( + "S̺͆k̺͆y̺͆l̺͆i̺͆n̺͆e̺͆", callback_data="style+skyline" + ), + InlineKeyboardButton("A͎r͎r͎o͎w͎s͎", callback_data="style+arrows"), + ], + [ + InlineKeyboardButton("ዪሀክቿነ", callback_data="style+qvnes"), + InlineKeyboardButton("S̶t̶r̶i̶k̶e̶", callback_data="style+strike"), + InlineKeyboardButton("F༙r༙o༙z༙e༙n༙", callback_data="style+frozen"), + ], + [InlineKeyboardButton ("ᴄʟᴏsᴇ", callback_data="close_reply"), InlineKeyboardButton ("ʙᴀᴄᴋ", callback_data="nxt+0")], + ] + await m.answer() + await m.message.edit_reply_markup(InlineKeyboardMarkup(buttons)) + elif m.data == "nxt+0": + await style_buttons(c, m, cb=True) + +@app.on_callback_query(filters.regex("^style")) +async def style(c, m): + await m.answer() + cmd,style = m.data.split('+') + if style == "typewriter": + cls = Fonts.typewriter + if style == "outline": + cls = Fonts.outline + if style == "serif": + cls = Fonts.serief + if style == "bold_cool": + cls = Fonts.bold_cool + if style == "cool": + cls = Fonts.cool + if style == "small_cap": + cls = Fonts.smallcap + if style == "script": + cls = Fonts.script + if style == "script_bolt": + cls = Fonts.bold_script + if style == "tiny": + cls = Fonts.tiny + if style == "comic": + cls = Fonts.comic + if style == "sans": + cls = Fonts.san + if style == "slant_sans": + cls = Fonts.slant_san + if style == "slant": + cls = Fonts.slant + if style == "sim": + cls = Fonts.sim + if style == "circles": + cls = Fonts.circles + if style == "circle_dark": + cls = Fonts.dark_circle + if style == "gothic": + cls = Fonts.gothic + if style == "gothic_bolt": + cls = Fonts.bold_gothic + if style == "cloud": + cls = Fonts.cloud + if style == "happy": + cls = Fonts.happy + if style == "sad": + cls = Fonts.sad + if style == "special": + cls = Fonts.special + if style == "squares": + cls = Fonts.square + if style == "squares_bold": + cls = Fonts.dark_square + if style == "andalucia": + cls = Fonts.andalucia + if style == "manga": + cls = Fonts.manga + if style == "stinky": + cls = Fonts.stinky + if style == "bubbles": + cls = Fonts.bubbles + if style == "underline": + cls = Fonts.underline + if style == "ladybug": + cls = Fonts.ladybug + if style == "rays": + cls = Fonts.rays + if style == "birds": + cls = Fonts.birds + if style == "slash": + cls = Fonts.slash + if style == "stop": + cls = Fonts.stop + if style == "skyline": + cls = Fonts.skyline + if style == "arrows": + cls = Fonts.arrows + if style == "qvnes": + cls = Fonts.rvnes + if style == "strike": + cls = Fonts.strike + if style == "frozen": + cls = Fonts.frozen + new_text = cls(m.message.reply_to_message.text.split(" ",1)[1]) + try: + await m.message.edit_text(new_text, reply_markup=m.message.reply_markup) + except: + pass + + diff --git a/TanuMusic/plugins/tools/left.py b/TanuMusic/plugins/tools/left.py new file mode 100644 index 000000000000..98f9cf16fc5f --- /dev/null +++ b/TanuMusic/plugins/tools/left.py @@ -0,0 +1,108 @@ +from TanuMusic import app +from pyrogram import Client, filters +from pyrogram.errors import RPCError +from pyrogram.types import ChatMemberUpdated, InlineKeyboardMarkup, InlineKeyboardButton +from os import environ +from typing import Union, Optional +from PIL import Image, ImageDraw, ImageFont + +BUTTONS = [ + [ + InlineKeyboardButton(text="ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ", url=f"https://t.me/TanuMusicxBot?startgroup=true"), + ], +] + +# --------------------------------------------------------------------------------- # + +get_font = lambda font_size, font_path: ImageFont.truetype(font_path, font_size) +resize_text = ( + lambda text_size, text: (text[:text_size] + "...").upper() + if len(text) > text_size + else text.upper() +) + +# --------------------------------------------------------------------------------- # + +async def get_userinfo_img( + bg_path: str, + font_path: str, + user_id: Union[int, str], + profile_path: Optional[str] = None +): + bg = Image.open(bg_path) + + if profile_path: + img = Image.open(profile_path) + mask = Image.new("L", img.size, 0) + draw = ImageDraw.Draw(mask) + draw.pieslice([(0, 0), img.size], 0, 360, fill=255) + + circular_img = Image.new("RGBA", img.size, (0, 0, 0, 0)) + circular_img.paste(img, (0, 0), mask) + resized = circular_img.resize((286, 286)) + bg.paste(resized, (297, 117), resized) + + + img_draw = ImageDraw.Draw(bg) + + path = f"./cache/userinfo_img_{user_id}.png" + bg.save(path) + return path + + +# --------------------------------------------------------------------------------- # + +bg_path = "TanuMusic/assets/left.jpg" +font_path = "TanuMusic/assets/font4.ttf" + +# --------------------------------------------------------------------------------- # + + +@app.on_chat_member_updated(filters.group, group=20) +async def member_has_left(client: app, member: ChatMemberUpdated): + + if ( + not member.new_chat_member + and member.old_chat_member.status not in { + "💌" + } + and member.old_chat_member + ): + pass + else: + return + + user = ( + member.old_chat_member.user + if member.old_chat_member + else member.from_user + ) + + # Check if the user has a profile photo + if user.photo and user.photo.big_file_id: + try: + # Add the photo path, caption, and button details + photo = await app.download_media(user.photo.big_file_id) + + welcome_photo = await get_userinfo_img( + bg_path=bg_path, + font_path=font_path, + user_id=user.id, + profile_path=photo, + ) + + caption = f"ㅤㅤ ㅤ•●◉✿ ᴜsᴇʀ ʟᴇғᴛ ✿◉●•\n▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰\n\n❖ ᴀ ᴍᴇᴍʙᴇʀ ʟᴇғᴛ ғʀᴏᴍ ɢʀᴏᴜᴘ.\n\n● ɢʀᴏᴜᴘ ➥ {member.chat.title}\n● ᴜsᴇʀ ɴᴀᴍᴇ ➥ {user.mention}\n● sᴇᴇ ʏᴏᴜ sᴏᴏɴ ᴀɢᴀɪɴ, ʙᴀʙʏ.\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙\n▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰" + + # Send the message with the photo, caption, and button + await client.send_photo( + chat_id=member.chat.id, + photo=welcome_photo, + caption=caption, + reply_markup=InlineKeyboardMarkup(BUTTONS),) + except RPCError as e: + print(e) + return + else: + # Handle the case where the user has no profile photo + print(f"❖ User {user.id} has no profile photo.") + diff --git a/TanuMusic/plugins/tools/pypi.py b/TanuMusic/plugins/tools/pypi.py new file mode 100644 index 000000000000..00f041cb026c --- /dev/null +++ b/TanuMusic/plugins/tools/pypi.py @@ -0,0 +1,49 @@ +import requests +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from TanuMusic import app + + +def get_pypi_info(package_name): + try: + api_url = f"https://pypi.org/pypi/{package_name}/json" + response = requests.get(api_url) + if response.status_code == 200: + pypi_info = response.json() + return pypi_info + else: + return None + except Exception as e: + print(f"Error fetching PyPI information: {e}") + return None + + +@app.on_message(filters.command("pypi", prefixes="/")) +async def pypi_info_command(client, message): + try: + package_name = message.command[1] + pypi_info = get_pypi_info(package_name) + + if pypi_info: + info_message = ( + f"❖ ᴅᴇᴀʀ {message.from_user.mention} \n " + f"● ʜᴇʀᴇ ɪs ʏᴏᴜʀ ᴘᴀᴋᴀɢᴇ ᴅᴇᴛᴀɪʟs \n\n " + f"● ᴘᴀᴋᴀɢᴇ ɴᴀᴍᴇ ➥ {pypi_info['info']['name']}\n\n" + f"● ʟᴀᴛᴇsᴛ ᴠᴇʀsɪᴏɴ ➥ {pypi_info['info']['version']}\n\n" + f"● ᴅᴇsᴄʀɪᴘᴛɪᴏɴ ➥ {pypi_info['info']['summary']}\n\n" + f"● ᴘʀᴏᴊᴇᴄᴛ ᴜʀʟ ➥ {pypi_info['info']['project_urls']['Homepage']}" + ) + close_markup = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close")]] + ) + await message.reply_text(info_message, reply_markup=close_markup) + else: + await message.reply_text( + f"ᴘᴀᴄᴋᴀɢᴇ '{package_name}' ɴᴏᴛ ғᴏᴜɴᴅ \n ᴘʟᴇᴀsᴇ ᴅᴏɴᴛ ᴛʀʏ ᴀɢᴀɪɴ ʟᴀᴛᴇʀ." + ) + + except IndexError: + await message.reply_text( + "ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ᴘᴀᴄᴋᴀɢᴇ ɴᴀᴍᴇ ᴀғᴛᴇʀ ᴛʜᴇ /pypi ᴄᴏᴍᴍᴀɴᴅ." + ) \ No newline at end of file diff --git a/TanuMusic/plugins/tools/queue.py b/TanuMusic/plugins/tools/queue.py new file mode 100644 index 000000000000..e3bdff5e4fdb --- /dev/null +++ b/TanuMusic/plugins/tools/queue.py @@ -0,0 +1,269 @@ +import asyncio +import os + +from pyrogram import filters +from pyrogram.errors import FloodWait +from pyrogram.types import CallbackQuery, InputMediaPhoto, Message + +import config +from TanuMusic import app +from TanuMusic.misc import db +from TanuMusic.utils import Bin, get_channeplayCB, seconds_to_min +from TanuMusic.utils.database import get_cmode, is_active_chat, is_music_playing +from TanuMusic.utils.decorators.language import language, languageCB +from TanuMusic.utils.inline import queue_back_markup, queue_markup +from config import BANNED_USERS + +basic = {} + + +def get_image(videoid): + if os.path.isfile(f"cache/{videoid}.png"): + return f"cache/{videoid}.png" + else: + return config.YOUTUBE_IMG_URL + + +def get_duration(playing): + file_path = playing[0]["file"] + if "index_" in file_path or "live_" in file_path: + return "Unknown" + duration_seconds = int(playing[0]["seconds"]) + if duration_seconds == 0: + return "Unknown" + else: + return "Inline" + + +@app.on_message( + filters.command(["queue", "cqueue", "player", "cplayer", "playing", "cplaying"]) + & filters.group + & ~BANNED_USERS +) +@language +async def get_queue(client, message: Message, _): + if message.command[0][0] == "c": + chat_id = await get_cmode(message.chat.id) + if chat_id is None: + return await message.reply_text(_["setting_7"]) + try: + await app.get_chat(chat_id) + except: + return await message.reply_text(_["cplay_4"]) + cplay = True + else: + chat_id = message.chat.id + cplay = False + if not await is_active_chat(chat_id): + return await message.reply_text(_["general_5"]) + got = db.get(chat_id) + if not got: + return await message.reply_text(_["queue_2"]) + file = got[0]["file"] + videoid = got[0]["vidid"] + user = got[0]["by"] + title = (got[0]["title"]).title() + typo = (got[0]["streamtype"]).title() + DUR = get_duration(got) + if "live_" in file: + IMAGE = get_image(videoid) + elif "vid_" in file: + IMAGE = get_image(videoid) + elif "index_" in file: + IMAGE = config.STREAM_IMG_URL + else: + if videoid == "telegram": + IMAGE = ( + config.TELEGRAM_AUDIO_URL + if typo == "Audio" + else config.TELEGRAM_VIDEO_URL + ) + elif videoid == "soundcloud": + IMAGE = config.SOUNCLOUD_IMG_URL + else: + IMAGE = get_image(videoid) + send = _["queue_6"] if DUR == "Unknown" else _["queue_7"] + cap = _["queue_8"].format(app.mention, title, typo, user, send) + upl = ( + queue_markup(_, DUR, "c" if cplay else "g", videoid) + if DUR == "Unknown" + else queue_markup( + _, + DUR, + "c" if cplay else "g", + videoid, + seconds_to_min(got[0]["played"]), + got[0]["dur"], + ) + ) + basic[videoid] = True + mystic = await message.reply_photo(IMAGE, caption=cap, reply_markup=upl) + if DUR != "Unknown": + try: + while db[chat_id][0]["vidid"] == videoid: + await asyncio.sleep(5) + if await is_active_chat(chat_id): + if basic[videoid]: + if await is_music_playing(chat_id): + try: + buttons = queue_markup( + _, + DUR, + "c" if cplay else "g", + videoid, + seconds_to_min(db[chat_id][0]["played"]), + db[chat_id][0]["dur"], + ) + await mystic.edit_reply_markup(reply_markup=buttons) + except FloodWait: + pass + else: + pass + else: + break + else: + break + except: + return + + +@app.on_callback_query(filters.regex("GetTimer") & ~BANNED_USERS) +async def quite_timer(client, CallbackQuery: CallbackQuery): + try: + await CallbackQuery.answer() + except: + pass + + +@app.on_callback_query(filters.regex("GetQueued") & ~BANNED_USERS) +@languageCB +async def queued_tracks(client, CallbackQuery: CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + what, videoid = callback_request.split("|") + try: + chat_id, channel = await get_channeplayCB(_, what, CallbackQuery) + except: + return + if not await is_active_chat(chat_id): + return await CallbackQuery.answer(_["general_5"], show_alert=True) + got = db.get(chat_id) + if not got: + return await CallbackQuery.answer(_["queue_2"], show_alert=True) + if len(got) == 1: + return await CallbackQuery.answer(_["queue_5"], show_alert=True) + await CallbackQuery.answer() + basic[videoid] = False + buttons = queue_back_markup(_, what) + med = InputMediaPhoto( + media="https://telegra.ph//file/6f7d35131f69951c74ee5.jpg", + caption=_["queue_1"], + ) + await CallbackQuery.edit_message_media(media=med) + j = 0 + msg = "" + for x in got: + j += 1 + if j == 1: + msg += f'Streaming :\n\n✨ Title : {x["title"]}\nDuration : {x["dur"]}\nBy : {x["by"]}\n\n' + elif j == 2: + msg += f'Queued :\n\n✨ Title : {x["title"]}\nDuration : {x["dur"]}\nBy : {x["by"]}\n\n' + else: + msg += f'✨ Title : {x["title"]}\nDuration : {x["dur"]}\nBy : {x["by"]}\n\n' + if "Queued" in msg: + if len(msg) < 700: + await asyncio.sleep(1) + return await CallbackQuery.edit_message_text(msg, reply_markup=buttons) + if "✨" in msg: + msg = msg.replace("✨", "") + link = await Bin(msg) + med = InputMediaPhoto(media=link, caption=_["queue_3"].format(link)) + await CallbackQuery.edit_message_media(media=med, reply_markup=buttons) + else: + await asyncio.sleep(1) + return await CallbackQuery.edit_message_text(msg, reply_markup=buttons) + + +@app.on_callback_query(filters.regex("queue_back_timer") & ~BANNED_USERS) +@languageCB +async def queue_back(client, CallbackQuery: CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + cplay = callback_data.split(None, 1)[1] + try: + chat_id, channel = await get_channeplayCB(_, cplay, CallbackQuery) + except: + return + if not await is_active_chat(chat_id): + return await CallbackQuery.answer(_["general_5"], show_alert=True) + got = db.get(chat_id) + if not got: + return await CallbackQuery.answer(_["queue_2"], show_alert=True) + await CallbackQuery.answer(_["set_cb_5"], show_alert=True) + file = got[0]["file"] + videoid = got[0]["vidid"] + user = got[0]["by"] + title = (got[0]["title"]).title() + typo = (got[0]["streamtype"]).title() + DUR = get_duration(got) + if "live_" in file: + IMAGE = get_image(videoid) + elif "vid_" in file: + IMAGE = get_image(videoid) + elif "index_" in file: + IMAGE = config.STREAM_IMG_URL + else: + if videoid == "telegram": + IMAGE = ( + config.TELEGRAM_AUDIO_URL + if typo == "Audio" + else config.TELEGRAM_VIDEO_URL + ) + elif videoid == "soundcloud": + IMAGE = config.SOUNCLOUD_IMG_URL + else: + IMAGE = get_image(videoid) + send = _["queue_6"] if DUR == "Unknown" else _["queue_7"] + cap = _["queue_8"].format(app.mention, title, typo, user, send) + upl = ( + queue_markup(_, DUR, cplay, videoid) + if DUR == "Unknown" + else queue_markup( + _, + DUR, + cplay, + videoid, + seconds_to_min(got[0]["played"]), + got[0]["dur"], + ) + ) + basic[videoid] = True + + med = InputMediaPhoto(media=IMAGE, caption=cap) + mystic = await CallbackQuery.edit_message_media(media=med, reply_markup=upl) + if DUR != "Unknown": + try: + while db[chat_id][0]["vidid"] == videoid: + await asyncio.sleep(5) + if await is_active_chat(chat_id): + if basic[videoid]: + if await is_music_playing(chat_id): + try: + buttons = queue_markup( + _, + DUR, + cplay, + videoid, + seconds_to_min(db[chat_id][0]["played"]), + db[chat_id][0]["dur"], + ) + await mystic.edit_reply_markup(reply_markup=buttons) + except FloodWait: + pass + else: + pass + else: + break + else: + break + except: + return diff --git a/TanuMusic/plugins/tools/quiz.py b/TanuMusic/plugins/tools/quiz.py new file mode 100644 index 000000000000..ecb406d30880 --- /dev/null +++ b/TanuMusic/plugins/tools/quiz.py @@ -0,0 +1,159 @@ +import random +import requests +import asyncio +from pyrogram import filters +from pyrogram.enums import PollType +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup +from TanuMusic import app + +# Track quiz loops and active polls per user +quiz_loops = {} +active_polls = {} # To track active poll messages for each user + +# Function to fetch a quiz question from the API +async def fetch_quiz_question(): + categories = [9, 17, 18, 20, 21, 27] # Quiz categories + url = f"https://opentdb.com/api.php?amount=1&category={random.choice(categories)}&type=multiple" + response = requests.get(url).json() + + question_data = response["results"][0] + question = question_data["question"] + correct_answer = question_data["correct_answer"] + incorrect_answers = question_data["incorrect_answers"] + + all_answers = incorrect_answers + [correct_answer] + random.shuffle(all_answers) + + cid = all_answers.index(correct_answer) + + return question, all_answers, cid + +# Function to send a quiz poll with an open_period for countdown +async def send_quiz_poll(client, chat_id, user_id, interval): + # Fetch quiz question + question, all_answers, cid = await fetch_quiz_question() + + # Delete the previous active poll if it exists + if user_id in active_polls: + try: + await app.delete_messages(chat_id=chat_id, message_ids=active_polls[user_id]) + except Exception as e: + print(f"Failed to delete previous poll: {e}") + + # Send new quiz poll with a countdown using open_period + poll_message = await app.send_poll( + chat_id=chat_id, + question=question, + options=all_answers, + is_anonymous=False, + type=PollType.QUIZ, + #allows_multiple_answers=True, # Allow multiple answers + correct_option_id=cid, + open_period=interval # Countdown timer for the poll in seconds + ) + + # Store the message ID of the new poll + if poll_message: + active_polls[user_id] = poll_message.id # Corrected to use `.id` + +@app.on_message(filters.command(["quiz", "uiz"], prefixes=["/", "!", ".", "Q", "q"])) +async def quiz_info(client, message): + user_id = message.from_user.id + + # Send the informational message + await message.reply_text( + "ᴡᴇʟᴄᴏᴍᴇ ᴛᴏ ᴛʜᴇ ǫᴜɪᴢ ʙᴏᴛ\n\n" + "ʜᴇʀᴇ ɪs ʜᴏᴡ ɪᴛ ᴡᴏʀᴋs:\n" + "𝟷. ᴜsᴇ /quizon ᴛᴏ sᴛᴀʀᴛ ᴀ ǫᴜɪᴢ ʟᴏᴏᴘ. ᴀғᴛᴇʀ ʏᴏᴜ sᴛᴀʀᴛ, ʏᴏᴜ ᴡɪʟʟ ʙᴇ ᴀsᴋᴇᴅ ᴛᴏ ᴄʜᴏᴏsᴇ ᴀ ᴛɪᴍᴇ ɪɴᴛᴇʀᴠᴀʟ ғᴏʀ ᴛʜᴇ ǫᴜɪᴢ.\n" + "𝟸. ᴛʜᴇ ᴀᴠᴀɪʟᴀʙʟᴇ ɪɴᴛᴇʀᴠᴀʟs ᴀʀᴇ:\n" + " - 30 sᴇᴄᴏɴᴅs\n" + " - 1 ᴍɪɴᴜᴛᴇ\n" + " - 5 ᴍɪɴᴜᴛᴇs\n" + " - 10 ᴍɪɴᴜᴛᴇs\n" + "𝟹. ᴏɴᴄᴇ ʏᴏᴜ ᴄʜᴏᴏsᴇ ᴀɴ ɪɴᴛᴇʀᴠᴀʟ, ᴛʜᴇ ǫᴜɪᴢ ᴡɪʟʟ sᴛᴀʀᴛ, ᴀɴᴅ ʏᴏᴜ ᴡɪʟʟ ɢᴇᴛ ᴀ ɴᴇᴡ ǫᴜᴇsᴛɪᴏɴ ᴀᴛ ᴛʜᴇ ᴄʜᴏsᴇɴ ɪɴᴛᴇʀᴠᴀʟ. ᴇᴀᴄʜ ǫᴜɪᴢ ᴡɪʟʟ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴄʟᴏsᴇ ᴀғᴛᴇʀ ᴀ sᴘᴇᴄɪғɪᴄ ᴛɪᴍᴇ.\n" + "𝟺. ᴜsᴇ /quizoff ᴛᴏ sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ ᴀᴛ ᴀɴʏ ᴛɪᴍᴇ.\n\n" + "ᴄᴏᴍᴍᴀɴᴅs:\n" + "• /quizon - sᴛᴀʀᴛ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ\n" + "• /quizoff - sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ\n\n" + "sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ 🎉" + ) + +# /quiz on command to show time interval options +@app.on_message(filters.command(["quizon", "uizon"], prefixes=["/", "!", ".", "Q", "q"])) +async def quiz_on(client, message): + user_id = message.from_user.id + + # Create time interval buttons arranged in 4x2 grid + keyboard = InlineKeyboardMarkup( + [ + [InlineKeyboardButton("30s", callback_data="30_sec"), InlineKeyboardButton("1min", callback_data="1_min")], + [InlineKeyboardButton("5min", callback_data="5_min"), InlineKeyboardButton("10min", callback_data="10_min")], + ] + ) + + # Send buttons with a description + await message.reply_text( + "ᴄʜᴏᴏsᴇ ʜᴏᴡ ᴏғᴛᴇɴ ʏᴏᴜ ᴡᴀɴᴛ ᴛʜᴇ ǫᴜɪᴢ ᴛᴏ ʀᴜɴ:\n\n" + "- 30s: ǫᴜɪᴢ ᴇᴠᴇʀʏ 30 sᴇᴄᴏɴᴅs\n" + "- 1min: ǫᴜɪᴢ ᴇᴠᴇʀʏ 1 ᴍɪɴᴜᴛᴇ\n" + "- 5min: ǫᴜɪᴢ ᴇᴠᴇʀʏ 5 ᴍɪɴᴜᴛᴇs\n" + "- 10min: ǫᴜɪᴢ ᴇᴠᴇʀʏ 10 ᴍɪɴᴜᴛᴇs\n\n" + "ᴜsᴇ /quizoff sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ ᴀᴛ ᴀɴʏ ᴛɪᴍᴇ.", + reply_markup=keyboard + ) + +# Handle button presses for time intervals +@app.on_callback_query(filters.regex(r"^\d+_sec$|^\d+_min$")) +async def start_quiz_loop(client, callback_query): + user_id = callback_query.from_user.id + chat_id = callback_query.message.chat.id + + if user_id in quiz_loops: + await callback_query.answer("ǫᴜɪᴢ ʟᴏᴏᴘ ɪs ᴀʟʀᴇᴀᴅʏ ʀᴜɴɴɪɴɢ...!!", show_alert=True) + return + + # Determine interval based on the button pressed + if callback_query.data == "30_sec": + interval = 30 + interval_text = "30 sᴇᴄᴏɴᴅs" + elif callback_query.data == "1_min": + interval = 60 + interval_text = "1 ᴍɪɴᴜᴛᴇ" + elif callback_query.data == "5_min": + interval = 300 + interval_text = "5 ᴍɪɴᴜᴛᴇs" + elif callback_query.data == "10_min": + interval = 600 + interval_text = "10 ᴍɪɴᴜᴛᴇs" + + # Delete the original message with buttons + await callback_query.message.delete() + + # Confirm that the quiz loop has started + await callback_query.message.reply_text(f"✅ ǫᴜɪᴢ ʟᴏᴏᴘ sᴛᴀʀᴛᴇᴅ! ʏᴏᴜ'ʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ǫᴜɪᴢ ᴇᴠᴇʀʏ {interval_text}.") + + quiz_loops[user_id] = True # Mark loop as running + + # Start the quiz loop with the selected interval + while quiz_loops.get(user_id, False): + await send_quiz_poll(client, chat_id, user_id, interval) + await asyncio.sleep(interval) # Wait for the selected interval before sending the next quiz + +# /quiz off command to stop the quiz loop +@app.on_message(filters.command(["quizoff", "uizoff"], prefixes=["/", "!", ".", "Q", "q"])) +async def stop_quiz(client, message): + user_id = message.from_user.id + + if user_id not in quiz_loops: + await message.reply_text("ɴᴏ ǫᴜɪᴢ ʟᴏᴏᴘ ɪs ʀᴜɴɴɪɴɢ.") + else: + quiz_loops.pop(user_id) # Stop the loop + await message.reply_text("ǫᴜɪᴢ ʟᴏᴏᴘ sᴛᴏᴘᴘᴇᴅ...!!") + + # Delete the active poll if there's one + if user_id in active_polls: + try: + await app.delete_messages(chat_id=message.chat.id, message_ids=active_polls[user_id]) + active_polls.pop(user_id) + except Exception as e: + print(f"Failed to delete active poll: {e}") \ No newline at end of file diff --git a/TanuMusic/plugins/tools/quoto.py b/TanuMusic/plugins/tools/quoto.py new file mode 100644 index 000000000000..c3c5904cb140 --- /dev/null +++ b/TanuMusic/plugins/tools/quoto.py @@ -0,0 +1,290 @@ +from io import BytesIO +from pyrogram import Client, filters +from pyrogram.types import Message +from TanuMusic import app +from httpx import AsyncClient, Timeout + + +# ----------------------------------------------------------------- +fetch = AsyncClient( + http2=True, + verify=False, + headers={ + "Accept-Language": "id-ID", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edge/107.0.1418.42", + }, + timeout=Timeout(20), +) +# ------------------------------------------------------------------------ +class QuotlyException(Exception): + pass +# -------------------------------------------------------------------------- +async def get_message_sender_id(ctx: Message): + if ctx.forward_date: + if ctx.forward_sender_name: + return 1 + elif ctx.forward_from: + return ctx.forward_from.id + elif ctx.forward_from_chat: + return ctx.forward_from_chat.id + else: + return 1 + elif ctx.from_user: + return ctx.from_user.id + elif ctx.sender_chat: + return ctx.sender_chat.id + else: + return 1 +# ----------------------------------------------------------------------------------------- +async def get_message_sender_name(ctx: Message): + if ctx.forward_date: + if ctx.forward_sender_name: + return ctx.forward_sender_name + elif ctx.forward_from: + return ( + f"{ctx.forward_from.first_name} {ctx.forward_from.last_name}" + if ctx.forward_from.last_name + else ctx.forward_from.first_name + ) +# --------------------------------------------------------------------------------------------------- + elif ctx.forward_from_chat: + return ctx.forward_from_chat.title + else: + return "" + elif ctx.from_user: + if ctx.from_user.last_name: + return f"{ctx.from_user.first_name} {ctx.from_user.last_name}" + else: + return ctx.from_user.first_name + elif ctx.sender_chat: + return ctx.sender_chat.title + else: + return "" +# --------------------------------------------------------------------------------------------------- +async def get_custom_emoji(ctx: Message): + if ctx.forward_date: + return ( + "" + if ctx.forward_sender_name + or not ctx.forward_from + and ctx.forward_from_chat + or not ctx.forward_from + else ctx.forward_from.emoji_status.custom_emoji_id + ) + + return ctx.from_user.emoji_status.custom_emoji_id if ctx.from_user else "" + +# --------------------------------------------------------------------------------------------------- +async def get_message_sender_username(ctx: Message): + if ctx.forward_date: + if ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + and ctx.forward_from_chat.username + ): + return ctx.forward_from_chat.username + elif ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + or ctx.forward_sender_name + or not ctx.forward_from + ): + return "" + else: + return ctx.forward_from.username or "" + elif ctx.from_user and ctx.from_user.username: + return ctx.from_user.username + elif ( + ctx.from_user + or ctx.sender_chat + and not ctx.sender_chat.username + or not ctx.sender_chat + ): + return "" + else: + return ctx.sender_chat.username +# ------------------------------------------------------------------------ +async def get_message_sender_photo(ctx: Message): + if ctx.forward_date: + if ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + and ctx.forward_from_chat.photo + ): + return { + "small_file_id": ctx.forward_from_chat.photo.small_file_id, + "small_photo_unique_id": ctx.forward_from_chat.photo.small_photo_unique_id, + "big_file_id": ctx.forward_from_chat.photo.big_file_id, + "big_photo_unique_id": ctx.forward_from_chat.photo.big_photo_unique_id, + } + elif ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + or ctx.forward_sender_name + or not ctx.forward_from + ): + return "" + else: + return ( + { + "small_file_id": ctx.forward_from.photo.small_file_id, + "small_photo_unique_id": ctx.forward_from.photo.small_photo_unique_id, + "big_file_id": ctx.forward_from.photo.big_file_id, + "big_photo_unique_id": ctx.forward_from.photo.big_photo_unique_id, + } + if ctx.forward_from.photo + else "" + ) +# --------------------------------------------------------------------------------- + elif ctx.from_user and ctx.from_user.photo: + return { + "small_file_id": ctx.from_user.photo.small_file_id, + "small_photo_unique_id": ctx.from_user.photo.small_photo_unique_id, + "big_file_id": ctx.from_user.photo.big_file_id, + "big_photo_unique_id": ctx.from_user.photo.big_photo_unique_id, + } + elif ( + ctx.from_user + or ctx.sender_chat + and not ctx.sender_chat.photo + or not ctx.sender_chat + ): + return "" + else: + return { + "small_file_id": ctx.sender_chat.photo.small_file_id, + "small_photo_unique_id": ctx.sender_chat.photo.small_photo_unique_id, + "big_file_id": ctx.sender_chat.photo.big_file_id, + "big_photo_unique_id": ctx.sender_chat.photo.big_photo_unique_id, + } +# --------------------------------------------------------------------------------------------------- +async def get_text_or_caption(ctx: Message): + if ctx.text: + return ctx.text + elif ctx.caption: + return ctx.caption + else: + return "" +# --------------------------------------------------------------------------------------------------- +async def pyrogram_to_quotly(messages, is_reply): + if not isinstance(messages, list): + messages = [messages] + payload = { + "type": "quote", + "format": "png", + "backgroundColor": "#1b1429", + "messages": [], + } +# ------------------------------------------------------------------------------------------------------------ + for message in messages: + the_message_dict_to_append = {} + if message.entities: + the_message_dict_to_append["entities"] = [ + { + "type": entity.type.name.lower(), + "offset": entity.offset, + "length": entity.length, + } + for entity in message.entities + ] + elif message.caption_entities: + the_message_dict_to_append["entities"] = [ + { + "type": entity.type.name.lower(), + "offset": entity.offset, + "length": entity.length, + } + for entity in message.caption_entities + ] + else: + the_message_dict_to_append["entities"] = [] + the_message_dict_to_append["chatId"] = await get_message_sender_id(message) + the_message_dict_to_append["text"] = await get_text_or_caption(message) + the_message_dict_to_append["avatar"] = True + the_message_dict_to_append["from"] = {} + the_message_dict_to_append["from"]["id"] = await get_message_sender_id(message) + the_message_dict_to_append["from"]["name"] = await get_message_sender_name( + message + ) + the_message_dict_to_append["from"][ + "username" + ] = await get_message_sender_username(message) + the_message_dict_to_append["from"]["type"] = message.chat.type.name.lower() + the_message_dict_to_append["from"]["photo"] = await get_message_sender_photo( + message + ) + if message.reply_to_message and is_reply: + the_message_dict_to_append["replyMessage"] = { + "name": await get_message_sender_name(message.reply_to_message), + "text": await get_text_or_caption(message.reply_to_message), + "chatId": await get_message_sender_id(message.reply_to_message), + } + else: + the_message_dict_to_append["replyMessage"] = {} + payload["messages"].append(the_message_dict_to_append) + r = await fetch.post("https://bot.lyo.su/quote/generate.png", json=payload) + if not r.is_error: + return r.read() + else: + raise QuotlyException(r.json()) +# ------------------------------------------------------------------------------------------ + +def isArgInt(txt) -> list: + count = txt + try: + count = int(count) + return [True, count] + except ValueError: + return [False, 0] + +# --------------------------------------------------------------------------------------------------- +@app.on_message(filters.command(["q", "r"]) & filters.reply) +async def msg_quotly_cmd(self: app, ctx: Message): + is_reply = False + if ctx.command[0].endswith("r"): + is_reply = True + if len(ctx.text.split()) > 1: + check_arg = isArgInt(ctx.command[1]) + if check_arg[0]: + if check_arg[1] < 2 or check_arg[1] > 10: + return await ctx.reply_msg("Invalid range", del_in=6) + try: + messages = [ + i + for i in await self.get_messages( + chat_id=ctx.chat.id, + message_ids=range( + ctx.reply_to_message.id, + ctx.reply_to_message.id + (check_arg[1] + 5), + ), + replies=-1, + ) + if not i.empty and not i.media + ] + except Exception: + return await ctx.reply_text("🤷🏻‍♂️") + try: + make_quotly = await pyrogram_to_quotly(messages, is_reply=is_reply) + bio_sticker = BytesIO(make_quotly) + bio_sticker.name = "misskatyquote_sticker.webp" + return await ctx.reply_sticker(bio_sticker) + except Exception: + return await ctx.reply_msg("🤷🏻‍♂️") + try: + messages_one = await self.get_messages( + chat_id=ctx.chat.id, message_ids=ctx.reply_to_message.id, replies=-1 + ) + messages = [messages_one] + except Exception: + return await ctx.reply_msg("🤷🏻‍♂️") + try: + make_quotly = await pyrogram_to_quotly(messages, is_reply=is_reply) + bio_sticker = BytesIO(make_quotly) + bio_sticker.name = "misskatyquote_sticker.webp" + return await ctx.reply_sticker(bio_sticker) + except Exception as e: + return await ctx.reply_msg(f"ERROR: {e}") \ No newline at end of file diff --git a/TanuMusic/plugins/tools/reload.py b/TanuMusic/plugins/tools/reload.py new file mode 100644 index 000000000000..560586bba828 --- /dev/null +++ b/TanuMusic/plugins/tools/reload.py @@ -0,0 +1,125 @@ +import asyncio +import time + +from pyrogram import filters +from pyrogram.enums import ChatMembersFilter +from pyrogram.types import CallbackQuery, Message + +from TanuMusic import app +from TanuMusic.core.call import Tanu +from TanuMusic.misc import db +from TanuMusic.utils.database import get_assistant, get_authuser_names, get_cmode +from TanuMusic.utils.decorators import ActualAdminCB, AdminActual, language +from TanuMusic.utils.formatters import alpha_to_int, get_readable_time +from config import BANNED_USERS, adminlist, lyrical + +rel = {} + + +@app.on_message( + filters.command(["admincache", "reload", "refresh"]) & filters.group & ~BANNED_USERS +) +@language +async def reload_admin_cache(client, message: Message, _): + try: + if message.chat.id not in rel: + rel[message.chat.id] = {} + else: + saved = rel[message.chat.id] + if saved > time.time(): + left = get_readable_time((int(saved) - int(time.time()))) + return await message.reply_text(_["reload_1"].format(left)) + adminlist[message.chat.id] = [] + async for user in app.get_chat_members( + message.chat.id, filter=ChatMembersFilter.ADMINISTRATORS + ): + if user.privileges.can_manage_video_chats: + adminlist[message.chat.id].append(user.user.id) + authusers = await get_authuser_names(message.chat.id) + for user in authusers: + user_id = await alpha_to_int(user) + adminlist[message.chat.id].append(user_id) + now = int(time.time()) + 180 + rel[message.chat.id] = now + await message.reply_text(_["reload_2"]) + except: + await message.reply_text(_["reload_3"]) + + +@app.on_message(filters.command(["reboot"]) & filters.group & ~BANNED_USERS) +@AdminActual +async def restartbot(client, message: Message, _): + mystic = await message.reply_text(_["reload_4"].format(app.mention)) + await asyncio.sleep(1) + try: + db[message.chat.id] = [] + await Tanu.stop_stream_force(message.chat.id) + except: + pass + userbot = await get_assistant(message.chat.id) + try: + if message.chat.username: + await userbot.resolve_peer(message.chat.username) + else: + await userbot.resolve_peer(message.chat.id) + except: + pass + chat_id = await get_cmode(message.chat.id) + if chat_id: + try: + got = await app.get_chat(chat_id) + except: + pass + userbot = await get_assistant(chat_id) + try: + if got.username: + await userbot.resolve_peer(got.username) + else: + await userbot.resolve_peer(chat_id) + except: + pass + try: + db[chat_id] = [] + await Tanu.stop_stream_force(chat_id) + except: + pass + return await mystic.edit_text(_["reload_5"].format(app.mention)) + + +@app.on_callback_query(filters.regex("close") & ~BANNED_USERS) +async def close_menu(_, query: CallbackQuery): + try: + await query.answer() + await query.message.delete() + umm = await query.message.reply_text( + f"⬤ ᴄʟᴏsᴇᴅ ʙʏ ➥ {query.from_user.mention}" + ) + await asyncio.sleep(7) + await umm.delete() + except: + pass + + +@app.on_callback_query(filters.regex("stop_downloading") & ~BANNED_USERS) +@ActualAdminCB +async def stop_download(client, CallbackQuery: CallbackQuery, _): + message_id = CallbackQuery.message.id + task = lyrical.get(message_id) + if not task: + return await CallbackQuery.answer(_["tg_4"], show_alert=True) + if task.done() or task.cancelled(): + return await CallbackQuery.answer(_["tg_5"], show_alert=True) + if not task.done(): + try: + task.cancel() + try: + lyrical.pop(message_id) + except: + pass + await CallbackQuery.answer(_["tg_6"], show_alert=True) + return await CallbackQuery.edit_message_text( + _["tg_7"].format(CallbackQuery.from_user.mention) + ) + except: + return await CallbackQuery.answer(_["tg_8"], show_alert=True) + await CallbackQuery.answer(_["tg_9"], show_alert=True) diff --git a/TanuMusic/plugins/tools/sangmata.py# b/TanuMusic/plugins/tools/sangmata.py# new file mode 100644 index 000000000000..5e3003cba1c1 --- /dev/null +++ b/TanuMusic/plugins/tools/sangmata.py# @@ -0,0 +1,54 @@ +import asyncio +import random + +from pyrogram import Client, filters +from pyrogram.types import Message +from pyrogram.raw.functions.messages import DeleteHistory + +from TanuMusic import userbot as us, app +from TanuMusic.core.userbot import assistants + + +@app.on_message(filters.command("sg")) +async def sg(client: Client, message: Message): + if len(message.text.split()) < 1 and not message.reply_to_message: + return await message.reply("sg username/id/reply") + if message.reply_to_message: + args = message.reply_to_message.from_user.id + else: + args = message.text.split()[1] + lol = await message.reply("🧨") + if args: + try: + user = await client.get_users(f"{args}") + except Exception: + return await lol.edit("✦ Please specify a valid user!") + bo = ["sangmata_bot", "sangmata_beta_bot"] + sg = random.choice(bo) + if 1 in assistants: + ubot = us.one + + try: + a = await ubot.send_message(sg, f"{user.id}") + await a.delete() + except Exception as e: + return await lol.edit(e) + await asyncio.sleep(1) + + async for stalk in ubot.search_messages(a.chat.id): + if stalk.text == None: + continue + if not stalk: + await message.reply("botnya ngambek") + elif stalk: + await message.reply(f"{stalk.text}") + break # Exit the loop after displaying one message + + try: + user_info = await ubot.resolve_peer(sg) + await ubot.send(DeleteHistory(peer=user_info, max_id=0, revoke=True)) + except Exception: + pass + + await lol.delete() + diff --git a/TanuMusic/plugins/tools/song.py b/TanuMusic/plugins/tools/song.py new file mode 100644 index 000000000000..8e81497fa169 --- /dev/null +++ b/TanuMusic/plugins/tools/song.py @@ -0,0 +1,38 @@ +import os +import requests +from pyrogram import Client, filters +from TanuMusic import app + +def fetch_song(song_name): + url = f"https://song-teleservice.vercel.app/song?songName={song_name.replace(' ', '%20')}" + try: + response = requests.get(url) + return response.json() if response.status_code == 200 and "downloadLink" in response.json() else None + except Exception as e: + print(f"API Error: {e}") + return None + +@app.on_message(filters.command("song")) +async def handle_song(client, message): + song_name = message.text.split(" ", 1)[1] if len(message.text.split(" ", 1)) > 1 else None + if not song_name: + return await message.reply("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ sᴏɴɢ ɴᴀᴍᴇ ᴀғᴛᴇʀ ᴛʜᴇ /song ᴄᴏᴍᴍᴀɴᴅ..") + + song_info = fetch_song(song_name) + if not song_info: + return await message.reply(f"sᴏʀʀʏ, ɪ ᴄᴏᴜʟᴅɴ'ᴛ ғɪɴᴅ ᴛʜᴇ sᴏɴɢ '{song_name}'.") + + filename = f"{song_info['trackName']}.mp3" + download_url = song_info['downloadLink'] + + # Download and save the file + with requests.get(download_url, stream=True) as r, open(filename, "wb") as file: + for chunk in r.iter_content(1024): + if chunk: + file.write(chunk) + + caption = (f"""❖ sᴏɴɢ ɴᴀᴍᴇ ➥ {song_info['trackName']}\n\n● ᴀʟʙᴜᴍ ➥ {song_info['album']}\n ● ʀᴇʟᴇᴀsᴇ ᴅᴀᴛᴇ ➥ {song_info['releaseDate']}\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {message.from_user.mention}\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™""") + + # Send audio and clean up + await message.reply_audio(audio=open(filename, "rb"), caption=caption) + os.remove(filename) \ No newline at end of file diff --git a/TanuMusic/plugins/tools/speedtest.py b/TanuMusic/plugins/tools/speedtest.py new file mode 100644 index 000000000000..57b8d1506ff2 --- /dev/null +++ b/TanuMusic/plugins/tools/speedtest.py @@ -0,0 +1,45 @@ +import asyncio + +import speedtest +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.decorators.language import language + + +def testspeed(m, _): + try: + test = speedtest.Speedtest() + test.get_best_server() + m = m.edit_text(_["server_12"]) + test.download() + m = m.edit_text(_["server_13"]) + test.upload() + test.results.share() + result = test.results.dict() + m = m.edit_text(_["server_14"]) + except Exception as e: + return m.edit_text(f"{e}") + return result + + +@app.on_message(filters.command(["speedtest", "spt"]) & SUDOERS) +@language +async def speedtest_function(client, message: Message, _): + m = await message.reply_text(_["server_11"]) + loop = asyncio.get_event_loop() + result = await loop.run_in_executor(None, testspeed, m, _) + output = _["server_15"].format( + result["client"]["isp"], + result["client"]["country"], + result["server"]["name"], + result["server"]["country"], + result["server"]["cc"], + result["server"]["sponsor"], + result["server"]["latency"], + result["ping"], + ) + msg = await message.reply_photo(photo=result["share"], caption=output) + await m.delete() diff --git a/TanuMusic/plugins/tools/stats.py b/TanuMusic/plugins/tools/stats.py new file mode 100644 index 000000000000..181d10d7de7c --- /dev/null +++ b/TanuMusic/plugins/tools/stats.py @@ -0,0 +1,135 @@ +import platform +from sys import version as pyver + +import psutil +from pyrogram import __version__ as pyrover +from pyrogram import filters +from pyrogram.errors import MessageIdInvalid +from pyrogram.types import InputMediaPhoto, Message +from pytgcalls.__version__ import __version__ as pytgver + +import config +from TanuMusic import app +from TanuMusic.core.userbot import assistants +from TanuMusic.misc import SUDOERS, mongodb +from TanuMusic.plugins import ALL_MODULES +from TanuMusic.utils.database import get_served_chats, get_served_users, get_sudoers +from TanuMusic.utils.decorators.language import language, languageCB +from TanuMusic.utils.inline.stats import back_stats_buttons, stats_buttons +from config import BANNED_USERS + + +@app.on_message(filters.command(["stats", "gstats"]) & filters.group & ~BANNED_USERS) +@language +async def stats_global(client, message: Message, _): + upl = stats_buttons(_, True if message.from_user.id in SUDOERS else False) + await message.reply_photo( + photo=config.STATS_IMG_URL, + caption=_["gstats_2"].format(app.mention), + reply_markup=upl, + ) + + +@app.on_callback_query(filters.regex("stats_back") & ~BANNED_USERS) +@languageCB +async def home_stats(client, CallbackQuery, _): + upl = stats_buttons(_, True if CallbackQuery.from_user.id in SUDOERS else False) + await CallbackQuery.edit_message_text( + text=_["gstats_2"].format(app.mention), + reply_markup=upl, + ) + + +@app.on_callback_query(filters.regex("TopOverall") & ~BANNED_USERS) +@languageCB +async def overall_stats(client, CallbackQuery, _): + await CallbackQuery.answer() + upl = back_stats_buttons(_) + try: + await CallbackQuery.answer() + except: + pass + await CallbackQuery.edit_message_text(_["gstats_1"].format(app.mention)) + served_chats = len(await get_served_chats()) + served_users = len(await get_served_users()) + text = _["gstats_3"].format( + app.mention, + len(assistants), + len(BANNED_USERS), + served_chats, + served_users, + len(ALL_MODULES), + len(SUDOERS), + config.AUTO_LEAVING_ASSISTANT, + config.DURATION_LIMIT_MIN, + ) + med = InputMediaPhoto(media=config.STATS_IMG_URL, caption=text) + try: + await CallbackQuery.edit_message_media(media=med, reply_markup=upl) + except MessageIdInvalid: + await CallbackQuery.message.reply_photo( + photo=config.STATS_IMG_URL, caption=text, reply_markup=upl + ) + + +@app.on_callback_query(filters.regex("bot_stats_sudo")) +@languageCB +async def bot_stats(client, CallbackQuery, _): + if CallbackQuery.from_user.id not in SUDOERS: + return await CallbackQuery.answer(_["gstats_4"], show_alert=True) + upl = back_stats_buttons(_) + try: + await CallbackQuery.answer() + except: + pass + await CallbackQuery.edit_message_text(_["gstats_1"].format(app.mention)) + p_core = psutil.cpu_count(logical=False) + t_core = psutil.cpu_count(logical=True) + ram = str(round(psutil.virtual_memory().total / (1024.0**3))) + " ɢʙ" + try: + cpu_freq = psutil.cpu_freq().current + if cpu_freq >= 1000: + cpu_freq = f"{round(cpu_freq / 1000, 2)}ɢʜᴢ" + else: + cpu_freq = f"{round(cpu_freq, 2)}ᴍʜᴢ" + except: + cpu_freq = "ғᴀɪʟᴇᴅ ᴛᴏ ғᴇᴛᴄʜ" + hdd = psutil.disk_usage("/") + total = hdd.total / (1024.0**3) + used = hdd.used / (1024.0**3) + free = hdd.free / (1024.0**3) + call = await mongodb.command("dbstats") + datasize = call["dataSize"] / 1024 + storage = call["storageSize"] / 1024 + served_chats = len(await get_served_chats()) + served_users = len(await get_served_users()) + text = _["gstats_5"].format( + app.mention, + len(ALL_MODULES), + platform.system(), + ram, + p_core, + t_core, + cpu_freq, + pyver.split()[0], + pyrover, + pytgver, + str(total)[:4], + str(used)[:4], + str(free)[:4], + served_chats, + served_users, + len(BANNED_USERS), + len(await get_sudoers()), + str(datasize)[:6], + storage, + call["collections"], + call["objects"], + ) + med = InputMediaPhoto(media=config.STATS_IMG_URL, caption=text) + try: + await CallbackQuery.edit_message_media(media=med, reply_markup=upl) + except MessageIdInvalid: + await CallbackQuery.message.reply_photo( + photo=config.STATS_IMG_URL, caption=text, reply_markup=upl + ) diff --git a/TanuMusic/plugins/tools/stickers.py b/TanuMusic/plugins/tools/stickers.py new file mode 100644 index 000000000000..98740e5df48c --- /dev/null +++ b/TanuMusic/plugins/tools/stickers.py @@ -0,0 +1,90 @@ +import base64 +import httpx +import os +from pyrogram import filters +from config import BOT_USERNAME +from TanuMusic import app +from pyrogram import filters +import pyrogram +from uuid import uuid4 +from pyrogram.types import InlineKeyboardButton,InlineKeyboardMarkup + + +EVAA = [ + [ + InlineKeyboardButton(text="ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ", url=f"https://t.me/TanuMusicxBot?startgroup=true"), + ], +] + +######### sticker id + +@app.on_message(filters.command("packkang")) +async def _packkang(app :app,message): + txt = await message.reply_text("✦ ᴘʀᴏᴄᴇssɪɴɢ.... ") + if not message.reply_to_message: + await txt.edit('ʀᴇᴘʟʏ ᴛᴏ ᴍᴇssᴀɢᴇ') + return + if not message.reply_to_message.sticker: + await txt.edit('ʀᴇᴘʟʏ ᴛᴏ sᴛɪᴄᴋᴇʀ') + return + if message.reply_to_message.sticker.is_animated or message.reply_to_message.sticker.is_video: + return await txt.edit("ʀᴇᴘʟʏ ᴛᴏ ᴀ ɴᴏɴ-ᴀɴɪᴍᴀᴛᴇᴅ sᴛɪᴄᴋᴇʀ") + if len(message.command) < 2: + pack_name = f'{message.from_user.first_name}_sticker_pack_by_@TanuMusicxBot' + else : + pack_name = message.text.split(maxsplit=1)[1] + short_name = message.reply_to_message.sticker.set_name + stickers = await app.invoke( + pyrogram.raw.functions.messages.GetStickerSet( + stickerset=pyrogram.raw.types.InputStickerSetShortName( + short_name=short_name), + hash=0)) + shits = stickers.documents + sticks = [] + + for i in shits: + sex = pyrogram.raw.types.InputDocument( + id=i.id, + access_hash=i.access_hash, + file_reference=i.thumbs[0].bytes + ) + + sticks.append( + pyrogram.raw.types.InputStickerSetItem( + document=sex, + emoji=i.attributes[1].alt + ) + ) + + try: + short_name = f'stikcer_pack_{str(uuid4()).replace("-","")}_by_{app.me.username}' + user_id = await app.resolve_peer(message.from_user.id) + await app.invoke( + pyrogram.raw.functions.stickers.CreateStickerSet( + user_id=user_id, + title=pack_name, + short_name=short_name, + stickers=sticks, + ) + ) + await txt.edit(f"❖ ʜᴇʀᴇ ɪs ʏᴏᴜʀ ᴋᴀɴɢᴇᴅ ʟɪɴᴋ !\n● ᴛᴏᴛᴀʟ sᴛɪᴄᴋᴇʀ ➥ {len(sticks)}",reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("ᴘᴀᴄᴋ ʟɪɴᴋ",url=f"http://t.me/addstickers/{short_name}")]])) + except Exception as e: + await message.reply(str(e)) + + +###### sticker id = +@app.on_message(filters.command(["stickerid","stid"])) +async def sticker_id(app: app, msg): + if not msg.reply_to_message: + await msg.reply_text("✦ Reply to a sticker") + elif not msg.reply_to_message.sticker: + await msg.reply_text("✦ Reply to a sticker") + st_in = msg.reply_to_message.sticker + await msg.reply_text(f""" +❖ sᴛɪᴄᴋᴇʀ ɪɴғᴏ ❖ + +● sᴛɪᴄᴋᴇʀ ɪᴅ ➥ {st_in.file_id}\n +● sᴛɪᴄᴋᴇʀ ᴜɴɪǫᴜᴇ ɪᴅ ➥ {st_in.file_unique_id}""", reply_markup=InlineKeyboardMarkup(EVAA),) + + +##### diff --git a/TanuMusic/plugins/tools/translate.py b/TanuMusic/plugins/tools/translate.py new file mode 100644 index 000000000000..a4db1ecef080 --- /dev/null +++ b/TanuMusic/plugins/tools/translate.py @@ -0,0 +1,21 @@ +from TanuMusic import app +from pyrogram import filters +from deep_translator import GoogleTranslator + +@app.on_message(filters.command("tr")) +async def translate(client, message): + if message.reply_to_message: + text_to_translate = message.reply_to_message.text + target_language = message.text.split(None, 1)[1] if len(message.text.split()) > 1 else 'en' + else: + if len(message.text.split()) < 3: + await message.reply_text("You can use this command by replying to a message.") + return + target_language = message.text.split(None, 2)[1] + text_to_translate = message.text.split(None, 2)[2] + + try: + translated = GoogleTranslator(source='auto', target=target_language).translate(text_to_translate) + await message.reply_text(f"ᴛʀᴀɴsʟᴀᴛᴇᴅ ғʀᴏᴍ {target_language}\n\n {translated}") + except Exception as e: + await message.reply_text(f"An error occurred during translation: {str(e)}") \ No newline at end of file diff --git a/TanuMusic/plugins/tools/welcome.py b/TanuMusic/plugins/tools/welcome.py new file mode 100644 index 000000000000..e4b86e0f5d2f --- /dev/null +++ b/TanuMusic/plugins/tools/welcome.py @@ -0,0 +1,149 @@ +import os +from unidecode import unidecode +from PIL import ImageDraw, Image, ImageFont, ImageChops +from pyrogram import * +from pyrogram.types import * +from logging import getLogger +from TanuMusic import LOGGER +from pyrogram.types import Message +from TanuMusic.misc import SUDOERS +from TanuMusic import app +from TanuMusic.utils.database import * +from config import LOGGER_ID + +LOGGER = getLogger(__name__) + + +class temp: + ME = None + CURRENT = 2 + CANCEL = False + MELCOW = {} + U_NAME = None + B_NAME = None + +def circle(pfp, size=(450, 450)): + pfp = pfp.resize(size, Image.LANCZOS).convert("RGBA") + bigsize = (pfp.size[0] * 3, pfp.size[1] * 3) + mask = Image.new("L", bigsize, 0) + draw = ImageDraw.Draw(mask) + draw.ellipse((0, 0) + bigsize, fill=255) + mask = mask.resize(pfp.size, Image.LANCZOS) + mask = ImageChops.darker(mask, pfp.split()[-1]) + pfp.putalpha(mask) + return pfp + +def welcomepic(pic, user, chat, id, uname): + background = Image.open("TanuMusic/assets/welcome.png") + pfp = Image.open(pic).convert("RGBA") + pfp = circle(pfp) + pfp = pfp.resize( + (450, 450) + ) + draw = ImageDraw.Draw(background) + font = ImageFont.truetype('TanuMusic/assets/font.ttf', size=45) + font2 = ImageFont.truetype('TanuMusic/assets/font.ttf', size=90) + draw.text((65, 250), f'NAME : {unidecode(user)}', fill="white", font=font) + draw.text((65, 340), f'ID : {id}', fill="white", font=font) + draw.text((65, 430), f"USERNAME : {uname}", fill="white",font=font) + pfp_position = (767, 133) + background.paste(pfp, pfp_position, pfp) + background.save( + f"downloads/welcome#{id}.png" + ) + return f"downloads/welcome#{id}.png" + + +HUHU = """** +@app.on_message(filters.command("swel") & ~filters.private) +async def auto_state(_, message): + usage = "**❖ ᴜsᴀɢᴇ ➥** /swel [ᴇɴᴀʙʟᴇ|ᴅɪsᴀʙʟᴇ]" + if len(message.command) == 1: + return await message.reply_text(usage) + chat_id = message.chat.id + user = await app.get_chat_member(message.chat.id, message.from_user.id) + if user.status in ( + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ): + A = await wlcm.find_one({"chat_id" : chat_id}) + state = message.text.split(None, 1)[1].strip() + state = state.lower() + if state == "enable": + if A: + return await message.reply_text("✦ Special Welcome Already Enabled") + elif not A: + await add_wlcm(chat_id) + await message.reply_text(f"✦ Enabled Special Welcome in {message.chat.title}") + elif state == "disable": + if not A: + return await message.reply_text("✦ Special Welcome Already Disabled") + elif A: + await rm_wlcm(chat_id) + await message.reply_text(f"✦ Disabled Special Welcome in {message.chat.title}") + else: + await message.reply_text(usage) + else: + await message.reply("✦ Only Admins Can Use This Command") + ** """ +#bhag + +@app.on_chat_member_updated(filters.group, group=-3) +async def greet_group(_, member: ChatMemberUpdated): + chat_id = member.chat.id + # A = await wlcm.find_one({"chat_id" : chat_id}) + # if not A: + # return + if ( + not member.new_chat_member + or member.new_chat_member.status in {"banned", "left", "restricted"} + or member.old_chat_member + ): + return + user = member.new_chat_member.user if member.new_chat_member else member.from_user + try: + pic = await app.download_media( + user.photo.big_file_id, file_name=f"pp{user.id}.png" + ) + except AttributeError: + pic = "TanuMusic/assets/upic.png" + if (temp.MELCOW).get(f"welcome-{member.chat.id}") is not None: + try: + await temp.MELCOW[f"welcome-{member.chat.id}"].delete() + except Exception as e: + LOGGER.error(e) + try: + welcomeimg = welcomepic( + pic, user.first_name, member.chat.title, user.id, user.username + ) + temp.MELCOW[f"welcome-{member.chat.id}"] = await app.send_photo( + member.chat.id, + photo=welcomeimg, + caption= f""" +ㅤ ㅤ●◉✿ ᴡᴇʟᴄᴏᴍᴇ ʙᴀʙʏ ✿◉● +▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰ + +● ɴᴀᴍᴇ ➥ {user.mention} +● ᴜsᴇʀɴᴀᴍᴇ ➥ @{user.username} +● ᴜsᴇʀ ɪᴅ ➥ {user.id} + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰ +""", +reply_markup=InlineKeyboardMarkup( +[ +[InlineKeyboardButton(f"ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ", url=f"https://t.me/TanuMusicxBot?startgroup=new"), +] +] +)) + + except Exception as e: + LOGGER.error(e) + try: + os.remove(f"downloads/welcome#{user.id}.png") + os.remove(f"downloads/pp{user.id}.png") + except Exception as e: + pass + + + diff --git a/TanuMusic/utils/__init__.py b/TanuMusic/utils/__init__.py new file mode 100644 index 000000000000..6208a5acfba7 --- /dev/null +++ b/TanuMusic/utils/__init__.py @@ -0,0 +1,8 @@ +from .channelplay import * +from .database import * +from .decorators import * +from .extraction import * +from .formatters import * +from .inline import * +from .pastebin import * +from .sys import * diff --git a/TanuMusic/utils/channelplay.py b/TanuMusic/utils/channelplay.py new file mode 100644 index 000000000000..84d772945fb0 --- /dev/null +++ b/TanuMusic/utils/channelplay.py @@ -0,0 +1,23 @@ +from TanuMusic import app +from TanuMusic.utils.database import get_cmode + + +async def get_channeplayCB(_, command, CallbackQuery): + if command == "c": + chat_id = await get_cmode(CallbackQuery.message.chat.id) + if chat_id is None: + try: + return await CallbackQuery.answer(_["setting_7"], show_alert=True) + except: + return + try: + channel = (await app.get_chat(chat_id)).title + except: + try: + return await CallbackQuery.answer(_["cplay_4"], show_alert=True) + except: + return + else: + chat_id = CallbackQuery.message.chat.id + channel = None + return chat_id, channel diff --git a/TanuMusic/utils/cleanmode.py b/TanuMusic/utils/cleanmode.py new file mode 100644 index 000000000000..c9d727dcb39e --- /dev/null +++ b/TanuMusic/utils/cleanmode.py @@ -0,0 +1,30 @@ +from config import LOGGER_ID +from TanuMusic import app + +protected_messages = {} + + +async def protect_message(chat_id, message_id): + if chat_id not in protected_messages: + protected_messages[chat_id] = [] + protected_messages[chat_id].append(message_id) + + +async def send_message(chat_id, text, reply=None): + if reply: + try: + message = await app.send_message( + chat_id, text, reply_to_message_id=reply, disable_web_page_preview=True + ) + await protect_message(chat_id, message.id) + except Exception as e: + return await app.send_message(LOGGER_ID, e) + else: + try: + message = await app.send_message( + chat_id, text, disable_web_page_preview=True + ) + await protect_message(chat_id, message.id) + except Exception as e: + return await app.send_message(LOGGER_ID, e) + diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py new file mode 100644 index 000000000000..a83b8a59db92 --- /dev/null +++ b/TanuMusic/utils/database.py @@ -0,0 +1,684 @@ +import random +from typing import Dict, List, Union + +from TanuMusic import userbot +from TanuMusic.core.mongo import mongodb +from TanuMusic.utils.mongo import db + +afkdb = db.afk +authdb = mongodb.adminauth +authuserdb = mongodb.authuser +autoenddb = mongodb.autoend +assdb = mongodb.assistants +blacklist_chatdb = mongodb.blacklistChat +blockeddb = mongodb.blockedusers +chatsdb = mongodb.chats +channeldb = mongodb.cplaymode +countdb = mongodb.upcount +gbansdb = mongodb.gban +langdb = mongodb.language +onoffdb = mongodb.onoffper +playmodedb = mongodb.playmode +playtypedb = mongodb.playtypedb +skipdb = mongodb.skipmode +sudoersdb = mongodb.sudoers +usersdb = mongodb.tgusersdb + +# Shifting to memory [mongo sucks often] +active = [] +activevideo = [] +assistantdict = {} +autoend = {} +count = {} +channelconnect = {} +langm = {} +loop = {} +maintenance = [] +nonadmin = {} +pause = {} +playmode = {} +playtype = {} +skipmode = {} + +async def add_wlcm(chat_id: int): + return await wlcm.insert_one({"chat_id": chat_id}) + +async def rm_wlcm(chat_id: int): + chat = await wlcm.find_one({"chat_id": chat_id}) + if chat: + return await wlcm.delete_one({"chat_id": chat_id}) + + +async def get_assistant_number(chat_id: int) -> str: + assistant = assistantdict.get(chat_id) + return assistant + + +async def get_client(assistant: int): + if int(assistant) == 1: + return userbot.one + elif int(assistant) == 2: + return userbot.two + elif int(assistant) == 3: + return userbot.three + elif int(assistant) == 4: + return userbot.four + elif int(assistant) == 5: + return userbot.five + + +async def set_assistant_new(chat_id, number): + number = int(number) + await assdb.update_one( + {"chat_id": chat_id}, + {"$set": {"assistant": number}}, + upsert=True, + ) + + +async def set_assistant(chat_id): + from TanuMusic.core.userbot import assistants + + ran_assistant = random.choice(assistants) + assistantdict[chat_id] = ran_assistant + await assdb.update_one( + {"chat_id": chat_id}, + {"$set": {"assistant": ran_assistant}}, + upsert=True, + ) + userbot = await get_client(ran_assistant) + return userbot + + +async def get_assistant(chat_id: int) -> str: + from TanuMusic.core.userbot import assistants + + assistant = assistantdict.get(chat_id) + if not assistant: + dbassistant = await assdb.find_one({"chat_id": chat_id}) + if not dbassistant: + userbot = await set_assistant(chat_id) + return userbot + else: + got_assis = dbassistant["assistant"] + if got_assis in assistants: + assistantdict[chat_id] = got_assis + userbot = await get_client(got_assis) + return userbot + else: + userbot = await set_assistant(chat_id) + return userbot + else: + if assistant in assistants: + userbot = await get_client(assistant) + return userbot + else: + userbot = await set_assistant(chat_id) + return userbot + +async def is_afk(user_id: int) -> bool: + user = await afkdb.find_one({"user_id": user_id}) + if not user: + return False, {} + return True, user["reason"] + + +async def add_afk(user_id: int, mode): + await afkdb.update_one( + {"user_id": user_id}, {"$set": {"reason": mode}}, upsert=True + ) + + +async def remove_afk(user_id: int): + user = await afkdb.find_one({"user_id": user_id}) + if user: + return await afkdb.delete_one({"user_id": user_id}) + + +async def get_afk_users() -> list: + users = afkdb.find({"user_id": {"$gt": 0}}) + if not users: + return [] + users_list = [] + for user in await users.to_list(length=1000000000): + users_list.append(user) + return users_list + + +async def set_calls_assistant(chat_id): + from TanuMusic.core.userbot import assistants + + ran_assistant = random.choice(assistants) + assistantdict[chat_id] = ran_assistant + await assdb.update_one( + {"chat_id": chat_id}, + {"$set": {"assistant": ran_assistant}}, + upsert=True, + ) + return ran_assistant + + +async def group_assistant(self, chat_id: int) -> int: + from TanuMusic.core.userbot import assistants + + assistant = assistantdict.get(chat_id) + if not assistant: + dbassistant = await assdb.find_one({"chat_id": chat_id}) + if not dbassistant: + assis = await set_calls_assistant(chat_id) + else: + assis = dbassistant["assistant"] + if assis in assistants: + assistantdict[chat_id] = assis + assis = assis + else: + assis = await set_calls_assistant(chat_id) + else: + if assistant in assistants: + assis = assistant + else: + assis = await set_calls_assistant(chat_id) + if int(assis) == 1: + return self.one + elif int(assis) == 2: + return self.two + elif int(assis) == 3: + return self.three + elif int(assis) == 4: + return self.four + elif int(assis) == 5: + return self.five + + +async def is_skipmode(chat_id: int) -> bool: + mode = skipmode.get(chat_id) + if not mode: + user = await skipdb.find_one({"chat_id": chat_id}) + if not user: + skipmode[chat_id] = True + return True + skipmode[chat_id] = False + return False + return mode + + +async def skip_on(chat_id: int): + skipmode[chat_id] = True + user = await skipdb.find_one({"chat_id": chat_id}) + if user: + return await skipdb.delete_one({"chat_id": chat_id}) + + +async def skip_off(chat_id: int): + skipmode[chat_id] = False + user = await skipdb.find_one({"chat_id": chat_id}) + if not user: + return await skipdb.insert_one({"chat_id": chat_id}) + + +async def get_upvote_count(chat_id: int) -> int: + mode = count.get(chat_id) + if not mode: + mode = await countdb.find_one({"chat_id": chat_id}) + if not mode: + return 5 + count[chat_id] = mode["mode"] + return mode["mode"] + return mode + + +async def set_upvotes(chat_id: int, mode: int): + count[chat_id] = mode + await countdb.update_one( + {"chat_id": chat_id}, {"$set": {"mode": mode}}, upsert=True + ) + + +async def is_autoend() -> bool: + chat_id = 1234 + user = await autoenddb.find_one({"chat_id": chat_id}) + if not user: + return False + return True + + +async def autoend_on(): + chat_id = 1234 + await autoenddb.insert_one({"chat_id": chat_id}) + + +async def autoend_off(): + chat_id = 1234 + await autoenddb.delete_one({"chat_id": chat_id}) + + +async def get_loop(chat_id: int) -> int: + lop = loop.get(chat_id) + if not lop: + return 0 + return lop + + +async def set_loop(chat_id: int, mode: int): + loop[chat_id] = mode + + +async def get_cmode(chat_id: int) -> int: + mode = channelconnect.get(chat_id) + if not mode: + mode = await channeldb.find_one({"chat_id": chat_id}) + if not mode: + return None + channelconnect[chat_id] = mode["mode"] + return mode["mode"] + return mode + + +async def set_cmode(chat_id: int, mode: int): + channelconnect[chat_id] = mode + await channeldb.update_one( + {"chat_id": chat_id}, {"$set": {"mode": mode}}, upsert=True + ) + + +async def get_playtype(chat_id: int) -> str: + mode = playtype.get(chat_id) + if not mode: + mode = await playtypedb.find_one({"chat_id": chat_id}) + if not mode: + playtype[chat_id] = "Everyone" + return "Everyone" + playtype[chat_id] = mode["mode"] + return mode["mode"] + return mode + + +async def set_playtype(chat_id: int, mode: str): + playtype[chat_id] = mode + await playtypedb.update_one( + {"chat_id": chat_id}, {"$set": {"mode": mode}}, upsert=True + ) + + +async def get_playmode(chat_id: int) -> str: + mode = playmode.get(chat_id) + if not mode: + mode = await playmodedb.find_one({"chat_id": chat_id}) + if not mode: + playmode[chat_id] = "Direct" + return "Direct" + playmode[chat_id] = mode["mode"] + return mode["mode"] + return mode + + +async def set_playmode(chat_id: int, mode: str): + playmode[chat_id] = mode + await playmodedb.update_one( + {"chat_id": chat_id}, {"$set": {"mode": mode}}, upsert=True + ) + + +async def get_lang(chat_id: int) -> str: + mode = langm.get(chat_id) + if not mode: + lang = await langdb.find_one({"chat_id": chat_id}) + if not lang: + langm[chat_id] = "en" + return "en" + langm[chat_id] = lang["lang"] + return lang["lang"] + return mode + + +async def set_lang(chat_id: int, lang: str): + langm[chat_id] = lang + await langdb.update_one({"chat_id": chat_id}, {"$set": {"lang": lang}}, upsert=True) + + +async def is_music_playing(chat_id: int) -> bool: + mode = pause.get(chat_id) + if not mode: + return False + return mode + + +async def music_on(chat_id: int): + pause[chat_id] = True + + +async def music_off(chat_id: int): + pause[chat_id] = False + + +async def get_active_chats() -> list: + return active + + +async def is_active_chat(chat_id: int) -> bool: + if chat_id not in active: + return False + else: + return True + + +async def add_active_chat(chat_id: int): + if chat_id not in active: + active.append(chat_id) + + +async def remove_active_chat(chat_id: int): + if chat_id in active: + active.remove(chat_id) + + +async def get_active_video_chats() -> list: + return activevideo + + +async def is_active_video_chat(chat_id: int) -> bool: + if chat_id not in activevideo: + return False + else: + return True + + +async def add_active_video_chat(chat_id: int): + if chat_id not in activevideo: + activevideo.append(chat_id) + + +async def remove_active_video_chat(chat_id: int): + if chat_id in activevideo: + activevideo.remove(chat_id) + + +async def check_nonadmin_chat(chat_id: int) -> bool: + user = await authdb.find_one({"chat_id": chat_id}) + if not user: + return False + return True + + +async def is_nonadmin_chat(chat_id: int) -> bool: + mode = nonadmin.get(chat_id) + if not mode: + user = await authdb.find_one({"chat_id": chat_id}) + if not user: + nonadmin[chat_id] = False + return False + nonadmin[chat_id] = True + return True + return mode + + +async def add_nonadmin_chat(chat_id: int): + nonadmin[chat_id] = True + is_admin = await check_nonadmin_chat(chat_id) + if is_admin: + return + return await authdb.insert_one({"chat_id": chat_id}) + + +async def remove_nonadmin_chat(chat_id: int): + nonadmin[chat_id] = False + is_admin = await check_nonadmin_chat(chat_id) + if not is_admin: + return + return await authdb.delete_one({"chat_id": chat_id}) + + +async def is_on_off(on_off: int) -> bool: + onoff = await onoffdb.find_one({"on_off": on_off}) + if not onoff: + return False + return True + + +async def add_on(on_off: int): + is_on = await is_on_off(on_off) + if is_on: + return + return await onoffdb.insert_one({"on_off": on_off}) + + +async def add_off(on_off: int): + is_off = await is_on_off(on_off) + if not is_off: + return + return await onoffdb.delete_one({"on_off": on_off}) + + +async def is_maintenance(): + if not maintenance: + get = await onoffdb.find_one({"on_off": 1}) + if not get: + maintenance.clear() + maintenance.append(2) + return True + else: + maintenance.clear() + maintenance.append(1) + return False + else: + if 1 in maintenance: + return False + else: + return True + + +async def maintenance_off(): + maintenance.clear() + maintenance.append(2) + is_off = await is_on_off(1) + if not is_off: + return + return await onoffdb.delete_one({"on_off": 1}) + + +async def maintenance_on(): + maintenance.clear() + maintenance.append(1) + is_on = await is_on_off(1) + if is_on: + return + return await onoffdb.insert_one({"on_off": 1}) + + +async def is_served_user(user_id: int) -> bool: + user = await usersdb.find_one({"user_id": user_id}) + if not user: + return False + return True + + +async def get_served_users() -> list: + users_list = [] + async for user in usersdb.find({"user_id": {"$gt": 0}}): + users_list.append(user) + return users_list + + +async def add_served_user(user_id: int): + is_served = await is_served_user(user_id) + if is_served: + return + return await usersdb.insert_one({"user_id": user_id}) + + +async def get_served_chats() -> list: + chats_list = [] + async for chat in chatsdb.find({"chat_id": {"$lt": 0}}): + chats_list.append(chat) + return chats_list + + +async def is_served_chat(chat_id: int) -> bool: + chat = await chatsdb.find_one({"chat_id": chat_id}) + if not chat: + return False + return True + + +async def add_served_chat(chat_id: int): + is_served = await is_served_chat(chat_id) + if is_served: + return + return await chatsdb.insert_one({"chat_id": chat_id}) + + +async def blacklisted_chats() -> list: + chats_list = [] + async for chat in blacklist_chatdb.find({"chat_id": {"$lt": 0}}): + chats_list.append(chat["chat_id"]) + return chats_list + + +async def blacklist_chat(chat_id: int) -> bool: + if not await blacklist_chatdb.find_one({"chat_id": chat_id}): + await blacklist_chatdb.insert_one({"chat_id": chat_id}) + return True + return False + + +async def whitelist_chat(chat_id: int) -> bool: + if await blacklist_chatdb.find_one({"chat_id": chat_id}): + await blacklist_chatdb.delete_one({"chat_id": chat_id}) + return True + return False + + +async def _get_authusers(chat_id: int) -> Dict[str, int]: + _notes = await authuserdb.find_one({"chat_id": chat_id}) + if not _notes: + return {} + return _notes["notes"] + + +async def get_authuser_names(chat_id: int) -> List[str]: + _notes = [] + for note in await _get_authusers(chat_id): + _notes.append(note) + return _notes + + +async def get_authuser(chat_id: int, name: str) -> Union[bool, dict]: + name = name + _notes = await _get_authusers(chat_id) + if name in _notes: + return _notes[name] + else: + return False + + +async def save_authuser(chat_id: int, name: str, note: dict): + name = name + _notes = await _get_authusers(chat_id) + _notes[name] = note + + await authuserdb.update_one( + {"chat_id": chat_id}, {"$set": {"notes": _notes}}, upsert=True + ) + + +async def delete_authuser(chat_id: int, name: str) -> bool: + notesd = await _get_authusers(chat_id) + name = name + if name in notesd: + del notesd[name] + await authuserdb.update_one( + {"chat_id": chat_id}, + {"$set": {"notes": notesd}}, + upsert=True, + ) + return True + return False + + +async def get_gbanned() -> list: + results = [] + async for user in gbansdb.find({"user_id": {"$gt": 0}}): + user_id = user["user_id"] + results.append(user_id) + return results + + +async def is_gbanned_user(user_id: int) -> bool: + user = await gbansdb.find_one({"user_id": user_id}) + if not user: + return False + return True + + +async def add_gban_user(user_id: int): + is_gbanned = await is_gbanned_user(user_id) + if is_gbanned: + return + return await gbansdb.insert_one({"user_id": user_id}) + + +async def remove_gban_user(user_id: int): + is_gbanned = await is_gbanned_user(user_id) + if not is_gbanned: + return + return await gbansdb.delete_one({"user_id": user_id}) + + +async def get_sudoers() -> list: + sudoers = await sudoersdb.find_one({"sudo": "sudo"}) + if not sudoers: + return [] + return sudoers["sudoers"] + + +async def add_sudo(user_id: int) -> bool: + sudoers = await get_sudoers() + sudoers.append(user_id) + await sudoersdb.update_one( + {"sudo": "sudo"}, {"$set": {"sudoers": sudoers}}, upsert=True + ) + return True + + +async def remove_sudo(user_id: int) -> bool: + sudoers = await get_sudoers() + sudoers.remove(user_id) + await sudoersdb.update_one( + {"sudo": "sudo"}, {"$set": {"sudoers": sudoers}}, upsert=True + ) + return True + + +async def get_banned_users() -> list: + results = [] + async for user in blockeddb.find({"user_id": {"$gt": 0}}): + user_id = user["user_id"] + results.append(user_id) + return results + + +async def get_banned_count() -> int: + users = blockeddb.find({"user_id": {"$gt": 0}}) + users = await users.to_list(length=100000) + return len(users) + + +async def is_banned_user(user_id: int) -> bool: + user = await blockeddb.find_one({"user_id": user_id}) + if not user: + return False + return True + + +async def add_banned_user(user_id: int): + is_gbanned = await is_banned_user(user_id) + if is_gbanned: + return + return await blockeddb.insert_one({"user_id": user_id}) + + +async def remove_banned_user(user_id: int): + is_gbanned = await is_banned_user(user_id) + if not is_gbanned: + return + return await blockeddb.delete_one({"user_id": user_id}) diff --git a/TanuMusic/utils/decorators/#play.py b/TanuMusic/utils/decorators/#play.py new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/TanuMusic/utils/decorators/#play.py @@ -0,0 +1 @@ + diff --git a/TanuMusic/utils/decorators/__init__.py b/TanuMusic/utils/decorators/__init__.py new file mode 100644 index 000000000000..c1e9ec3f1b6e --- /dev/null +++ b/TanuMusic/utils/decorators/__init__.py @@ -0,0 +1,2 @@ +from .admins import * +from .language import * diff --git a/TanuMusic/utils/decorators/admins.py b/TanuMusic/utils/decorators/admins.py new file mode 100644 index 000000000000..a9a35d576376 --- /dev/null +++ b/TanuMusic/utils/decorators/admins.py @@ -0,0 +1,203 @@ +from pyrogram.enums import ChatType +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from TanuMusic import app +from TanuMusic.misc import SUDOERS, db +from TanuMusic.utils.database import ( + get_authuser_names, + get_cmode, + get_lang, + get_upvote_count, + is_active_chat, + is_maintenance, + is_nonadmin_chat, + is_skipmode, +) +from config import SUPPORT_CHAT, adminlist, confirmer +from strings import get_string + +from ..formatters import int_to_alpha + + +def AdminRightsCheck(mystic): + async def wrapper(client, message): + if await is_maintenance() is False: + if message.from_user.id not in SUDOERS: + return await message.reply_text( + text=f"{app.mention} ɪs ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ, ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ ғᴏʀ ᴋɴᴏᴡɪɴɢ ᴛʜᴇ ʀᴇᴀsᴏɴ.", + disable_web_page_preview=True, + ) + + try: + await message.delete() + except: + pass + + try: + language = await get_lang(message.chat.id) + _ = get_string(language) + except: + _ = get_string("en") + if message.sender_chat: + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʜᴏᴡ ᴛᴏ ғɪx ?", + callback_data="AnonymousAdmin", + ), + ] + ] + ) + return await message.reply_text(_["general_3"], reply_markup=upl) + if message.command[0][0] == "c": + chat_id = await get_cmode(message.chat.id) + if chat_id is None: + return await message.reply_text(_["setting_7"]) + try: + await app.get_chat(chat_id) + except: + return await message.reply_text(_["cplay_4"]) + else: + chat_id = message.chat.id + if not await is_active_chat(chat_id): + return await message.reply_text(_["general_5"]) + is_non_admin = await is_nonadmin_chat(message.chat.id) + if not is_non_admin: + if message.from_user.id not in SUDOERS: + admins = adminlist.get(message.chat.id) + if not admins: + return await message.reply_text(_["admin_13"]) + else: + if message.from_user.id not in admins: + if await is_skipmode(message.chat.id): + upvote = await get_upvote_count(chat_id) + text = f"""ᴀᴅᴍɪɴ ʀɪɢʜᴛs ɴᴇᴇᴅᴇᴅ + +ʀᴇғʀᴇsʜ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴠɪᴀ : /reload + +» {upvote} ᴠᴏᴛᴇs ɴᴇᴇᴅᴇᴅ ғᴏʀ ᴘᴇʀғᴏʀᴍɪɴɢ ᴛʜɪs ᴀᴄᴛɪᴏɴ.""" + + command = message.command[0] + if command[0] == "c": + command = command[1:] + if command == "speed": + return await message.reply_text(_["admin_14"]) + MODE = command.title() + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴠᴏᴛᴇ", + callback_data=f"ADMIN UpVote|{chat_id}_{MODE}", + ), + ] + ] + ) + if chat_id not in confirmer: + confirmer[chat_id] = {} + try: + vidid = db[chat_id][0]["vidid"] + file = db[chat_id][0]["file"] + except: + return await message.reply_text(_["admin_14"]) + senn = await message.reply_text(text, reply_markup=upl) + confirmer[chat_id][senn.id] = { + "vidid": vidid, + "file": file, + } + return + else: + return await message.reply_text(_["admin_14"]) + + return await mystic(client, message, _, chat_id) + + return wrapper + + +def AdminActual(mystic): + async def wrapper(client, message): + if await is_maintenance() is False: + if message.from_user.id not in SUDOERS: + return await message.reply_text( + text=f"{app.mention} ɪs ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ, ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ ғᴏʀ ᴋɴᴏᴡɪɴɢ ᴛʜᴇ ʀᴇᴀsᴏɴ.", + disable_web_page_preview=True, + ) + + try: + await message.delete() + except: + pass + + try: + language = await get_lang(message.chat.id) + _ = get_string(language) + except: + _ = get_string("en") + if message.sender_chat: + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʜᴏᴡ ᴛᴏ ғɪx ?", + callback_data="AnonymousAdmin", + ), + ] + ] + ) + return await message.reply_text(_["general_3"], reply_markup=upl) + if message.from_user.id not in SUDOERS: + try: + member = ( + await app.get_chat_member(message.chat.id, message.from_user.id) + ).privileges + except: + return + if not member.can_manage_video_chats: + return await message.reply(_["general_4"]) + return await mystic(client, message, _) + + return wrapper + + +def ActualAdminCB(mystic): + async def wrapper(client, CallbackQuery): + if await is_maintenance() is False: + if CallbackQuery.from_user.id not in SUDOERS: + return await CallbackQuery.answer( + f"{app.mention} ɪs ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ, ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ ғᴏʀ ᴋɴᴏᴡɪɴɢ ᴛʜᴇ ʀᴇᴀsᴏɴ.", + show_alert=True, + ) + try: + language = await get_lang(CallbackQuery.message.chat.id) + _ = get_string(language) + except: + _ = get_string("en") + if CallbackQuery.message.chat.type == ChatType.PRIVATE: + return await mystic(client, CallbackQuery, _) + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + try: + a = ( + await app.get_chat_member( + CallbackQuery.message.chat.id, + CallbackQuery.from_user.id, + ) + ).privileges + except: + return await CallbackQuery.answer(_["general_4"], show_alert=True) + if not a.can_manage_video_chats: + if CallbackQuery.from_user.id not in SUDOERS: + token = await int_to_alpha(CallbackQuery.from_user.id) + _check = await get_authuser_names(CallbackQuery.from_user.id) + if token not in _check: + try: + return await CallbackQuery.answer( + _["general_4"], + show_alert=True, + ) + except: + return + return await mystic(client, CallbackQuery, _) + + return wrapper diff --git a/TanuMusic/utils/decorators/language.py b/TanuMusic/utils/decorators/language.py new file mode 100644 index 000000000000..02c1f9a2a020 --- /dev/null +++ b/TanuMusic/utils/decorators/language.py @@ -0,0 +1,58 @@ +from strings import get_string + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import get_lang, is_maintenance + + +def language(mystic): + async def wrapper(_, message, **kwargs): + if await is_maintenance() is False: + if message.from_user.id not in SUDOERS: + return await message.reply_text( + text=f"{app.mention} ɪs ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ, ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ ғᴏʀ ᴋɴᴏᴡɪɴɢ ᴛʜᴇ ʀᴇᴀsᴏɴ.", + disable_web_page_preview=True, + ) + try: + await message.delete() + except: + pass + + try: + language = await get_lang(message.chat.id) + language = get_string(language) + except: + language = get_string("en") + return await mystic(_, message, language) + + return wrapper + + +def languageCB(mystic): + async def wrapper(_, CallbackQuery, **kwargs): + if await is_maintenance() is False: + if CallbackQuery.from_user.id not in SUDOERS: + return await CallbackQuery.answer( + f"{app.mention} ɪs ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ, ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ ғᴏʀ ᴋɴᴏᴡɪɴɢ ᴛʜᴇ ʀᴇᴀsᴏɴ.", + show_alert=True, + ) + try: + language = await get_lang(CallbackQuery.message.chat.id) + language = get_string(language) + except: + language = get_string("en") + return await mystic(_, CallbackQuery, language) + + return wrapper + + +def LanguageStart(mystic): + async def wrapper(_, message, **kwargs): + try: + language = await get_lang(message.chat.id) + language = get_string(language) + except: + language = get_string("en") + return await mystic(_, message, language) + + return wrapper diff --git a/TanuMusic/utils/decorators/play.py b/TanuMusic/utils/decorators/play.py new file mode 100644 index 000000000000..e44c11028a41 --- /dev/null +++ b/TanuMusic/utils/decorators/play.py @@ -0,0 +1,195 @@ +import asyncio + +from pyrogram.enums import ChatMemberStatus +from pyrogram.errors import ( + ChatAdminRequired, + InviteRequestSent, + UserAlreadyParticipant, + UserNotParticipant, +) +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from TanuMusic import YouTube, app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import ( + get_assistant, + get_cmode, + get_lang, + get_playmode, + get_playtype, + is_active_chat, + is_maintenance, +) +from TanuMusic.utils.inline import botplaylist_markup +from config import PLAYLIST_IMG_URL, SUPPORT_CHAT, adminlist +from strings import get_string + +links = {} + + +def PlayWrapper(command): + async def wrapper(client, message): + language = await get_lang(message.chat.id) + _ = get_string(language) + if message.sender_chat: + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʜᴏᴡ ᴛᴏ ғɪx ?", + callback_data="AnonymousAdmin", + ), + ] + ] + ) + return await message.reply_text(_["general_3"], reply_markup=upl) + + if await is_maintenance() is False: + if message.from_user.id not in SUDOERS: + return await message.reply_text( + text=f"{app.mention} ɪs ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ, ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ ғᴏʀ ᴋɴᴏᴡɪɴɢ ᴛʜᴇ ʀᴇᴀsᴏɴ.", + disable_web_page_preview=True, + ) + + try: + await message.delete() + except: + pass + + audio_telegram = ( + (message.reply_to_message.audio or message.reply_to_message.voice) + if message.reply_to_message + else None + ) + video_telegram = ( + (message.reply_to_message.video or message.reply_to_message.document) + if message.reply_to_message + else None + ) + url = await YouTube.url(message) + if audio_telegram is None and video_telegram is None and url is None: + if len(message.command) < 2: + if "stream" in message.command: + return await message.reply_text(_["str_1"]) + buttons = botplaylist_markup(_) + return await message.reply_photo( + photo=PLAYLIST_IMG_URL, + caption=_["play_18"], + reply_markup=InlineKeyboardMarkup(buttons), + ) + if message.command[0][0] == "c": + chat_id = await get_cmode(message.chat.id) + if chat_id is None: + return await message.reply_text(_["setting_7"]) + try: + chat = await app.get_chat(chat_id) + except: + return await message.reply_text(_["cplay_4"]) + channel = chat.title + else: + chat_id = message.chat.id + channel = None + playmode = await get_playmode(message.chat.id) + playty = await get_playtype(message.chat.id) + if playty != "Everyone": + if message.from_user.id not in SUDOERS: + admins = adminlist.get(message.chat.id) + if not admins: + return await message.reply_text(_["admin_13"]) + else: + if message.from_user.id not in admins: + return await message.reply_text(_["play_4"]) + if message.command[0][0] == "v": + video = True + else: + if "-v" in message.text: + video = True + else: + video = True if message.command[0][1] == "v" else None + if message.command[0][-1] == "e": + if not await is_active_chat(chat_id): + return await message.reply_text(_["play_16"]) + fplay = True + else: + fplay = None + + if not await is_active_chat(chat_id): + userbot = await get_assistant(chat_id) + try: + try: + get = await app.get_chat_member(chat_id, userbot.id) + except ChatAdminRequired: + return await message.reply_text(_["call_1"]) + if ( + get.status == ChatMemberStatus.BANNED + or get.status == ChatMemberStatus.RESTRICTED + ): + return await message.reply_text( + _["call_2"].format( + app.mention, userbot.id, userbot.name, userbot.username + ) + ) + except UserNotParticipant: + if chat_id in links: + invitelink = links[chat_id] + else: + if message.chat.username: + invitelink = message.chat.username + try: + await userbot.resolve_peer(invitelink) + except: + pass + else: + try: + invitelink = await app.export_chat_invite_link(chat_id) + except ChatAdminRequired: + return await message.reply_text(_["call_1"]) + except Exception as e: + return await message.reply_text( + _["call_3"].format(app.mention, type(e).__name__) + ) + + if invitelink.startswith("https://t.me/+"): + invitelink = invitelink.replace( + "https://t.me/+", "https://t.me/joinchat/" + ) + myu = await message.reply_text(_["call_4"].format(app.mention)) + try: + await asyncio.sleep(1) + await userbot.join_chat(invitelink) + except InviteRequestSent: + try: + await app.approve_chat_join_request(chat_id, userbot.id) + except Exception as e: + return await message.reply_text( + _["call_3"].format(app.mention, type(e).__name__) + ) + await asyncio.sleep(3) + await myu.edit(_["call_5"].format(app.mention)) + except UserAlreadyParticipant: + pass + except Exception as e: + return await message.reply_text( + _["call_3"].format(app.mention, type(e).__name__) + ) + + links[chat_id] = invitelink + + try: + await userbot.resolve_peer(chat_id) + except: + pass + + return await command( + client, + message, + _, + chat_id, + video, + channel, + playmode, + url, + fplay, + ) + + return wrapper diff --git a/TanuMusic/utils/error.py b/TanuMusic/utils/error.py new file mode 100644 index 000000000000..a7fd73d0392f --- /dev/null +++ b/TanuMusic/utils/error.py @@ -0,0 +1,39 @@ +import traceback +from functools import wraps + +from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden + +from config import LOGGER_ID +from TanuMusic import app + +def capture_err(func): + @wraps(func) + async def capture(client, message, *args, **kwargs): + try: + return await func(client, message, *args, **kwargs) + except ChatWriteForbidden: + await app.leave_chat(message.chat.id) + return + except Exception as err: + errors = traceback.format_exc() + error_feedback = split_limits( + "ERROR | {} | {}\n```command\n{}```\n\n```python\n{}```\n".format( + 0 if not message.from_user else message.from_user.mention, + ( + 0 + if not message.chat + else ( + f"@{message.chat.username}" + if message.chat.username + else f"`{message.chat.id}`" + ) + ), + message.text or message.caption, + "".join(errors), + ), + ) + for x in error_feedback: + await app.send_message(LOG_GROUP_ID, x) + raise err + + return capture \ No newline at end of file diff --git a/TanuMusic/utils/exceptions.py b/TanuMusic/utils/exceptions.py new file mode 100644 index 000000000000..c28414d73415 --- /dev/null +++ b/TanuMusic/utils/exceptions.py @@ -0,0 +1,3 @@ +class AssistantErr(Exception): + def __init__(self, errr: str): + super().__init__(errr) diff --git a/TanuMusic/utils/extraction.py b/TanuMusic/utils/extraction.py new file mode 100644 index 000000000000..370af6690d16 --- /dev/null +++ b/TanuMusic/utils/extraction.py @@ -0,0 +1,17 @@ +from pyrogram.enums import MessageEntityType +from pyrogram.types import Message, User + +from TanuMusic import app + + +async def extract_user(m: Message) -> User: + if m.reply_to_message: + return m.reply_to_message.from_user + msg_entities = m.entities[1] if m.text.startswith("/") else m.entities[0] + return await app.get_users( + msg_entities.user.id + if msg_entities.type == MessageEntityType.TEXT_MENTION + else int(m.command[1]) + if m.command[1].isdecimal() + else m.command[1] + ) diff --git a/TanuMusic/utils/fonts.py b/TanuMusic/utils/fonts.py new file mode 100644 index 000000000000..a126a7512e50 --- /dev/null +++ b/TanuMusic/utils/fonts.py @@ -0,0 +1,2361 @@ +class Fonts: + def typewriter(text): + style = { + "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": "𝚉", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def outline(text): + style = { + "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": "ℤ", + "0": "𝟘", + "1": "𝟙", + "2": "𝟚", + "3": "𝟛", + "4": "𝟜", + "5": "𝟝", + "6": "𝟞", + "7": "𝟟", + "8": "𝟠", + "9": "𝟡", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def serief(text): + style = { + "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": "𝐙", + "0": "𝟎", + "1": "𝟏", + "2": "𝟐", + "3": "𝟑", + "4": "𝟒", + "5": "𝟓", + "6": "𝟔", + "7": "𝟕", + "8": "𝟖", + "9": "𝟗", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def bold_cool(text): + style = { + "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": "𝒁", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def cool(text): + style = { + "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": "𝑍", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def smallcap(text): + style = { + "a": "ᴀ", + "b": "ʙ", + "c": "ᴄ", + "d": "ᴅ", + "e": "ᴇ", + "f": "ғ", + "g": "ɢ", + "h": "ʜ", + "i": "ɪ", + "j": "J", + "k": "ᴋ", + "l": "ʟ", + "m": "ᴍ", + "n": "ɴ", + "o": "ᴏ", + "p": "ᴘ", + "q": "ǫ", + "r": "ʀ", + "s": "s", + "t": "ᴛ", + "u": "ᴜ", + "v": "ᴠ", + "w": "ᴡ", + "x": "x", + "y": "ʏ", + "z": "ᴢ", + "A": "A", + "B": "B", + "C": "C", + "D": "D", + "E": "E", + "F": "F", + "G": "G", + "H": "H", + "I": "I", + "J": "J", + "K": "K", + "L": "L", + "M": "M", + "N": "N", + "O": "O", + "P": "P", + "Q": "Q", + "R": "R", + "S": "S", + "T": "T", + "U": "U", + "V": "V", + "W": "W", + "X": "X", + "Y": "Y", + "Z": "Z", + "0": "𝟶", + "1": "𝟷", + "2": "𝟸", + "3": "𝟹", + "4": "𝟺", + "5": "𝟻", + "6": "𝟼", + "7": "𝟽", + "8": "𝟾", + "9": "𝟿", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def script(text): + style = { + "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": "𝒵", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def bold_script(text): + style = { + "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": "𝓩", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def tiny(text): + style = { + "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": "ᶻ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def comic(text): + style = { + "a": "ᗩ", + "b": "ᗷ", + "c": "ᑕ", + "d": "ᗪ", + "e": "ᗴ", + "f": "ᖴ", + "g": "ᘜ", + "h": "ᕼ", + "i": "I", + "j": "ᒍ", + "k": "K", + "l": "ᒪ", + "m": "ᗰ", + "n": "ᑎ", + "o": "O", + "p": "ᑭ", + "q": "ᑫ", + "r": "ᖇ", + "s": "Տ", + "t": "T", + "u": "ᑌ", + "v": "ᐯ", + "w": "ᗯ", + "x": "᙭", + "y": "Y", + "z": "ᘔ", + "A": "ᗩ", + "B": "ᗷ", + "C": "ᑕ", + "D": "ᗪ", + "E": "ᗴ", + "F": "ᖴ", + "G": "ᘜ", + "H": "ᕼ", + "I": "I", + "J": "ᒍ", + "K": "K", + "L": "ᒪ", + "M": "ᗰ", + "N": "ᑎ", + "O": "O", + "P": "ᑭ", + "Q": "ᑫ", + "R": "ᖇ", + "S": "Տ", + "T": "T", + "U": "ᑌ", + "V": "ᐯ", + "W": "ᗯ", + "X": "᙭", + "Y": "Y", + "Z": "ᘔ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def san(text): + style = { + "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": "𝗭", + "0": "𝟬", + "1": "𝟭", + "2": "𝟮", + "3": "𝟯", + "4": "𝟰", + "5": "𝟱", + "6": "𝟲", + "7": "𝟳", + "8": "𝟴", + "9": "𝟵", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def slant_san(text): + style = { + "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": "𝙕", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def slant(text): + style = { + "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": "𝘡", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def sim(text): + style = { + "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": "𝖹", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def circles(text): + style = { + "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": "Ⓩ︎", + "0": "⓪", + "1": "①", + "2": "②", + "3": "③", + "4": "④", + "5": "⑤", + "6": "⑥", + "7": "⑦", + "8": "⑧", + "9": "⑨", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def dark_circle(text): + style = { + "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": "🅩", + "0": "⓿", + "1": "➊", + "2": "➋", + "3": "➌", + "4": "➍", + "5": "➎", + "6": "➏", + "7": "➐", + "8": "➑", + "9": "➒", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def gothic(text): + style = { + "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": "ℨ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def bold_gothic(text): + style = { + "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": "𝖅", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def cloud(text): + style = { + "a": "a͜͡", + "b": "b͜͡", + "c": "c͜͡", + "d": "d͜͡", + "e": "e͜͡", + "f": "f͜͡", + "g": "g͜͡", + "h": "h͜͡", + "i": "i͜͡", + "j": "j͜͡", + "k": "k͜͡", + "l": "l͜͡", + "m": "m͜͡", + "n": "n͜͡", + "o": "o͜͡", + "p": "p͜͡", + "q": "q͜͡", + "r": "r͜͡", + "s": "s͜͡", + "t": "t͜͡", + "u": "u͜͡", + "v": "v͜͡", + "w": "w͜͡", + "x": "x͜͡", + "y": "y͜͡", + "z": "z͜͡", + "A": "A͜͡", + "B": "B͜͡", + "C": "C͜͡", + "D": "D͜͡", + "E": "E͜͡", + "F": "F͜͡", + "G": "G͜͡", + "H": "H͜͡", + "I": "I͜͡", + "J": "J͜͡", + "K": "K͜͡", + "L": "L͜͡", + "M": "M͜͡", + "N": "N͜͡", + "O": "O͜͡", + "P": "P͜͡", + "Q": "Q͜͡", + "R": "R͜͡", + "S": "S͜͡", + "T": "T͜͡", + "U": "U͜͡", + "V": "V͜͡", + "W": "W͜͡", + "X": "X͜͡", + "Y": "Y͜͡", + "Z": "Z͜͡", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def happy(text): + style = { + "a": "ă̈", + "b": "b̆̈", + "c": "c̆̈", + "d": "d̆̈", + "e": "ĕ̈", + "f": "f̆̈", + "g": "ğ̈", + "h": "h̆̈", + "i": "ĭ̈", + "j": "j̆̈", + "k": "k̆̈", + "l": "l̆̈", + "m": "m̆̈", + "n": "n̆̈", + "o": "ŏ̈", + "p": "p̆̈", + "q": "q̆̈", + "r": "r̆̈", + "s": "s̆̈", + "t": "t̆̈", + "u": "ŭ̈", + "v": "v̆̈", + "w": "w̆̈", + "x": "x̆̈", + "y": "y̆̈", + "z": "z̆̈", + "A": "Ă̈", + "B": "B̆̈", + "C": "C̆̈", + "D": "D̆̈", + "E": "Ĕ̈", + "F": "F̆̈", + "G": "Ğ̈", + "H": "H̆̈", + "I": "Ĭ̈", + "J": "J̆̈", + "K": "K̆̈", + "L": "L̆̈", + "M": "M̆̈", + "N": "N̆̈", + "O": "Ŏ̈", + "P": "P̆̈", + "Q": "Q̆̈", + "R": "R̆̈", + "S": "S̆̈", + "T": "T̆̈", + "U": "Ŭ̈", + "V": "V̆̈", + "W": "W̆̈", + "X": "X̆̈", + "Y": "Y̆̈", + "Z": "Z̆̈", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def sad(text): + style = { + "a": "ȃ̈", + "b": "b̑̈", + "c": "c̑̈", + "d": "d̑̈", + "e": "ȇ̈", + "f": "f̑̈", + "g": "g̑̈", + "h": "h̑̈", + "i": "ȋ̈", + "j": "j̑̈", + "k": "k̑̈", + "l": "l̑̈", + "m": "m̑̈", + "n": "n̑̈", + "o": "ȏ̈", + "p": "p̑̈", + "q": "q̑̈", + "r": "ȓ̈", + "s": "s̑̈", + "t": "t̑̈", + "u": "ȗ̈", + "v": "v̑̈", + "w": "w̑̈", + "x": "x̑̈", + "y": "y̑̈", + "z": "z̑̈", + "A": "Ȃ̈", + "B": "B̑̈", + "C": "C̑̈", + "D": "D̑̈", + "E": "Ȇ̈", + "F": "F̑̈", + "G": "G̑̈", + "H": "H̑̈", + "I": "Ȋ̈", + "J": "J̑̈", + "K": "K̑̈", + "L": "L̑̈", + "M": "M̑̈", + "N": "N̑̈", + "O": "Ȏ̈", + "P": "P̑̈", + "Q": "Q̑̈", + "R": "Ȓ̈", + "S": "S̑̈", + "T": "T̑̈", + "U": "Ȗ̈", + "V": "V̑̈", + "W": "W̑̈", + "X": "X̑̈", + "Y": "Y̑̈", + "Z": "Z̑̈", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def special(text): + style = { + "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": "🇿 ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def square(text): + style = { + "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": "🅉", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def dark_square(text): + style = { + "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": "🆉︎", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def andalucia(text): + style = { + "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": "ɀ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def manga(text): + style = { + "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": "乙", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def stinky(text): + style = { + "a": "a̾", + "b": "b̾", + "c": "c̾", + "d": "d̾", + "e": "e̾", + "f": "f̾", + "g": "g̾", + "h": "h̾", + "i": "i̾", + "j": "j̾", + "k": "k̾", + "l": "l̾", + "m": "m̾", + "n": "n̾", + "o": "o̾", + "p": "p̾", + "q": "q̾", + "r": "r̾", + "s": "s̾", + "t": "t̾", + "u": "u̾", + "v": "v̾", + "w": "w̾", + "x": "x̾", + "y": "y̾", + "z": "z̾", + "A": "A̾", + "B": "B̾", + "C": "C̾", + "D": "D̾", + "E": "E̾", + "F": "F̾", + "G": "G̾", + "H": "H̾", + "I": "I̾", + "J": "J̾", + "K": "K̾", + "L": "L̾", + "M": "M̾", + "N": "N̾", + "O": "O̾", + "P": "P̾", + "Q": "Q̾", + "R": "R̾", + "S": "S̾", + "T": "T̾", + "U": "U̾", + "V": "V̾", + "W": "W̾", + "X": "X̾", + "Y": "Y̾", + "Z": "Z̾", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def bubbles(text): + style = { + "a": "ḁͦ", + "b": "b̥ͦ", + "c": "c̥ͦ", + "d": "d̥ͦ", + "e": "e̥ͦ", + "f": "f̥ͦ", + "g": "g̥ͦ", + "h": "h̥ͦ", + "i": "i̥ͦ", + "j": "j̥ͦ", + "k": "k̥ͦ", + "l": "l̥ͦ", + "m": "m̥ͦ", + "n": "n̥ͦ", + "o": "o̥ͦ", + "p": "p̥ͦ", + "q": "q̥ͦ", + "r": "r̥ͦ", + "s": "s̥ͦ", + "t": "t̥ͦ", + "u": "u̥ͦ", + "v": "v̥ͦ", + "w": "w̥ͦ", + "x": "x̥ͦ", + "y": "y̥ͦ", + "z": "z̥ͦ", + "A": "Ḁͦ", + "B": "B̥ͦ", + "C": "C̥ͦ", + "D": "D̥ͦ", + "E": "E̥ͦ", + "F": "F̥ͦ", + "G": "G̥ͦ", + "H": "H̥ͦ", + "I": "I̥ͦ", + "J": "J̥ͦ", + "K": "K̥ͦ", + "L": "L̥ͦ", + "M": "M̥ͦ", + "N": "N̥ͦ", + "O": "O̥ͦ", + "P": "P̥ͦ", + "Q": "Q̥ͦ", + "R": "R̥ͦ", + "S": "S̥ͦ", + "T": "T̥ͦ", + "U": "U̥ͦ", + "V": "V̥ͦ", + "W": "W̥ͦ", + "X": "X̥ͦ", + "Y": "Y̥ͦ", + "Z": "Z̥ͦ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def underline(text): + style = { + "a": "a͟", + "b": "b͟", + "c": "c͟", + "d": "d͟", + "e": "e͟", + "f": "f͟", + "g": "g͟", + "h": "h͟", + "i": "i͟", + "j": "j͟", + "k": "k͟", + "l": "l͟", + "m": "m͟", + "n": "n͟", + "o": "o͟", + "p": "p͟", + "q": "q͟", + "r": "r͟", + "s": "s͟", + "t": "t͟", + "u": "u͟", + "v": "v͟", + "w": "w͟", + "x": "x͟", + "y": "y͟", + "z": "z͟", + "A": "A͟", + "B": "B͟", + "C": "C͟", + "D": "D͟", + "E": "E͟", + "F": "F͟", + "G": "G͟", + "H": "H͟", + "I": "I͟", + "J": "J͟", + "K": "K͟", + "L": "L͟", + "M": "M͟", + "N": "N͟", + "O": "O͟", + "P": "P͟", + "Q": "Q͟", + "R": "R͟", + "S": "S͟", + "T": "T͟", + "U": "U͟", + "V": "V͟", + "W": "W͟", + "X": "X͟", + "Y": "Y͟", + "Z": "Z͟", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def ladybug(text): + style = { + "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": "ꁴ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def rays(text): + style = { + "a": "a҉", + "b": "b҉", + "c": "c҉", + "d": "d҉", + "e": "e҉", + "f": "f҉", + "g": "g҉", + "h": "h҉", + "i": "i҉", + "j": "j҉", + "k": "k҉", + "l": "l҉", + "m": "m҉", + "n": "n҉", + "o": "o҉", + "p": "p҉", + "q": "q҉", + "r": "r҉", + "s": "s҉", + "t": "t҉", + "u": "u҉", + "v": "v҉", + "w": "w҉", + "x": "x҉", + "y": "y҉", + "z": "z҉", + "A": "A҉", + "B": "B҉", + "C": "C҉", + "D": "D҉", + "E": "E҉", + "F": "F҉", + "G": "G҉", + "H": "H҉", + "I": "I҉", + "J": "J҉", + "K": "K҉", + "L": "L҉", + "M": "M҉", + "N": "N҉", + "O": "O҉", + "P": "P҉", + "Q": "Q҉", + "R": "R҉", + "S": "S҉", + "T": "T҉", + "U": "U҉", + "V": "V҉", + "W": "W҉", + "X": "X҉", + "Y": "Y҉", + "Z": "Z҉", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def birds(text): + style = { + "a": "a҈", + "b": "b҈", + "c": "c҈", + "d": "d҈", + "e": "e҈", + "f": "f҈", + "g": "g҈", + "h": "h҈", + "i": "i҈", + "j": "j҈", + "k": "k҈", + "l": "l҈", + "m": "m҈", + "n": "n҈", + "o": "o҈", + "p": "p҈", + "q": "q҈", + "r": "r҈", + "s": "s҈", + "t": "t҈", + "u": "u҈", + "v": "v҈", + "w": "w҈", + "x": "x҈", + "y": "y҈", + "z": "z҈", + "A": "A҈", + "B": "B҈", + "C": "C҈", + "D": "D҈", + "E": "E҈", + "F": "F҈", + "G": "G҈", + "H": "H҈", + "I": "I҈", + "J": "J҈", + "K": "K҈", + "L": "L҈", + "M": "M҈", + "N": "N҈", + "O": "O҈", + "P": "P҈", + "Q": "Q҈", + "R": "R҈", + "S": "S҈", + "T": "T҈", + "U": "U҈", + "V": "V҈", + "W": "W҈", + "X": "X҈", + "Y": "Y҈", + "Z": "Z҈", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def slash(text): + style = { + "a": "a̸", + "b": "b̸", + "c": "c̸", + "d": "d̸", + "e": "e̸", + "f": "f̸", + "g": "g̸", + "h": "h̸", + "i": "i̸", + "j": "j̸", + "k": "k̸", + "l": "l̸", + "m": "m̸", + "n": "n̸", + "o": "o̸", + "p": "p̸", + "q": "q̸", + "r": "r̸", + "s": "s̸", + "t": "t̸", + "u": "u̸", + "v": "v̸", + "w": "w̸", + "x": "x̸", + "y": "y̸", + "z": "z̸", + "A": "A̸", + "B": "B̸", + "C": "C̸", + "D": "D̸", + "E": "E̸", + "F": "F̸", + "G": "G̸", + "H": "H̸", + "I": "I̸", + "J": "J̸", + "K": "K̸", + "L": "L̸", + "M": "M̸", + "N": "N̸", + "O": "O̸", + "P": "P̸", + "Q": "Q̸", + "R": "R̸", + "S": "S̸", + "T": "T̸", + "U": "U̸", + "V": "V̸", + "W": "W̸", + "X": "X̸", + "Y": "Y̸", + "Z": "Z̸", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def stop(text): + style = { + "a": "a⃠", + "b": "b⃠", + "c": "c⃠", + "d": "d⃠", + "e": "e⃠", + "f": "f⃠", + "g": "g⃠", + "h": "h⃠", + "i": "i⃠", + "j": "j⃠", + "k": "k⃠", + "l": "l⃠", + "m": "m⃠", + "n": "n⃠", + "o": "o⃠", + "p": "p⃠", + "q": "q⃠", + "r": "r⃠", + "s": "s⃠", + "t": "t⃠", + "u": "u⃠", + "v": "v⃠", + "w": "w⃠", + "x": "x⃠", + "y": "y⃠", + "z": "z⃠", + "A": "A⃠", + "B": "B⃠", + "C": "C⃠", + "D": "D⃠", + "E": "E⃠", + "F": "F⃠", + "G": "G⃠", + "H": "H⃠", + "I": "I⃠", + "J": "J⃠", + "K": "K⃠", + "L": "L⃠", + "M": "M⃠", + "N": "N⃠", + "O": "O⃠", + "P": "P⃠", + "Q": "Q⃠", + "R": "R⃠", + "S": "S⃠", + "T": "T⃠", + "U": "U⃠", + "V": "V⃠", + "W": "W⃠", + "X": "X⃠", + "Y": "Y⃠", + "Z": "Z⃠", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def skyline(text): + style = { + "a": "a̺͆", + "b": "b̺͆", + "c": "c̺͆", + "d": "d̺͆", + "e": "e̺͆", + "f": "f̺͆", + "g": "g̺͆", + "h": "h̺͆", + "i": "i̺͆", + "j": "j̺͆", + "k": "k̺͆", + "l": "l̺͆", + "m": "m̺͆", + "n": "n̺͆", + "o": "o̺͆", + "p": "p̺͆", + "q": "q̺͆", + "r": "r̺͆", + "s": "s̺͆", + "t": "t̺͆", + "u": "u̺͆", + "v": "v̺͆", + "w": "w̺͆", + "x": "x̺͆", + "y": "y̺͆", + "z": "z̺͆", + "A": "A̺͆", + "B": "B̺͆", + "C": "C̺͆", + "D": "D̺͆", + "E": "E̺͆", + "F": "F̺͆", + "G": "G̺͆", + "H": "H̺͆", + "I": "I̺͆", + "J": "J̺͆", + "K": "K̺͆", + "L": "L̺͆", + "M": "M̺͆", + "N": "N̺͆", + "O": "O̺͆", + "P": "P̺͆", + "Q": "Q̺͆", + "R": "R̺͆", + "S": "S̺͆", + "T": "T̺͆", + "U": "U̺͆", + "V": "V̺͆", + "W": "W̺͆", + "X": "X̺͆", + "Y": "Y̺͆", + "Z": "Z̺͆", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def arrows(text): + style = { + "a": "a͎", + "b": "b͎", + "c": "c͎", + "d": "d͎", + "e": "e͎", + "f": "f͎", + "g": "g͎", + "h": "h͎", + "i": "i͎", + "j": "j͎", + "k": "k͎", + "l": "l͎", + "m": "m͎", + "n": "n͎", + "o": "o͎", + "p": "p͎", + "q": "q͎", + "r": "r͎", + "s": "s͎", + "t": "t͎", + "u": "u͎", + "v": "v͎", + "w": "w͎", + "x": "x͎", + "y": "y͎", + "z": "z͎", + "A": "A͎", + "B": "B͎", + "C": "C͎", + "D": "D͎", + "E": "E͎", + "F": "F͎", + "G": "G͎", + "H": "H͎", + "I": "I͎", + "J": "J͎", + "K": "K͎", + "L": "L͎", + "M": "M͎", + "N": "N͎", + "O": "O͎", + "P": "P͎", + "Q": "Q͎", + "R": "R͎", + "S": "S͎", + "T": "T͎", + "U": "U͎", + "V": "V͎", + "W": "W͎", + "X": "X͎", + "Y": "Y͎", + "Z": "Z͎", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def rvnes(text): + style = { + "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": "ጊ", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def strike(text): + style = { + "a": "a̶", + "b": "b̶", + "c": "c̶", + "d": "d̶", + "e": "e̶", + "f": "f̶", + "g": "g̶", + "h": "h̶", + "i": "i̶", + "j": "j̶", + "k": "k̶", + "l": "l̶", + "m": "m̶", + "n": "n̶", + "o": "o̶", + "p": "p̶", + "q": "q̶", + "r": "r̶", + "s": "s̶", + "t": "t̶", + "u": "u̶", + "v": "v̶", + "w": "w̶", + "x": "x̶", + "y": "y̶", + "z": "z̶", + "A": "A̶", + "B": "B̶", + "C": "C̶", + "D": "D̶", + "E": "E̶", + "F": "F̶", + "G": "G̶", + "H": "H̶", + "I": "I̶", + "J": "J̶", + "K": "K̶", + "L": "L̶", + "M": "M̶", + "N": "N̶", + "O": "O̶", + "P": "P̶", + "Q": "Q̶", + "R": "R̶", + "S": "S̶", + "T": "T̶", + "U": "U̶", + "V": "V̶", + "W": "W̶", + "X": "X̶", + "Y": "Y̶", + "Z": "Z̶", + } + for i, j in style.items(): + text = text.replace(i, j) + return text + + def frozen(text): + style = { + "a": "a༙", + "b": "b༙", + "c": "c༙", + "d": "d༙", + "e": "e༙", + "f": "f༙", + "g": "g༙", + "h": "h༙", + "i": "i༙", + "j": "j༙", + "k": "k༙", + "l": "l༙", + "m": "m༙", + "n": "n༙", + "o": "o༙", + "p": "p༙", + "q": "q༙", + "r": "r༙", + "s": "s༙", + "t": "t༙", + "u": "u༙", + "v": "v༙", + "w": "w༙", + "x": "x༙", + "y": "y༙", + "z": "z༙", + "A": "A༙", + "B": "B༙", + "C": "C༙", + "D": "D༙", + "E": "E༙", + "F": "F༙", + "G": "G༙", + "H": "H༙", + "I": "I༙", + "J": "J༙", + "K": "K༙", + "L": "L༙", + "M": "M༙", + "N": "N༙", + "O": "O༙", + "P": "P༙", + "Q": "Q༙", + "R": "R༙", + "S": "S༙", + "T": "T༙", + "U": "U༙", + "V": "V༙", + "W": "W༙", + "X": "X༙", + "Y": "Y༙", + "Z": "Z༙", + } + for i, j in style.items(): + text = text.replace(i, j) + return text \ No newline at end of file diff --git a/TanuMusic/utils/formatters.py b/TanuMusic/utils/formatters.py new file mode 100644 index 000000000000..c0077e5ca959 --- /dev/null +++ b/TanuMusic/utils/formatters.py @@ -0,0 +1,185 @@ +import json +import subprocess + + +def get_readable_time(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "ᴍ", "ʜ", "ᴅᴀʏs"] + while count < 4: + count += 1 + if count < 3: + remainder, result = divmod(seconds, 60) + else: + remainder, result = divmod(seconds, 24) + if seconds == 0 and remainder == 0: + break + time_list.append(int(result)) + seconds = int(remainder) + for i in range(len(time_list)): + time_list[i] = str(time_list[i]) + time_suffix_list[i] + if len(time_list) == 4: + ping_time += time_list.pop() + ", " + time_list.reverse() + ping_time += ":".join(time_list) + return ping_time + + +def convert_bytes(size: float) -> str: + """humanize size""" + if not size: + return "" + power = 1024 + t_n = 0 + power_dict = {0: " ", 1: "Ki", 2: "Mi", 3: "Gi", 4: "Ti"} + while size > power: + size /= power + t_n += 1 + return "{:.2f} {}B".format(size, power_dict[t_n]) + + +async def int_to_alpha(user_id: int) -> str: + alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] + text = "" + user_id = str(user_id) + for i in user_id: + text += alphabet[int(i)] + return text + + +async def alpha_to_int(user_id_alphabet: str) -> int: + alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] + user_id = "" + for i in user_id_alphabet: + index = alphabet.index(i) + user_id += str(index) + user_id = int(user_id) + return user_id + + +def time_to_seconds(time): + stringt = str(time) + return sum(int(x) * 60**i for i, x in enumerate(reversed(stringt.split(":")))) + + +def seconds_to_min(seconds): + if seconds is not None: + seconds = int(seconds) + d, h, m, s = ( + seconds // (3600 * 24), + seconds // 3600 % 24, + seconds % 3600 // 60, + seconds % 3600 % 60, + ) + if d > 0: + return "{:02d}:{:02d}:{:02d}:{:02d}".format(d, h, m, s) + elif h > 0: + return "{:02d}:{:02d}:{:02d}".format(h, m, s) + elif m > 0: + return "{:02d}:{:02d}".format(m, s) + elif s > 0: + return "00:{:02d}".format(s) + return "-" + + +def speed_converter(seconds, speed): + if str(speed) == str("0.5"): + seconds = seconds * 2 + if str(speed) == str("0.75"): + seconds = seconds + ((50 * seconds) // 100) + if str(speed) == str("1.5"): + seconds = seconds - ((25 * seconds) // 100) + if str(speed) == str("2.0"): + seconds = seconds - ((50 * seconds) // 100) + collect = seconds + if seconds is not None: + seconds = int(seconds) + d, h, m, s = ( + seconds // (3600 * 24), + seconds // 3600 % 24, + seconds % 3600 // 60, + seconds % 3600 % 60, + ) + if d > 0: + convert = "{:02d}:{:02d}:{:02d}:{:02d}".format(d, h, m, s) + return convert, collect + elif h > 0: + convert = "{:02d}:{:02d}:{:02d}".format(h, m, s) + return convert, collect + elif m > 0: + convert = "{:02d}:{:02d}".format(m, s) + return convert, collect + elif s > 0: + convert = "00:{:02d}".format(s) + return convert, collect + return "-" + + +def check_duration(file_path): + command = [ + "ffprobe", + "-loglevel", + "quiet", + "-print_format", + "json", + "-show_format", + "-show_streams", + file_path, + ] + + pipe = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + out, err = pipe.communicate() + _json = json.loads(out) + + if "format" in _json: + if "duration" in _json["format"]: + return float(_json["format"]["duration"]) + + if "streams" in _json: + for s in _json["streams"]: + if "duration" in s: + return float(s["duration"]) + + return "Unknown" + + +formats = [ + "webm", + "mkv", + "flv", + "vob", + "ogv", + "ogg", + "rrc", + "gifv", + "mng", + "mov", + "avi", + "qt", + "wmv", + "yuv", + "rm", + "asf", + "amv", + "mp4", + "m4p", + "m4v", + "mpg", + "mp2", + "mpeg", + "mpe", + "mpv", + "m4v", + "svi", + "3gp", + "3g2", + "mxf", + "roq", + "nsv", + "flv", + "f4v", + "f4p", + "f4a", + "f4b", +] diff --git a/TanuMusic/utils/inline/__init__.py b/TanuMusic/utils/inline/__init__.py new file mode 100644 index 000000000000..0e5871b91d51 --- /dev/null +++ b/TanuMusic/utils/inline/__init__.py @@ -0,0 +1,7 @@ +from .extras import * +from .help import * +from .play import * +from .queue import * +from .settings import * +from .speed import * +from .start import * diff --git a/TanuMusic/utils/inline/extras.py b/TanuMusic/utils/inline/extras.py new file mode 100644 index 000000000000..9d99b133679e --- /dev/null +++ b/TanuMusic/utils/inline/extras.py @@ -0,0 +1,41 @@ +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from config import SUPPORT_CHAT + + +def botplaylist_markup(_): + buttons = [ + [ + InlineKeyboardButton(text=_["S_B_9"], url=SUPPORT_CHAT), + InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close"), + ], + ] + return buttons + + +def close_markup(_): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ] + ] + ) + return upl + + +def supp_markup(_): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["S_B_9"], + url=SUPPORT_CHAT, + ), + ] + ] + ) + return upl diff --git a/TanuMusic/utils/inline/help.py b/TanuMusic/utils/inline/help.py new file mode 100644 index 000000000000..a32da9c13f55 --- /dev/null +++ b/TanuMusic/utils/inline/help.py @@ -0,0 +1,76 @@ +from typing import Union + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from TanuMusic import app + + +def help_pannel(_, START: Union[bool, int] = None): + first = [InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data=f"close")] + second = [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data=f"settingsback_helper", + ), + ] + mark = second if START else first + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["H_B_1"], + callback_data="help_callback hb1", + ), + InlineKeyboardButton( + text=_["H_B_2"], + callback_data="help_callback hb2", + ), + InlineKeyboardButton( + text=_["H_B_3"], + callback_data="help_callback hb3", + ), + ], + [ + InlineKeyboardButton( + text=_["H_B_4"], + callback_data="help_callback hb4", + ), + InlineKeyboardButton( + text=_["H_B_5"], + callback_data="help_callback hb5", + ), + InlineKeyboardButton( + text=_["H_B_6"], + callback_data="help_callback hb6", + ), + ], + mark, + ] + ) + return upl + + +def help_back_markup(_): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data=f"settings_back_helper", + ), + ] + ] + ) + return upl + + +def private_help_panel(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["S_B_4"], + url=f"https://t.me/{app.username}?start=help", + ), + ], + ] + return buttons diff --git a/TanuMusic/utils/inline/play.py b/TanuMusic/utils/inline/play.py new file mode 100644 index 000000000000..7615cc6dcf10 --- /dev/null +++ b/TanuMusic/utils/inline/play.py @@ -0,0 +1,186 @@ +import math +from config import SUPPORT_CHAT, OWNER_USERNAME +from pyrogram.types import InlineKeyboardButton +from TanuMusic.utils.formatters import time_to_seconds + + +def track_markup(_, videoid, user_id, channel, fplay): + buttons = [ + [ + InlineKeyboardButton( + text=_["P_B_1"], + callback_data=f"MusicStream {videoid}|{user_id}|a|{channel}|{fplay}", + ), + InlineKeyboardButton( + text=_["P_B_2"], + callback_data=f"MusicStream {videoid}|{user_id}|v|{channel}|{fplay}", + ), + ], + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data=f"forceclose {videoid}|{user_id}", + ) + ], + ] + return buttons + + +def stream_markup_timer(_, chat_id, played, dur): + played_sec = time_to_seconds(played) + duration_sec = time_to_seconds(dur) + percentage = (played_sec / duration_sec) * 100 + umm = math.floor(percentage) + if 0 < umm <= 10: + bar = "Ⓝ▱▱▱▱▱▱▱▱▰" + elif 10 < umm < 20: + bar = "▰Ⓝ▱▱▱▱▱▱▱▰" + elif 20 <= umm < 30: + bar = "▰▱Ⓝ▱▱▱▱▱▱▰" + elif 30 <= umm < 40: + bar = "▰▱▱Ⓝ▱▱▱▱▱▰" + elif 40 <= umm < 50: + bar = "▰▱▱▱Ⓝ▱▱▱▱▰" + elif 50 <= umm < 60: + bar = "▰▱▱▱▱Ⓝ▱▱▱▰" + elif 60 <= umm < 70: + bar = "▰▱▱▱▱▱Ⓝ▱▱▰" + elif 70 <= umm < 80: + bar = "▰▱▱▱▱▱▱Ⓝ▱▰" + elif 80 <= umm < 95: + bar = "▰▱▱▱▱▱▱▱Ⓝ▰" + else: + bar = "▰▱▱▱▱▱▱▱▱Ⓝ" + buttons = [ + [ + InlineKeyboardButton( + text=f"{played} {bar} {dur}", + callback_data="GetTimer", + ) + ], + [ + InlineKeyboardButton(text="◁", callback_data=f"ADMIN Resume|{chat_id}"), + InlineKeyboardButton(text="၊၊", callback_data=f"ADMIN Pause|{chat_id}"), + InlineKeyboardButton(text="▷", callback_data=f"ADMIN Skip|{chat_id}"), + InlineKeyboardButton(text="▢", callback_data=f"ADMIN Stop|{chat_id}"), + ], + [ + InlineKeyboardButton( + + text="ᴜᴘᴅᴀᴛᴇ", + + url=f"t.me/C0DE_SEARCH", + + ), + InlineKeyboardButton( + + text="sᴜᴘᴘᴏʀᴛ", + + url=f"t.me/AsuraaSupports", + + ), + ], + [InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close")], + ] + return buttons + + +def stream_markup(_, chat_id): + buttons = [ + [ + InlineKeyboardButton(text="◁", callback_data=f"ADMIN Resume|{chat_id}"), + InlineKeyboardButton(text="၊၊", callback_data=f"ADMIN Pause|{chat_id}"), + InlineKeyboardButton(text="▷", callback_data=f"ADMIN Skip|{chat_id}"), + InlineKeyboardButton(text="▢", callback_data=f"ADMIN Stop|{chat_id}"), + ], + [ + InlineKeyboardButton( + + text="ᴜᴘᴅᴀᴛᴇ", + + url=f"t.me/C0DE_SEARCH", + + ), + InlineKeyboardButton( + + text="sᴜᴘᴘᴏʀᴛ", + + url=f"t.me/AsuraaSupports", + + ), + ], + [InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close")], + ] + return buttons + + +def playlist_markup(_, videoid, user_id, ptype, channel, fplay): + buttons = [ + [ + InlineKeyboardButton( + text=_["P_B_1"], + callback_data=f"AnonyPlaylists {videoid}|{user_id}|{ptype}|a|{channel}|{fplay}", + ), + InlineKeyboardButton( + text=_["P_B_2"], + callback_data=f"AnonyPlaylists {videoid}|{user_id}|{ptype}|v|{channel}|{fplay}", + ), + ], + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data=f"forceclose {videoid}|{user_id}", + ), + ], + ] + return buttons + + +def livestream_markup(_, videoid, user_id, mode, channel, fplay): + buttons = [ + [ + InlineKeyboardButton( + text=_["P_B_3"], + callback_data=f"LiveStream {videoid}|{user_id}|{mode}|{channel}|{fplay}", + ), + ], + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data=f"forceclose {videoid}|{user_id}", + ), + ], + ] + return buttons + + +def slider_markup(_, videoid, user_id, query, query_type, channel, fplay): + query = f"{query[:20]}" + buttons = [ + [ + InlineKeyboardButton( + text=_["P_B_1"], + callback_data=f"MusicStream {videoid}|{user_id}|a|{channel}|{fplay}", + ), + InlineKeyboardButton( + text=_["P_B_2"], + callback_data=f"MusicStream {videoid}|{user_id}|v|{channel}|{fplay}", + ), + ], + [ + InlineKeyboardButton( + text="◁", + callback_data=f"slider B|{query_type}|{query}|{user_id}|{channel}|{fplay}", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data=f"forceclose {query}|{user_id}", + ), + InlineKeyboardButton( + text="▷", + callback_data=f"slider F|{query_type}|{query}|{user_id}|{channel}|{fplay}", + ), + ], + ] + return buttons + diff --git a/TanuMusic/utils/inline/queue.py b/TanuMusic/utils/inline/queue.py new file mode 100644 index 000000000000..59356ba0a2b5 --- /dev/null +++ b/TanuMusic/utils/inline/queue.py @@ -0,0 +1,81 @@ +from typing import Union + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + + +def queue_markup( + _, + DURATION, + CPLAY, + videoid, + played: Union[bool, int] = None, + dur: Union[bool, int] = None, +): + not_dur = [ + [ + InlineKeyboardButton( + text=_["QU_B_1"], + callback_data=f"GetQueued {CPLAY}|{videoid}", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ] + ] + dur = [ + [ + InlineKeyboardButton( + text=_["QU_B_2"].format(played, dur), + callback_data="GetTimer", + ) + ], + [ + InlineKeyboardButton( + text=_["QU_B_1"], + callback_data=f"GetQueued {CPLAY}|{videoid}", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ], + ] + upl = InlineKeyboardMarkup(not_dur if DURATION == "Unknown" else dur) + return upl + + +def queue_back_markup(_, CPLAY): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data=f"queue_back_timer {CPLAY}", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ] + ] + ) + return upl + + +def aq_markup(_, chat_id): + buttons = [ + [ + InlineKeyboardButton(text="◁", callback_data=f"ADMIN Resume|{chat_id}"), + InlineKeyboardButton(text="၊၊", callback_data=f"ADMIN Pause|{chat_id}"), + InlineKeyboardButton(text="▷", callback_data=f"ADMIN Skip|{chat_id}"), + InlineKeyboardButton(text="▢", callback_data=f"ADMIN Stop|{chat_id}"), + ], + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ] + ] + return buttons diff --git a/TanuMusic/utils/inline/settings.py b/TanuMusic/utils/inline/settings.py new file mode 100644 index 000000000000..904a53519a27 --- /dev/null +++ b/TanuMusic/utils/inline/settings.py @@ -0,0 +1,110 @@ +from typing import Union + +from pyrogram.types import InlineKeyboardButton + + +def setting_markup(_): + buttons = [ + [ + InlineKeyboardButton(text=_["ST_B_1"], callback_data="AU"), + InlineKeyboardButton(text=_["ST_B_3"], callback_data="LG"), + ], + [ + InlineKeyboardButton(text=_["ST_B_2"], callback_data="PM"), + ], + [ + InlineKeyboardButton(text=_["ST_B_4"], callback_data="VM"), + InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close"), + ], + ] + return buttons + + +def vote_mode_markup(_, current, mode: Union[bool, str] = None): + buttons = [ + [ + InlineKeyboardButton(text="ᴠᴏᴛɪɴɢ ᴍᴏᴅᴇ ➤", callback_data="VOTEANSWER"), + InlineKeyboardButton( + text=_["ST_B_5"] if mode == True else _["ST_B_6"], + callback_data="VOMODECHANGE", + ), + ], + [ + InlineKeyboardButton(text="-2", callback_data="FERRARIUDTI M"), + InlineKeyboardButton( + text=f"ᴄᴜʀʀᴇɴᴛ ➣ {current}", + callback_data="ANSWERVOMODE", + ), + InlineKeyboardButton(text="+2", callback_data="FERRARIUDTI A"), + ], + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data="settings_helper", + ), + InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close"), + ], + ] + return buttons + + +def auth_users_markup(_, status: Union[bool, str] = None): + buttons = [ + [ + InlineKeyboardButton(text=_["ST_B_7"], callback_data="AUTHANSWER"), + InlineKeyboardButton( + text=_["ST_B_8"] if status == True else _["ST_B_9"], + callback_data="AUTH", + ), + ], + [ + InlineKeyboardButton(text=_["ST_B_1"], callback_data="AUTHLIST"), + ], + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data="settings_helper", + ), + InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close"), + ], + ] + return buttons + + +def playmode_users_markup( + _, + Direct: Union[bool, str] = None, + Group: Union[bool, str] = None, + Playtype: Union[bool, str] = None, +): + buttons = [ + [ + InlineKeyboardButton(text=_["ST_B_10"], callback_data="SEARCHANSWER"), + InlineKeyboardButton( + text=_["ST_B_11"] if Direct == True else _["ST_B_12"], + callback_data="MODECHANGE", + ), + ], + [ + InlineKeyboardButton(text=_["ST_B_13"], callback_data="AUTHANSWER"), + InlineKeyboardButton( + text=_["ST_B_8"] if Group == True else _["ST_B_9"], + callback_data="CHANNELMODECHANGE", + ), + ], + [ + InlineKeyboardButton(text=_["ST_B_14"], callback_data="PLAYTYPEANSWER"), + InlineKeyboardButton( + text=_["ST_B_8"] if Playtype == True else _["ST_B_9"], + callback_data="PLAYTYPECHANGE", + ), + ], + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data="settings_helper", + ), + InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close"), + ], + ] + return buttons diff --git a/TanuMusic/utils/inline/speed.py b/TanuMusic/utils/inline/speed.py new file mode 100644 index 000000000000..25c2429b8c6f --- /dev/null +++ b/TanuMusic/utils/inline/speed.py @@ -0,0 +1,41 @@ +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + + +def speed_markup(_, chat_id): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🕒 0.5x", + callback_data=f"SpeedUP {chat_id}|0.5", + ), + InlineKeyboardButton( + text="🕓 0.75x", + callback_data=f"SpeedUP {chat_id}|0.75", + ), + ], + [ + InlineKeyboardButton( + text=_["P_B_4"], + callback_data=f"SpeedUP {chat_id}|1.0", + ), + ], + [ + InlineKeyboardButton( + text="🕤 1.5x", + callback_data=f"SpeedUP {chat_id}|1.5", + ), + InlineKeyboardButton( + text="🕛 2.0x", + callback_data=f"SpeedUP {chat_id}|2.0", + ), + ], + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ], + ] + ) + return upl diff --git a/TanuMusic/utils/inline/start.py b/TanuMusic/utils/inline/start.py new file mode 100644 index 000000000000..08f254cf322c --- /dev/null +++ b/TanuMusic/utils/inline/start.py @@ -0,0 +1,33 @@ +from pyrogram.types import InlineKeyboardButton + +import config +from TanuMusic import app + + +def start_panel(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["S_B_1"], url=f"https://t.me/{app.username}?startgroup=true" + ), + InlineKeyboardButton(text=_["S_B_2"], url=config.SUPPORT_CHAT), + ], + ] + return buttons + + +def private_panel(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["S_B_3"], + url=f"https://t.me/{app.username}?startgroup=true", + ) + ], + [ + InlineKeyboardButton(text=_["S_B_5"], user_id=config.OWNER_ID), + InlineKeyboardButton(text=_["S_B_2"], url=config.SUPPORT_CHAT), + ], + [InlineKeyboardButton(text=_["S_B_4"], callback_data="settings_back_helper")], + ] + return buttons diff --git a/TanuMusic/utils/inline/stats.py b/TanuMusic/utils/inline/stats.py new file mode 100644 index 000000000000..8bed88089ef6 --- /dev/null +++ b/TanuMusic/utils/inline/stats.py @@ -0,0 +1,50 @@ +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + + +def stats_buttons(_, status): + not_sudo = [ + InlineKeyboardButton( + text=_["SA_B_1"], + callback_data="TopOverall", + ) + ] + sudo = [ + InlineKeyboardButton( + text=_["SA_B_2"], + callback_data="bot_stats_sudo", + ), + InlineKeyboardButton( + text=_["SA_B_3"], + callback_data="TopOverall", + ), + ] + upl = InlineKeyboardMarkup( + [ + sudo if status else not_sudo, + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ], + ] + ) + return upl + + +def back_stats_buttons(_): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data="stats_back", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ], + ] + ) + return upl diff --git a/TanuMusic/utils/inlinequery.py b/TanuMusic/utils/inlinequery.py new file mode 100644 index 000000000000..26f08e32b9b6 --- /dev/null +++ b/TanuMusic/utils/inlinequery.py @@ -0,0 +1,62 @@ +from pyrogram.types import InlineQueryResultArticle, InputTextMessageContent + +answer = [] + +answer.extend( + [ + InlineQueryResultArticle( + title="ᴘᴀᴜsᴇ sᴛʀᴇᴀᴍ", + description=f"ᴘᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴘʟᴀʏɪɴɢ sᴏɴɢ ᴏɴ ᴠᴏɪᴄᴇᴄʜᴀᴛ.", + thumb_url="https://telegra.ph/file/c0a1c789def7b93f13745.png", + input_message_content=InputTextMessageContent("/pause"), + ), + InlineQueryResultArticle( + title="ʀᴇsᴜᴍᴇ sᴛʀᴇᴀᴍ", + description=f"ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴘᴀᴜsᴇᴅ sᴏɴɢ ᴏɴ ᴠᴏɪᴄᴇᴄʜᴀᴛ.", + thumb_url="https://telegra.ph/file/02d1b7f967ca11404455a.png", + input_message_content=InputTextMessageContent("/resume"), + ), + InlineQueryResultArticle( + title="ᴍᴜᴛᴇ sᴛʀᴇᴀᴍ", + description=f"ᴍᴜᴛᴇ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴏɴɢ ᴏɴ ᴠᴏɪᴄᴇᴄʜᴀᴛ", + thumb_url="https://telegra.ph/file/66516f2976cb6d87e20f9.png", + input_message_content=InputTextMessageContent("/vcmute"), + ), + InlineQueryResultArticle( + title="ᴜɴᴍᴜᴛᴇ sᴛʀᴇᴀᴍ", + description=f"ᴜɴᴍᴜᴛᴇ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴏɴɢ ᴏɴ ᴠᴏɪᴄᴇᴄʜᴀᴛ", + thumb_url="https://telegra.ph/file/3078794f9341ffd582e18.png", + input_message_content=InputTextMessageContent("/vcunmute"), + ), + InlineQueryResultArticle( + title="sᴋɪᴘ sᴛʀᴇᴀᴍ", + description=f"sᴋɪᴘ ᴛᴏ ɴᴇxᴛ ᴛʀᴀᴄᴋ. | sᴋɪᴘ ᴛᴏ ɴᴇxᴛ ᴛʀᴀᴄᴋ. | ғᴏʀ sᴘᴇᴄɪғɪᴄ ᴛʀᴀᴄᴋ ɴᴜᴍʙᴇʀ: /skip [number] ", + thumb_url="https://telegra.ph/file/98b88e52bc625903c7a2f.png", + input_message_content=InputTextMessageContent("/skip"), + ), + InlineQueryResultArticle( + title="ᴇɴᴅ sᴛʀᴇᴀᴍ", + description="sᴛᴏᴘ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴏɴɢ ᴏɴ ɢʀᴏᴜᴘ ᴠᴏɪᴄᴇᴄʜᴀᴛ.", + thumb_url="https://telegra.ph/file/d2eb03211baaba8838cc4.png", + input_message_content=InputTextMessageContent("/stop"), + ), + InlineQueryResultArticle( + title="sʜᴜғғʟᴇ sᴛʀᴇᴀᴍ", + description="sʜᴜғғʟᴇ ᴛʜᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ʟɪsᴛ.", + thumb_url="https://telegra.ph/file/7f6aac5c6e27d41a4a269.png", + input_message_content=InputTextMessageContent("/shuffle"), + ), + InlineQueryResultArticle( + title="sᴇᴇᴋ sᴛʀᴇᴀᴍ", + description="sᴇᴇᴋ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴛᴏ ᴀ sᴘᴇᴄɪғɪᴄ ᴅᴜʀᴀᴛɪᴏɴ.", + thumb_url="https://telegra.ph/file/cd25ec6f046aa8003cfee.png", + input_message_content=InputTextMessageContent("/seek 10"), + ), + InlineQueryResultArticle( + title="ʟᴏᴏᴘ sᴛʀᴇᴀᴍ", + description="ʟᴏᴏᴘ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴘʟᴀʏɪɴɢ ᴍᴜsɪᴄ. ᴜsᴀsɢᴇ: /loop [enable|disable]", + thumb_url="https://telegra.ph/file/081c20ce2074ea3e9b952.png", + input_message_content=InputTextMessageContent("/loop 3"), + ), + ] +) \ No newline at end of file diff --git a/TanuMusic/utils/logger.py b/TanuMusic/utils/logger.py new file mode 100644 index 000000000000..06ce91c8de01 --- /dev/null +++ b/TanuMusic/utils/logger.py @@ -0,0 +1,33 @@ +from pyrogram.enums import ParseMode + +from TanuMusic import app +from TanuMusic.utils.database import is_on_off +from config import LOGGER_ID + + +async def play_logs(message, streamtype): + if await is_on_off(2): + logger_text = f""" + ❖ {app.mention} ᴘʟᴀʏ ʟᴏɢ ❖ + +● ᴄʜᴀᴛ ɪᴅ ➥ {message.chat.id} +● ᴄʜᴀᴛ ɴᴀᴍᴇ ➥ {message.chat.title} +● ᴄʜᴀᴛ ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.chat.username} + +● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id} +● ɴᴀᴍᴇ ➥ {message.from_user.mention} +● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username} + +● ǫᴜᴇʀʏ ➥ {message.text.split(None, 1)[1]} +● sᴛʀᴇᴀᴍᴛʏᴘᴇ ➥ {streamtype}""" + if message.chat.id != LOGGER_ID: + try: + await app.send_message( + chat_id=LOGGER_ID, + text=logger_text, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + except: + pass + return diff --git a/TanuMusic/utils/mongo.py b/TanuMusic/utils/mongo.py new file mode 100644 index 000000000000..722f062ec1d5 --- /dev/null +++ b/TanuMusic/utils/mongo.py @@ -0,0 +1,8 @@ +from typing import Dict, Union + +from motor.motor_asyncio import AsyncIOMotorClient as MongoCli + +from config import MONGO_DB_URI + +mongo = MongoCli(MONGO_DB_URI) +db = mongo.TanuMusic diff --git a/TanuMusic/utils/pastebin.py b/TanuMusic/utils/pastebin.py new file mode 100644 index 000000000000..bac569c2057f --- /dev/null +++ b/TanuMusic/utils/pastebin.py @@ -0,0 +1,21 @@ +import aiohttp + +BASE = "https://batbin.me/" + + +async def post(url: str, *args, **kwargs): + async with aiohttp.ClientSession() as session: + async with session.post(url, *args, **kwargs) as resp: + try: + data = await resp.json() + except Exception: + data = await resp.text() + return data + + +async def Bin(text): + resp = await post(f"{BASE}api/v2/paste", data=text) + if not resp["success"]: + return + link = BASE + resp["message"] + return link diff --git a/TanuMusic/utils/stream/autoclear.py b/TanuMusic/utils/stream/autoclear.py new file mode 100644 index 000000000000..92c8104634be --- /dev/null +++ b/TanuMusic/utils/stream/autoclear.py @@ -0,0 +1,18 @@ +import os + +from config import autoclean + + +async def auto_clean(popped): + try: + rem = popped["file"] + autoclean.remove(rem) + count = autoclean.count(rem) + if count == 0: + if "vid_" not in rem or "live_" not in rem or "index_" not in rem: + try: + os.remove(rem) + except: + pass + except: + pass diff --git a/TanuMusic/utils/stream/queue.py b/TanuMusic/utils/stream/queue.py new file mode 100644 index 000000000000..82d41e9d88d7 --- /dev/null +++ b/TanuMusic/utils/stream/queue.py @@ -0,0 +1,91 @@ +import asyncio +from typing import Union + +from TanuMusic.misc import db +from TanuMusic.utils.formatters import check_duration, seconds_to_min +from config import autoclean, time_to_seconds + + +async def put_queue( + chat_id, + original_chat_id, + file, + title, + duration, + user, + vidid, + user_id, + stream, + forceplay: Union[bool, str] = None, +): + title = title.title() + try: + duration_in_seconds = time_to_seconds(duration) - 3 + except: + duration_in_seconds = 0 + put = { + "title": title, + "dur": duration, + "streamtype": stream, + "by": user, + "user_id": user_id, + "chat_id": original_chat_id, + "file": file, + "vidid": vidid, + "seconds": duration_in_seconds, + "played": 0, + } + if forceplay: + check = db.get(chat_id) + if check: + check.insert(0, put) + else: + db[chat_id] = [] + db[chat_id].append(put) + else: + db[chat_id].append(put) + autoclean.append(file) + + +async def put_queue_index( + chat_id, + original_chat_id, + file, + title, + duration, + user, + vidid, + stream, + forceplay: Union[bool, str] = None, +): + if "20.212.146.162" in vidid: + try: + dur = await asyncio.get_event_loop().run_in_executor( + None, check_duration, vidid + ) + duration = seconds_to_min(dur) + except: + duration = "ᴜʀʟ sᴛʀᴇᴀᴍ" + dur = 0 + else: + dur = 0 + put = { + "title": title, + "dur": duration, + "streamtype": stream, + "by": user, + "chat_id": original_chat_id, + "file": file, + "vidid": vidid, + "seconds": dur, + "played": 0, + } + if forceplay: + check = db.get(chat_id) + if check: + check.insert(0, put) + else: + db[chat_id] = [] + db[chat_id].append(put) + else: + db[chat_id].append(put) diff --git a/TanuMusic/utils/stream/stream.py b/TanuMusic/utils/stream/stream.py new file mode 100644 index 000000000000..0734b372aeb5 --- /dev/null +++ b/TanuMusic/utils/stream/stream.py @@ -0,0 +1,420 @@ +import os +from random import randint +from typing import Union + +from pyrogram.types import InlineKeyboardMarkup + +import config +from TanuMusic import Carbon, YouTube, app +from TanuMusic.core.call import Tanu +from TanuMusic.misc import db +from TanuMusic.utils.database import add_active_video_chat, is_active_chat +from TanuMusic.utils.exceptions import AssistantErr +from TanuMusic.utils.inline import aq_markup, close_markup, stream_markup +from TanuMusic.utils.pastebin import Bin +from TanuMusic.utils.stream.queue import put_queue, put_queue_index +from TanuMusic.utils.thumbnails import get_thumb + + +async def stream( + _, + mystic, + user_id, + result, + chat_id, + user_name, + original_chat_id, + video: Union[bool, str] = None, + streamtype: Union[bool, str] = None, + spotify: Union[bool, str] = None, + forceplay: Union[bool, str] = None, +): + if not result: + return + if forceplay: + await Tanu.force_stop_stream(chat_id) + if streamtype == "playlist": + msg = f"{_['play_19']}\n\n" + count = 0 + for search in result: + if int(count) == config.PLAYLIST_FETCH_LIMIT: + continue + try: + ( + title, + duration_min, + duration_sec, + thumbnail, + vidid, + ) = await YouTube.details(search, False if spotify else True) + except: + continue + if str(duration_min) == "None": + continue + if duration_sec > config.DURATION_LIMIT: + continue + if await is_active_chat(chat_id): + await put_queue( + chat_id, + original_chat_id, + f"vid_{vidid}", + title, + duration_min, + user_name, + vidid, + user_id, + "video" if video else "audio", + ) + position = len(db.get(chat_id)) - 1 + count += 1 + msg += f"{count}. {title[:70]}\n" + msg += f"{_['play_20']} {position}\n\n" + else: + if not forceplay: + db[chat_id] = [] + status = True if video else None + try: + file_path, direct = await YouTube.download( + vidid, mystic, video=status, videoid=True + ) + except: + raise AssistantErr(_["play_14"]) + await Tanu.join_call( + chat_id, + original_chat_id, + file_path, + video=status, + image=thumbnail, + ) + await put_queue( + chat_id, + original_chat_id, + file_path if direct else f"vid_{vidid}", + title, + duration_min, + user_name, + vidid, + user_id, + "video" if video else "audio", + forceplay=forceplay, + ) + img = await get_thumb(vidid) + button = stream_markup(_, chat_id) + run = await app.send_photo( + original_chat_id, + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{vidid}", + title[:23], + duration_min, + user_name, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" + if count == 0: + return + else: + link = await Bin(msg) + lines = msg.count("\n") + if lines >= 17: + car = os.linesep.join(msg.split(os.linesep)[:17]) + else: + car = msg + carbon = await Carbon.generate(car, randint(100, 10000000)) + upl = close_markup(_) + return await app.send_photo( + original_chat_id, + photo=carbon, + caption=_["play_21"].format(position, link), + reply_markup=upl, + ) + elif streamtype == "youtube": + link = result["link"] + vidid = result["vidid"] + title = (result["title"]).title() + duration_min = result["duration_min"] + thumbnail = result["thumb"] + status = True if video else None + try: + file_path, direct = await YouTube.download( + vidid, mystic, videoid=True, video=status + ) + except: + raise AssistantErr(_["play_14"]) + if await is_active_chat(chat_id): + await put_queue( + chat_id, + original_chat_id, + file_path if direct else f"vid_{vidid}", + title, + duration_min, + user_name, + vidid, + user_id, + "video" if video else "audio", + ) + position = len(db.get(chat_id)) - 1 + button = aq_markup(_, chat_id) + await app.send_message( + chat_id=original_chat_id, + text=_["queue_4"].format(position, title[:27], duration_min, user_name), + reply_markup=InlineKeyboardMarkup(button), + ) + else: + if not forceplay: + db[chat_id] = [] + await Tanu.join_call( + chat_id, + original_chat_id, + file_path, + video=status, + image=thumbnail, + ) + await put_queue( + chat_id, + original_chat_id, + file_path if direct else f"vid_{vidid}", + title, + duration_min, + user_name, + vidid, + user_id, + "video" if video else "audio", + forceplay=forceplay, + ) + img = await get_thumb(vidid) + button = stream_markup(_, chat_id) + run = await app.send_photo( + original_chat_id, + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{vidid}", + title[:23], + duration_min, + user_name, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" + elif streamtype == "soundcloud": + file_path = result["filepath"] + title = result["title"] + duration_min = result["duration_min"] + if await is_active_chat(chat_id): + await put_queue( + chat_id, + original_chat_id, + file_path, + title, + duration_min, + user_name, + streamtype, + user_id, + "audio", + ) + position = len(db.get(chat_id)) - 1 + button = aq_markup(_, chat_id) + await app.send_message( + chat_id=original_chat_id, + text=_["queue_4"].format(position, title[:27], duration_min, user_name), + reply_markup=InlineKeyboardMarkup(button), + ) + else: + if not forceplay: + db[chat_id] = [] + await Tanu.join_call(chat_id, original_chat_id, file_path, video=None) + await put_queue( + chat_id, + original_chat_id, + file_path, + title, + duration_min, + user_name, + streamtype, + user_id, + "audio", + forceplay=forceplay, + ) + button = stream_markup(_, chat_id) + run = await app.send_photo( + original_chat_id, + photo=config.SOUNCLOUD_IMG_URL, + caption=_["stream_1"].format( + config.SUPPORT_CHAT, title[:23], duration_min, user_name + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif streamtype == "telegram": + file_path = result["path"] + link = result["link"] + title = (result["title"]).title() + duration_min = result["dur"] + status = True if video else None + if await is_active_chat(chat_id): + await put_queue( + chat_id, + original_chat_id, + file_path, + title, + duration_min, + user_name, + streamtype, + user_id, + "video" if video else "audio", + ) + position = len(db.get(chat_id)) - 1 + button = aq_markup(_, chat_id) + await app.send_message( + chat_id=original_chat_id, + text=_["queue_4"].format(position, title[:27], duration_min, user_name), + reply_markup=InlineKeyboardMarkup(button), + ) + else: + if not forceplay: + db[chat_id] = [] + await Tanu.join_call(chat_id, original_chat_id, file_path, video=status) + await put_queue( + chat_id, + original_chat_id, + file_path, + title, + duration_min, + user_name, + streamtype, + user_id, + "video" if video else "audio", + forceplay=forceplay, + ) + if video: + await add_active_video_chat(chat_id) + button = stream_markup(_, chat_id) + run = await app.send_photo( + original_chat_id, + photo=config.TELEGRAM_VIDEO_URL if video else config.TELEGRAM_AUDIO_URL, + caption=_["stream_1"].format(link, title[:23], duration_min, user_name), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif streamtype == "live": + link = result["link"] + vidid = result["vidid"] + title = (result["title"]).title() + thumbnail = result["thumb"] + duration_min = "Live Track" + status = True if video else None + if await is_active_chat(chat_id): + await put_queue( + chat_id, + original_chat_id, + f"live_{vidid}", + title, + duration_min, + user_name, + vidid, + user_id, + "video" if video else "audio", + ) + position = len(db.get(chat_id)) - 1 + button = aq_markup(_, chat_id) + await app.send_message( + chat_id=original_chat_id, + text=_["queue_4"].format(position, title[:27], duration_min, user_name), + reply_markup=InlineKeyboardMarkup(button), + ) + else: + if not forceplay: + db[chat_id] = [] + n, file_path = await YouTube.video(link) + if n == 0: + raise AssistantErr(_["str_3"]) + await Tanu.join_call( + chat_id, + original_chat_id, + file_path, + video=status, + image=thumbnail if thumbnail else None, + ) + await put_queue( + chat_id, + original_chat_id, + f"live_{vidid}", + title, + duration_min, + user_name, + vidid, + user_id, + "video" if video else "audio", + forceplay=forceplay, + ) + img = await get_thumb(vidid) + button = stream_markup(_, chat_id) + run = await app.send_photo( + original_chat_id, + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{vidid}", + title[:23], + duration_min, + user_name, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif streamtype == "index": + link = result + title = "ɪɴᴅᴇx ᴏʀ ᴍ3ᴜ8 ʟɪɴᴋ" + duration_min = "00:00" + if await is_active_chat(chat_id): + await put_queue_index( + chat_id, + original_chat_id, + "index_url", + title, + duration_min, + user_name, + link, + "video" if video else "audio", + ) + position = len(db.get(chat_id)) - 1 + button = aq_markup(_, chat_id) + await mystic.edit_text( + text=_["queue_4"].format(position, title[:27], duration_min, user_name), + reply_markup=InlineKeyboardMarkup(button), + ) + else: + if not forceplay: + db[chat_id] = [] + await Tanu.join_call( + chat_id, + original_chat_id, + link, + video=True if video else None, + ) + await put_queue_index( + chat_id, + original_chat_id, + "index_url", + title, + duration_min, + user_name, + link, + "video" if video else "audio", + forceplay=forceplay, + ) + button = stream_markup(_, chat_id) + run = await app.send_photo( + original_chat_id, + photo=config.STREAM_IMG_URL, + caption=_["stream_2"].format(user_name), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + await mystic.delete() diff --git a/TanuMusic/utils/sys.py b/TanuMusic/utils/sys.py new file mode 100644 index 000000000000..0ffcfe608c03 --- /dev/null +++ b/TanuMusic/utils/sys.py @@ -0,0 +1,15 @@ +import time + +import psutil + +from TanuMusic.misc import _boot_ +from TanuMusic.utils.formatters import get_readable_time + + +async def bot_sys_stats(): + bot_uptime = int(time.time() - _boot_) + UP = f"{get_readable_time(bot_uptime)}" + CPU = f"{psutil.cpu_percent(interval=0.5)}%" + RAM = f"{psutil.virtual_memory().percent}%" + DISK = f"{psutil.disk_usage('/').percent}%" + return UP, CPU, RAM, DISK diff --git a/TanuMusic/utils/thumbnails.py b/TanuMusic/utils/thumbnails.py new file mode 100644 index 000000000000..c55d13d316cb --- /dev/null +++ b/TanuMusic/utils/thumbnails.py @@ -0,0 +1,163 @@ +import os +import re +import aiofiles +import aiohttp +from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont, ImageOps +from unidecode import unidecode +from youtubesearchpython.__future__ import VideosSearch +from TanuMusic import app +from config import YOUTUBE_IMG_URL + +def changeImageSize(maxWidth, maxHeight, image): + widthRatio = maxWidth / image.size[0] + heightRatio = maxHeight / image.size[1] + newWidth = int(widthRatio * image.size[0]) + newHeight = int(heightRatio * image.size[1]) + newImage = image.resize((newWidth, newHeight)) + return newImage + +def truncate(text): + list = text.split(" ") + text1 = "" + text2 = "" + for i in list: + if len(text1) + len(i) < 30: + text1 += " " + i + elif len(text2) + len(i) < 30: + text2 += " " + i + + text1 = text1.strip() + text2 = text2.strip() + return [text1,text2] + +def crop_center_circle(img, output_size, border, crop_scale=1.5): + half_the_width = img.size[0] / 2 + half_the_height = img.size[1] / 2 + larger_size = int(output_size * crop_scale) + img = img.crop( + ( + half_the_width - larger_size/2, + half_the_height - larger_size/2, + half_the_width + larger_size/2, + half_the_height + larger_size/2 + ) + ) + + img = img.resize((output_size - 2*border, output_size - 2*border)) + + + final_img = Image.new("RGBA", (output_size, output_size), "pink") + + + mask_main = Image.new("L", (output_size - 2*border, output_size - 2*border), 0) + draw_main = ImageDraw.Draw(mask_main) + draw_main.ellipse((0, 0, output_size - 2*border, output_size - 2*border), fill=255) + + final_img.paste(img, (border, border), mask_main) + + + mask_border = Image.new("L", (output_size, output_size), 0) + draw_border = ImageDraw.Draw(mask_border) + draw_border.ellipse((0, 0, output_size, output_size), fill=255) + + result = Image.composite(final_img, Image.new("RGBA", final_img.size, (0, 0, 0, 0)), mask_border) + + return result + + + +async def get_thumb(videoid): + if os.path.isfile(f"cache/{videoid}_v4.png"): + return f"cache/{videoid}_v4.png" + + url = f"https://www.youtube.com/watch?v={videoid}" + results = VideosSearch(url, limit=1) + for result in (await results.next())["result"]: + try: + title = result["title"] + title = re.sub("\W+", " ", title) + title = title.title() + except: + title = "Unsupported Title" + try: + duration = result["duration"] + except: + duration = "Unknown Mins" + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + try: + views = result["viewCount"]["short"] + except: + views = "Unknown Views" + try: + channel = result["channel"]["name"] + except: + channel = "Unknown Channel" + + async with aiohttp.ClientSession() as session: + async with session.get(thumbnail) as resp: + if resp.status == 200: + f = await aiofiles.open(f"cache/thumb{videoid}.png", mode="wb") + await f.write(await resp.read()) + await f.close() + + youtube = Image.open(f"cache/thumb{videoid}.png") + image1 = changeImageSize(1280, 720, youtube) + image2 = image1.convert("RGBA") + background = image2.filter(filter=ImageFilter.BoxBlur(20)) + enhancer = ImageEnhance.Brightness(background) + background = enhancer.enhance(0.6) + draw = ImageDraw.Draw(background) + arial = ImageFont.truetype("TanuMusic/assets/font2.ttf", 30) + font = ImageFont.truetype("TanuMusic/assets/font.ttf", 30) + title_font = ImageFont.truetype("TanuMusic/assets/font3.ttf", 45) + + + circle_thumbnail = crop_center_circle(youtube, 400, 20) + circle_thumbnail = circle_thumbnail.resize((400, 400)) + circle_position = (120, 160) + background.paste(circle_thumbnail, circle_position, circle_thumbnail) + + text_x_position = 565 + + title1 = truncate(title) + draw.text((text_x_position, 180), title1[0], fill=(255, 255, 255), font=title_font) + draw.text((text_x_position, 230), title1[1], fill=(255, 255, 255), font=title_font) + draw.text((text_x_position, 320), f"{channel} | {views[:23]}", (255, 255, 255), font=arial) + draw.text((10, 10), f"TANU MUSIC", fill="yellow", font=font) + + + line_length = 580 + + + red_length = int(line_length * 0.6) + white_length = line_length - red_length + + + start_point_red = (text_x_position, 380) + end_point_red = (text_x_position + red_length, 380) + draw.line([start_point_red, end_point_red], fill="red", width=9) + + + start_point_white = (text_x_position + red_length, 380) + end_point_white = (text_x_position + line_length, 380) + draw.line([start_point_white, end_point_white], fill="white", width=8) + + + circle_radius = 10 + circle_position = (end_point_red[0], end_point_red[1]) + draw.ellipse([circle_position[0] - circle_radius, circle_position[1] - circle_radius, + circle_position[0] + circle_radius, circle_position[1] + circle_radius], fill="red") + draw.text((text_x_position, 400), "00:00", (255, 255, 255), font=arial) + draw.text((1080, 400), duration, (255, 255, 255), font=arial) + + play_icons = Image.open("TanuMusic/assets/play_icons.png") + play_icons = play_icons.resize((580, 62)) + background.paste(play_icons, (text_x_position, 450), play_icons) + + try: + os.remove(f"cache/thumb{videoid}.png") + except: + pass + background.save(f"cache/{videoid}_v4.png") + return f"cache/{videoid}_v4.png" + diff --git a/app.json b/app.json new file mode 100644 index 000000000000..887651b622a9 --- /dev/null +++ b/app.json @@ -0,0 +1,73 @@ +{ + "name": "TANU MUSIC", + "description": "A Telegram Music Player Bot, written in Python with Pyrogram and Py-Tgcalls.", + "logo": "https://te.legra.ph/file/b8a0c1a00db3e57522b53.jpg", + "keywords": [ + "python3", + "telegram", + "bot", + "AnonX", + "MusicBot", + "telegram-bot", + "pyrogram" + ], + "env": { + "API_ID": { + "description": "Get this value from https://my.telegram.org", + "value": "", + "required": true + }, + "API_HASH": { + "description": "Get this value from https://my.telegram.org", + "value": "", + "required": true + }, + "BOT_TOKEN": { + "description": "A Bot's token from Botfather", + "value": "", + "required": true + }, + "MONGO_DB_URI": { + "description": "Get a mongodb url from https://cloud.mongodb.com.", + "value": "", + "required": true + }, + "OWNER_ID": { + "description": "The user id of user whom you would like to add as OWNER.", + "value": "6922271843", + "required": true + }, + "STRING_SESSION": { + "description": "A Pyrogram v2 String Session.", + "value": "", + "required": true + }, + "HEROKU_API_KEY": { + "description": "Your Heroku account's API key", + "value": "", + "required": false + }, + "HEROKU_APP_NAME": { + "description": "Your heroku app name", + "value": "", + "required": false + }, + "LOGGER_ID": { + "description": "Your Log Group ID, add your bot and promote as an admin with full rights!. Channel ki id mat daal dena bsdk.", + "value": "", + "required": true + } + }, + "buildpacks": [ + { + "url": "heroku/python" + }, + { + "url": "heroku/nodejs" + }, + { + "url": "https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.git" + } + ], + "stack": "container" + } diff --git a/config/ConfigReadme.md b/config/ConfigReadme.md new file mode 100644 index 000000000000..708fde58c19a --- /dev/null +++ b/config/ConfigReadme.md @@ -0,0 +1,115 @@ +# Tanu Music Bot Configs + +Config vars are basically the variables which configure or modify bot to function, which are the basic necessities of plugins or code to work. You have to set the proper mandatory vars to make it functional and to start the basic feature of bot. + +### Get to know about all these vars in depth from our Docs. [Read Now from Here](https://notreallyshikhar.gitbook.io/yukkimusicbot/config-vars/available-vars) + +## Mandatory Vars + +- These are the minimum required vars need to setup to make Tanu Music Bot functional. + +1. `API_ID` : Get it from my.telegram.org +2. `API_HASH` : Get it from my.telegram.org +3. `BOT_TOKEN` : Get it from [@Botfather](http://t.me/BotFather) in Telegram +4. `MONGO_DB_URI` : Get mongo db [from here.](https://notreallyshikhar.gitbook.io/yukkimusicbot/deployment/mongodb) +5. `LOGGER_ID` : You'll need a Private Group ID for this. Supergroup Needed with id starting from -100 +6. `OWNER_ID` : Your Owner ID for managing your bot. +7. `STRING_SESSION` : Pyrogram Session Needed +8. `COOKIES` : Add youtube cookies in cookies.txt on cookies folders + +## Non-Mandatory Vars + +- These are the extra vars for extra features inside Music Bot. You can leave non mandatory vars for now and can add them later. + +1. `DURATION_LIMIT` : Custom max audio(music) duration for voice chat. Default to 60 mins. +2. `SONG_DOWNLOAD_DURATION_LIMIT` : Duration Limit for downloading Songs in MP3 or MP4 format from bot. Default to 180 mins. +3. `VIDEO_STREAM_LIMIT` : Maximum number of video calls allowed on bot. You can later set it via /set_video_limit on telegram. Default to 3 chats. +4. `SERVER_PLAYLIST_LIMIT` : Maximum Limit Allowed for users to save playlists on bot's server. Default to 30 +5. `PLAYLIST_FETCH_LIMIT` : Maximum limit for fetching playlist's track from youtube, spotify, apple links. Default to 25 +6. `CLEANMODE_MINS` : Cleanmode time after which bot will delete its old messages from chats. Default to 5 Mins. +7. `SUPPORT_CHANNEL` : If you've any channel for your music bot , fill it with your channel link +8. `SUPPORT_GROUP` : If you've any group support for your music bot , fill it with your group link + +## Play FileSize Limit Vars + +- Maximum File size limit for the audio and videos that a user can play from your bot. [Only Bytes Size Accepted] +> You can convert mb into bytes from https://www.gbmb.org/mb-to-bytes and use it here + +1. `TG_AUDIO_FILESIZE_LIMIT` : Maximum file size limit for audio files which can be streamed over vc. Defaults to 104857600 bytes, i.e. 100MB +2. `TG_VIDEO_FILESIZE_LIMIT` : Maximum file size limit for video files which can be played. Defaults to 1073741824 bytes, i.e. 1024MB or 1GB + + +## Bot Vars + +- These all vars are used for setting up bot. You can edit these vars if you want , else leave all of them as it is. + +1. `PRIVATE_BOT_MODE` : Set it `True` if you want your bot to be private only or False for all groups. Default to False +2. `YOUTUBE_EDIT_SLEEP` : Time sleep duration For Youtube Downloader. Default to 3 seconds +3. `TELEGRAM_EDIT_SLEEP` : Time sleep duration For Telegram Downloader. Default to 5 seconds +4. `AUTO_LEAVING_ASSISTANT` : Set it in `True` if you want to leave your assistant after a certain amount of time. +5. `ASSISTANT_LEAVE_TIME` : Time after which your assistant account will leave served chats automatically. Default to 5400 seconds, i.e 90 Mins +6. `AUTO_DOWNLOADS_CLEAR` : Set it `True` if you want to delete downloads after the music playout ends. +7. `AUTO_SUGGESTION_MODE` : Set it `True` if you want to bot to suggest about bot commands to random chats of your bots. +9. `AUTO_SUGGESTION_TIME` : Time after which your bot will suggest random 1/10 chats of your served chats about bot commands. Default to 5400 seconds, i.e 90 Mins +10. `SET_CMDS` : Set it to `True` if you want your bot to set the commands for chat menu automatically. [Reference](https://i.postimg.cc/Bbg3LQTG/image.png) + +## Spotify Vars + +- You can play tracks or playlists from spotify from Tanu Music bot +- You'll need these two vars to make spotify play working. This is not essential , you can leave them blank if you want. + +### How to get these? [Read from here](https://notreallyshikhar.gitbook.io/yukkimusicbot/deployment/spotify) + + +1. `SPOTIFY_CLIENT_ID` : Get it from https://developer.spotify.com/dashboard +2. `SPOTIFY_CLIENT_SECRET` : Get it from https://developer.spotify.com/dashboard + +## Heroku Vars + +- To work some Heroku compatible modules, this var value required to Access your account to use `get_log`, `usage`, `update` etc etc commands. +- You can fill this var using your API key or Authorization token. + +### How to get these? [Read from here](https://notreallyshikhar.gitbook.io/yukkimusicbot/config-vars/heroku-vars) + +1. `HEROKU_API_KEY` : Get it from http://dashboard.heroku.com/account +2. `HEROKU_APP_NAME` : You have to Enter the app name which you gave to identify your Music Bot in Heroku. + + +## Custom Repo Vars + +- If you plan to use Tanu Music Bot with your own customized or modified code. + +1. `UPSTREAM_REPO` : Your Upstream Repo URL or Forked Repo. +2. `UPSTREAM_BRANCH` : Default Branch of your Upstream Repo URL or Forked Repo. +3. `GIT_TOKEN` : Your GIT TOKEN if your upstream repo is private +4. `GITHUB_REPO` : Your Github Repo url, that will be shown on /start command + + + +## Images/Thumbnail Vars + +- You can change images which are used in Tanu Music Bot. +- You can generate telegaph links from [@TanuMusicxBot](http://t.me/TanuMusicxBot) and use it here. + +1. `START_IMG_URL` : Image which comes on /start command in private messages of bot. +2. `PING_IMG_URL` : Image which comes on /ping command of bot. +3. `PLAYLIST_IMG_URL` : Image which comes on /play command of bot. +4. `GLOBAL_IMG_URL` : Image which comes on /stats command of bot. +5. `STATS_IMG_URL` : Image which comes on /stats command of bot. +6. `TELEGRAM_AUDIO_URL` : This image comes when someone plays audios from telegram. +7. `TELEGRAM_VIDEO_URL` : This image comes when someone plays videos from telegram. +8. `STREAM_IMG_URL` : his image comes when someone plays m3u8 or index links. +9. `SOUNCLOUD_IMG_URL` : This image comes when someone plays music from soundcloud. +10. `YOUTUBE_IMG_URL` : This image comes if thumbnail generator fails to gen thumb anyhow. +11. `SPOTIFY_ARTIST_IMG_URL` : This image comes when someone plays Spotify artist via link in inline mode. +12. `SPOTIFY_ALBUM_IMG_URL` : This image comes when someone plays Spotify album via link in inline mode. +13. `SPOTIFY_PLAYLIST_IMG_URL` : This image comes when someone plays Spotify album via link in inline mode. + +## Multi Assistant Mode + +- You can use upto 5 Assistant Clients ( allowing your bot to atleast work in 2000-2500 chats at a time ) + +1. `STRING_SESSION2` : Pyrogram Session Needed +2. `STRING_SESSION3` : Pyrogram Session Needed +3. `STRING_SESSION4` : Pyrogram Session Needed +4. `STRING_SESSION5` : Pyrogram Session Needed \ No newline at end of file diff --git a/config/__init__.py b/config/__init__.py new file mode 100644 index 000000000000..d085c3a95859 --- /dev/null +++ b/config/__init__.py @@ -0,0 +1 @@ +from .config import * \ No newline at end of file diff --git a/config/config.py b/config/config.py new file mode 100644 index 000000000000..dd989ac0391c --- /dev/null +++ b/config/config.py @@ -0,0 +1,131 @@ +import re +from os import getenv + +from dotenv import load_dotenv +from pyrogram import filters + +load_dotenv() + +#❖ Get this value from my.telegram.org/apps +API_ID = getenv("API_ID", None) +API_HASH = getenv("API_HASH", None) + +#❖ Add Owner Username without @ +OWNER_USERNAME = getenv("OWNER_USERNAME", "itzAsuraa") + +#❖ Get Your bot username +BOT_USERNAME = getenv("BOT_USERNAME", "TanuMusicxBot") + +#❖ Don't Add style font +BOT_NAME = getenv("BOT_NAME", "TANU MUSIC") + +#❖ get Your Assistant User name +ASSUSERNAME = getenv("ASSUSERNAME", "TANU_ASS") + +#❖ Get your token from @BotFather on Telegram. +BOT_TOKEN = getenv("BOT_TOKEN") + +#❖ Get your mongo url from cloud.mongodb.com +MONGO_DB_URI = getenv("MONGO_DB_URI", None) + +DURATION_LIMIT_MIN = int(getenv("DURATION_LIMIT", 600000)) + +#❖ Chat id of a group for logging bot's activities +LOGGER_ID = int(getenv("LOGGER_ID", "-1002100219353")) + +#❖ Get this value from @MissRose_bot on Telegram by /id +OWNER_ID = getenv("OWNER_ID", "7453278496") + +#❖ Your heroku app name +HEROKU_APP_NAME = getenv("HEROKU_APP_NAME", None) + +#❖ Get it from http://dashboard.heroku.com/account +HEROKU_API_KEY = getenv("HEROKU_API_KEY", None) + +UPSTREAM_REPO = getenv( + "UPSTREAM_REPO", + "https://github.com/CodeSearchDev/TanuMusic", +) + +UPSTREAM_BRANCH = getenv("UPSTREAM_BRANCH", "master") + +GIT_TOKEN = getenv( + "GIT_TOKEN", None +) #❖ Fill this variable if your upstream repository is private + +SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/C0DE_SEARCH") +SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/AsuraaSupports") + +#❖ Set this to True if you want the assistant to automatically leave chats after an interval +AUTO_LEAVING_ASSISTANT = bool(getenv("AUTO_LEAVING_ASSISTANT", False)) + + +#❖ Get this credentials from https://developer.spotify.com/dashboard +SPOTIFY_CLIENT_ID = getenv("SPOTIFY_CLIENT_ID", "e319091f771445b18c029299505d5d4f") +SPOTIFY_CLIENT_SECRET = getenv("SPOTIFY_CLIENT_SECRET", "293c334a2861415197a697b2d11dd4de") + + +#❖ Maximum limit for fetching playlist's track from youtube, spotify, apple links. +PLAYLIST_FETCH_LIMIT = int(getenv("PLAYLIST_FETCH_LIMIT", 2500)) + + +#❖ Telegram audio and video file size limit (in bytes) +TG_AUDIO_FILESIZE_LIMIT = int(getenv("TG_AUDIO_FILESIZE_LIMIT", 104857600)) +TG_VIDEO_FILESIZE_LIMIT = int(getenv("TG_VIDEO_FILESIZE_LIMIT", 1073741824)) +#❖ Checkout https://www.gbmb.org/mb-to-bytes for converting mb to bytes + + +#❖ Get your pyrogram v2 session from @StringFatherBot on Telegram +STRING1 = getenv("STRING_SESSION", None) +STRING2 = getenv("STRING_SESSION2", None) +STRING3 = getenv("STRING_SESSION3", None) +STRING4 = getenv("STRING_SESSION4", None) +STRING5 = getenv("STRING_SESSION5", None) + + +BANNED_USERS = filters.user() +adminlist = {} +lyrical = {} +votemode = {} +autoclean = [] +confirmer = {} + + +START_IMG_URL = getenv( + "START_IMG_URL", "https://envs.sh/SSL.jpg" +) +PING_IMG_URL = getenv( + "PING_IMG_URL", "https://envs.sh/qEB.jpg" +) +PLAYLIST_IMG_URL = "https://envs.sh/nOh.jpg" +STATS_IMG_URL = "https://envs.sh/SSk.jpg" +TELEGRAM_AUDIO_URL = "https://telegra.ph/file/d2081243af7c1d7578b7b.jpg" +TELEGRAM_VIDEO_URL = "https://telegra.ph/file/d2081243af7c1d7578b7b.jpg" +STREAM_IMG_URL = "https://telegra.ph/file/982b01ba53c3d69b0d0ce.jpg" +SOUNCLOUD_IMG_URL = "https://telegra.ph/file/982b01ba53c3d69b0d0ce.jpg" +YOUTUBE_IMG_URL = "https://telegra.ph/file/d2081243af7c1d7578b7b.jpg" +SPOTIFY_ARTIST_IMG_URL = "https://telegra.ph/file/61024698bfc926e95d57a.jpg" +SPOTIFY_ALBUM_IMG_URL = "https://telegra.ph/file/61024698bfc926e95d57a.jpg" +SPOTIFY_PLAYLIST_IMG_URL = "https://telegra.ph/file/61024698bfc926e95d57a.jpg" + + + +def time_to_seconds(time): + stringt = str(time) + return sum(int(x) * 60**i for i, x in enumerate(reversed(stringt.split(":")))) + + +DURATION_LIMIT = int(time_to_seconds(f"{DURATION_LIMIT_MIN}:00")) + + +if SUPPORT_CHANNEL: + if not re.match("(?:http|https)://", SUPPORT_CHANNEL): + raise SystemExit( + "[ERROR] - Your SUPPORT_CHANNEL url is wrong. Please ensure that it starts with https://" + ) + +if SUPPORT_CHAT: + if not re.match("(?:http|https)://", SUPPORT_CHAT): + raise SystemExit( + "[ERROR] - Your SUPPORT_CHAT url is wrong. Please ensure that it starts with https://" + ) diff --git a/cookies/cookies.txt b/cookies/cookies.txt new file mode 100644 index 000000000000..60bd0cb0f744 --- /dev/null +++ b/cookies/cookies.txt @@ -0,0 +1,20 @@ +# Netscape HTTP Cookie File +# http://curl.haxx.se/rfc/cookie_spec.html +# This is a generated file! Do not edit. + +.youtube.com TRUE / TRUE 1762671255 __Secure-1PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA +.youtube.com TRUE / TRUE 1762671255 __Secure-3PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA +.youtube.com TRUE / FALSE 1765695255 HSID A69vSCW39JPHQGxt3 +.youtube.com TRUE / TRUE 1765695255 SSID AbtE2g0gOfLqyADgx +.youtube.com TRUE / FALSE 1765695255 APISID bmovEQwfG97_p3Xn/AOGoT55Q1syWHDQCM +.youtube.com TRUE / TRUE 1765695255 SAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd +.youtube.com TRUE / TRUE 1765695255 __Secure-1PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd +.youtube.com TRUE / TRUE 1765695255 __Secure-3PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd +.youtube.com TRUE / FALSE 1765695255 SID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNMMZrHnz7kTw25L6r6usfJQACgYKAT8SARYSFQHGX2MiulzzOploKQ0SBbTJFNsZ2BoVAUF8yKoU7P_YqvqOV6X9h5Ri0QoJ0076 +.youtube.com TRUE / TRUE 1765695255 __Secure-1PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNIQpKBM8Ol4MxnQh0himPjwACgYKAWwSARYSFQHGX2MiA66JWckeknTlYjQ2zsaf7hoVAUF8yKpoeDw0weLjlxGdNCDRwctz0076 +.youtube.com TRUE / TRUE 1765695255 __Secure-3PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNkhfWPqQ8m6mQMHn1SdsG9QACgYKAX0SARYSFQHGX2MigaNR2A4QljvtfCBFuWSsihoVAUF8yKpOBvzZ4QAOFa4c5UrPfAfi0076 +.youtube.com TRUE / TRUE 1765695413 LOGIN_INFO AFmmF2swRgIhAKxYmInMGYmFdDLzw_zZFbJgEmYY63UZyagWPdtjOj2kAiEAhs6JCdjRu1cK5JR--BJBq43w8t9jmVBp1Y9n_29zYlg:QUQ3MjNmelJEV3ZuQTduYXVZZHh2ZlVpZnNLUEdKdGlkUEJFSklRdlhCMk85a3ZXRFo0RGVMTHF0a2NQM1dDWWp2U091eVVVZ2tmMk9GQmNqLU1rNWJmUUF5alNSZWU4Z04yaW55OU5CSjRaRlBPMFhaSmVxR1hJbkFhMXA1dVZQb1dGaHRMcEZybmd4bmludmdwTW04Q2pjeDkwYnNGUHhB +.youtube.com TRUE / TRUE 1766403772 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 +.youtube.com TRUE / FALSE 1763379781 SIDCC AKEyXzVMqEJTfwpfaABjwNgDvd2cgI5Gt0uX2s-7QJ2qkEs2r2Azfnkp8vhINXFYd00GmCMGXQ +.youtube.com TRUE / TRUE 1763379781 __Secure-1PSIDCC AKEyXzUcekplMITXHWzE_Ohxxdtke4vv_Gy074KnF2jfmosQHItQLFQCYsnqxdDH0H-hZAnF +.youtube.com TRUE / TRUE 1763379781 __Secure-3PSIDCC AKEyXzVBzcw8-2Q3_Z6RHxUvXvZJmh8RM6rnRdS25XuAonpC1ymIiPbLvd0Z8-ai2Qmx84zLEQ \ No newline at end of file diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 000000000000..86bcb3dc3be4 --- /dev/null +++ b/heroku.yml @@ -0,0 +1,5 @@ +build: + docker: + worker: Dockerfile +run: + worker: bash start \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000000..9240988819b1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,63 @@ +deep-translator +pyromod +openai +aiofiles +aiohttp +asyncio +beautifulsoup4 +dnspython +ffmpeg-python +gitpython +hachoir +heroku3 +httpx[http2] +lyricsgenius +motor +wget +pillow==11.0.0 +pymongo==4.9.1 +psutil +pytube +pykeyboard +unidecode +pyromod +ntgcalls==1.1.2 +python-dotenv +pyyaml +requests +speedtest-cli +spotipy +tgcrypto +urllib3 +uvloop +flask +blackpink +pycountry +pyshorteners +gunicorn==22.0.0 +youtube-search +youtube-search-python +pornhub-api==0.3.0 +telegraph +async_pymongo +gpytranslate +search_engine_parser +emojis +cloudscraper +blackpink +pycryptodome +pickledb +Faker +pyfiglet +qrcode +pytz +pydub +apscheduler +gtts +py-tgcalls==0.9.7 +lexica-api==1.5.7 +git+https://github.com/KurimuzonAkuma/pyrogram@dev +git+https://github.com/yt-dlp/yt-dlp +git+https://github.com/alexmercerind/youtube-search-python@main +git+https://github.com/joetats/youtube_search@master +git+https://github.com/Vivekkumar-IN/yt-dlp-youtube-oauth2 diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 000000000000..cf3b804237ed --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.11.8 diff --git a/sample.env b/sample.env new file mode 100644 index 000000000000..4ab941d548a7 --- /dev/null +++ b/sample.env @@ -0,0 +1,7 @@ +API_ID= +API_HASH= +BOT_TOKEN= +LOGGER_ID= +MONGO_DB_URI= +OWNER_ID= +STRING_SESSION= diff --git a/setup b/setup new file mode 100644 index 000000000000..9c2f71747233 --- /dev/null +++ b/setup @@ -0,0 +1,126 @@ +#!/bin/bash + +pprint (){ + cred='\033[0;31m' + cgreen='\033[0;32m' + cyellow='\033[0;33m' + cblue='\033[0;34m' + cpurple='\033[0;35m' + eval "export color='$cpurple'" + [ ! -z $2 ] && eval "export color=\"\$$2\"" + printf "$color $1" +} + +color_reset(){ printf '\033[0;37m';} + +yesnoprompt(){ + old_stty_cfg=$(stty -g) + stty raw -echo ; answer=$(head -c 1) + stty $old_stty_cfg + echo "$answer" | grep -iq "^y" +} + +update() { + pprint "\n\nUpdating package list.. " + sudo apt update 2>&1 | grep "can be upgraded" &>/dev/null + if [ $? -eq 0 ]; then + pprint "UPDATE AVAILABLE" "cgreen" + pprint "\n\nDo you want to automatically upgrade (y/n)?" + if yesnoprompt; then + pprint "\n\nUpgrading packages.. " + sudo apt upgrade -y &>/dev/null && + pprint "DONE!\n\n" "cgreen" || (pprint "FAIL.\n\n" "cred"; exit 1) + else + echo + fi + else + pprint "ALREADY UP TO DATE\n\n" "cgreen" + fi +} + +packages(){ + if ! command -v pip &>/dev/null; then + pprint "Couldn't found pip, installing now..." + sudo apt install python3-pip -y 2>pypilog.txt 1>/dev/null && + pprint "SUCCESS.\n\n" "cgreen" || (pprint "FAIL.\n\n" "cred"; exit 1) + fi + + if ! command -v ffmpeg &>/dev/null; then + pprint "Couldn't found ffmpeg, installing now..." + if sudo apt install ffmpeg -y &>/dev/null;then + pprint "SUCCESS.\n\n" "cgreen" + else + pprint "FAIL.\n\n" "cred" + pprint "You need to install ffmpeg manually in order to deploy TanuMusic, exiting...\n" "cblue" + exit 1 + fi + fi + + # Check ffmpeg version and warn user if necessary. + fv=$(grep -Po 'version (3.*?) ' <<< $(ffmpeg -version)) && + pprint "Playing live streams not going to work since you have ffmpeg $fv, live streams are supported by version 4+.\n" "cblue" +} + + +node(){ + command -v npm &>/dev/null && return + pprint "Installing Nodejs and Npm.. " + curl -fssL https://deb.nodesource.com/setup_19.x | sudo -E bash - &>nodelog.txt && + sudo apt install -y nodejs &>>nodelog.txt && + sudo npm i -g npm &>>nodelog.txt && + pprint "SUCCESS!\n" "cgreen" || (pprint "FAIL.\n" "cred"; exit 1) +} + + +installation(){ + pprint "\n\nUpgrading pip and installing dependency packages..." + pip3 install -U pip &>>pypilog.txt && + pip3 install -U -r requirements.txt &>>pypilog.txt && + pprint "DONE.\n" "cgreen" && return + pprint "FAIL.\n" "cred" + exit 1 +} + +clear +pprint "Welcome to TanuMusic Setup Installer\n\n" +pprint "If you see any error during Installation Process, Please refer to these files for logs: " +pprint "\nFor node js errors , Checkout nodelog.txt" +pprint "\nFor pypi packages errors , Checkout pypilog.txt" +sleep 1 +pprint "\n\nScript needs sudo privileges in order to update & install packages.\n" +sudo test + +update +packages +node +installation +pprint "\n\n\n\n\nAnonXMusic Installation Completed !" "cgreen" +sleep 1 +clear + +pprint "\nEnter Your Values Below\n\n\n" +pprint "API ID: "; color_reset; read api_id +pprint "\nAPI HASH: "; color_reset; read api_hash +pprint "\nBOT TOKEN: "; color_reset; read bot_token +pprint "\nOWNER ID:"; color_reset; read ownid +pprint "\nMONGO DB URI: "; color_reset; read mongo_db +pprint "\nLOG GROUP ID: "; color_reset; read logger +pprint "\nSTRING SESSION: "; color_reset; read string_session + +pprint "\n\nProcessing your vars, wait a while !" "cgreen" + +if [ -f .env ]; then + rm .env +fi + +echo """API_ID = $api_id +API_HASH = $api_hash +BOT_TOKEN = $bot_token +MONGO_DB_URI = $mongo_db +LOGGER_ID = $logger +STRING_SESSION = $string_session +OWNER_ID = $ownid""" > .env +clear + +pprint "\n\n\nThanks for using TanuMusic installer, your vars have been saved successfully ! \nIf you wanna add more variables add them in your env by : vi .env" +pprint "\n\nNow you can start the bot by : bash start\n\n" diff --git a/start b/start new file mode 100644 index 000000000000..a4d32186c186 --- /dev/null +++ b/start @@ -0,0 +1 @@ +python3 -m TanuMusic diff --git a/strings/__init__.py b/strings/__init__.py new file mode 100644 index 000000000000..00c9c007fb1d --- /dev/null +++ b/strings/__init__.py @@ -0,0 +1,34 @@ +import os +from typing import List + +import yaml + +languages = {} +languages_present = {} + + +def get_string(lang: str): + return languages[lang] + + +for filename in os.listdir(r"./strings/langs/"): + if "en" not in languages: + languages["en"] = yaml.safe_load( + open(r"./strings/langs/en.yml", encoding="utf8") + ) + languages_present["en"] = languages["en"]["name"] + if filename.endswith(".yml"): + language_name = filename[:-4] + if language_name == "en": + continue + languages[language_name] = yaml.safe_load( + open(r"./strings/langs/" + filename, encoding="utf8") + ) + for item in languages["en"]: + if item not in languages[language_name]: + languages[language_name][item] = languages["en"][item] + try: + languages_present[language_name] = languages[language_name]["name"] + except: + print("There is some issue with the language file inside bot.") + exit() diff --git a/strings/helpers.py b/strings/helpers.py new file mode 100644 index 000000000000..3c7ba9f8dee0 --- /dev/null +++ b/strings/helpers.py @@ -0,0 +1,98 @@ +HELP_1 = """ +❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ➥ +● /pause ➥ ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. +● /resume ➥ ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. +● /skip ➥ sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. +● /end ᴏʀ /stop ➥ ᴄʟᴇᴀʀs ᴛʜᴇ ǫᴜᴇᴜᴇ ᴀɴᴅ ᴇɴᴅ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. +● /player ➥ ɢᴇᴛ ᴀ ɪɴᴛᴇʀᴀᴄᴛɪᴠᴇ ᴩʟᴀʏᴇʀ ᴩᴀɴᴇʟ. +● /queue ➥ sʜᴏᴡs ᴛʜᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ʟɪsᴛ. +● /speed or /playback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ɢʀᴏᴜᴘ. +● /cspeed or /cplayback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ᴄʜᴀɴɴᴇʟ. + +❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ ➥ +● /loop [enable/disable] ➥ ᴇɴᴀʙʟᴇs/ᴅɪsᴀʙʟᴇs ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ +● /loop [1, 2, 3, ...] ➥ ᴇɴᴀʙʟᴇs ᴛʜᴇ ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ɢɪᴠᴇɴ ᴠᴀʟᴜᴇ. + +❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ ➥ +● /shuffle ➥ sʜᴜғғʟᴇ's ᴛʜᴇ ᴏ̨ᴜᴇᴜᴇ. +● /queue ➥ sʜᴏᴡs ᴛʜᴇ sʜᴜғғʟᴇᴅ ᴏ̨ᴜᴇᴜᴇ. + +❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ ➥ +● /seek [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. +● /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ ʙᴀᴄᴋᴡᴀʀᴅ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" + +HELP_2 = """ +❖ ᴀᴜᴛʜ ᴜsᴇʀs ➥ +● /auth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ᴀᴅᴅ ᴀ ᴜsᴇʀ ᴛᴏ ᴀᴜᴛʜ ʟɪsᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. +● /unauth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ʀᴇᴍᴏᴠᴇ ᴀ ᴀᴜᴛʜ ᴜsᴇʀs ғʀᴏᴍ ᴛʜᴇ ᴀᴜᴛʜ ᴜsᴇʀs ʟɪsᴛ. +● /authusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴜᴛʜ ᴜsᴇʀs ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" + +HELP_3 = """ +❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ ➥ + +● /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] ➥ ʙʀᴏᴀᴅᴄᴀsᴛ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. + +● -pin ➥ ᴩɪɴs ʏᴏᴜʀ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇs ɪɴ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs. +● -pinloud ➥ ᴩɪɴs ʏᴏᴜʀ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ sᴇɴᴅ ɴᴏᴛɪғɪᴄᴀᴛɪᴏɴ ᴛᴏ ᴛʜᴇ ᴍᴇᴍʙᴇʀs. +● -user ➥ ʙʀᴏᴀᴅᴄᴀsᴛs ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴛᴏ ᴛʜᴇ ᴜsᴇʀs ᴡʜᴏ ʜᴀᴠᴇ sᴛᴀʀᴛᴇᴅ ʏᴏᴜʀ ʙᴏᴛ. +● -assistant ➥ ʙʀᴏᴀᴅᴄᴀsᴛ ʏᴏᴜʀ ᴍᴇssᴀɢᴇ ғʀᴏᴍ ᴛʜᴇ ᴀssɪᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. +● -nobot ➥ ғᴏʀᴄᴇs ᴛʜᴇ ʙᴏᴛ ᴛᴏ ɴᴏᴛ ʙʀᴏᴀᴅᴄᴀsᴛ ᴛʜᴇ ᴍᴇssᴀɢᴇ.. + +● ᴇxᴀᴍᴩʟᴇ ➥ /broadcast -user -assistant -pin ᴛᴇsᴛɪɴɢ ʙʀᴏᴀᴅᴄᴀsᴛ + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" + +HELP_4 = """ +❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ ➥ +● /blacklistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ʙʟᴀᴄᴋʟɪsᴛ ᴀ ᴄʜᴀᴛ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. +● /whitelistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ᴡʜɪᴛᴇʟɪsᴛ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ. +● /blacklistedchat ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs. + +❖ ʙʟᴏᴄᴋ ᴜsᴇʀs ➥ +● /block [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ʙʟᴏᴄᴋ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ ᴏᴜʀ ʙᴏᴛ. +● /unblock [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ᴜɴʙʟᴏᴄᴋs ᴛʜᴇ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀ. +● /blockedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs. + +❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ ➥ +● /gban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ʙᴀɴs ᴛʜᴇ ᴄʜᴜᴛɪʏᴀ ғʀᴏᴍ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ ʙʟᴀᴄᴋʟɪsᴛ ʜɪᴍ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. +● /ungban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ᴜɴʙᴀɴs ᴛʜᴇ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀ. +● /gbannedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs. + +❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ➥ +● /logs ➥ ɢᴇᴛ ʟᴏɢs ᴏғ ᴛʜᴇ ʙᴏᴛ. +● /logger [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ʙᴏᴛ ᴡɪʟʟ sᴛᴀʀᴛ ʟᴏɢɢɪɴɢ ᴛʜᴇ ᴀᴄᴛɪᴠɪᴛɪᴇs ʜᴀᴩᴩᴇɴ ᴏɴ ʙᴏᴛ. +● /maintenance [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ᴇɴᴀʙʟᴇ ᴏʀ ᴅɪsᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ʏᴏᴜʀ ʙᴏᴛ. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" + +HELP_5 = """ +❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥ +● v ➥ sᴛᴀɴᴅs ғᴏʀ ᴠɪᴅᴇᴏ ᴩʟᴀʏ. +● force ➥ sᴛᴀɴᴅs ғᴏʀ ғᴏʀᴄᴇ ᴩʟᴀʏ. +● /play ᴏʀ /vplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. +● /playforce ᴏʀ /vplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. + +❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥ +● /cplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴀᴜᴅɪᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. +● /cvplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴠɪᴅᴇᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. +● /cplayforce or /cvplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. +● /channelplay [ᴄʜᴀᴛ ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ɪᴅ] ᴏʀ [ᴅɪsᴀʙʟᴇ] ➥ ᴄᴏɴɴᴇᴄᴛ ᴄʜᴀɴɴᴇʟ ᴛᴏ ᴀ ɢʀᴏᴜᴩ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʀᴀᴄᴋs ʙʏ ᴛʜᴇ ʜᴇʟᴩ ᴏғ ᴄᴏᴍᴍᴀɴᴅs sᴇɴᴛ ɪɴ ɢʀᴏᴜᴩ. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" + +HELP_6 = """ +● sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ ➥ + +● /song [sᴏɴɢ ɴᴀᴍᴇ] ➥ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴʏ ᴛʀᴀᴄᴋ ғʀᴏᴍ ʏᴏᴜᴛᴜʙᴇ ɪɴ ᴍᴘ3 ᴏʀ ᴍᴘ4 ғᴏʀᴍᴀᴛs. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" diff --git a/strings/langs/ar.yml b/strings/langs/ar.yml new file mode 100644 index 000000000000..9571535e36f2 --- /dev/null +++ b/strings/langs/ar.yml @@ -0,0 +1,320 @@ +name : 🇦🇪 عربي + + +general_1 : "» قم بالرد على رسالة المستخدم أو قم بتقديم اسم المستخدم / معرف المستخدم." +general_2 : "» حدث خطأ ما أثناء معالجة استعلامك.\n\nاستثناء: {0}" +general_3 : "أنت مشرف مجهول في هذه الدردشة، عد إلى حساب المستخدم لاستخدامي." +general_4 : "» ليس لديك الصلاحيات لإدارة مكالمات الفيديو.\n\nقم بإعادة تحميل ذاكرة التخزين المؤقت للمشرفين عبر /reload" +general_5 : "» البوت لا يقوم ببث مكالمات الفيديو." + +tg_1 : "{0} مُنزِّل\n\nحجم الملف: {1}\nاكتمل: {2}\nالنسبة المئوية: {3}%\n\nالسرعة: {4}/ث\nالتقدير الزمني: {5}" +tg_2 : "تم التنزيل بنجاح، جاري معالجة الملف...\n\nالوقت المستغرق: {0}" +tg_3 : "فشل في تنزيل الوسائط من تليجرام، يرجى المحاولة مرة أخرى..." +tg_4 : "» تم تنزيل العنصر بالفعل." +tg_5 : "» تم تنزيل العنصر بالفعل أو تم الإلغاء." +tg_6 : "» تم إلغاء التنزيل." +tg_7 : "» تم إلغاء التنزيل بواسطة: {0}" +tg_8 : "فشل في إيقاف التنزيل." +tg_9 : "فشل في الحصول على مهمة التنزيل الجارية..." + +call_1 : "» البوت يحتاج إذن دعوة المستخدمين عبر الرابط لدعوة المساعد إلى محادثتك." +call_2 : "تم حظر مساعد {0} في مجموعتك/قناتك.\n\nالمعرّف : {1}\nالاسم : {2}\nاسم المستخدم : @{3}\n\nيرجى إلغاء حظر المساعد والمحاولة مرة أخرى." +call_3 : "فشل في دعوة مساعد {0} إلى محادثتك.\n\nالسبب : {1}" +call_4 : "يرجى الانتظار...\n\nجاري دعوة مساعد {0} إلى محادثتك..." +call_5 : "تم انضمام مساعد {0} بنجاح.\n\nمحاولة بدء التشغيل..." +call_6 : "» فشل في التبديل إلى البث، يُرجى استخدام /skip لتغيير المسار مرة أخرى." +call_7 : "» جاري تنزيل المسار التالي من قائمة الانتظار.\n\nيرجى الانتظار..." +call_8 : "لم يتم العثور على دردشة فيديو نشطة.\n\nيرجى بدء دردشة فيديو في مجموعتك/قناتك والمحاولة مرة أخرى." +call_9 : "المساعد بالفعل في دردشة فيديو.\n\nإذا لم يكن المساعد في دردشة فيديو، يرجى إرسال /reboot ثم اللعب مرة أخرى." +call_10 : "خطأ في الخادم التيليجرام\n\nالتيليجرام يواجه مشكلات داخلية، يرجى المحاولة مرة أخرى أو إعادة تشغيل دردشة الفيديو في مجموعتك/قناتك." + +auth_1 : "» يمكنك فقط أن تمتلك 25 مستخدمًا مُصرَّحًا في مجموعتك." +auth_2 : "» تمت إضافة {0} إلى قائمة المستخدمين المُصرَّح بهم." +auth_3 : "{0} موجود بالفعل في قائمة المستخدمين المُصرَّح بهم." +auth_4 : "» تمت إزالة {0} من قائمة المستخدمين المُصرَّح بهم." +auth_5 : "{0} غير موجود في قائمة المستخدمين المُصرَّح بهم." +auth_6 : "» جاري استرداد قائمة المستخدمين المُصرَّح بهم..." +auth_7 : "» قائمة المستخدمين المُصرَّح بهم في {0}:\n\n" +auth_8 : "↬ تمت الإضافة بواسطة:" + +reload_1 : "» يمكنك تحديث ذاكرة التخزين المؤقت للمشرفين فقط مرة واحدة كل 3 دقائق.\n\nيرجى المحاولة بعد {0}." +reload_2 : "» تم تحديث ذاكرة التخزين المؤقت للمشرفين بنجاح." +reload_3 : "» فشل في تحديث ذاكرة التخزين المؤقت للمشرفين، تأكد من أن البوت مشرف في محادثتك." +reload_4 : "» يُرجى الانتظار...\n\nإعادة تشغيل {0} لمحادثتك." +reload_5 : "تم إعادة تشغيل {0} بنجاح لمحادثتك.\n\nابدأ اللعب مرة أخرى..." + +admin_1 : "هل تذكر أنك استأنفت البث؟" +admin_2 : "➻ تم إيقاف البث مؤقتًا 🎄\n│ \n└بواسطة: {0} 🥀" +admin_3 : "هل تذكر أنك قمت بإيقاف البث؟" +admin_4 : "➻ تم استئناف البث 🎄\n│ \n└بواسطة: {0} 🥀" +admin_5 : "➻ انتهى/تم إيقاف البث 🎄\n│ \n└بواسطة: {0} 🥀" +admin_6 : "➻ تم تخطي البث 🎄\n│ \n└بواسطة: {0} 🥀\n\n» لا توجد مقاطع في قائمة الانتظار في {1}، سأغادر الدردشة الفيديوية." +admin_7 : "خطأ أثناء تغيير البث إلى {0}." +admin_8 : "» يرجى تعطيل التكرار الدائري عبر /loop disable ثم حاول الانتقال مرة أخرى." +admin_9 : "يرجى استخدام أرقام محددة للانتقال، مثل 1، 2، 4..." +admin_10 : "مطلوب على الأقل مقطعين في قائمة الانتظار للانتقال إلى المقطع المحدد.\n\nتحقق من قائمة الانتظار عبر: /queue" +admin_11 : "» ليس هناك مقاطع كافية في قائمة الانتظار للانتقال إلى المقطع المحدد.\n\nيرجى الانتقال بين المقاطع من 1 إلى {0}" +admin_12 : "» فشل في الانتقال إلى المقطع المحدد.\n\nتحقق من المقاطع المتبقية في قائمة الانتظار عبر: /queue" +admin_13 : "» يرجى إعادة تحميل ذاكرة التخزين المؤقت للمشرف عبر: /reload" +admin_14 : "» ليس لديك صلاحيات لإدارة دردشات الفيديو.\n\nيرجى إعادة تحميل ذاكرة التخزين المؤقت للمشرف عبر: /reload" +admin_15 : "» فشل في عملية الخلط.\n\nتحقق من قائمة الانتظار عبر: /queue" +admin_16 : "» تم خلط قائمة الانتظار بواسطة {0}.\n\nتحقق من قائمة الانتظار المختلطة عبر: /queue" +admin_17 : "مثال:\n\n/loop enable/disable\n/loop 10/9/8/7" +admin_18 : "» تم تمكين الحلقة لعدد {0} مرات بواسطة: {1}." +admin_19 : "» تم تعطيل تشغيل الحلقة بواسطة: {0}." +admin_20 : "مثال:\n\n/seek or /seekback [المدة بالثواني]" +admin_21 : "» يرجى استخدام أرقام رقمية لعملية البحث بالثواني." +admin_22 : "» لا يمكن تغيير مكان بث الفيديو المباشر." +admin_23 : "» حاول التحكم في البحث بمدة أقل.\n\nتم تشغيل {0} من أصل {1} دقيقة." +admin_24 : "جارِ البحث...\n\nيرجى الانتظار..." +admin_25 : "» تم تغيير مكان البث بنجاح.\n\nالمدة: {0} دقيقة\nبواسطة: {1}" +admin_26 : "فشل في تغيير المكان." +admin_27 : "» يمكن التحكم حالياً فقط في سرعة بث اليوتيوب." +admin_28 : "لوحة تحكم سرعة {0}\n\nانقر على الأزرار أدناه لتغيير سرعة البث الحالي في دردشة الفيديو." +admin_29 : "» البوت يعمل بالفعل بسرعة عادية." +admin_30 : "» يرجى الانتظار...\n\nهناك شخص آخر يحاول تغيير سرعة البث." +admin_31 : "جارِ تغيير السرعة..." +admin_32 : "» يتم محاولة تغيير سرعة البث الحالي...\n\nطلب بواسطة: {0}" +admin_33 : "» فشل في تغيير سرعة البث الحالي." +admin_34 : "» تم تغيير سرعة البث الحالي إلى {0}x\n\nطلب بواسطة: {1}" +admin_35 : "انتهت عملية التصويت لأن المقطع الذي تم تقديم التصويت له قد انتهى." +admin_36 : "فشل في تنفيذ هذا الإجراء لأن المقطع الذي تم تقديم التصويت له قد انتهى أو تم إيقافه." +admin_37 : "تم الحصول بنجاح على {0} تصويت إيجابي." +admin_38 : "» تمت إضافة تصويت إيجابي واحد." +admin_39 : "» تمت إزالة تصويت إيجابي واحد." +admin_40 : "تم التصويت بإيجابية." + +start_1 : "{0} على قيد الحياة يا صغيري.\n\n✫ وقت التشغيل : {1}" +start_2 : "هلا {0}، 🥀\n\n๏ هذا هو {1} !\n\n➻ بوت تشغيل موسيقى سريع وقوي على تليجرام مع ميزات رائعة.\n\nالمنصات المدعومة: يوتيوب، سبوتيفاي، ريسو، آبل ميوزيك وساوندكلاود.\n──────────────────\n๏ انقر على زر المساعدة للحصول على معلومات حول وحداتي وأوامري." +start_3 : "هلا {0}،\nهذا {1}\n\nشكرًا لإضافتي في {2}، {3} الآن يمكنه تشغيل الأغاني في هذه الدردشة." +start_4 : "🎄 المطلوب سوبر جروب 🎄\n\nيرجى تحويل المجموعة الخاصة بك إلى سوبر جروب ثم أضفني مرة أخرى.\n\nكيفية جعلها سوبر جروب؟\n- اجعل تاريخ الدردشة الخاصة بمجموعتك مرئيًا مرة واحدة." +start_5 : "↝ الدردشة في القائمة السوداء ↜\n\nتم إدراج هذه الدردشة في قاعدة بيانات {0} كدردشة في القائمة السوداء.\nقدم طلبًا لمستخدم سودو لإزالة الدردشة من القائمة السوداء أو قم بزيارة دردشة الدعم." +start_6 : "😲 معلومات المقطع 😲\n\n📌 العنوان : {0}\n\n⏳ المدة : {1} دقيقة\n👀 المشاهدات : {2}\n⏰ نشر في : {3}\n📎 القناة : {5}\n\n🥀 البحث مدعوم من قبل {6}" + +queue_1 : "» جاري جلب قائمة الانتظار...\n\nيرجى الانتظار..." +queue_2 : "» قائمة الانتظار فارغة." +queue_3 : "» انقر هنا للتحقق من قائمة المقاطع في الانتظار : هنا" +queue_4 : "➲ تمت إضافته إلى قائمة الانتظار في الموقع رقم #{0}\n\n‣ العنوان : {1}\n‣ المدة : {2} دقيقة\n‣ طلب بواسطة : {3}" +queue_5 : "هناك مقطع واحد فقط في قائمة الانتظار.\n\nأضف المزيد من المقاطع للتحقق من القائمة." +queue_6 : "🕚 المدة : مدة البث غير معروفة\n\nانقر على الزر أدناه للحصول على قائمة الانتظار بالكامل." +queue_7 : "\nانقر على الزر أدناه للحصول على قائمة الانتظار بالكامل." +queue_8 : "مشغل {0}\n\n🎄 يتم البث حاليًا لـ : {1}\n\n🔗 نوع البث : {2}\n🥀 طلب بواسطة : {3}\n{4}" + +stream_1 : "➲ بدء البث |\n\n‣ العنوان : {1}\n‣ المدة : {2} دقيقة\n‣ طلب بواسطة : {3}" +stream_2 : "➲ بدء البث |\n\n‣ نوع البث : بث مباشر [الرابط]\n‣ طلب بواسطة : {0}" + +help_1 : "اختر الفئة التي ترغب في الحصول على المساعدة لها.\nاستفسر عن شكواك في دردشة الدعم\n\nيمكن استخدام جميع الأوامر مع : /" +help_2 : "انقر على الزر أدناه للحصول على قائمة المساعدة في رسائلك الخاصة." + +lang_1 : "» يُرجى اختيار اللغة التي ترغب في تعيينها كلغة افتراضية لهذه المجموعة:" +lang_2 : "تم تغيير اللغة بنجاح." +lang_3 : "فشل في تغيير اللغة." +lang_4 : "أنت بالفعل على نفس اللغة." + +setting_1 : "لوحة إعدادات {0}\n\nمعرّف الدردشة : {1}\nعنوان الدردشة : {2}\n\nانقر على الأزرار أدناه لتغيير الإعدادات." +setting_2 : "» مباشر : يشغل عمليات البحث مباشرةً.\n\n» مضمن : يعيد زرًا مضمنًا للاختيار بين الفيديو والصوت." +setting_3 : "» الجميع : يمكن لأي شخص استخدام أوامر المشرف [تخطي، إيقاف مؤقت، استئناف وما إلى ذلك] في هذه المجموعة.\n\n» المشرفون فقط : يمكن فقط للمشرفين والمستخدمين المصرح لهم استخدام أوامر المشرف." +setting_4 : "» لم يتم العثور على مستخدمين مصرح لهم." +setting_5 : "» مجموعة : يشغل الموسيقى في المجموعة التي تم إعطاء الأمر فيها.\n\n» قناة : يشغل الموسيقى في القناة التي تريدها. قم بتعيين معرّف القناة عبر /channelplay" +setting_6 : "» الجميع : يمكن لأي شخص حاضر في هذه المجموعة تشغيل الموسيقى هنا.\n\n» المشرفون فقط : يمكن فقط للمشرفين تشغيل الموسيقى في هذه المجموعة." +setting_7 : "» يرجى تعريف معرف القناة عبر /channelplay" +setting_8 : "عند تمكين هذا الوضع، يمكن للأشخاص الذين ليس لديهم صلاحيات المشرف استخدام أوامر المشرف بعد عدد معين من التصويتات." +setting_9 : "التصويتات الحالية المطلوبة لاستخدام أوامر المشرف هي : {0}" +setting_10 : "تم تعطيل وضع التصويت." +setting_11 : "أدنى عدد للتصويتات يمكن أن يكون 2. لا يمكنك تعيينه أقل من 2" +setting_12 : "أعلى عدد للتصويتات يمكن أن يكون 15. لا يمكنك تعيينه أعلى من 15" + +set_cb_1 : "جارٍ الحصول على لوحة مستخدمي المصرح لهم..." +set_cb_2 : "جارٍ الحصول على لوحة وضع التشغيل..." +set_cb_3 : "جاري تغيير الإعدادات..." +set_cb_4 : "» جاري الحصول على قائمة المستخدمين المصرح لهم..." +set_cb_5 : "» الرجاء الانتظار..." + +gstats_1 : "جارٍ الحصول على إحصائيات ومعلومات {0}...\n\nقد يستغرق الأمر بعض الوقت، يرجى الانتظار..." +gstats_2 : "انقر على الأزرار أدناه للتحقق من إحصائيات {0}." +gstats_3 : "إحصائيات ومعلومات {0} :\n\nالمساعدين : {1}\nالمحظورون : {2}\nالدردشات : {3}\nالمستخدمون : {4}\nالوحدات : {5}\nالمشرفون : {6}\n\nمغادرة تلقائية للمساعدين : {7}\nحدود مدة التشغيل : {8} دقائق" +gstats_4 : "هذا الزر مخصص للمشرفين فقط." +gstats_5 : "إحصائيات ومعلومات {0} :\n\nالوحدات : {1}\nالمنصة : {2}\nالذاكرة (RAM) : {3}\nالنوى الفعلية : {4}\nإجمالي النوى : {5}\nتردد وحدة المعالجة المركزية : {6}\n\nبيثون : {7}\nPyrogram : {8}\nPy-TgCalls : {9}\n\nالتخزين المتاح : {10} جيبايت\nالتخزين المستخدم : {11} جيبايت\nالتخزين المتبقي : {12} جيبايت\n\nالدردشات المخدومة : {13}\nالمستخدمون المخدومون : {14}\nالمستخدمون المحظورون : {15}\nمستخدمو sudo : {16}\n\nحجم قاعدة البيانات الإجمالي : {17} ميجابايت\nسعة تخزين قاعدة البيانات الإجمالية : {18} ميجابايت\nإجمالي مجموعات بيانات قاعدة البيانات : {19}\nإجمالي مفاتيح قاعدة البيانات : {20}" + +playcb_1 : "» آه، هذا ليس لك يا حبيبي." +playcb_2 : "» جاري الحصول على النتيجة التالية،\n\nالرجاء الانتظار..." + +cplay_1 : "» يمكنك تشغيل الموسيقى في القنوات من {0} إلى أي قناة أخرى أو القناة المرتبطة بالدردشة.\n\nللقناة المرتبطة :\n/channelplay linked\n\nلأي قناة أخرى :\n/channelplay [معرف القناة]" +cplay_2 : "» هذه الدردشة ليس لديها أي قناة مرتبطة." +cplay_3 : "» تم تعيين القناة إلى {0}.\nمعرف القناة : {1}" +cplay_4 : "» فشل في الحصول على القناة.\n\nتأكد من أنك قمت بإضافة البوت إلى القناة وترقيته كمشرف." +cplay_5 : "القنوات فقط مدعومة." +cplay_6 : "» يجب أن تكون المالك للقناة {0} لتربطها بالمجموعة هذه.\nمالك القناة : @{1}\n\nبديلاً يمكنك ربط مجموعتك بتلك القناة ومن ثم محاولة الاتصال باستخدام /channelplay linked" +cplay_7 : "» تم تعطيل تشغيل القناة." + +play_1 : "🔎" +play_2 : "➻ وضع تشغيل القناة\n\nجاري المعالجة، يرجى الانتظار...\n\nالقناة المرتبطة : {0}" +play_3 : "» فشل في معالجة الاستعلام." +play_4 : "تشغيل للمسؤولين فقط\nيُسمح فقط لمسؤولي هذه الدردشة بالتشغيل\n\nقم بتغيير وضع التشغيل عبر /playmode" +play_5 : "» فشل في معالجة ملف الصوت.\n\nحجم ملف الصوت أكبر من الحد المحدد." +play_6 : "» البث أطول من {0} غير مسموح بتشغيله على {1}" +play_7 : "» ليس ملحق ملف فيديو صالح.\n\nالملحقات المدعومة : {0}" +play_8 : "» يجب أن يكون حجم ملف الفيديو أقل من 1 جيجابايت." +play_9 : "ميزة قائمة تشغيل يوتيوب\n\nحدد الوضع الذي تريد تشغيل قائمة تشغيل يوتيوب كاملة فيه." +play_10 : "العنوان : {0}\nالمدة : {1} دقيقة" +play_11 : "مشغل سبوتيفاي {0}\n\nالطلب من قِبل : {1}" +play_12 : "مشغل أبل ميوزك {0}\n\nالطلب من قِبل : {1}" +play_13 : "» تم الكشف عن بث مباشر.\n\nهل أنت متأكد أنك تريد تشغيل هذا البث المباشر؟" +play_14 : "فشل في جلب تفاصيل المسار.\n\nجرب تشغيل أي مسار آخر." +play_15 : "» فشل في معالجة الاستعلام.\n\nأستطيع فقط تشغيل مسارات سبوتيفاي والبومات وفنانين وقوائم تشغيل." +play_16 : "لا يوجد دردشة صوتية نشطة.\n\nلاستخدام التشغيل القسري، يجب أن يكون هناك دردشة صوتية نشطة." +play_17 : "يرجى تشغيل دردشة الفيديو، لا يمكنني تشغيل عناوين URL." +play_18 : "الاستخدام: /play [اسم الأغنية/عنوان يوتيوب/الرد على ملف صوتي/فيديو]" +play_19 : "قائمة التشغيل في الانتظار:" +play_20 : "الموقف في قائمة الانتظار -" +play_21 : "تمت إضافة {0} مسارات إلى القائمة في الانتظار.\n\nالتحقق: انقر هنا" +play_22 : "حدد الوضع الذي تريد تشغيل الاستعلامات به داخل مجموعتك: {0}" + +str_1 : "يرجى تقديم روابط m3u8 أو index." +str_2 : "➻ تم التحقق من البث الصالح.\n\nجاري المعالجة..." +str_3 : "فشل في بث بث مباشر من يوتيوب، لم يتم العثور على تنسيق بث مباشر." + +ping_1 : "يتم عمل بينغ لـ {0}..." +ping_2 : "🏓 البونج : {0}ms\n\n{1} إحصائيات النظام :\n\n↬ وقت التشغيل : {2}\n↬ الذاكرة العشوائية (RAM) : {3}\n↬ المعالج (CPU) : {4}\n↬ القرص الصلب (Disk) : {5}\n↬ Py-TgCalls : {6}ms" + +queue_1 : "» جاري جلب قائمة الانتظار...\n\nيرجى الانتظار..." +queue_2 : "» قائمة الانتظار فارغة." +queue_3 : "» انقر هنا للتحقق من قائمة المقاطع في الانتظار : هنا" +queue_4 : "➲ تمت إضافته إلى قائمة الانتظار في الموقع رقم #{0}\n\n‣ العنوان : {1}\n‣ المدة : {2} دقيقة\n‣ طلب بواسطة : {3}" +queue_5 : "هناك مقطع واحد فقط في قائمة الانتظار.\n\nأضف المزيد من المقاطع للتحقق من القائمة." +queue_6 : "🕚 المدة : مدة البث غير معروفة\n\nانقر على الزر أدناه للحصول على قائمة الانتظار بالكامل." +queue_7 : "\nانقر على الزر أدناه للحصول على قائمة الانتظار بالكامل." +queue_8 : "مشغل {0}\n\n🎄 يتم البث حاليًا لـ : {1}\n\n🔗 نوع البث : {2}\n🥀 طلب بواسطة : {3}\n{4}" + +stream_1 : "➲ بدء البث |\n\n‣ العنوان : {1}\n‣ المدة : {2} دقيقة\n‣ طلب بواسطة : {3}" +stream_2 : "➲ بدء البث |\n\n‣ نوع البث : بث مباشر [الرابط]\n‣ طلب بواسطة : {0}" + +CLOSE_BUTTON : "إغلاق" +BACK_BUTTON : "رجوع" + +S_B_1 : "أضفني" +S_B_2 : "الدعم" +S_B_3 : "أضفني في مجموعتك" +S_B_4 : "المساعدة والأوامر" +S_B_5 : "المطور" +S_B_6 : "القناة" +S_B_7 : "الشيفرة المصدرية" +S_B_8 : "👀 يوتيوب 👀" +S_B_9 : "🥀 الدعم 🥀" + +H_B_1 : "أدمن" +H_B_2 : "أوث" +H_B_3 : "بث" +H_B_4 : "بل-دردشة" +H_B_5 : "بل-مستخدم" +H_B_6 : "تشغيل-عشوائي" +H_B_7 : "حظر-جماعي" +H_B_8 : "تكرار" +H_B_9 : "صيانة" +H_B_10 : "بنج" +H_B_11 : "تشغيل" +H_B_12 : "تبديل-عشوائي" +H_B_13 : "بحث" +H_B_14 : "أغنية" +H_B_15 : "سرعة" + +P_B_1 : "صوتي" +P_B_2 : "فيديو" +P_B_3 : "بث مباشر" +P_B_4 : "عادي" + +ST_B_1 : "مستخدمين مصرح لهم" +ST_B_2 : "وضع التشغيل" +ST_B_3 : "اللغة" +ST_B_4 : "وضع التصويت" +ST_B_5 : "مشغل" +ST_B_6 : "معطل" +ST_B_7 : "مستخدمين مصرح لهم ➜" +ST_B_8 : "مسؤولون" +ST_B_9 : "الجميع" +ST_B_10 : "وضع البحث ➜" +ST_B_11 : "مباشر" +ST_B_12 : "داخلي" +ST_B_13 : "أوامر المسؤول ➜" +ST_B_14 : "نوع التشغيل ➜" + +SA_B_1 : "إحصائيات عامة" +SA_B_2 : "عام" +SA_B_3 : "عامة" + +QU_B_1 : "قائمة الانتظار" +QU_B_2 : " {0} —————————— {1}" + +sudo_1 : "» {0} موجود بالفعل في قائمة مستخدمي sudo." +sudo_2 : "» تمت إضافة {0} إلى قائمة مستخدمي sudo." +sudo_3 : "» {0} غير موجود في قائمة مستخدمي sudo." +sudo_4 : "» تمت إزالة {0} من قائمة مستخدمي sudo." +sudo_5 : "🥀 المالك :\n" +sudo_6 : "\n✨ مستخدمو sudo :\n" +sudo_7 : "» لا توجد مستخدمين sudo." +sudo_8 : "فشل." + +block_1 : "» {0} محظور بالفعل من البوت." +block_2 : "» تمت إضافة {0} إلى قائمة المستخدمين المحظورين." +block_3 : "» {0} غير موجود في قائمة المستخدمين المحظورين." +block_4 : "» تمت إزالة {0} من قائمة المستخدمين المحظورين." +block_5 : "» لا توجد مستخدمين محظورين." +block_6 : "» جاري الحصول على قائمة المستخدمين المحظورين..." +block_7 : "😫 المستخدمون المحظورون :\n\n" + +black_1 : "مثال :\n\n/blacklistchat [معرّف الدردشة]" +black_2 : "» هذه الدردشة محظورة بالفعل." +black_3 : "» تمت إضافتها بنجاح إلى قائمة الدردشات المحظورة." +black_4 : "مثال :\n\n/whitelistchat [معرّف الدردشة]" +black_5 : "» هذه الدردشة غير محظورة." +black_6 : "» تمت إزالتها بنجاح من قائمة الدردشات المحظورة." +black_7 : "» قائمة الدردشات المحظورة :\n\n" +black_8 : "» لا توجد دردشات محظورة على {0}." +black_9 : "» حدث خطأ ما." + +maint_1 : "مثال :\n/maintenance [تمكين | تعطيل]" +maint_2 : "» تم تمكين وضع الصيانة {0}." +maint_3 : "» تم تعطيل وضع الصيانة {0}." +maint_4 : "» وضع الصيانة مُمكّن بالفعل." +maint_5 : "» وضع الصيانة مُعطّل بالفعل." + +log_1 : "مثال :\n/logger [تمكين | تعطيل]" +log_2 : "تم تمكين تسجيل البيانات." +log_3 : "تم تعطيل تسجيل البيانات." + +broad_1 : "» بدء البث..." +broad_2 : "مثال :\n\n/broadcast [الرسالة أو الرد على رسالة]" +broad_3 : "» تم بث الرسالة إلى {0} دردشة مع {1} تثبيتًا من البوت." +broad_4 : "» تم بث الرسالة إلى {0} مستخدمين." +broad_5 : "» بدء بث المساعد..." +broad_6 : "➻ بث المساعد :\n\n" +broad_7 : "↬ تم بث المساعد {0} في {1} دردشة." +broad_8 : "» يُرجى تقديم نص للبث." + +server_1 : "» فشل في الحصول على السجلات." +server_2 : "يرجى التأكد من تكوين مفتاح API هيروكو الخاص بك واسم التطبيق بشكل صحيح." +server_3 : "التحقق من وجود تحديثات متاحة..." +server_4 : "خطأ في أمر git." +server_5 : "مستودع Git غير صالح." +server_6 : "» البوت محدث." +server_7 : "» تم تحديث البوت بنجاح! انتظر بضع دقائق حتى يتم إعادة تشغيل البوت ودمج التغييرات!" +server_8 : "جاري إعادة تشغيل {0}...\n\nيمكنك البدء في التشغيل مرة أخرى بعد 15-20 ثانية." +server_9 : "حدث خطأ ما، يُرجى التحقق من السجلات." +server_10 : "حدث استثناء في #مُحدّث بسبب : {0}" +server_11 : "» جاري إجراء اختبار سرعة..." +server_12 : "⇆ جاري اختبار سرعة التنزيل..." +server_13 : "⇆ جاري اختبار سرعة الرفع..." +server_14 : "↻ مشاركة نتائج اختبار السرعة..." +server_15 : "✯ نتائج اختبار السرعة ✯\n\nالعميل :\n» عنوان IP : {0}\n» البلد : {1}\n\nالخادم :\n» الاسم : {2}\n» البلد : {3}, {4}\n» الراعي : {5}\n» التأخير : {6}\n» التأخير في الشبكة : {7}" +gban_1 : "» لماذا تريد حظر نفسك يا صغيري؟" +gban_2 : "» لماذا يجب أن أحظر نفسي؟" +gban_3 : "» لا يمكنك حظر المستخدمين المصرح لهم." +gban_4 : "» تم حظر {0} بالفعل على مستوى البوت." +gban_5 : "» جاري تنفيذ حظر عالمي على {0}.\n\nالزمن المتوقع: {1}" +gban_6 : "حظر عالمي جديد على {0}:\n\nمنبعه من : {1} [{2}]\nالمستخدم : {3}\nمعرّف المستخدم : {4}\n\nتم الحظر بواسطة : {5}\nالدردشات : {6}" +gban_7 : "» {0} ليس محظورًا على مستوى البوت." +gban_8 : "» رفع الحظر العالمي عن {0}.\n\nالزمن المتوقع : {1}" +gban_9 : "» تم رفع الحظر العالمي عن {0}.\n\nتم إلغاء الحظر في {1} دردشة." +gban_10 : "» لا يوجد أي مستخدم محظور على مستوى البوت." +gban_11 : "» جاري جلب قائمة المستخدمين المحظورين على مستوى البوت..." +gban_12 : "🙂 قائمة المستخدمين المحظورين عالميًا :\n\n" diff --git a/strings/langs/en.yml b/strings/langs/en.yml new file mode 100644 index 000000000000..0efbef92ab5c --- /dev/null +++ b/strings/langs/en.yml @@ -0,0 +1,302 @@ +name : 🇺🇸 English + + +general_1 : "❖ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." +general_2 : "❖ sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ ᴡʜɪʟᴇ ᴘʀᴏᴄᴇssɪɴɢ ʏᴏᴜʀ ǫᴜᴇʀʏ.\n\n● ᴇxᴄᴇᴘᴛɪᴏɴ ➥ {0}" +general_3 : "❖ ʏᴏᴜ'ʀᴇ ᴀɴ ᴀɴᴏɴʏᴍᴏᴜs ᴀᴅᴍɪɴ ɪɴ ᴛʜɪs ᴄʜᴀᴛ, ʀᴇᴠᴇʀᴛ ʙᴀᴄᴋ ᴛᴏ ᴜsᴇʀ ᴀᴄᴄᴏᴜɴᴛ ғᴏʀ ᴜsɪɴɢ ᴍᴇ." +general_4 : "❖ ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs.\n\n● ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴠɪᴀ /reload" +general_5 : "❖ ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ." + +tg_1 : "❖ {0} ᴅᴏᴡɴʟᴏᴀᴅᴇʀ ⏤͟͟͞͞★\n\n● ғɪʟᴇ sɪᴢᴇ ➥ {1}\n● ᴄᴏᴍᴘʟᴇᴛᴇᴅ ➥ {2}\n● ᴘᴇʀᴄᴇɴᴛᴀɢᴇ ➥ {3}%\n\n● sᴘᴇᴇᴅ ➥ {4}/s\n● ᴇᴛᴀ ➥ {5}" +tg_2 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ᴅᴏᴡɴʟᴏᴀᴅᴇᴅ, ᴘʀᴏᴄᴇssɪɴɢ ғɪʟᴇ...\n\n● ᴛɪᴍᴇ ᴇʟᴀᴘsᴇᴅ ➥ {0}" +tg_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴅᴏᴡɴʟᴏᴀᴅ ᴍᴇᴅɪᴀ ғʀᴏᴍ ᴛᴇʟᴇɢʀᴀᴍ, ᴘʟᴇᴀsᴇ ᴛʀʏ ᴀɢᴀɪɴ..." +tg_4 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴀʟʀᴇᴀᴅʏ ᴄᴏᴍᴘʟᴇᴛᴇᴅ." +tg_5 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴀʟʀᴇᴀᴅʏ ᴄᴏᴍᴘʟᴇᴛᴇᴅ ᴏʀ ᴄᴀɴᴄᴇʟʟᴇᴅ." +tg_6 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴄᴀɴᴄᴇʟʟᴇᴅ." +tg_7 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴄᴀɴᴄᴇʟʟᴇᴅ ʙʏ ➥ {0}" +tg_8 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴛᴏᴘ ᴛʜᴇ ᴅᴏᴡɴʟᴏᴀᴅ." +tg_9 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɢᴇᴛ ᴛʜᴇ ᴏɴɢᴏɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ ᴛᴀsᴋ..." + +call_1 : "❖ ʙᴏᴛ ʀᴇǫᴜɪʀᴇs ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ ɪɴᴠɪᴛᴇ ᴀssɪsᴛᴀɴᴛ ᴛᴏ ʏᴏᴜʀ ᴄʜᴀᴛ." +call_2 : "❖ {0} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.\n\n● ɪᴅ ➥ {1}\n● ɴᴀᴍᴇ ➥ {2}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{3}\n\n● ᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." +call_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {0} ᴀssɪsᴛᴀɴᴛ ᴛᴏ ʏᴏᴜʀ ᴄʜᴀᴛ.\n\n● ʀᴇᴀsᴏɴ ➥ {1}" +call_4 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ɪɴᴠɪᴛɪɴɢ {0} ᴀssɪsᴛᴀɴᴛ ᴛᴏ ʏᴏᴜʀ ᴄʜᴀᴛ..." +call_5 : "❖ {0} ᴀssɪsᴛᴀɴᴛ ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.\n\n● ᴛʀʏɪɴɢ ᴛᴏ sᴛᴀʀᴛ sᴛʀᴇᴀᴍ..." +call_6 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴡɪᴛᴄʜ sᴛʀᴇᴀᴍ, ᴘʟᴇᴀsᴇ ᴜsᴇ /skip ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴛʀᴀᴄᴋ ᴀɢᴀɪɴ." +call_7 : "❖ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ǫᴜᴇᴜᴇ.\n\n● ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." +call_8 : "❖ Nᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.\n\n● Pʟᴇᴀsᴇ sᴛᴀʀᴛ ᴠɪᴅᴇᴏᴄʜᴀᴛ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." +call_9 : "❖ Assɪsᴛᴀɴᴛ ᴀʟʀᴇᴀᴅʏ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.\n\n● ɪғ ᴀssɪsᴛᴀɴᴛ ɪs ɴᴏᴛ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ, ᴘʟᴇᴀsᴇ sᴇɴᴅ /reboot ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ." +call_10 : "❖ Tᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀ ᴇʀʀᴏʀ\n\n● ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴏʀ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴏғ ʏᴏᴜʀ ɢʀᴏᴜᴘ." + +auth_1 : "❖ ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ʜᴀᴠᴇ 25 ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ." +auth_2 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛᴏ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." +auth_3 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ɪɴ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." +auth_4 : "❖ ʀᴇᴍᴏᴠᴇᴅ {0} ғʀᴏᴍ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." +auth_5 : "❖ {0} ɪs ɴᴏᴛ ɪɴ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." +auth_6 : "❖ ғᴇᴛᴄʜɪɴɢ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." +auth_7 : "❖ ʟɪsᴛ ᴏғ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ɪɴ {0} ⏤͟͟͞͞★\n\n" +auth_8 : "❖ ᴀᴅᴅᴇᴅ ʙʏ ⏤͟͟͞͞★" + +reload_1 : "❖ ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ʀᴇғʀᴇsʜ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴏɴᴄᴇ ɪɴ 3 ᴍɪɴᴜᴛᴇs.\n\n● ᴘʟᴇᴀsᴇ ᴛʀʏ ᴀғᴛᴇʀ {0}." +reload_2 : "❖ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ʀᴇғʀᴇsʜᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." +reload_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ, ᴍᴀᴋᴇ sᴜʀᴇ ᴛʜᴀᴛ ᴛʜᴇ ʙᴏᴛ ɪs ᴀᴅᴍɪɴ ɪɴ ʏᴏᴜʀ ᴄʜᴀᴛ." +reload_4 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ʀᴇʙᴏᴏᴛɪɴɢ {0} ғᴏʀ ʏᴏᴜʀ ᴄʜᴀᴛ." +reload_5 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ʀᴇʙᴏᴏᴛᴇᴅ {0} ғᴏʀ ʏᴏᴜʀ ᴄʜᴀᴛ.\n\n● sᴛᴀʀᴛ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ..." + +admin_1 : "❖ ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ'ᴠᴇ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" +admin_2 : "❖ sᴛʀᴇᴀᴍ ᴘᴀᴜsᴇᴅ \n│ \n└ʙʏ ➥ {0}" +admin_3 : "❖ ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ'ᴠᴇ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" +admin_4 : "❖ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ \n│ \n└ʙʏ ➥ {0}" +admin_5 : "❖ sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ \n│ \n└ʙʏ ➥ {0}" +admin_6 : "❖ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ \n│ \n└ʙʏ ➥ {0}\n\n● ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ {1}, ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ." +admin_7 : "❖ ᴇʀʀᴏʀ ᴡʜɪʟᴇ ᴄʜᴀɴɢɪɴɢ sᴛʀᴇᴀᴍ ᴛᴏ {0}." +admin_8 : "❖ ᴘʟᴇᴀsᴇ ᴅɪsᴀʙʟᴇ ʟᴏᴏᴘ ᴘʟᴀʏ ᴠɪᴀ /loop disable ᴀɴᴅ ᴛʜᴇɴ ᴛʀʏ ᴛᴏ sᴋɪᴘ ᴀɢᴀɪɴ." +admin_9 : "❖ ᴘʟᴇᴀsᴇ ᴜsᴇ sᴘᴇᴄɪғɪᴄ ɴᴜᴍʙᴇʀs ғᴏʀ sᴋɪᴘ, ʟɪᴋᴇ 1, 2, 4..." +admin_10 : "❖ ᴀᴛʟᴇᴀsᴛ 2 ᴛʀᴀᴄᴋs ɴᴇᴇᴅᴇᴅ ɪɴ ǫᴜᴇᴜᴇ ғᴏʀ sᴘᴇᴄɪғɪᴄ sᴋɪᴘ.\n\n● ᴄʜᴇᴄᴋ ᴛʜᴇ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" +admin_11 : "❖ ɴᴏᴛ ᴇɴᴏᴜɢʜ ᴛʀᴀᴄᴋs ɪɴ ǫᴜᴇᴜᴇ ғᴏʀ sᴘᴇᴄɪғɪᴄ sᴋɪᴘ.\n\n● ᴘʟᴇᴀsᴇ sᴋɪᴘ ʙᴇᴛᴡᴇᴇɴ 1 ᴀɴᴅ {0}" +admin_12 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴋɪᴘ ᴛᴏ sᴘᴇᴄɪғɪᴄ ᴛʀᴀᴄᴋ.\n\n● ᴄʜᴇᴄᴋ ʟᴇғᴛ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" +admin_13 : "❖ ᴘʟᴇᴀsᴇ ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴠɪᴀ ➥ /reload" +admin_14 : "❖ ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs.\n\n● ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴠɪᴀ ➥ /reload" +admin_15 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sʜᴜғғʟᴇ.\n\n● ᴄʜᴇᴄᴋ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" +admin_16 : "❖ ǫᴜᴇᴜᴇ sʜᴜғғʟᴇᴅ ʙʏ {0}.\n\n● ᴄʜᴇᴄᴋ sʜᴜғғʟᴇᴅ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" +admin_17 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /loop enable/disable\n● /loop 10/9/8/7" +admin_18 : "❖ ʟᴏᴏᴘ ᴇɴᴀʙʟᴇᴅ ғᴏʀ {0} ᴛɪᴍᴇs ʙʏ ➥ {1}." +admin_19 : "❖ ʟᴏᴏᴘ ᴘʟᴀʏ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ʙʏ ➥ {0}." +admin_20 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /seek ᴏʀ /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs]" +admin_21 : "❖ ᴘʟᴇᴀsᴇ ᴜsᴇ ɴᴜᴍᴇʀɪᴄ ᴅɪɢɪᴛs ғᴏʀ sᴇᴇᴋɪɴɢ ɪɴ sᴇᴄᴏɴᴅs." +admin_22 : "❖ ʟɪᴠᴇ sᴛʀᴇᴀᴍs ᴄᴀɴ'ᴛ ʙᴇ sᴇᴇᴋᴇᴅ." +admin_23 : "❖ ᴛʀʏ sᴇᴇᴋɪɴɢ ᴡɪᴛʜ ᴀ ʟᴏᴡᴇʀ ᴅᴜʀᴀᴛɪᴏɴ.\n\n● ᴘʟᴀʏᴇᴅ {0} ᴏᴜᴛ ᴏғ {1} ᴍɪɴᴜᴛᴇs." +admin_24 : "❖ sᴇᴇᴋɪɴɢ...\n\n● ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." +admin_25 : "❖ sᴛʀᴇᴀᴍ sᴜᴄᴄᴇssғᴜʟʟʏ sᴇᴇᴋᴇᴅ.\n\n● ᴅᴜʀᴀᴛɪᴏɴ ➥ {0} ᴍɪɴᴜᴛᴇs\n● ʙʏ ➥ {1}" +admin_26 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴇᴇᴋ." +admin_27 : "❖ ᴏɴʟʏ ʏᴏᴜᴛᴜʙᴇ sᴛʀᴇᴀᴍ's sᴘᴇᴇᴅ ᴄᴀɴ ʙᴇ ᴄᴏɴᴛʀᴏʟʟᴇᴅ ᴄᴜʀʀᴇɴᴛʟʏ." +admin_28 : "❖ {0} sᴘᴇᴇᴅ ᴄᴏɴᴛʀᴏʟ ᴘᴀɴᴇʟ\n\n● ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ʙᴇʟᴏᴡ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴘʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ." +admin_29 : "❖ ʙᴏᴛ ɪs ᴀʟʀᴇᴀᴅʏ ᴘʟᴀʏɪɴɢ ᴏɴ ɴᴏʀᴍᴀʟ sᴘᴇᴇᴅ." +admin_30 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● sᴏᴍᴇᴏɴᴇ ᴇʟsᴇ ɪs ᴛʀʏɪɴɢ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ sᴛʀᴇᴀᴍ." +admin_31 : "❖ ᴄʜᴀɴɢɪɴɢ sᴘᴇᴇᴅ..." +admin_32 : "❖ ᴛʀʏɪɴɢ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ...\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {0}" +admin_33 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ." +admin_34 : "❖ ᴄʜᴀɴɢᴇᴅ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴛᴏ {0}x\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {1}" +admin_35 : "❖ ᴛʜᴇ ᴠᴏᴛɪɴɢ ʜᴀs ᴇɴᴅᴇᴅ ʙᴇᴄᴀᴜsᴇ ᴛʜᴇ ᴛʀᴀᴄᴋ ʜᴀs ᴇɴᴅᴇᴅ ғᴏʀ ᴡʜɪᴄʜ ᴛʜᴇ ᴠᴏᴛɪɴɢ ᴡᴀs ᴘʀᴏᴠɪᴅᴇᴅ." +admin_36 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘᴇʀғᴏʀᴍ ᴛʜɪs ᴀᴄᴛɪᴏɴ ʙᴇᴄᴀᴜsᴇ ғᴏʀ ᴡʜɪᴄʜ ᴛʀᴀᴄᴋ ᴛʜᴇ ᴠᴏᴛɪɴɢ ᴡᴀs ᴘʀᴏᴠɪᴅᴇᴅ ɪs ᴇɪᴛʜᴇʀ ᴇɴᴅᴇᴅ ᴏʀ sᴛᴏᴘᴘᴇᴅ." +admin_37 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ɢᴏᴛ {0} ᴜᴘᴠᴏᴛᴇs." +admin_38 : "❖ ᴀᴅᴅᴇᴅ 1 ᴜᴘᴠᴏᴛᴇ." +admin_39 : "❖ ʀᴇᴍᴏᴠᴇᴅ 1 ᴜᴘᴠᴏᴛᴇ." +admin_40 : "❖ ᴜᴘᴠᴏᴛᴇᴅ." + +start_1 : "❖ {0} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ.\n\n❖ ᴜᴘᴛɪᴍᴇ ➥ {1}" +start_2 : "❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n● ɪ ᴀᴍ {1} ʙᴏᴛ.\n\n● ᴘʏᴛʜᴏɴ ➥ 3.10.11\n● ᴘʏʀᴏɢʀᴀᴍ ➥ 2.0.106\n● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ 0.9.7\n\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴠᴄ." +start_3 : "❖ ʜᴇʏ {0},\n● ᴛʜɪs ɪs {1}\n\n● ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ ɪɴ {2}, {3} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." +start_4 : "❖ sᴜᴘᴇʀɢʀᴏᴜᴘ ɴᴇᴇᴅᴇᴅ ❖\n\n● ᴘʟᴇᴀsᴇ ᴄᴏɴᴠᴇʀᴛ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴛᴏ sᴜᴘᴇʀɢʀᴏᴜᴘ ᴀɴᴅ ᴛʜᴇɴ ᴀᴅᴅ ᴍᴇ ᴀɢᴀɪɴ.\n\n● ʜᴏᴡ ᴛᴏ ᴍᴀᴋᴇ sᴜᴘᴇʀɢʀᴏᴜᴘ ?\n● ᴍᴀᴋᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ's ᴄʜᴀᴛ ʜɪsᴛᴏʀʏ ᴠɪsɪʙʟᴇ ᴏɴᴄᴇ." +start_5 : "❖ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ ❖\n\n● ᴛʜɪs ᴄʜᴀᴛ ɪs ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴏɴ {0} ᴅᴀᴛᴀʙᴀsᴇ.\n● ʀᴇǫᴜᴇsᴛ ᴀ sᴜᴅᴏ ᴜsᴇʀ ᴛᴏ ᴜɴʙʟᴀᴄᴋʟɪsᴛ ʏᴏᴜʀ ᴄʜᴀᴛ ᴏʀ ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ." +start_6 : "❖ 🥀ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ❖\n\n● 📌ᴛɪᴛʟᴇ ➥ {0}\n\n● ⏳ᴅᴜʀᴀᴛɪᴏɴ ➥ {1} ᴍɪɴᴜᴛᴇs\n● 👀ᴠɪᴇᴡs ➥ {2}\n● ⏰ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ ➥ {3}\n● ᴄʜᴀɴɴᴇʟ ➥ {5}\n\n● sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ ➥ {6}" + +help_1 : "❖ ᴄʜᴏᴏsᴇ ᴛʜᴇ ᴄᴀᴛᴇɢᴏʀʏ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴩ.\n\n● ᴀsᴋ ʏᴏᴜʀ ᴅᴏᴜʙᴛs ᴀᴛ ➥ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ\n\n● ᴀʟʟ ᴄᴏᴍᴍᴀɴᴅs ᴄᴀɴ ʙᴇ ᴜsᴇᴅ ᴡɪᴛʜ ➥ /" +help_2 : "❖ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ᴍʏ ʜᴇʟᴘ ᴍᴇɴᴜ ɪɴ ʏᴏᴜʀ ᴘᴍ." + +lang_1 : "❖ ᴘʟᴇᴀsᴇ ᴄʜᴏᴏsᴇ ᴛʜᴇ ʟᴀɴɢᴜᴀɢᴇ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ sᴇᴛ ᴀs ᴛʜɪs ɢʀᴏᴜᴘ's ᴅᴇғᴀᴜʟᴛ ʟᴀɴɢᴜᴀɢᴇ" +lang_2 : "❖ ʟᴀɴɢᴜᴀɢᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." +lang_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ʟᴀɴɢᴜᴀɢᴇ." +lang_4 : "❖ Yᴏᴜ'ʀᴇ ᴀʟʀᴇᴀᴅʏ ᴏɴ ᴛʜᴇ sᴀᴍᴇ ʟᴀɴɢᴜᴀɢᴇ." + +setting_1 : "❖ {0} sᴇᴛᴛɪɴɢs ᴘᴀɴᴇʟ\n\n● ᴄʜᴀᴛ ɪᴅ ➥ {1}\n● ᴄʜᴀᴛ ᴛɪᴛʟᴇ ➥ {2}\n\n● ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ʙᴇʟᴏᴡ ғᴏʀ ᴄʜᴀɴɢɪɴɢ sᴇᴛᴛɪɴɢs." +setting_2 : "❖ ᴅɪʀᴇᴄᴛ ➥ ᴘʟᴀʏs sᴇᴀʀᴄʜ ǫᴜᴇʀɪᴇs ᴅɪʀᴇᴄᴛʟʏ.\n\n● ɪɴʟɪɴᴇ ➥ ʀᴇᴛᴜʀɴs ɪɴʟɪɴᴇ ʙᴜᴛᴛᴏɴs ꜰᴏʀ ᴄʜᴏᴏsɪɴɢ ʙᴇᴛᴡᴇᴇɴ ᴠɪᴅᴇᴏ & ᴀᴜᴅɪᴏ." +setting_3 : "❖ ᴇᴠᴇʀʏᴏɴᴇ ➥ ᴀɴʏᴏɴᴇ ᴄᴀɴ ᴜsᴇ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs [sᴋɪᴘ, ᴘᴀᴜsᴇ, ʀᴇsᴜᴍᴇ ᴇᴛᴄ.] ᴘʀᴇsᴇɴᴛ ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ.\n\n● ᴀᴅᴍɪɴ ᴏɴʟʏ ➥ ᴏɴʟʏ ᴀᴅᴍɪɴs ᴀɴᴅ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ᴄᴀɴ ᴜsᴇ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs." +setting_4 : "❖ ɴᴏ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ꜰᴏᴜɴᴅ." +setting_5 : "❖ ɢʀᴏᴜᴘ ➥ ᴘʟᴀʏs ᴍᴜsɪᴄ ɪɴ ᴛʜᴇ ɢʀᴏᴜᴘ ᴡʜᴇʀᴇ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ ɪs ɢɪᴠᴇɴ.\n\n● ᴄʜᴀɴɴᴇʟ ➥ ᴘʟᴀʏs ᴍᴜsɪᴄ ɪɴ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ ʏᴏᴜ ᴡᴀɴᴛ. sᴇᴛ ᴄʜᴀɴɴᴇʟ ɪᴅ ᴠɪᴀ ➥ /channelplay" +setting_6 : "❖ ᴇᴠᴇʀʏᴏɴᴇ ➥ ᴀɴʏᴏɴᴇ ᴘʀᴇsᴇɴᴛ ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ ᴄᴀɴ ᴘʟᴀʏ ᴍᴜsɪᴄ ʜᴇʀᴇ.\n\n● ᴀᴅᴍɪɴ ᴏɴʟʏ ➥ ᴏɴʟʏ ᴀᴅᴍɪɴs ᴄᴀɴ ᴘʟᴀʏ ᴛʜᴇ ᴍᴜsɪᴄ ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ." +setting_7 : "❖ ᴘʟᴇᴀsᴇ ᴅᴇғɪɴᴇ ᴄʜᴀɴɴᴇʟ ɪᴅ ᴠɪᴀ ➥ /channelplay" +setting_8 : "❖ ᴡʜᴇɴ ᴛʜɪs ᴍᴏᴅᴇ ɪs ᴇɴᴀʙʟᴇᴅ, ᴘᴇᴏᴘʟᴇ ᴡɪᴛʜᴏᴜᴛ ᴀᴅᴍɪɴ ʀɪɢʜᴛs ᴄᴀɴ ᴜsᴇ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ᴀғᴛᴇʀ ᴀ ᴄᴇʀᴛᴀɪɴ ᴀᴍᴏᴜɴᴛ ᴏғ ᴠᴏᴛᴇs." +setting_9 : "❖ ᴄᴜʀʀᴇɴᴛ ᴜᴘᴠᴏᴛᴇs ʀᴇǫᴜɪʀᴇᴅ ғᴏʀ ᴜsɪɴɢ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ➥ {0}" +setting_10 : "❖ ᴠᴏᴛɪɴɢ ᴍᴏᴅᴇ ɪs ᴅɪsᴀʙʟᴇᴅ." +setting_11 : "❖ ʟᴏᴡᴇsᴛ ᴜᴘᴠᴏᴛᴇs ᴄᴏᴜɴᴛ ᴄᴀɴ ʙᴇ 2. ʏᴏᴜ ᴄᴀɴ'ᴛ sᴇᴛ ʙᴇʟᴏᴡ 2" +setting_12 : "❖ ʜɪɢʜᴇsᴛ ᴜᴘᴠᴏᴛᴇs ᴄᴏᴜɴᴛ ᴄᴀɴ ʙᴇ 15. ʏᴏᴜ ᴄᴀɴ'ᴛ sᴇᴛ ᴀʙᴏᴠᴇ 15" + +set_cb_1 : "❖ ɢᴇᴛᴛɪɴɢ ᴀᴜᴛʜ ᴜsᴇʀs ᴩᴀɴᴇʟ..." +set_cb_2 : "❖ ɢᴇᴛᴛɪɴɢ ᴩʟᴀʏ ᴍᴏᴅᴇ ᴩᴀɴᴇʟ..." +set_cb_3 : "❖ sᴇᴛᴛɪɴɢ ᴜᴩ ᴄʜᴀɴɢᴇs..." +set_cb_4 : "❖ ғᴇᴛᴄʜɪɴɢ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." +set_cb_5 : "❖ ɢᴇᴛᴛɪɴɢ ʙᴀᴄᴋ..." + +gstats_1 : "❖ ɢᴇᴛᴛɪɴɢ {0} sᴛᴀᴛs ᴀɴᴅ ɪɴғᴏʀᴍᴀᴛɪᴏɴ...\n\n● ɪᴛ ᴍᴀʏ ᴛᴀᴋᴇ ᴀ ᴡʜɪʟᴇ, ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." +gstats_2 : "❖ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ʙᴇʟᴏᴡ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʜᴇ sᴛᴀᴛs ᴏғ ➥ {0}." +gstats_3 : "❖ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙゙ ʙᴏᴛ sᴛᴀᴛɪsᴛɪᴄs ❖\n\n╭✠──────⊱◈◈◈⊰──────✠╮\n│● ᴀssɪsᴛᴀɴᴛs ➥ {1}\n│● ʙʟᴏᴄᴋᴇᴅ ➥ {2}\n│● ᴄʜᴀᴛs ➥ {3}\n│● ᴜsᴇʀs ➥ {4}\n│● ᴍᴏᴅᴜʟᴇs ➥ {5}\n│● sᴜᴅᴏᴇʀs ➥ {6}\n╰✠──────⊱◈◈◈⊰──────✠╯\n\n● ᴀᴜᴛᴏ ʟᴇᴀᴠɪɴɢ ᴀssɪsᴛᴀɴᴛ ➥ {7}\n● ᴘʟᴀʏ ᴅᴜʀᴀᴛɪᴏɴ ʟɪᴍɪᴛ ➥ {8} ᴍɪɴᴜᴛᴇs\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" +gstats_4 : "❖ ᴛʜɪs ʙᴜᴛᴛᴏɴ ɪs ᴏɴʟʏ ғᴏʀ sᴜᴅᴏᴇʀs." +gstats_5 : "❖ {0} sᴛᴀᴛs ᴀɴᴅ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ⏤͟͟͞͞★\n\n● ᴍᴏᴅᴜʟᴇs ➥ {1}\n● ᴘʟᴀᴛғᴏʀᴍ ➥ {2}\n● ʀᴀᴍ ➥ {3}\n● ᴘʜʏsɪᴄᴀʟ ᴄᴏʀᴇs ➥ {4}\n● ᴛᴏᴛᴀʟ ᴄᴏʀᴇs ➥ {5}\n● ᴄᴘᴜ ➥ {6}\n\n● ᴘʏᴛʜᴏɴ ➥ {7}\n● ᴘʏʀᴏɢʀᴀᴍ ➥ {8}\n● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ {9}\n\n● sᴛᴏʀᴀɢᴇ ᴀᴠᴀɪʟᴀʙʟᴇ ➥ {10} ɢɪʙ\n● sᴛᴏʀᴀɢᴇ ᴜsᴇᴅ ➥ {11} ɢɪʙ\n● sᴛᴏʀᴀɢᴇ ʟᴇғᴛ ➥ {12} ɢɪʙ\n\n● sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ➥ {13}\n● sᴇʀᴠᴇᴅ ᴜsᴇʀs ➥ {14}\n● ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ➥ {15}\n● sᴜᴅᴏ ᴜsᴇʀs ➥ {16}\n\n● ᴛᴏᴛᴀʟ ᴅʙ sɪᴢᴇ ➥ {17} ᴍʙ\n● ᴛᴏᴛᴀʟ ᴅʙ sᴛᴏʀᴀɢᴇ ➥ {18} ᴍʙ\n● ᴛᴏᴛᴀʟ ᴅʙ ᴄᴏʟʟᴇᴄᴛɪᴏɴs ➥ {19}\n● ᴛᴏᴛᴀʟ ᴅʙ ᴋᴇʏs ➥ {20}" + +playcb_1 : "❖ ᴀᴡᴡ, ᴛʜɪs ɪs ɴᴏᴛ ғᴏʀ ʏᴏᴜ ʙᴀʙʏ." +playcb_2 : "❖ ɢᴇᴛᴛɪɴɢ ɴᴇxᴛ ʀᴇsᴜʟᴛ,\n\n● ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ..." + +cplay_1 : "❖ ʏᴏᴜ ᴄᴀɴ ᴘʟᴀʏ ᴍᴜsɪᴄ ɪɴ ᴄʜᴀɴɴᴇʟs ғʀᴏᴍ {0} ᴛᴏ ᴀɴʏ ᴄʜᴀɴɴᴇʟ ᴏʀ ʏᴏᴜʀ ᴄʜᴀᴛ's ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ.\n\n● ғᴏʀ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ➥\n● /channelplay linked\n\n● ғᴏʀ ᴀɴʏ ᴏᴛʜᴇʀ ᴄʜᴀɴɴᴇʟ ➥\n/channelplay [ᴄʜᴀɴɴᴇʟ ɪᴅ]" +cplay_2 : "❖ ᴛʜɪs ᴄʜᴀᴛ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴀɴʏ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ." +cplay_3 : "❖ ᴄʜᴀɴɴᴇʟ ᴅᴇғɪɴᴇᴅ ᴛᴏ {0}.\n● ᴄʜᴀɴɴᴇʟ ɪᴅ ➥ {1}" +cplay_4 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɢᴇᴛ ᴄʜᴀɴɴᴇʟ.\n\n● ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ'ᴠᴇ ᴀᴅᴅᴇᴅ ᴛʜᴇ ʙᴏᴛ ɪɴ ʏᴏᴜʀ ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴘʀᴏᴍᴏᴛᴇᴅ ᴀs ᴀᴅᴍɪɴ." +cplay_5 : "❖ ᴏɴʟʏ ᴄʜᴀɴɴᴇʟs ᴀʀᴇ sᴜᴘᴘᴏʀᴛᴇᴅ." +cplay_6 : "❖ ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ʙᴇ ᴛʜᴇ ᴏᴡɴᴇʀ ᴏғ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ {0} ᴛᴏ ᴄᴏɴɴᴇᴄᴛ ɪᴛ ᴡɪᴛʜ ᴛʜɪs ɢʀᴏᴜᴘ.\n● ᴄʜᴀɴɴᴇʟ's ᴏᴡɴᴇʀ ➥ @{1}\n\n● ᴀʟᴛᴇʀɴᴀᴛɪᴠᴇʟʏ ʏᴏᴜ ᴄᴀɴ ʟɪɴᴋ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴛᴏ ᴛʜᴀᴛ ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʜᴇɴ ᴛʀʏ ᴄᴏɴɴɴᴇᴄᴛɪɴɢ ᴡɪᴛʜ /channelplay linked" +cplay_7 : "❖ ᴄʜᴀɴɴᴇʟ ᴘʟᴀʏ ᴅɪsᴀʙʟᴇᴅ." + +play_1 : "🔎" +play_2 : "❖ ᴄʜᴀɴɴᴇʟ ᴘʟᴀʏ ᴍᴏᴅᴇ\n\n● ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ➥ {0}" +play_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ǫᴜᴇʀʏ." +play_4 : "❖ ᴀᴅᴍɪɴs ᴏɴʟʏ ᴘʟᴀʏ\n● ᴏɴʟʏ ᴀᴅᴍɪɴs ᴏғ ᴛʜɪs ᴄʜᴀᴛ ᴀʀᴇ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ\n\n● ᴄʜᴀɴɢᴇ ᴘʟᴀʏ ᴍᴏᴅᴇ ᴠɪᴀ ➥ /playmode" +play_5 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴀᴜᴅɪᴏ ғɪʟᴇ.\n\n● ᴀᴜᴅɪᴏ ғɪʟᴇ sɪᴢᴇ ɪs ʟᴀʀɢᴇʀ ᴛʜᴀɴ ᴛʜᴇ ᴅᴇғɪɴᴇᴅ ʟɪᴍɪᴛ." +play_6 : "❖ sᴛʀᴇᴀᴍ's ʟᴏɴɢᴇʀ ᴛʜᴀɴ {0} ᴀʀᴇɴ'ᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {1}" +play_7 : "❖ ɴᴏᴛ ᴀ ᴠᴀʟɪᴅ ᴠɪᴅᴇᴏ ғɪʟᴇ ᴇxᴛᴇɴsɪᴏɴ.\n\n● sᴜᴘᴘᴏʀᴛᴇᴅ ᴇxᴛᴇɴsɪᴏɴs ➥ {0}" +play_8 : "❖ ᴠɪᴅᴇᴏ ғɪʟᴇ sɪᴢᴇ sʜᴏᴜʟᴅ ʙᴇ ʟᴇss ᴛʜᴀɴ 1ɢɪʙ." +play_9 : "❖ ʏᴏᴜᴛᴜʙᴇ ᴘʟᴀʏʟɪsᴛ ғᴇᴀᴛᴜʀᴇ\n\n● sᴇʟᴇᴄᴛ ᴛʜᴇ ᴍᴏᴅᴇ ɪɴ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴘʟᴀʏ ᴡʜᴏʟᴇ ʏᴏᴜᴛᴜʙᴇ ᴘʟᴀʏʟɪsᴛ." +play_10 : "❖ ᴛɪᴛʟᴇ ➥ {0}\n● ᴅᴜʀᴀᴛɪᴏɴ ➥ {1} ᴍɪɴᴜᴛᴇs" +play_11 : "❖ {0} sᴘᴏᴛɪғʏ ᴘʟᴀʏᴇʀ\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {1}" +play_12 : "❖ {0} ᴀᴘᴘʟᴇ ᴘʟᴀʏᴇʀ\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {1}" +play_13 : "❖ ʟɪᴠᴇ sᴛʀᴇᴀᴍ ᴅᴇᴛᴇᴄᴛᴇᴅ.\n\n● ᴀʀᴇ ʏᴏᴜ sᴜʀᴇ ᴛʜᴀᴛ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ᴛʜɪs ʟɪᴠᴇ sᴛʀᴇᴀᴍ ?" +play_14 : "❖ ꜰᴀɪʟᴇᴅ ᴛᴏ ꜰᴇᴛᴄʜ ᴛʀᴀᴄᴋ ᴅᴇᴛᴀɪʟs.\n\n● ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɴʏ ᴏᴛʜᴇʀ." +play_15 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ǫᴜᴇʀʏ.\n\n● ɪ ᴄᴀɴ ᴏɴʟʏ ᴘʟᴀʏ sᴘᴏᴛɪғʏ ᴛʀᴀᴄᴋs, ᴀʟʙᴜᴍs, ᴀʀᴛɪsᴛs ᴀɴᴅ ᴘʟᴀʏʟɪsᴛs." +play_16 : "❖ ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛ.\n\n● ᴛᴏ ᴜsᴇ ғᴏʀᴄᴇ ᴩʟᴀʏ, ᴛʜᴇʀᴇ ᴍᴜsᴛ ʙᴇ ᴀɴ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛ." +play_17 : "❖ ᴘʟᴇᴀsᴇ ᴛᴜʀɴ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ, ɪ'ᴍ ᴜɴᴀʙʟᴇ ᴛᴏ sᴛʀᴇᴀᴍ ᴜʀʟs." +play_18 : "❖ ᴜsᴀɢᴇ ➥ /play [sᴏɴɢ ɴᴀᴍᴇ/ʏᴏᴜᴛᴜʙᴇ ᴜʀʟ/ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴀᴜᴅɪᴏ/ᴠɪᴅᴇᴏ ғɪʟᴇ]" +play_19 : "❖ Queued Playlist :" +play_20 : "❖ Queued Position-" +play_21 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛʀᴀᴄᴋs ᴛᴏ ǫᴜᴇᴜᴇ.\n\n● ᴄʜᴇᴄᴋ ➥ ᴄʟɪᴄᴋ ʜᴇʀᴇ" +play_22 : "❖ sᴇʟᴇᴄᴛ ᴛʜᴇ ᴍᴏᴅᴇ ɪɴ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴘʟᴀʏ ᴛʜᴇ ǫᴜᴇʀɪᴇs ɪɴsɪᴅᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ ➥ {0}" + +str_1 : "❖ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴍ3ᴜ8 ᴏʀ ɪɴᴅᴇx ʟɪɴᴋs." +str_2 : "❖ ᴠᴀʟɪᴅ sᴛʀᴇᴀᴍ ᴠᴇʀɪғɪᴇᴅ.\n\n● ᴘʀᴏᴄᴇssɪɴɢ..." +str_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴛʀᴇᴀᴍ ʏᴏᴜᴛᴜʙᴇ ʟɪᴠᴇ sᴛʀᴇᴀᴍ, ɴᴏ ʟɪᴠᴇ ꜰᴏʀᴍᴀᴛ ꜰᴏᴜɴᴅ." + +ping_1 : "❖ {0} ɪs ᴘɪɴɢɪɴɢ..." +ping_2 : "❖ 🏓ᴛᴀɴᴜ ᴍᴜsɪᴄ ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ ⏤‌★\n\n╭✠──────⊱◈◈◈⊰──────✠╮\n│● ᴘɪɴɢ ➥ {0}ᴍs\n│● ᴜᴘᴛɪᴍᴇ ➥ {2}\n│● ʀᴀᴍ ➥ {3}\n│● ᴄᴘᴜ ➥ {4}\n│● ᴅɪsᴋ ➥ {5}\n│● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ {6}ᴍs\n╰✠──────⊱◈◈◈⊰──────✠╯\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" + +queue_1 : "❖ ғᴇᴛᴄʜɪɴɢ ǫᴜᴇᴜᴇ...\n\nᴘʟᴇᴀsᴇ ᴡᴀɪᴛ..." +queue_2 : "❖ ǫᴜᴇᴜᴇ ᴇᴍᴘᴛʏ." +queue_3 : "❖ ᴄʟɪᴄᴋ ʜᴇʀᴇ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʜᴇ ʟɪsᴛ ᴏғ ᴛʜᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ➥ ʜᴇʀᴇ" +queue_4 : "❖ ɴᴇxᴛ sᴏɴɢ ᴀᴅᴅᴇᴅ ɪɴ ǫᴜᴇᴜᴇ ➥ #{0}\n\n⬤ ᴛɪᴛʟᴇ ➥ {1}\n⬤ ᴅᴜʀᴀᴛɪᴏɴ ➥ {2} ᴍɪɴᴜᴛᴇs\n⬤ ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {3}\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" +queue_5 : "❖ ᴛʜᴇʀᴇ's ᴏɴʟʏ ᴏɴᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋ ɪɴ ᴘʟᴀʏʟɪsᴛ.\n\n● ᴀᴅᴅ ᴍᴏʀᴇ ᴛʀᴀᴄᴋs ᴛᴏ ᴄʜᴇᴄᴋ ʟɪsᴛ." +queue_6 : "❖ ᴅᴜʀᴀᴛɪᴏɴ ➥ ᴜɴᴋɴᴏᴡɴ ᴅᴜʀᴀᴛɪᴏɴ sᴛʀᴇᴀᴍ\n\n● ᴄʟɪᴄᴋ ᴏɴ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ᴡʜᴏʟᴇ ǫᴜᴇᴜᴇᴅ ʟɪsᴛ." +queue_7 : "\n❖ ᴄʟɪᴄᴋ ᴏɴ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ᴡʜᴏʟᴇ ǫᴜᴇᴜᴇᴅ ʟɪsᴛ." +queue_8 : "❖ {0} ᴘʟᴀʏᴇʀ ❖\n\n● sᴛʀᴇᴀᴍɪɴɢ ➥ {1}\n\n● sᴛʀᴇᴀᴍ ᴛʏᴘᴇ ➥ {2}\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {3}\n{4}" + +stream_1 : "❖ ᴛᴀɴᴜ ᴍᴜsɪᴄ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ ⏤͟͟͞͞★\n\n⬤ ᴛɪᴛʟᴇ ➥ {1}\n⬤ ᴅᴜʀᴀᴛɪᴏɴ ➥ {2} ᴍɪɴᴜᴛᴇs\n⬤ ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {3}\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" +stream_2 : "❖ ᴛᴀɴᴜ ᴍᴜsɪᴄ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ ⏤͟͟͞͞★\n\n⬤ sᴛʀᴇᴀᴍ ᴛʏᴘᴇ ➥ ʟɪᴠᴇ sᴛʀᴇᴀᴍ [ᴜʀʟ]\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {0}\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" + + +CLOSE_BUTTON : "ᴄʟᴏsᴇ" +BACK_BUTTON : "ʙᴀᴄᴋ" + +S_B_1 : "ᴀᴅᴅ ᴍᴇ" +S_B_2 : "sᴜᴘᴘᴏʀᴛ" +S_B_3 : "ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ" +S_B_4 : "ʜᴇʟᴘ ᴄᴏᴍᴍᴀɴᴅs" +S_B_5 : "ᴏᴡɴᴇʀ" +S_B_6 : "ᴜᴘᴅᴀᴛᴇ" +S_B_7 : "ʀᴇᴘᴏ" +S_B_8 : "ʏᴏᴜᴛᴜʙᴇ" +S_B_9 : "sᴜᴩᴩᴏʀᴛ" + +H_B_1 : "ᴀᴅᴍɪɴ" +H_B_2 : "ᴀᴜᴛʜ" +H_B_3 : "ʙʀᴏᴀᴅᴄᴀsᴛ" +H_B_4 : "sᴜᴅᴏ" +H_B_5 : "ᴜsᴇʀ" +H_B_6 : "ᴘʟᴀʏ" +H_B_7 : "sᴏɴɢ" + +P_B_1 : "ᴀᴜᴅɪᴏ" +P_B_2 : "ᴠɪᴅᴇᴏ" +P_B_3 : "ʟɪᴠᴇ sᴛʀᴇᴀᴍ" +P_B_4 : "ɴᴏʀᴍᴀʟ" + +ST_B_1 : "ᴀᴜᴛʜ ᴜsᴇʀs" +ST_B_2 : "ᴘʟᴀʏ ᴍᴏᴅᴇ" +ST_B_3 : "ʟᴀɴɢᴜᴀɢᴇ" +ST_B_4 : "ᴠᴏᴛɪɴɢ ᴍᴏᴅᴇ" +ST_B_5 : "ᴏɴ" +ST_B_6 : "ᴏғғ" +ST_B_7 : "ᴀᴜᴛʜ ᴜsᴇʀs ➤" +ST_B_8 : "ᴀᴅᴍɪɴs" +ST_B_9 : "ᴇᴠᴇʀʏᴏɴᴇ" +ST_B_10 : "sᴇᴀʀᴄʜ ᴍᴏᴅᴇ ➤" +ST_B_11 : "ᴅɪʀᴇᴄᴛ" +ST_B_12 : "ɪɴʟɪɴᴇ" +ST_B_13 : "ᴀᴅᴍɪɴ ᴄᴍᴅs ➤" +ST_B_14 : "ᴘʟᴀʏ ᴛʏᴘᴇ ➤" + +SA_B_1 : "ᴏᴠᴇʀᴀʟʟ sᴛᴀᴛs" +SA_B_2 : "ɢᴇɴᴇʀᴀʟ" +SA_B_3 : "ᴏᴠᴇʀᴀʟʟ" + +QU_B_1 : "ǫᴜᴇᴜᴇ" +QU_B_2 : " {0} —————————— {1}" + +sudo_1 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." +sudo_2 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛᴏ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." +sudo_3 : "❖ {0} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." +sudo_4 : "❖ ʀᴇᴍᴏᴠᴇᴅ {0} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." +sudo_5 : "❖ ᴏᴡɴᴇʀ ➥\n" +sudo_6 : "\n❖ sᴜᴅᴏ ᴜsᴇʀs ➥\n" +sudo_7 : "❖ ɴᴏ sᴜᴅᴏ ᴜsᴇʀs ғᴏᴜɴᴅ." +sudo_8 : "❖ ғᴀɪʟᴇᴅ." + +block_1 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ʙʟᴏᴄᴋᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." +block_2 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛᴏ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ." +block_3 : "❖ {0} ɪs ɴᴏᴛ ɪɴ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ." +block_4 : "❖ ʀᴇᴍᴏᴠᴇᴅ {0} ғʀᴏᴍ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ." +block_5 : "❖ ɴᴏ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ғᴏᴜɴᴅ." +block_6 : "❖ ɢᴇᴛᴛɪɴɢ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." +block_7 : "❖ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ➥\n\n" + +black_1 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /blacklistchat [ᴄʜᴀᴛ ɪᴅ]" +black_2 : "❖ ᴛʜɪs ᴄʜᴀᴛ ɪs ᴀʟʀᴇᴀᴅʏ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ." +black_3 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ᴀᴅᴅᴇᴅ ᴛᴏ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs." +black_4 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /whitelistchat [ᴄʜᴀᴛ ɪᴅ]" +black_5 : "❖ ᴛʜɪs ᴄʜᴀᴛ ɪs ɴᴏᴛ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ." +black_6 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ʀᴇᴍᴏᴠᴇᴅ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs." +black_7 : "❖ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs ➥\n\n" +black_8 : "❖ ɴᴏ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs ᴏɴ {0}." +black_9 : "❖ sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ." + +maint_1 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n● /maintenance [ᴇɴᴀʙʟᴇ | ᴅɪsᴀʙʟᴇ]" +maint_2 : "❖ {0} ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴇɴᴀʙʟᴇᴅ." +maint_3 : "❖ {0} ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴅɪsᴀʙʟᴇᴅ." +maint_4 : "❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ɪs ᴀʟʀᴇᴀᴅʏ ᴇɴᴀʙʟᴇᴅ." +maint_5 : "❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ɪs ᴀʟʀᴇᴀᴅʏ ᴅɪsᴀʙʟᴇᴅ." + +log_1 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n● /logger [ᴇɴᴀʙʟᴇ | ᴅɪsᴀʙʟᴇ]" +log_2 : "❖ ᴇɴᴀʙʟᴇᴅ ʟᴏɢɢɪɴɢ." +log_3 : "❖ ᴅɪsᴀʙʟᴇᴅ ʟᴏɢɢɪɴɢ." + +broad_1 : "❖ sᴛᴀʀᴛᴇᴅ ʙʀᴏᴀᴅᴄᴀsᴛɪɴɢ..." +broad_2 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ]" +broad_3 : "❖ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ᴛᴏ {0} ᴄʜᴀᴛs ᴡɪᴛʜ {1} ᴘɪɴs ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." +broad_4 : "❖ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ᴛᴏ {0} ᴜsᴇʀs." +broad_5 : "❖ sᴛᴀʀᴛɪɴɢ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ..." +broad_6 : "❖ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ ➥\n\n" +broad_7 : "❖ ᴀssɪsᴛᴀɴᴛ {0} ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ɪɴ {1} ᴄʜᴀᴛs." +broad_8 : "❖ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ ʙʀᴏᴀᴅᴄᴀsᴛ." + +server_1 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɢᴇᴛ ʟᴏɢs." +server_2 : "❖ ᴘʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ᴛʜᴀᴛ ʏᴏᴜʀ ʜᴇʀᴏᴋᴜ ᴀᴘɪ ᴋᴇʏ ᴀɴᴅ ᴀᴘᴘ ɴᴀᴍᴇ ᴀʀᴇ ᴄᴏɴғɪɢᴜʀᴇᴅ ᴄᴏʀʀᴇᴄᴛʟʏ." +server_3 : "❖ ᴄʜᴇᴄᴋɪɴɢ ꜰᴏʀ ᴀᴠᴀɪʟᴀʙʟᴇ ᴜᴘᴅᴀᴛᴇs..." +server_4 : "❖ ɢɪᴛ ᴄᴏᴍᴍᴀɴᴅ ᴇʀʀᴏʀ." +server_5 : "❖ ɪɴᴠᴀʟɪᴅ ɢɪᴛ ʀᴇᴘsɪᴛᴏʀʏ." +server_6 : "❖ ʙᴏᴛ ɪs ᴜᴘ-ᴛᴏ-ᴅᴀᴛᴇ." +server_7 : "❖ ʙᴏᴛ ᴜᴩᴅᴀᴛᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ ! ɴᴏᴡ ᴡᴀɪᴛ ғᴏʀ ғᴇᴡ ᴍɪɴᴜᴛᴇs ᴜɴᴛɪʟ ᴛʜᴇ ʙᴏᴛ ʀᴇsᴛᴀʀᴛs ᴀɴᴅ ᴩᴜsʜ ᴄʜᴀɴɢᴇs !" +server_8 : "❖ {0} ɪs ʀᴇsᴛᴀʀᴛɪɴɢ...\n\n● ʏᴏᴜ ᴄᴀɴ sᴛᴀʀᴛ ᴩʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴀғᴛᴇʀ 15-20 sᴇᴄᴏɴᴅs." +server_9 : "❖ sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ, ᴩʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʟᴏɢs." +server_10 : "❖ ᴀɴ ᴇxᴄᴇᴩᴛɪᴏɴ ᴏᴄᴄᴜʀᴇᴅ ᴀᴛ #ᴜᴩᴅᴀᴛᴇʀ ᴅᴜᴇ ᴛᴏ ➥ {0}" +server_11 : "❖ ʀᴜɴɴɪɴɢ ᴀ sᴘᴇᴇᴅᴛᴇsᴛ..." +server_12 : "❖ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." +server_13 : "❖ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." +server_14 : "❖ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs..." +server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ ➥\n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ ➥\n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ ➥ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" + +gban_1 : "❖ ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴡᴀɴɴᴀ ɢʙᴀɴ ʏᴏᴜʀsᴇʟғ ʙᴀʙʏ ?" +gban_2 : "❖ ᴡʜʏ sʜᴏᴜʟᴅ ɪ ɢʙᴀɴ ᴍʏsᴇʟғ ?" +gban_3 : "❖ ʏᴏᴜ ᴄᴀɴ'ᴛ ɢʙᴀɴ ᴍʏ sᴜᴅᴏᴇʀs." +gban_4 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." +gban_5 : "❖ ɪɴɪᴛɪᴀʟɪᴢɪɴɢ ɢʟᴏʙᴀʟ ʙᴀɴ ᴏɴ {0}.\n\n● ᴛɪᴍᴇ ᴇxᴘᴇᴄᴛᴇᴅ ➥ {1}" +gban_6 : "❖ ɴᴇᴡ ɢʟᴏʙᴀʟ ʙᴀɴ ᴏɴ {0} ➥\n\n● ᴏʀɪɢɪɴᴀᴛᴇᴅ ғʀᴏᴍ ➥ {1} [{2}]\n● ᴜsᴇʀ :➥ {3}\n● ᴜsᴇʀ ɪᴅ ➥ {4}\n\n● ʙᴀɴɴᴇᴅ ʙʏ ➥ {5}\n● ᴄʜᴀᴛs ➥ {6}" +gban_7 : "❖ {0} ɪs ɴᴏᴛ ɢʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." +gban_8 : "❖ ʟɪғᴛɪɴɢ ɢʟᴏʙᴀʟ ʙᴀɴ ғʀᴏᴍ {0}.\n\n● ᴇxᴘᴇᴄᴛᴇᴅ ᴛɪᴍᴇ ➥ {1}" +gban_9 : "❖ ʟɪғᴛᴇᴅ ɢʟᴏʙᴀʟ ʙᴀɴ ғʀᴏᴍ {0}.\n\n● ᴜɴʙᴀɴɴᴇᴅ ɪɴ {1} ᴄʜᴀᴛs." +gban_10 : "❖ ɴᴏ ᴏɴᴇ ɪs ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." +gban_11 : "❖ ғᴇᴛᴄʜɪɴɢ ɢʙᴀɴɴᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." +gban_12 : "❖ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs ➥\n\n" diff --git a/strings/langs/hi.yml b/strings/langs/hi.yml new file mode 100644 index 000000000000..f01471aa5b1e --- /dev/null +++ b/strings/langs/hi.yml @@ -0,0 +1,306 @@ +name : 🇮🇳 हिंदी + + +general_1: "» एक उपयोगकर्ता के संदेश का उत्तर दें या उपयोगकर्ता नाम / उपयोगकर्ता ID दें।" +general_2: "» कुछ गड़बड़ हो गई थी आपके क्वेरी को प्रोसेस करते समय।\n\nअपवाद: {0}" +general_3: "आप इस चैट में एक गुमनाम व्यवस्थापक हैं, मुझे उपयोग करने के लिए उपयोगकर्ता खाता पर वापस लौटें।" +general_4: "» आपकी अनुमतियाँ वीडियो चैट प्रबंधित करने के लिए नहीं हैं।\n\nव्यवस्थापक कैश को पुनः लोड करें /reload के माध्यम से" +general_5: "» बॉट वीडियोचैट पर स्ट्रीमिंग नहीं कर रहा है।" + +tg_1: "{0} डाउनलोडर\n\nफ़ाइल का आकार : {1}\nपूर्ण हो गया : {2}\nप्रतिशत : {3}%\n\nगति : {4}/s\nETA : {5}" +tg_2: "सफलतापूर्वक डाउनलोड किया गया, फ़ाइल प्रोसेस की जा रही है...\n\nसमय गुजरा : {0}" +tg_3: "मीडिया टेलीग्राम से डाउनलोड करने में विफल, कृपया पुनः प्रयास करें..." +tg_4: "» पहले से ही डाउनलोड पूरा हो गया है।" +tg_5: "» डाउनलोड पहले से ही पूरा हो गया है या रद्द किया गया है।" +tg_6: "» डाउनलोड रद्द कर दिया गया है।" +tg_7: "» डाउनलोड रद्द किया गया है द्वारा : {0}" +tg_8: "डाउनलोड रोकने में विफल।" +tg_9: "चल रहे डाउनलोड कार्य प्राप्त करने में विफल।" + +call_1: "» बोट को लिंक के माध्यम से उपयोगकर्ताओं को आमंत्रित करने की अनुमति की आवश्यकता होती है ताकि सहायक को आपकी चैट में आमंत्रित किया जा सके।" +call_2: "{0} सहायक आपके समूह/चैनल में प्रतिबंधित है।\n\nआईडी : {1}\nनाम : {2}\nउपयोगकर्ता नाम : @{3}\n\nकृपया सहायक को अनबैन करें और पुनः प्रयास करें।" +call_3: "सहायक को आपकी चैट में आमंत्रित करने में विफल।\n\nकारण : {1}" +call_4: "कृपया प्रतीक्षा करें...\n\n{0} सहायक को आपकी चैट में आमंत्रित किया जा रहा है..." +call_5: "{0} सहायक सफलतापूर्वक शामिल हो गया।\n\nप्रसारण शुरू करने का प्रयास किया जा रहा है..." +call_6: "» प्रसारण स्विच करने में विफल। कृपया पुनः /skip का उपयोग करके ट्रैक को फिर से बदलें।" +call_7: "» अगले ट्रैक को कतार से डाउनलोड किया जा रहा है।\n\nकृपया प्रतीक्षा करें..." +call_8: "↬ द्वारा जोड़ा गया :" + +auth_1: "» आपके समूह में केवल 25 प्रमाणित उपयोगकर्ताएँ हो सकती हैं।" +auth_2: "» {0} को प्रमाणित उपयोगकर्ताओं की सूची में जोड़ दिया गया है।" +auth_3: "{0} पहले से ही प्रमाणित उपयोगकर्ताओं की सूची में है।" +auth_4: "» {0} को प्रमाणित उपयोगकर्ताओं की सूची से हटा दिया गया है।" +auth_5: "{0} प्रमाणित उपयोगकर्ताओं की सूची में नहीं है।" +auth_6: "» प्रमाणित उपयोगकर्ताओं की सूची को पुनर्प्राप्त किया जा रहा है..." +auth_7: "» {0} की प्रमाणित उपयोगकर्ताओं की सूची में :\n\n" +auth_8: "↬ द्वारा जोड़ा गया :" + +reload_1: "» आपको केवल 3 मिनट में एक बार व्यवस्थापक कैश को ताज़ा करने की अनुमति होती है।\n\nकृपया {0} के बाद पुनः प्रयास करें।" +reload_2: "» व्यवस्थापक कैश सफलतापूर्वक ताज़ा किया गया।" +reload_3: "» व्यवस्थापक कैश को ताज़ा करने में विफल, सुनिश्चित करें कि बोट आपकी चैट में व्यवस्थापक है।" +reload_4: "» कृपया प्रतीक्षा करें...\n\n{0} को आपकी चैट के लिए दोबारा शुरू किया जा रहा है।" +reload_5: "{0} को आपकी चैट के लिए सफलतापूर्वक दोबारा आरंभ किया गया।\n\nफिर से प्रारंभ करने का प्रयास किया जा रहा है..." + +admin_1: "» क्या आपको याद है कि आपने प्रसारण को पुनः आरंभ किया था?" +admin_2: "➻ प्रसारण ठहरा दिया 🎄\n│ \n└द्वारा : {0} 🥀" +admin_3: "» क्या आपको याद है कि आपने प्रसारण को ठहराया था?" +admin_4: "➻ प्रसारण पुनः आरंभ 🎄\n│ \n└द्वारा : {0} 🥀" +admin_5: "➻ प्रसारण समाप्त/रोक दिया 🎄\n│ \n└द्वारा : {0} 🥀" +admin_6: "➻ प्रसारण रोका 🎄\n│ \n└द्वारा : {0} 🥀\n\n» {1} में अब कोई और ट्रैक कतार में नहीं है, वीडियोचैट छोड़ रहे हैं।" +admin_7: "स्ट्रीम {0} को बदलते समय त्रुटि।" +admin_8: "» कृपया लूप प्ले को अक्षम करें और फिर से स्किप का प्रयास करें। /loop disable के माध्यम से लूप प्ले को अक्षम करें।" +admin_9: "कृपया स्किप के लिए विशिष्ट संख्याएँ उपयोग करें, जैसे 1, 2, 4..." +admin_10: "कम से कम 2 ट्रैक्स की आवश्यकता होती है विशिष्ट स्किप के लिए।\n\nकृपया ट्रैक कतार देखें: /queue" +admin_11: "» ट्रैक्स कतार में पर्याप्त नहीं है विशिष्ट स्किप के लिए।\n\nकृपया 1 और {0} के बीच स्किप करें।" +admin_12: "» विशिष्ट ट्रैक पर स्किप करने में विफल।\n\nकृपया बचे हुए कतार की जाँच करें: /queue" +admin_13: "» कृपया व्यवस्थापक कैश को ताज़ा करें: /reload" +admin_14: "» वीडियो चैट प्रबंधित करने की अनुमति नहीं है।\n\nकृपया व्यवस्थापक कैश को ताज़ा करें: /reload" +admin_15: "» शफल करने में विफल।\n\nकतार देखें: /queue" +admin_16: "» कतार को शफल किया गया है {0} द्वारा।\n\nशफल किया गया कतार देखें: /queue" +admin_17: "{0} स्पीड नियंत्रण पैनल\n\nकर्रेंट प्लेइंग स्ट्रीम की स्पीड बदलने के लिए नीचे दिए गए बटन पर क्लिक करें।" +admin_18: "» {0} के लिए स्पीड चालू की गई है।\n\nद्वारा : {1}।" +admin_19: "» स्पीड कंट्रोल बंद किया गया है।\n\nद्वारा : {0}।" +admin_20: "उदाहरण:\n\n/seek या /seekback [सेकंड में अवधि]" +admin_21: "» कृपया सेकंड में अवधि के लिए केवल न्यूमेरिक डिजिट्स का उपयोग करें।" +admin_22: "» लाइव स्ट्रीम्स को सीक नहीं किया जा सकता।" +admin_23: "» कृपया कम अवधि में सीक करने का प्रयास करें।\n\n{0} मिनटों में प्ले हुआ, {1} मिनटों की क़तार से।" +admin_24: "सीक किया जा रहा है...\n\nकृपया प्रतीक्षा करें..." +admin_25: "» स्पीड के साथ सफलतापूर्वक सीक किया गया।\n\nअवधि : {0} मिनटों\nद्वारा : {1}" +admin_26: "सीक में विफल।" +admin_27: "» केवल यूट्यूब स्ट्रीम की स्पीड को वर्तमान में नियंत्रित किया जा सकता है।" +admin_28: "{0} स्पीड नियंत्रण पैनल\n\nकृपया वीडियो चैट पर प्लेइंग स्ट्रीम की स्पीड बदलने के लिए नीचे दिए गए बटनों पर क्लिक करें।" +admin_29: "» बॉट पहले से ही सामान्य स्पीड पर प्ले कर रहा है।" +admin_30: "» कृपया प्रतीक्षा करें...\n\nकोई अन्य व्यक्ति स्ट्रीम की स्पीड बदलने का प्रयास कर रहा है।" +admin_31: "स्पीड बदल रहा है..." +admin_32: "» चल रहे स्ट्रीम की स्पीड सफलतापूर्वक बदली गई।\n\nअनुरोधकर्ता : {0}" +admin_33: "» चल रहे स्ट्रीम की स्पीड बदलने में विफल।" +admin_34: "» चल रहे स्ट्रीम की स्पीड सफलतापूर्वक {0}x की गई।\n\nअनुरोधकर्ता : {1}" +admin_35: "मतदान समाप्त हो गया है क्योंकि वोटिंग प्रदान किए जाने वाले ट्रैक के लिए समाप्त हो गया है।" +admin_36: "इस क्रिया को करने में विफल क्योंकि वोटिंग प्रदान किए जाने वाले ट्रैक के लिए समाप्त हो गया है या वो रुका हुआ है।" +admin_37: "सफलतापूर्वक {0} अपवोट प्राप्त किए गए।" +admin_38: "» 1 अपवोट जोड़ा गया।" +admin_39: "» 1 अपवोट हटा दिया गया।" +admin_40: "अपवोट किया गया।" + +start_1 : "{0} जिंदा है बेबी।\n\n✫ उपकाल : {1}" +start_2 : "हे {0}, 🥀\n\n๏ यह {1} है !\n\n➻ एक तेज़ और शक्तिशाली टेलीग्राम संगीत प्लेयर बॉट जिसमें कुछ शानदार सुविधाएँ हैं।\n\nसमर्थित प्लेटफ़ॉर्म्स : यूट्यूब, स्पॉटिफ़ाई, रेसो, एप्पल म्यूज़िक और साउंडक्लाउड।\n──────────────────\n๏ मेरे मॉड्यूल्स और कमांड्स के बारे में जानकारी प्राप्त करने के लिए हेल्प बटन पर क्लिक करें।" +start_3 : "हे {0},\nयह {1} है\n\nआपके द्वारा {2} में मुझे जोड़ने के लिए धन्यवाद, {3} अब इस चैट में गाने बजा सकता है।" +start_4 : "🎄 सुपरग्रुप की आवश्यकता है 🎄\n\nकृपया अपने ग्रुप को सुपरग्रुप में बदलें और फिर मुझे फिर से जोड़ें।\n\nसुपरग्रुप कैसे बनाएं ?\n- अपने ग्रुप की चैट इतिहास को दृश्यमान बनाएं।" +start_5 : "↝ ब्लैकलिस्ट की गई चैट ↜\n\nयह चैट {0} डेटाबेस पर ब्लैकलिस्ट है।\nअपनी चैट को अनब्लैकलिस्ट करने के लिए सुडो उपयोगकर्ता से अनुरोध करें या समर्थन चैट पर जाएं।" +start_6 : "😲 ट्रैक जानकारी 😲\n\n📌 शीर्षक : {0}\n\n⏳ अवधि : {1} मिनट\n👀 दृश्य : {2}\n⏰ प्रकाशित हुआ : {3}\n📎 चैनल : {5}\n\n🥀 सर्च पावर्ड बाय {6}" + +help_1 : "इस ग्रुप के लिए उपयोगकर्ता की मदद के लिए कृपया उपयोगकर्ता जाति को चुनें।\nअपने संदेहों को पूछें समर्थन चैट में\n\nसभी कमांड्स का उपयोग करने के लिए : /" +help_2 : "अपने प्राइवेट में मेरे मदद मेनू प्राप्त करने के लिए कृपया नीचे दिए गए बटन पर क्लिक करें।" + +lang_1 : "» कृपया ग्रुप की डिफ़ॉल्ट भाषा के रूप में सेट करने के लिए भाषा चुनें :" +lang_2 : "भाषा सफलतापूर्वक बदल दी गई।" +lang_3 : "भाषा बदलने में विफल।" +lang_4 : "आप पहले से ही वही भाषा में हैं।" + +setting_1 : "{0} सेटिंग्स पैनल\n\nचैट आईडी : {1}\nचैट टाइटल : {2}\n\nसेटिंग्स बदलने के लिए नीचे दिए गए बटनों पर क्लिक करें." +setting_2 : "» डायरेक्ट: सीधे सर्च क्वेरी को चलाता है।\n\n» इनलाइन: वीडियो और ऑडियो के बीच चयन करने के लिए इनलाइन बटन्स प्रदान करता है।" +setting_3 : "» सभी: किसी भी व्यक्ति को इस ग्रुप में एडमिन कमांड्स [स्किप, पॉज, रिज्यूम आदि] का उपयोग करने की अनुमति है।\n\n» केवल एडमिन: केवल एडमिन और अधिकृत उपयोगकर्ता एडमिन कमांड्स का उपयोग कर सकते हैं।" +setting_4 : "» कोई अधिकृत उपयोगकर्ता नहीं मिले." +setting_5 : "» ग्रुप: ग्रुप में संगीत बजाता है जहां कमांड दी जाती है।\n\n» चैनल: वह चैनल चुनें जिसमें संगीत बजना है। /channelplay के माध्यम से चैनल आईडी सेट करें" +setting_6 : "» सभी: किसी भी व्यक्ति को इस ग्रुप में संगीत बजाने की अनुमति है।\n\n» केवल एडमिन: केवल एडमिन्स ही इस ग्रुप में संगीत बजा सकते हैं।" +setting_7 : "» कृपया /channelplay के माध्यम से चैनल आईडी सेट करें" +setting_8 : "जब यह मोड सक्षम होता है, तो वे लोग भी एडमिन कमांड्स का उपयोग कर सकते हैं जिनके पास एडमिन अधिकार नहीं होते हैं, एक निश्चित संख्या में वोट के बाद।" +setting_9 : "वर्तमान उपवोट्स की आवश्यकता जो एडमिन कमांड्स का उपयोग करने के लिए हैं : {0}" +setting_10 : "वोटिंग मोड अक्षम है।" +setting_11 : "न्यूनतम उपवोट्स की गिनती 2 हो सकती है। आप 2 से कम नहीं सेट कर सकते" +setting_12 : "अधिकतम उपवोट्स की गिनती 15 हो सकती है। आप 15 से अधिक नहीं सेट कर सकते" + +set_cb_1 : "आधीकृत उपयोगकर्ताओं का पैनल प्राप्त किया जा रहा है..." +set_cb_2 : "प्ले मोड पैनल प्राप्त किया जा रहा है..." +set_cb_3 : "सेटिंग्स बदल रहे हैं..." +set_cb_4 : "» आधीकृत उपयोगकर्ता सूची प्राप्त की जा रही है..." +set_cb_5 : "» पीछे जा रहे हैं..." + +gstats_1: "गेटिंग {0} स्टैट्स और इनफ़ोर्मेशन...\n\nइसमें समय लग सकता है, कृपया होल्ड ऑन..." +gstats_2: "क्लिक ऑन थे बट्टन्स बेलोव तो चेक थे स्टैट्स ऑफ {0}." +gstats_3: "{0} स्टैट्स और इनफ़ोर्मेशन :\n\nअसिस्टंट्स : {1}\nब्लॉक्ड : {2}\nचैट्स: {3}\nयूज़र्स : {4}\nमॉड्यूल्स : {5}\nसुडोएर्स : {6}\n\nऑटो लीविंग असिस्टंट : {7}\nप्ले दुरातिओन लिमिट : {8} मिनट्स" +gstats_4: "इस बट्टन इस ओनली फॉर सुडोएर्स." +gstats_5: "{0} स्टैट्स और इनफ़ोर्मेशन :\n\nमॉड्यूल्स : {1}\nप्लैटफॉर्म : {2}\nरैम : {3}\nफिजिकल कोर्स : {4}\nटोटल कोर्स : {5}\nसीपीयू फ़्रेक्वेंसी : {6}\n\nपायथन : {7}\nपायरोग्राम : {8}\nपाय-टीजीकैल्स : {9}\n\nस्टोरेज अवेलेबल : {10} गीब\nस्टोरेज यूज़्ड : {11} गीब\nस्टोरेज लेफ्ट : {12} गीब\n\nसर्व्ह्ड चैट्स : {13}\nसर्व्ह्ड यूज़र्स : {14}\nब्लॉक्ड यूज़र्स : {15}\nसुडो यूज़र्स : {16}\n\nटोटल डीबी साइज़ : {17} एम्बी\nटोटल डीबी स्टोरेज : {18} एम्बी\nटोटल डीबी कलेक्शन्स : {19}\nटोटल डीबी कीज़ : {20}" + +playcb_1: "» अव्व, थिस इस नोट फ़ॉर यू बेबी." +playcb_2: "» गेटिंग नेक्स्ट रेसुल्ट,\n\nप्लीज़ वेट..." + +cplay_1: "» यू कैन प्ले म्यूज़िक इन चैनल्स फ्रोम {0} तो अन्य चैनल और योर चैट्स लिंकेड चैनल.\n\nफ़ॉर लिंकेड चैनल :\n/channelplay linked\n\nफ़ॉर अन्य चैनल :\n/channelplay [चैनल आईडी]" +cplay_2: "» थिस चैट डोन'ट हेव अन्य लिंकेड चैनल." +cplay_3: "» चैनल डिफ़ाइन्ड टू {0}.\nचैनल आईडी : {1}" +cplay_4: "» फ़ेल्ड टो गेट चैनल.\n\nमेक सुरे यू'वे अद्देड थे बोट इन योर चैनल एंड प्रोमोटेड अस अद्मिन." +cplay_5: "ओन्ली चैनल्स आरे सुप्पोर्टेड." +cplay_6: "» यू नीड टो बी थे ओव्नर ऑफ थे चैनल {0} टो कन्नेक्ट इट विथ थिस ग्रूप.\nचैनल'स ओव्नर : @{1}\n\nआल्टरनटिवली यू कैन लिंक योर ग्रूप टो थाट चैनल एंड थेन ट्राई कन्नेक्टिंग विथ /channelplay linked" +cplay_7: "» चैनल प्लेय डिसअब्लेड." + +play_1: "🔎" +play_2: "➻ चैनल प्लेय मोड\n\nप्रोसेसिंग, प्लीज़ वेट...\n\nलिंकेड चैनल : {0}" +play_3: "» फ़ेल्ड टो प्रोसेस क़ुएरी." +play_4: "एड्मिन्स ओनली प्लेय\nओन्ली एड्मिन्स ऑफ थिस चैट आरे अल्लोवेड टो प्लेय\n\nचेंगे प्लेय मोड विआ /playmode" +play_5: "» फ़ेल्ड टो प्रोसेस ऑडियो फ़िले.\n\nऑडियो फ़िले सिज़े इस लार्जर थान थे डिफ़ाइन्ड लिमिट." +play_6: "» स्ट्रीम'स लोंगेर थान {0} आरें'ट अल्लोवेड टो प्लेय ऑन {1}" +play_7: "» नोट अ वैलिड विडियो फ़िले एक्सटेंशन.\n\nसुप्पोर्टेड एक्सटेंशन्स : {0}" +play_8: "» विडियो फ़िले सिज़े शोल्ड बी लेस थान 1गीब." +play_9: "यूट्यूब प्लेयलिस्ट फीचर\n\nसेलेक्ट थे मोड इन व्हिच यू वॉन्ट टो प्लेय होले यूट्यूब प्लेयलिस्ट." +play_10: "टाइटल : {0}\nड्युरेशन : {1} मिनट्स" +play_11: "{0} स्पोटिफ़ाई प्लेयर\n\nरिक्वेस्टेड बाय : {1}" +play_12: "{0} अप्प्ले प्लेयर\n\nरिक्वेस्टेड बाय : {1}" +play_13: "» लाइव स्ट्रीम डिटेक्टेड.\n\nआरे यू सुरे थाट यू वॉन्ट टो प्लेय लाइव स्ट्रीम इन थिस चैनल?" +play_14: "ट्रैक डिटेल्स प्राप्त करने में विफल।\n\nकृपया कोई अन्य ट्रैक प्ले करने का प्रयास करें।" +play_15: "» क्वेरी प्रोसेस करने में विफल।\n\nमैं केवल स्पॉटिफाई ट्रैक्स, एल्बम्स, कलाकारों और प्लेलिस्ट्स प्ले कर सकता हूँ।" +play_16: "कोई सक्रिय वॉयस चैट नहीं।\n\nफोर्स प्ले का उपयोग करने के लिए किसी सक्रिय वॉयस चैट होनी चाहिए।" +play_17: "कृपया वीडियो चैट ऑन करें, मैं URL्स को स्ट्रीम करने में असमर्थ हूँ।" +play_18: "उपयोग: /play [गाने का नाम/YouTube URL/ऑडियो/वीडियो फ़ाइल का उत्तर]" +play_19: "कतार में जोड़ा गया प्लेलिस्ट:" +play_20: "कतार में स्थिति-" +play_21: "{0} ट्रैक्स को कतार में जोड़ा गया।\n\nजाँच करें: यहाँ क्लिक करें" +play_22: "आपके ग्रुप के अंदर क्यूइड सूचियों को प्ले करने के लिए आपके द्वारा चुने गए मोड: {0}" + +str_1 : "कृपया m3u8 या इंडेक्स लिंक्स प्रदान करें।" +str_2 : "➻ मान्य स्ट्रीम सत्यापित।\n\nप्रोसेसिंग..." +str_3 : "यूट्यूब लाइव स्ट्रीम प्ले करने में विफल। कोई लाइव प्रारूप नहीं मिला।" + +ping_1 : "{0} पिंग कर रहा है..." +ping_2 : "🏓 पोंग : {0}ms\n\n{1} सिस्टम स्थिति :\n\n↬ अपटाइम : {2}\n↬ रैम : {3}\n↬ सीपीयू : {4}\n↬ डिस्क : {5}\n↬ पायथन-टीजीसीएल : {6}ms" + +queue_1 : "» कतार प्राप्त हो रही है...\n\nकृपया प्रतीक्षा करें..." +queue_2 : "» कतार खाली है।" +queue_3 : "» कतार में ट्रैकों की सूची देखने के लिए यहाँ क्लिक करें : यहाँ" +queue_4 : "➲ कतार में जोड़ा गया #{0}\n\n‣ शीर्षक : {1}\n‣ अवधि : {2} मिनट\n‣ द्वारा अनुरोधित : {3}" +queue_5 : "केवल एक कतार में ट्रैक है।\n\nलिस्ट देखने के लिए अधिक ट्रैक जोड़ें।" +queue_6 : "🕚 अवधि : अज्ञात स्ट्रीम\n\nपूरी कतार की सूची प्राप्त करने के लिए नीचे बटन पर क्लिक करें।" +queue_7 : "\nनीचे बटन पर क्लिक करें।" +queue_8 : "{0} प्लेयर\n\n🎄 स्ट्रीमिंग : {1}\n\n🔗 स्ट्रीम प्रकार : {2}\n🥀 अनुरोधक : {3}\n{4}" + +stream_1 : "➲ स्ट्रीमिंग शुरू की गई |\n\n‣ शीर्षक : {1}\n‣ अवधि : {2} मिनट\n‣ द्वारा अनुरोधित : {3}" +stream_2 : "➲ स्ट्रीमिंग शुरू की गई |\n\n‣ स्ट्रीम प्रकार : लाइव स्ट्रीम [URL]\n‣ द्वारा अनुरोधित : {0}" + +CLOSE_BUTTON : "बंद करें" +BACK_BUTTON : "वापस" + +S_B_1 : "मुझे जोड़ें" +S_B_2 : "समर्थन" +S_B_3 : "मुझे अपने समूह में जोड़ें" +S_B_4 : "मदद और कमांड्स" +S_B_5 : "डेवलपर" +S_B_6 : "चैनल" +S_B_7 : "स्रोत कोड" +S_B_8 : "👀 YouTube 👀" +S_B_9 : "🥀 समर्थन 🥀" + +H_B_1 : "एडमिन" +H_B_2 : "ऑथ" +H_B_3 : "ब्रॉडकास्ट" +H_B_4 : "ब्लैकलिस्ट" +H_B_5 : "ब्लॉक" +H_B_6 : "चैनल प्ले" +H_B_7 : "जी-बैन" +H_B_8 : "लूप" +H_B_9 : "सुडो" +H_B_10 : "पिंग" +H_B_11 : "प्ले" +H_B_12 : "शफल" +H_B_13 : "सीक-बैक" +H_B_14 : "गाना" +H_B_15 : "गति" + +P_B_1 : "ऑडियो" +P_B_2 : "वीडियो" +P_B_3 : "लाइव स्ट्रीम" +P_B_4 : "नॉर्मल" + +ST_B_1 : "ऑथ उपयोगकर्ता" +ST_B_2 : "प्ले मोड" +ST_B_3 : "भाषा" +ST_B_4 : "वोटिंग मोड" +ST_B_5 : "चालू" +ST_B_6 : "बंद" +ST_B_7 : "ऑथ उपयोगकर्ता ➜" +ST_B_8 : "व्यवस्थापक" +ST_B_9 : "सभी" +ST_B_10 : "खोज मोड ➜" +ST_B_11 : "प्रत्यक्ष" +ST_B_12 : "इनलाइन" +ST_B_13 : "व्यवस्थापक कमांड ➜" +ST_B_14 : "प्ले प्रकार ➜" + +SA_B_1 : "कुल स्थितियाँ" +SA_B_2 : "सामान्य" +SA_B_3 : "कुल" + +QU_B_1 : "कतार" +QU_B_2 : " {0} —————————— {1}" + +sudo_1 : "» {0} पहले से ही सुडो उपयोगकर्ताओं की सूची में है।" +sudo_2 : "» {0} को सुडो उपयोगकर्ताओं की सूची में जोड़ दिया गया।" +sudo_3 : "» {0} सुडो उपयोगकर्ताओं की सूची में नहीं है।" +sudo_4 : "» {0} को सुडो उपयोगकर्ताओं की सूची से हटा दिया गया।" +sudo_5 : "🥀 मालिक :\n" +sudo_6 : "\n✨ सुडो उपयोगकर्ताएँ :\n" +sudo_7 : "» सुडो उपयोगकर्ताएँ नहीं मिलीं।" +sudo_8 : "विफल।" + +block_1 : "» {0} पहले से ही ब्लॉक किया गया है।" +block_2 : "» {0} को ब्लॉक की सूची में जोड़ दिया गया।" +block_3 : "» {0} ब्लॉक की सूची में नहीं है।" +block_4 : "» {0} को ब्लॉक की सूची से हटा दिया गया।" +block_5 : "» ब्लॉक की सूची में कोई उपयोगकर्ता नहीं मिला।" +block_6 : "» ब्लॉक की सूची मिल रही है..." +block_7 : "😫 ब्लॉक की सूची :\n\n" + +black_1 : "उदाहरण :\n\n/blacklistchat [चैट आईडी]" +black_2 : "» यह चैट पहले से ही ब्लैकलिस्ट की सूची में है।" +black_3 : "» सफलतापूर्वक ब्लैकलिस्ट में जोड़ दिया गया।" +black_4 : "उदाहरण :\n\n/whitelistchat [चैट आईडी]" +black_5 : "» यह चैट ब्लैकलिस्ट की सूची में नहीं है।" +black_6 : "» सफलतापूर्वक ब्लैकलिस्ट से हटा दिया गया।" +black_7 : "» ब्लैकलिस्ट की सूची :\n\n" +black_8 : "» {0} के ऊपर कोई चैट ब्लैकलिस्ट की सूची में नहीं है।" +black_9 : "» कुछ गड़बड़ हो गई।" + +maint_1 : "उदाहरण :\n/maintenance [on|off]" +maint_2 : "» {0} ने मेंटेनेंस मोड सक्रिय किया।" +maint_3 : "» {0} ने मेंटेनेंस मोड अक्षम किया।" +maint_4 : "» मेंटेनेंस मोड पहले से ही सक्रिय है।" +maint_5 : "» मेंटेनेंस मोड पहले से ही अक्षम है।" + +log_1 : "उदाहरण :\n/logger [on|off]" +log_2 : "लॉगिंग सक्रिय किया" + +broad_1 : "» प्रसारण शुरू किया जा रहा है..." +broad_2 : "उदाहरण :\n\n/broadcast [संदेश या किसी संदेश के उत्तर में]" +broad_3 : "» संदेश को {0} चैट्स में प्रसारित किया गया, {1} पिन से बोट से।" +broad_4 : "» संदेश को {0} उपयोगकर्ताओं को प्रसारित किया गया।" +broad_5 : "» सहायक प्रसारण शुरू कर रहा है..." +broad_6 : "➻ सहायक प्रसारण :\n\n" +broad_7 : "↬ सहायक ने {0} चैटों में प्रसारित किया, {1} से।" +broad_8 : "» कृपया प्रसारित करने के लिए कुछ टेक्स्ट प्रदान करें।" + +server_1 : "» लॉग्स प्राप्त करने में विफल हुआ।" +server_2 : "कृपया सुनिश्चित करें कि आपका Heroku API कुंजी और ऐप का नाम सही रूप से कॉन्फ़िगर किए गए हैं।" +server_3 : "उपलब्ध अपडेटों की जांच की जा रही है..." +server_4 : "git कमांड त्रुटि।" +server_5 : "अमान्य git रिपॉजिटरी।" +server_6 : "» बोट अप-टू-डेट है।" +server_7 : "» बोट को सफलतापूर्वक अपडेट किया गया! अब कुछ मिनटों तक प्रतीक्षा करें जब तक बोट पुनरारंभ और परिवर्तनों को पुश नहीं करता है!" +server_8 : "{0} रीस्टार्ट हो रहा है...\n\n15-20 सेकंड के बाद आप फिर से खेलना शुरू कर सकते हैं।" +server_9 : "कुछ गलत हो गया, कृपया लॉग जांचें।" +server_10 : "{0} पर एक अपवाद हुआ #अपडेटर में : {0}" +server_11 : "» एक स्पीड टेस्ट चल रहा है..." +server_12 : "⇆ डाउनलोड स्पीड टेस्ट चल रहा है..." +server_13 : "⇆ अपलोड स्पीड टेस्ट चल रहा है..." +server_14 : "↻ स्पीड टेस्ट परिणाम साझा किए जा रहे हैं..." +server_15 : "✯ स्पीड टेस्ट परिणाम ✯\n\nग्राहक :\n» आईपी : {0}\n» देश : {1}\n\nसर्वर :\n» नाम : {2}\n» देश : {3}, {4}\nस्पॉन्सर : {5}\nलैटेंसी : {6}\nपिंग : {7}" + +gban_1 : "» तुमने क्यों खुद को ग्लोबल बैन करना चाहा बेबी?" +gban_2 : "» मैं क्यों खुद को ग्लोबल बैन करूँ?" +gban_3 : "» तुम मेरे सुडोएर्स को ग्लोबल बैन नहीं कर सकते।" +gban_4 : "» {0} पहले से ही बोट से ग्लोबल बैन है।" +gban_5 : "» {0} पर ग्लोबल बैन को आरंभ किया जा रहा है।\n\nप्रत्याशित समय: {1}" +gban_6 : "नया ग्लोबल बैन {0} पर:\n\nमूल श्रोत से: {1} [{2}]\nउपयोगकर्ता: {3}\nउपयोगकर्ता आईडी: {4}\n\nद्वारा बैन किया गया: {5}\nचैट्स: {6}" +gban_7 : "» {0} बोट से ग्लोबल बैन नहीं है।" +gban_8 : "» {0} से ग्लोबल बैन को हटाया जा रहा है।\n\nप्रत्याशित समय: {1}" +gban_9 : "» {0} से ग्लोबल बैन हटाया गया है।\n\n{1} चैट्स में अनबैन हो गया है।" +gban_10 : "» किसी भी उपयोगकर्ता को बोट से ग्लोबल बैन नहीं किया गया है।" +gban_11 : "» ग्लोबल बैन उपयोगकर्ता सूची प्राप्त की जा रही है..." +gban_12 : "🙂 ग्लोबल बैन उपयोगकर्ता :\n\n" diff --git a/strings/langs/pa.yml b/strings/langs/pa.yml new file mode 100644 index 000000000000..7f57c3215091 --- /dev/null +++ b/strings/langs/pa.yml @@ -0,0 +1,308 @@ +name : 🇮🇳 ਪੰਜਾਬੀ + +general_1 : "» ਉਪਭੋਗਤਾ ਦੇ ਸੁਨੇਹੇ ਦਾ ਜਵਾਬ ਦਿਓ ਜਾਂ ਉਪਭੋਗਤਾ ਨਾਮ/ਉਪਭੋਗਤਾ ਆਈਡੀ ਦਿਓ।" +general_2 : "» ਤੁਹਾਡੀ ਪੁੱਛਗਿੱਛ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰਦੇ ਸਮੇਂ ਕੁਝ ਗਲਤ ਹੋ ਗਿਆ।\n\nਅਪਵਾਦ : {0}" +general_3 : "ਤੁਸੀਂ ਇੱਥੇ ਏਕ ਗੁਮਾਨ ਕੰਪਨੀ ਦੇ ਗੁਮਾਨਸ਼ੀਨ ਪ੍ਰਸ਼ਾਸਕ ਹੋ, ਆਪਣੇ ਉਪਭੋਗਤਾ ਖਾਤੇ ਦੇ ਉਪਯੋਗ ਲਈ ਮੁੜ ਵਾਪਸ ਯਤਨ ਕਰੋ." +general_4 : "» ਤੁਹਾਨੂੰ ਵੀਡੀਓ ਚੈਟਾਂ ਨੂੰ ਪ੍ਰਬੰਧਿਤ ਕਰਨ ਦਾ ਅਨੁਮਤੀਆਂ ਨਹੀਂ ਹਨ.\n\nਐਡਮਿਨ ਕੈਸ਼ ਨੂੰ ਮੁੜ ਲੋਡ ਕਰੋ ਪਰਮੀਸ਼ਨ /reload ਦੁਆਰਾ" +general_5 : "» ਬੋਟ ਵੀਡੀਓ ਚੈਟ 'ਤੇ ਸਟ੍ਰੀਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਹੈ." + +tg_1 : "{0} ਡਾਉਨਲੋਡਰ\n\nਫਾਇਲ ਆਕਾਰ : {1}\nਪੂਰਾ ਹੋ ਗਿਆ : {2}\nਪ੍ਰਤੀਸ਼ਤ : {3}%\n\nਵੇਗ : {4}/ਸ\nਈਟਾ : {5}" +tg_2 : "ਸਫਲਤਾਪੂਰਕ ਡਾਊਨਲੋਡ ਹੋ ਗਿਆ ਹੈ, ਫਾਇਲ ਪ੍ਰੋਸੈਸਿੰਗ ਹੋ ਰਹੀ ਹੈ...\n\nਗੁਜਰੇ ਸਮੇਂ : {0}" +tg_3 : "ਟੈਲੀਗ੍ਰਾਮ ਤੋਂ ਮੀਡੀਆ ਡਾਊਨਲੋਡ ਕਰਨ 'ਚ ਅਸਫਲ, ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ..." +tg_4 : "» ਡਾਊਨਲੋਡ ਪਹਿਲਾਂ ਹੀ ਪੂਰਾ ਹੋ ਗਿਆ ਹੈ." +tg_5 : "» ਡਾਊਨਲੋਡ ਪਹਿਲਾਂ ਹੀ ਪੂਰਾ ਹੋ ਗਿਆ ਹੈ ਜਾਂ ਰੱਦ ਕਿਤਾ ਗਿਆ ਹੈ." +tg_6 : "» ਡਾਊਨਲੋਡ ਰੱਦ ਕਿਤਾ ਗਿਆ ਹੈ." +tg_7 : "» ਡਾਊਨਲੋਡ ਰੱਦ ਕਰਨਵਾਲਾ: {0}" +tg_8 : "ਡਾਊਨਲੋਡ ਰੋਕਣ ਵਿੱਚ ਅਸਫਲ ਰਹਿਾ ਹੈ." +tg_9 : "ਚੱਲਦੇ ਡਾਊਨਲੋਡ ਕੰਮ ਦੀ ਜਾਂਚ ਕਰਨ 'ਚ ਅਸਫਲ ਰਹਿਆ ਹੈ..." + +call_1 : "» ਬੋਟ ਲਈ ਲਿੰਕ ਰਾਹੀਂ ਯੂਜ਼ਰਾਂ ਨੂੰ ਸੱਦਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ ਤਾਂ ਕਿ ਬੋਟ ਨੂੰ ਤੁਹਾਡੇ ਚੈਟ 'ਚ ਸ਼ਾਮਲ ਕਰ ਸਕੇ." +call_2 : "{0} ਸਹਾਇਕ ਤੁਹਾਡੇ ਗਰੁੱਪ/ਚੈਨਲ 'ਚ ਪਾਬੰਦ ਹੈ.\n\nਆਈਡੀ : {1}\nਨਾਮ : {2}\nਯੂਜ਼ਰਨੇਮ : @{3}\n\nਕਿਰਪਾ ਕਰਕੇ ਸਹਾਇਕ ਦੇ ਪ੍ਰਤਿਬੰਧ ਖੋਲ੍ਹੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ." +call_3 : "{0} ਸਹਾਇਕ ਨੂੰ ਤੁਹਾਡੇ ਚੈਟ 'ਚ ਸੱਦਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਅਸਫਲ ਹੋ ਗਈ ਹੈ.\n\nਕਾਰਨ : {1}" +call_4 : "ਕਿਰਪਾ ਕਰਕੇ ਉਡੀਕੋ...\n\n{0} ਸਹਾਇਕ ਨੂੰ ਤੁਹਾਡੇ ਚੈਟ 'ਚ ਸੱਦਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..." +call_5 : "{0} ਸਹਾਇਕ ਨੂੰ ਸਫਲਤਾਪੂਰਕ ਸੱਦਣ ਲਈ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਹੈ.\n\nਸਟਰੀਮ ਸ਼ੁਰੂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..." +call_6 : "» ਸਟਰੀਮ ਬਦਲਣ 'ਚ ਅਸਫਲ ਹੋਇਆ, ਕਿਰਪਾ ਕਰਕੇ /skip ਵਰਤੋਂ ਕਰੋ ਜੀ ਤੁਸੀਂ ਫਿਰ ਗੀਤ ਤਬਦੀਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ." +call_7 : "» ਅਗਲੇ ਗੀਤ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ.\n\nਕਿਰਪਾ ਕਰਕੇ ਧੈਰਯ ਰੱਖੋ..." +call_8 : "ਕੋਈ ਚਾਲਤੀ ਵੀਡੀਓਚੈਟ ਨਹੀਂ ਮਿਲੀ.\n\nਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਗਰੁੱਪ/ਚੈਨਲ ਵਿੱਚ ਵੀਡੀਓਚੈਟ ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ." +call_9 : "ਸਹਾਇਕ ਹੀ ਪਹਿਲਾਂ ਵੀਡੀਓਚੈਟ ਵਿੱਚ ਹੈ.\n\nਜੇ ਸਹਾਇਕ ਵੀਡੀਓਚੈਟ ਵਿੱਚ ਨਹੀਂ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ /reboot ਭੇਜੋ ਅਤੇ ਫਿਰ ਖੇਡੋ." +call_10 : "ਟੈਲੀਗ੍ਰਾਮ ਸਰਵਰ ਗਲਤੀ\n\nਟੈਲੀਗ੍ਰਾਮ ਵਿੱਚ ਕੁਝ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਫੇਰ ਖੇਡੋ ਜਾਂ ਆਪਣੇ ਗਰੁੱਪ ਦੀ ਵੀਡੀਓਚੈਟ ਨੂੰ ਮੁੜ ਚਾਲਾਓ." + +auth_1 : "» ਤੁਸੀਂ ਆਪਣੇ ਗਰੁੱਪ 'ਚ ਸਿਰਫ 25 ਮੰਜੂਰ ਉਪਭੋਗਤਾਵਾਂ ਰੱਖ ਸਕਦੇ ਹੋ." +auth_2 : "» {0} ਨੂੰ ਮੰਜੂਰ ਉਪਭੋਗਤਾਵਾਂ ਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਹੈ." +auth_3 : "{0} ਪਹਿਲਾਂ ਹੀ ਮੰਜੂਰ ਉਪਭੋਗਤਾਵਾਂ ਸੂਚੀ 'ਚ ਹੈ." +auth_4 : "» {0} ਨੂੰ ਮੰਜੂਰ ਉਪਭੋਗਤਾਵਾਂ ਸੂਚੀ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ." +auth_5 : "{0} ਮੰਜੂਰ ਉਪਭੋਗਤਾਵਾਂ ਸੂਚੀ 'ਚ ਨਹੀਂ ਹੈ." +auth_6 : "» ਮੰਜੂਰ ਉਪਭੋਗਤਾਵਾਂ ਸੂਚੀ ਲਵਾ ਰਹੀ ਹੈ..." +auth_7 : "» ਮੰਜੂਰ ਉਪਭੋਗਤਾਵਾਂ ਦੀ ਸੂਚੀ {0} ਵਿੱਚ:\n\n" +auth_8 : "↬ ਦੁਆਰਾ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ :" + +reload_1 : "» ਤੁਸੀਂ ਕੇਵਲ 3 ਮਿੰਟਾਂ 'ਚ ਇੱਕ ਵਾਰ ਐਡਮਿਨ ਕੈਸ਼ ਰੀਫ੍ਰੈਸ਼ ਕਰ ਸਕਦੇ ਹੋ.\n\nਕਿਰਪਾ ਕਰਕੇ {0} ਤੋਂ ਬਾਅਦ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ." +reload_2 : "» ਐਡਮਿਨ ਕੈਸ਼ ਸਫਲਤਾਪੂਰਕ ਰੀਫ੍ਰੈਸ਼ ਹੋ ਗਈ ਹੈ." +reload_3 : "» ਐਡਮਿਨ ਕੈਸ਼ ਰੀਫ੍ਰੈਸ਼ ਕਰਨ 'ਚ ਅਸਫਲ ਹੋ ਗਈ ਹੈ, ਕ੍ਰਿਪਾ ਕਰਕੇ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਬੋਟ ਤੁਹਾਡੇ ਚੈਟ ਵਿੱਚ ਐਡਮਿਨ ਹੈ." +reload_4 : "» ਕਿਰਪਾ ਕਰਕੇ ਉਡੀਕੋ...\n\n{0} ਨੂੰ ਮੁੜ ਚਾਲਾਉਣ ਲਈ ਰੀਬੂਟ ਹੋ ਰਿਹਾ ਹੈ." +reload_5 : "{0} ਨੂੰ ਤੁਹਾਡੇ ਚੈਟ ਲਈ ਸਫਲਤਾਪੂਰਕ ਮੁੜ ਚਾਲਾ ਦਿੱਤਾ ਗਿਆ ਹੈ.\n\nਮੁੜ ਖੇਡਣਾ ਸ਼ੁਰੂ ਕਰੋ..." + +admin_1 : "» ਕੀ ਤੁਸੀਂ ਯਾਦ ਰੱਖਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਸੀ?" +admin_2 : "➻ ਸਟ੍ਰੀਮ ਰੋਕੀ ਗਈ 🎄\n│ \n└ਦੁਆਰਾ : {0} 🥀" +admin_3 : "» ਕੀ ਤੁਸੀਂ ਯਾਦ ਰੱਖਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਸਟ੍ਰੀਮ ਰੋਕੀ ਸੀ?" +admin_4 : "➻ ਸਟ੍ਰੀਮ ਚਾਲੀ ਗਈ 🎄\n│ \n└ਦੁਆਰਾ : {0} 🥀" +admin_5 : "➻ ਸਟ੍ਰੀਮ ਮੁੱਕ ਗਈ/ਰੋਕੀ ਗਈ 🎄\n│ \n└ਦੁਆਰਾ : {0} 🥀" +admin_6 : "➻ ਸਟ੍ਰੀਮ ਛੱਡ ਦਿੱਤੀ 🎄\n│ \n└ਦੁਆਰਾ : {0} 🥀\n\n» {1} ਵਿੱਚ ਹੋਰ ਕੁਈ ਕਤਾਰ 'ਚ ਹੋਰ ਕੋਈ ਟਰੈਕ ਨਹੀਂ ਬਚੇ, ਵੀਡੀਓਚੈਟ ਤੋਂ ਬਾਹਰ ਆ ਰਿਹਾ ਹੈ." +admin_7 : "ਸਟ੍ਰੀਮ ਨੂੰ {0} 'ਤੇ ਤਬਦੀਲ ਕਰਨ 'ਚ ਗਲਤੀ." +admin_8 : "» ਕਿਰਪਾ ਕਰਕੇ /loop disable ਦੀ ਸਹਾਇਤਾ ਨਾਲ ਲੂਪ ਪਲੇ ਨੂੰ ਬੰਦ ਕਰੋ ਅਤੇ ਫਿਰ ਸਕਿਪ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ." +admin_9 : "ਕਿਰਪਾ ਕਰਕੇ ਸਕਿਪ ਲਈ ਵਿਸ਼ਿਸ਼ ਨੰਬਰ ਵਰਤੋ, ਜਿਵੇਂ 1, 2, 4..." +admin_10 : "ਕਮ ਤੋਂ ਕਮ 2 ਟ੍ਰੈਕਾਂ ਦੀ ਜ਼ਰੂਰਤ ਹੈ ਜੋ ਵਿਸ਼ਿਸ਼ ਸਕਿਪ ਲਈ ਲੱਗੇ।\n\nਕਤਾਰ ਚੈੱਕ ਕਰੋ : /queue" +admin_11 : "» ਕਤਾਰ 'ਚ ਵਿਸ਼ਿਸ਼ ਸਕਿਪ ਲਈ ਕੋਈ ਟ੍ਰੈਕ ਨਹੀਂ ਹੈ।\n\nਕਿਰਪਾ ਕਰਕੇ 1 ਅਤੇ {0} ਵਿੱਚ ਸਕਿਪ ਕਰੋ" +admin_12 : "» ਵਿਸ਼ਿਸ਼ ਟ੍ਰੈਕ ਤੇ ਸਕਿਪ ਨਹੀਂ ਕੀਤਾ ਗਿਆ।\n\nਬਾਕੀ ਕਤਾਰ ਚੈੱਕ ਕਰੋ : /queue" +admin_13 : "» ਕਿਰਪਾ ਕਰਕੇ ਏਡਮਿਨ ਕੈਸ਼ ਨੂੰ ਰੀਲੋਡ ਕਰੋ : /reload" +admin_14 : "» ਤੁਹਾਡੇ ਕੋਲ ਵੀਡੀਓ ਚੈੱਟ ਪ੍ਰਬੰਧਿਤ ਕਰਨ ਦੀ ਅਨੁਮਤੀ ਨਹੀਂ ਹੈ।\n\nਕਿਰਪਾ ਕਰਕੇ ਏਡਮਿਨ ਕੈਸ਼ ਨੂੰ ਰੀਲੋਡ ਕਰੋ : /reload" +admin_15 : "» ਸ਼ੁੱਧੀ ਨਹੀਂ ਹੋ ਰਹੀ।\n\nਕਤਾਰ ਦੇ ਅੱਪਰ ਚੈੱਕ ਕਰੋ : /queue" +admin_16 : "» ਕਤਾਰ ਸ਼ੁੱਧੀ ਹੋ ਗਈ ਹੈ {0} ਵੱਲੋਂ।\n\nਸ਼ੁੱਧੀ ਕਤਾਰ ਚੈੱਕ ਕਰੋ : /queue" +admin_17 : "ਉਦਾਹਰਣ :\n\n/loop enable/disable\n/loop 10/9/8/7" +admin_18 : "» ਲੂਪ {0} ਸਮੇਂ ਲਈ ਚਾਲੀ ਗਈ ਹੈ {1} ਵੱਲੋਂ।" +admin_19 : "» ਲੂਪ ਪਲੇ ਬੰਦ ਕੀਤੀ ਗਈ ਹੈ {0} ਵੱਲੋਂ।" +admin_20 : "ਉਦਾਹਰਣ :\n\n/seek ਜਾਂ /seekback [ਸਮਾਂ ਸਕਿਅੰਤਾ ਸਕਿੰਟਾਂ ਵਿੱਚ]" +admin_21 : "» ਕਿਰਪਾ ਕਰਕੇ ਸਕੀਨਗ ਲਈ ਨੰਬਰੀਕ ਅੰਕ ਵਰਤੋ." +admin_22 : "» ਲਾਈਵ ਸਟਰੀਮ ਨੂੰ ਸੀਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ." +admin_23 : "» ਘੱਟ ਮੁਦਾਂ ਨਾਲ ਸੀਕ ਕੋਸ਼ਿਸ਼ ਕਰੋ।\n\n{0} ਵਿੱਚ ਖੇਡਿਆ {1} ਮਿੰਟਾਂ ਤੱਕ." +admin_24 : "ਸੀਕ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...\n\nਕਿਰਪਾ ਕਰਕੇ ਬਾਹਰ ਜਾਣ ਵਾਲੇ ਨਾਲ ਵਾਜਾ ਕਰੋ..." +admin_25 : "» ਸਟਰੀਮ ਸਫਲਤਾਪੂਰਕ ਸੀਕ ਕੀਤੀ ਗਈ ਹੈ।\n\nਮੁਦਾਂ : {0} ਮਿੰਟ\nਵਾਲੇ : {1}" +admin_26 : "ਸੀਕ ਨਹੀਂ ਕੀਤੀ।" +admin_27 : "» ਸਿਰਫ ਯੂਟਿਊਬ ਸਟਰੀਮ ਦੀ ਗਤੀ ਹੁਣੇ ਤੱਕ ਨਿਯੰਤਰਿਤ ਨਹੀਂ ਹੋ ਸਕਦੀ।" +admin_28 : "{0} ਗਤੀ ਨਿਯੰਤਰਣ ਪੈਨਲ\n\nਮੌਜੂਦਾ ਚੱਲਦੇ ਸਟਰੀਮ ਦੀ ਗਤੀ ਬਦਲਣ ਲਈ ਹੇਠਲੀਆਂ ਬਟਨਾਂ 'ਤੇ ਕਲਿਕ ਕਰੋ।" +admin_29 : "» ਬੋਟ ਪਹਿਲਾਂ ਹੀ ਸਧਾਰਨ ਗਤੀ 'ਤੇ ਚੱਲਦਾ ਹੈ।" +admin_30 : "» ਕਿਰਪਾ ਕਰਕੇ ਇੰਤਜ਼ਾਰ ਕਰੋ...\n\nਕੋਈ ਹੋਰ ਵੀ ਮੁਦਾਂ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ।" +admin_31 : "ਗਤੀ ਬਦਲੀ ਜਾ ਰਹੀ ਹੈ..." +admin_32 : "» ਮੌਜੂਦਾ ਚੱਲ ਰਹੇ ਮੁਦੇ ਦੀ ਗਤੀ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...\n\nਨੇਤਾਂ ਦੀ ਬੇਨਤੀ: {0}" +admin_33 : "» ਸਟ੍ਰੀਮ ਦੀ ਵੇਗ ਬਦਲਣ ਵਿੱਚ ਅਸਫਲ ਹੋਇਆ।" +admin_34 : "» ਚਲਦੇ ਸਟ੍ਰੀਮ ਦੀ ਵੇਗ ਬਦਲੀ ਗਈ ਹੈ {0}x\n\nਬਾਇਰਲੇਨਾਂ : {1}" +admin_35 : "ਵੋਟਿੰਗ ਸਮਾਪਤ ਹੋ ਗਈ ਹੈ ਕਿਉਂਕਿ ਵੋਟਿੰਗ ਦੀ ਆਪੋਸ਼ਣ ਦੇ ਹੋਈ ਹੈ ਜਿਸ ਸੰਗੀਤ ਲਈ ਵੋਟਿੰਗ ਦਿੱਤੀ ਗਈ ਸੀ।" +admin_36 : "ਇਸ ਕ੍ਰਿਆ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਹੋਇਆ ਕਿਉਂਕਿ ਵੋਟਿੰਗ ਲਈ ਮਿਲਦੇ ਹੋਏ ਸੰਗੀਤ ਵਿੱਚ ਮੁੱਖ ਸਿਖਰ ਵਾਰਤਾਂ ਦੀ ਬੰਦੋਬਸ਼ਤ ਹੈ ਜੋ ਇਥੇ ਸਮਾਪਤ ਹੋ ਗਈ ਹੈ ਜਾਂ ਰੁਕੀ ਹੋਈ ਹੈ।" +admin_37 : "ਸੰਗੀਤ ਵਿੱਚ {0} ਵੋਟਿੰਗਾਂ ਪ੍ਰਾਪਤ ਹੋਈਆਂ ਹਨ।" +admin_38 : "» 1 ਵੋਟ ਜੋੜਿਆ ਗਿਆ ਹੈ।" +admin_39 : "» 1 ਵੋਟ ਹਟਾਇਆ ਗਿਆ ਹੈ।" +admin_40 : "ਵੋਟ ਦਿੱਤਾ ਗਿਆ ਹੈ।" + +start_1 : "{0} ਜੀ ਜਿੰਦਾ ਹੈ ਵੀ.\n\n✫ ਅਪਟਾਈਮ : {1}" +start_2 : "ਹੇਲੋ {0}, 🥀\n\n๏ ਇਹ {1} ਹੈ !\n\n➻ ਇੱਕ ਤੇਜ਼ ਅਤੇ ਤਾਕਤਵਰ ਟੈਲੀਗ੍ਰਾਮ ਸੰਗੀਤ ਪਲੇਅਰ ਬੋਟ ਜਿਸ ਵਿੱਚ ਕੁਝ ਸ਼ਾਨਦਾਰ ਵੈਬਸਾਇਟਾਂ ਹਨ।\n\nਸਮਰਥਿਤ ਪਲੈਟਫਾਰਮ : ਯੂਟਿਊਬ, ਸਪੋਟੀਫਾਈ, ਰੈਸੋ, ਐਪਲ ਮਿਊਜ਼ਿਕ ਅਤੇ ਸਾਊਂਡਕਲੌਡ।\n──────────────────\n๏ ਮੇਰੀ ਮੋਡਿਊਲਾਂ ਅਤੇ ਕੰਮਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਲਈ ਮੱਦਦ ਬਟਨ ਤੇ ਕਲਿਕ ਕਰੋ।" +start_3 : "ਹੇਲੋ {0},\nਇਹ {1} ਹੈ\n\nਧੰਨਵਾਦ {2} ਵਿਚ ਮੈਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, {3} ਹੁਣ ਇਸ ਗੱਲ ਦਾ ਪਾਲਣ ਕਰ ਸਕਦੇ ਹਨ ਕਿ ਆਪ ਵੀਡੀਓ ਵਿੱਚ ਗੀਤ ਪਲੇ ਕਰ ਸਕਦੇ ਹੋ।" +start_4 : "🎄 ਸੁਪਰਗਰੂਪ ਦੀ ਲੋੜ ਹੈ 🎄\n\nਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਗਰੁੱਪ ਨੂੰ ਸੁਪਰਗਰੂਪ ਵਿੱਚ ਤਬਦੀਲ ਕਰੋ ਅਤੇ ਫਿਰ ਮੈਨੂੰ ਮੁੜ ਸ਼ਾਮਲ ਕਰੋ।\n\nਸੁਪਰਗਰੂਪ ਬਣਾਉਣ ਲਈ ਕਿਵੇਂ ?\n- ਆਪਣੇ ਗਰੁੱਪ ਚੈਟ ਦੀ ਇਤਿਹਾਸ ਨੂੰ ਏਕ ਵਾਰ ਦਿੱਖਤਾ ਬਣਾਓ।" +start_5 : "↝ ਬਲੈਕਲਿਸਟਡ ਚੈਟ ↜\n\nਇਹ ਚੈਟ {0} ਡੇਟਾਬੇਸ 'ਤੇ ਬਲੈਕਲਿਸਟ ਹੈ।\nਤੁਹਾਨੂੰ ਕਿਸੇ ਦੂਜੇ ਸੂਡੋ ਯੂਜ਼ਰ ਦੀ ਵੇਬਸਾਈਟ ਵੀਜ਼ਿਟ ਕਰਨ ਲਈ ਅਨੁਰੋਧ ਕਰਦਾ ਹੈ, ਜਾਂ ਸੁਪੋਰਟ ਚੈਟ 'ਤੇ ਜਾਓ।" +start_6 : "😲 ਟ੍ਰੈਕ ਜਾਣਕਾਰੀ 😲\n\n📌 ਸ਼ੀਰਸ਼ਕ : {0}\n\n⏳ ਮੁਦਤ : {1} ਮਿੰਟ\n👀 ਵੇਖੇ ਗਏ : {2}\n⏰ ਪ੍ਰਕਾਸ਼ਿਤ ਹੋਇਆ ਸਮਾਂ : {3}\n📎 ਚੈਨਲ : {5}\n\n🥀 ਖੋਜ ਸ਼ਕਤੀਵਾਨ ਬਣਾਇਆ ਗਿਆ ਹੈ {6}" + +help_1 : "ਸੰਮਰਥਨ ਲਈ ਕੈਟੇਗਰੀ ਚੁਣੋ ਜਿਸ ਵਿੱਚ ਤੁਸੀਂ ਮਦਦ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ। ਆਪਣੇ ਸਸਪੈਂਟ ਨੂੰ ਪੂਛੋ ਸੰਮਰਥਨ ਚੈਟ\n\nਸਭ ਕੰਮਾਂਡਾਂ / ਨਾਲ ਵਰਤੀ ਜਾ ਸਕਦੀਆਂ ਹਨ।" +help_2 : "ਆਪਣੇ ਪ੍ਰਾਈਵੇਟ ਚੈਟ ਵਿੱਚ ਮੇਰੇ ਮਦਦ ਮੀਨੂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਹੇਲਪ ਮੇਨੂ ਉੱਤੇ ਦਿੱਤੇ ਗਏ ਬਟਨ 'ਤੇ ਕਲਿਕ ਕਰੋ।" + +lang_1 : "» ਮੈਂਨੂੰ ਜੇ ਕਿਸੇ ਸਮੂਹ ਦੀ ਮੂਲ ਭਾ਷ਾ ਬਣਾਉਣੀ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਉਸ ਸਮੂਹ ਦੀ ਭਾ਷ਾ ਚੁਣੋ :" +lang_2 : "ਭਾਸ਼ਾ ਸਫ਼ਲਤਾਪੂਰਕ ਬਦਲੀ ਗਈ ਹੈ।" +lang_3 : "ਭਾਸ਼ਾ ਬਦਲਣ ਵਿੱਚ ਅਸਫਲ ਹੋਇਆ।" +lang_4 : "ਤੁਸੀਂ ਹੀ ਉਸੇ ਭਾਸ਼ਾ 'ਤੇ ਹੋ।" + +setting_1 : "{0} ਸੈਟਿੰਗਾਂ ਪੈਨਲ\n\nਚੈਟ ਆਈਡੀ : {1}\nਚੈਟ ਨਾਂ : {2}\n\nਸੈਟਿੰਗਾਂ ਬਦਲਣ ਲਈ ਹੇਠਾਂ 'ਤੇ ਬਟਨਾਂ 'ਤੇ ਕਲਿਕ ਕਰੋ।" +setting_2 : "» ਡਾਇਰੈਕਟ: ਖੋਜ ਪੁੱਛ ਤੇ ਖੋਜ ਜ਼ਿਦਾ ਸਵਰੂਪੋ 'ਤੇ ਸੀਧਾ ਚੱਲਦੀ ਹੈ।\n\n» ਇਨਲਾਈਨ: ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਵਿੱਚ ਚੁਣਨ ਲਈ ਇਨਲਾਈਨ ਬਟਨ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਨ।" +setting_3 : "» ਹਰ ਕੋਈ: ਇਸ ਸਮੂਹ ਵਿੱਚ ਹਰ ਕੋਈ ਐਡਮਿਨ ਕੰਮਾਂਡਾਂ [ਸਕਿਪ, ਪੌਜ, ਰੀਜ਼ਿਊਮ ਆਦਿ] ਵਰਤ ਸਕਦਾ ਹੈ।\n\n» ਸਿਰਫ ਐਡਮਿਨ: ਸਿਰਫ ਐਡਮਿਨਾਂ ਅਤੇ ਮਨਜ਼ੂਰ ਯੂਜ਼ਰ ਐਡਮਿਨ ਕੰਮਾਂਡਾਂ ਵਰਤ ਸਕਦੇ ਹਨ।" +setting_4 : "» ਕੋਈ ਮਨਜ਼ੂਰ ਯੂਜ਼ਰ ਨਹੀਂ ਮਿਲੇ।" +setting_5 : "» ਗਰੁੱਪ: ਉਸ ਗਰੁੱਪ ਵਿੱਚ ਸੰਗੀਤ ਚਲਾਉਂਦਾ ਹੈ ਜਿੱਥੇ ਆਦੇਸ਼ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।\n\n» ਚੈਨਲ: ਉਸ ਚੈਨਲ 'ਚ ਸੰਗੀਤ ਚਲਾਉਂਦਾ ਹੈ ਜਿਥੇ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਹੋ। /channelplay ਦੁਆਰਾ ਚੈਨਲ ਆਈਡੀ ਸੈਟ ਕਰੋ" +setting_6 : "» ਹਰ ਕੋਈ : ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਹਾਜ਼ਰ ਕੋਈ ਵੀ ਮਿਊਜ਼ਿਕ ਚਲਾ ਸਕਦਾ ਹੈ।\n\n» ਸਿਰਫ ਐਡਮਿਨ : ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਮਿਊਜ਼ਿਕ ਸਿਰਫ ਐਡਮਿਨਸ ਵੀ ਚਲਾ ਸਕਦੀ ਹੈ।" +setting_7 : "» ਕਿਰਪਾ ਕਰਕੇ /channelplay ਦੁਆਰਾ ਚੈਨਲ ਆਈਡੀ ਨੂੰ ਨਿਰਧਾਰਿਤ ਕਰੋ" +setting_8 : "ਜਦੋਂ ਇਹ ਮੋਡ ਸਮਰੱਥਿਤ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਬਿਨਾ ਐਡਮਿਨ ਹੱਕਾਂ ਵਾਲੇ ਲੋਕ ਕੁਝ ਸਮੇਂ ਬਾਅਦ ਐਡਮਿਨ ਕਮਾਂਡ ਵਰਤ ਸਕਦੇ ਹਨ." +setting_9 : "ਮੌਜੂਦਾ ਅੱਪਵੋਟਾਂ ਦੀ ਗਿਣਤੀ ਜੋ ਐਡਮਿਨ ਕਮਾਂਡ ਵਰਤਣ ਲਈ ਦੀ ਜ਼ਰੂਰੀ ਹੈ: {0}" +setting_10 : "ਵੋਟਿੰਗ ਮੋਡ ਬੰਦ ਹੈ." +setting_11 : "ਸਭ ਤੋਂ ਘੱਟ ਅੱਪਵੋਟ ਗਿਣਤੀ 2 ਹੋ ਸਕਦੀ ਹੈ। ਤੁਸੀਂ 2 ਤੋਂ ਘੱਟ ਸੈਟ ਨਹੀਂ ਕਰ ਸਕਦੇ" +setting_12 : "ਸਭ ਤੋਂ ਵੱਧ ਅੱਪਵੋਟ ਗਿਣਤੀ 15 ਹੋ ਸਕਦੀ ਹੈ। ਤੁਸੀਂ 15 ਤੋਂ ਵੱਧ ਸੈਟ ਨਹੀਂ ਕਰ ਸਕਦੇ" + +set_cb_1 : "ਪ੍ਰਾਪਤ ਕਰ ਰਹੇ ਹਨ ਮਨਜੂਰ ਯੂਜ਼ਰਾਂ ਪੈਨਲ..." +set_cb_2 : "ਪ੍ਰਾਪਤ ਕਰ ਰਹੇ ਹਨ ਪਲੇ ਮੋਡ ਪੈਨਲ..." +set_cb_3 : "ਸੈੱਟਿੰਗ ਅੱਪ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..." +set_cb_4 : "» ਮੰਜੂਰ ਕੀਤੇ ਗਏ ਯੂਜ਼ਰਾਂ ਦੀ ਲਿਸਟ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..." +set_cb_5 : "» ਵਾਪਸ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." + +gstats_1 : "ਪ੍ਰਾਪਤ ਕਰ ਰਿਹਾ ਹੈ {0} ਸਟੈਟਸ ਅਤੇ ਜਾਣਕਾਰੀ...\n\nਇਹ ਥੋੜੇ ਸਮੇਂ ਲਗ ਸਕਦਾ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਰੁਕੋ..." +gstats_2 : "ਨੀਚੇ ਦਿੱਤੇ ਗਏ ਬਟਨਾਂ 'ਤੇ ਕਲਿਕ ਕਰੋ ਤਾਂ {0} ਦੀ ਸਟੈਟਸ ਦੇਖੋ." +gstats_3 : "{0} ਸਟੈਟਸ ਅਤੇ ਜਾਣਕਾਰੀ :\n\nਅਸਿਸਟੈਂਟਾਂ : {1}\nਬਲੌਕ : {2}\nਚੈਟਾਂ : {3}\nਯੂਜ਼ਰ : {4}\nਮੋਡਿਊਲਾਂ : {5}\nਸੁਡੋਅਰ : {6}\n\nਆਟੋ ਛੱਡਣ ਵਾਲਾ ਅਸਿਸਟੈਂਟ : {7}\nਪਲੇ ਦੀ ਮਿਆਦ ਸੀਮਾ : {8} ਮਿੰਟਾਂ" +gstats_4 : "ਇਹ ਬਟਨ ਸਿਰਫ ਸੁਡੋਅਰਾਂ ਲਈ ਹੈ." +gstats_5 : "{0} ਸਟੈਟਸ ਅਤੇ ਜਾਣਕਾਰੀ :\n\nਮੋਡਿਊਲਾਂ : {1}\nਪਲੈਟਫਾਰਮ : {2}\nਰੈਮ : {3}\nਫਿਜਿਕਲ ਕੋਰਸ : {4}\nਕੁੱਲ ਕੋਰਸ : {5}\nਸੀਪੀਯੂ ਫ਼ਰੀਕਵੈਂਸੀ : {6}\n\nਪਾਇਥਨ : {7}\nਪਾਇਥਾਂ : {8}\nਪਾਇਥਾਂ-ਟੀਜੀਕਾਲਾ : {9}\n\nਸਟੋਰੇਜ ਉਪਲੱਬਧ : {10} ਗੀਬੀ\nਸਟੋਰੇਜ ਵਰਤੇ : {11} ਗੀਬੀ\nਸਟੋਰੇਜ ਬਾਕੀ : {12} ਗੀਬੀ\n\nਸੇਵਿਆਂ ਦੀਆਂ ਚੈਟਾਂ : {13}\nਸੇਵਿਆਂ ਦੇ ਯੂਜ਼ਰ : {14}\nਬਲੌਕ ਕੀਤੇ ਯੂਜ਼ਰ : {15}\nਸੁਡੋ ਯੂਜ਼ਰ : {16}\n\nਕੁੱਲ ਡੀਬੀ ਆਕਾਰ : {17} ਐਮਬੀ\nਕੁੱਲ ਡੀਬੀ ਸਟੋਰੇਜ : {18} ਐਮਬੀ\nਕੁੱਲ ਡੀਬੀ ਕਲੈਕਸ਼ਨ : {19}\nਕੁੱਲ ਡੀਬੀ ਕੀਜ : {20}" + +playcb_1 : "» ਆਓ, ਇਹ ਤੁਹਾਡੇ ਵਾਸਤੇ ਨਹੀਂ ਹੈ ਮੇਰੇ ਮਨਾਣ ਦੇ ਅਨੁਸਾਰ." +playcb_2 : "» ਅਗਲੇ ਨਤੀਜੇ ਪ੍ਰਾਪਤ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ,\n\nਕਿਰਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ..." + +cplay_1 : "» ਤੁਸੀਂ {0} ਤੋਂ ਕਿਸੇ ਵੀ ਚੈਨਲ 'ਤੇ ਗੀਤ ਖੇਡ ਸਕਦੇ ਹੋ ਜਾਂ ਤੁਹਾਡੇ ਚੈਟ ਦੇ ਲਿੰਕ ਦਿੱਤੇ ਚੈਨਲ 'ਤੇ।\n\nਲਿੰਕ ਦਿੱਤੇ ਚੈਨਲ ਲਈ:\n/channelplay linked\n\nਕਿਸੇ ਹੋਰ ਚੈਨਲ ਲਈ:\n/channelplay [ਚੈਨਲ ਆਈਡੀ]" +cplay_2 : "» ਇਸ ਚੈਟ ਦੇ ਕੋਈ ਵੀ ਲਿੰਕ ਦਿੱਤੇ ਚੈਨਲ ਨਹੀਂ ਹਨ।" +cplay_3 : "» ਚੈਨਲ ਨੂੰ {0} ਲਈ ਨਿਰਧਾਰਤ ਕੀਤਾ ਗਿਆ ਹੈ।\nਚੈਨਲ ਆਈਡੀ : {1}" +cplay_4 : "» ਚੈਨਲ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ 'ਚ ਅਸਫ਼ਲ ਹੋਇਆ।\n\nਮੁੱਖਬੂਟੀ ਬਣਾਓ ਕਿ ਤੁਸੀਂ ਆਪਣੇ ਚੈਨਲ ਵਿੱਚ ਬੋਟ ਸ਼ਾਮਲ ਕਰ ਚੁੱਕੇ ਹੋ ਅਤੇ ਉਸ ਨੂੰ ਐਡਮਿਨ ਬਣਾ ਦਿੳੁ।" +cplay_5 : "ਸਿਰਫ਼ ਚੈਨਲਾਂ ਦਾ ਸਮਰਥਨ ਕੀਤਾ ਗਿਆ ਹੈ।" +cplay_6 : "» ਤੁਹਾਨੂੰ ਚੈਨਲ {0} ਦਾ ਮਾਲਕ ਹੋਣ ਦੀ ਲੋੜ ਹੈ ਇਸ ਨੂੰ ਇਸ ਗਰੁਪ ਨਾਲ ਮੇਲਾਓ।\nਚੈਨਲ ਦਾ ਮਾਲਕ : @{1}\n\nਵਿਕਲਪ ਤੌਰ 'ਤੇ, ਤੁਸੀਂ ਆਪਣੇ ਗਰੁਪ ਨੂੰ ਉਹ ਚੈਨਲ ਦੇ ਸਥਾਨ 'ਤੇ ਲਿੰਕ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਫਿਰ /channelplay linked ਨਾਲ ਜੁੜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" +cplay_7 : "» ਚੈਨਲ ਪਲੇ ਅਸਮਰਥ ਕੀਤਾ ਗਿਆ ਹੈ।" + +play_1 : "🔍" +play_2 : "➻ ਚੈਨਲ ਪਲੇ ਮੋਡ\n\nਪ੍ਰੋਸੈਸਿੰਗ, ਕਿਰਪਾ ਕਰਕੇ ਉਡੀਕੋ...\n\nਲਿੰਕ ਕੀਤਾ ਚੈਨਲ : {0}" +play_3 : "» ਪ੍ਰੋਸੈਸ਼ ਕਰਨ ਵਿੱਚ ਅਸਫ਼ਲ ਹੋਇਆ।" +play_4 : "ਕੇਵਲ ਐਡਮਿਨ ਪਲੇ\nਇਸ ਚੈਟ ਦੇ ਐਡਮਿਨ ਹੀ ਖੇਡ ਸਕਦੇ ਹਨ\n\n/playmode ਰਾਹੀਂ ਖੇਡਣ ਦਾ ਮੋਡ ਬਦਲੋ" +play_5 : "» ਆਡੀਓ ਫਾਇਲ ਦੀ ਪ੍ਰੋਸੈਸ਼ਿੰਗ ਵਿੱਚ ਅਸਫ਼ਲ ਹੋਇਆ।\n\nਆਡੀਓ ਫਾਇਲ ਦਾ ਆਕਾਰ ਨੀਚੇ ਦਿੱਤੇ ਸੀਮਤ ਤੋਂ ਵੱਡਾ ਹੈ।" +play_6 : "» ਸਟ੍ਰੀਮ {0} ਤੋਂ ਲੰਬਾ ਹੈ ਅਤੇ {1} 'ਤੇ ਖੇਡਣ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ" +play_7 : "» ਮਾਨਿਆ ਵਿਡੀਓ ਫਾਇਲ ਐਕਸ਼ਟੇਸ਼ਨ ਨਹੀਂ ਹੈ।\n\nਸਹਾਇਕ ਐਕਸ਼ਟੇਸ਼ਨ: {0}" +play_8 : "» ਵੀਡੀਓ ਫਾਇਲ ਦਾ ਆਕਾਰ 1ਜੀਬੀ ਤੋਂ ਘੱਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ." +play_9 : "YouTube ਪਲੇਲਿਸਟ ਫੀਚਰ\n\nਪੂਰੀ YouTube ਪਲੇਲਿਸਟ ਨੂੰ ਖੇਡਣ ਲਈ ਮੋਡ ਚੁਣੋ।" +play_10 : "ਸਿਰਲੇਖ : {0}\nਮਿੰਟਾਂ ਦੀ ਮੁਦਤ : {1}" +play_11 : "{0} Spotify ਪਲੇਅਰ\n\nਦੁਆਰਾ ਮੰਗਿਆ ਗਿਆ : {1}" +play_12 : "{0} Apple ਪਲੇਅਰ\n\nਦੁਆਰਾ ਮੰਗਿਆ ਗਿਆ : {1}" +play_13 : "» ਲਾਈਵ ਸਟ੍ਰੀਮ ਪਕਡ਼ਿਆ ਗਿਆ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਯਕੀਨਾਂ ਹੈਂ ਕਿ ਤੁਸੀਂ ਇਸ ਲਾਈਵ ਸਟ੍ਰੀਮ ਨੂੰ ਚੱਲਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" +play_14 : "ਟ੍ਰੈਕ ਦੇਤਾਇਲਾਂ ਦੀ ਵੱਖਰੀ ਕਰਨਾ ਅਸਫ਼ਲ ਹੋਇਆ।\n\nਕਿਸੇ ਹੋਰ ਨੂੰ ਖੇਡੋ ਕੋਈ ਹੋਰ ਟ੍ਰੈਕ।" +play_15 : "» ਪੁਰਜ਼ਾ ਦਾ ਇੱਛਰਾ ਕਰਨ ਵਿੱਚ ਅਸਫ਼ਲ ਹੋਇਆ।\n\nਮੈਂ ਕੇਵਲ Spotify ਟ੍ਰੈਕਾਂ, ਐਲਬਮਾਂ, ਕਲਾਕਾਰਾਂ ਅਤੇ ਪਲੇਲਿਸਟ ਖੇਡ ਸਕਦਾ ਹਾਂ।" +play_16 : "ਕੋਈ ਸਰਗਰਮ ਆਵਾਜ਼ ਚੈਟ ਨਹੀਂ ਹੈ।\n\nਫੋਰਸ ਖੇਡਣ ਲਈ, ਸਰਗਰਮ ਆਵਾਜ਼ ਚੈਟ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।" +play_17 : "ਕਿਰਪਾ ਕਰਕੇ ਵੀਡੀਓ ਚੈਟ ਚਾਲੀਏ, ਮੈਂ URL ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹਾਂ।" +play_18 : "ਉਪਯੋਗ : /play [ਗੀਤ ਦਾ ਨਾਮ/YouTube URL/ਆਡੀਓ/ਵੀਡੀਓ ਫਾਇਲ ਦੇ ਪ੍ਰਤੀਕ ਉੱਤਰ]" +play_19 : "ਕਤਾਰ ਦੀ ਪਲੇਲਿਸਟ:" +play_20 : "ਕਤਾਰ ਦੀ ਥਾਂ -" +play_21 : "ਕੱਢੀਆ ਗਿਆ {0} ਟਰੈਕਾਂ ਨੂੰ ਕਤਾਰ ਵਿੱਚ.\n\nਚੈਕ: ਇੱਥੇ ਕਲਿਕ ਕਰੋ" +play_22 : "ਸਮੱਗਰੀ ਨੂੰ ਉਸ ਤਰੀਕੇ ਨਾਲ ਖੇਡਣ ਦੇ ਮੋਡ ਨੂੰ ਚੁਣੋ ਜਿਸ ਵਿੱਚ ਤੁਸੀਂ ਆਪਣੇ ਗਰੁੱਪ ਵਿੱਚ ਕਤਾਰਾ ਲੱਗਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ: {0}" + +str_1 : "ਕਿਰਪਾ ਕਰਕੇ m3u8 ਜਾਂ ਇੰਡੈਕਸ ਲਿੰਕ ਪ੍ਰਦਾਨ ਕਰੋ." +str_2 : "➻ ਵੈਲੀਡ ਸਟਰੀਮ ਪੁਸ਼ਟੀ ਕੀਤੀ।\n\nਪ੍ਰੋਸੈਸਿੰਗ..." +str_3 : "ਯੂਟਿਊਬ ਲਾਈਵ ਸਟਰੀਮ ਚਲਾਉਣ 'ਚ ਅਸਫ਼ਲ ਹੋਇਆ, ਕੋਈ ਲਾਈਵ ਫਾਰਮੈਟ ਨਹੀਂ ਲੱਭਿਆ।" + +ping_1 : "{0} ਪਿੰਗ ਲੱਗਾ ਰਿਹਾ ਹੈ..." +ping_2 : "🏓 ਪੌਂਗ: {0}ਮਿਲੀਸਕਿੰਡ\n\n{1} ਸਿਸਟਮ ਸਟੈਟਸ:\n\n↬ ਅਪਟਾਇਮ: {2}\n↬ ਰੈਮ: {3}\n↬ ਸੀ.ਪੀ.ਯੂ: {4}\n↬ ਡਿਸਕ: {5}\n↬ ਪਾਈ-ਟੀਜੀ-ਕਾਲਜ: {6}ਮਿਲੀਸਕਿੰਡ" + +queue_1 : "» Ǫᴜᴇᴜᴇ ਲੱਭ ਰਿਹਾ ਹੈ...\n\nਕਿਰਪਾ ਕਰਕੇ ਇੰਤਜ਼ਾਰ ਕਰੋ..." +queue_2 : "» Ǫᴜᴇᴜᴇ ਖਾਲੀ ਹੈ." +queue_3 : "» ਕਿਰਪਾ ਕਰਕੇ ਯੋਧਾਂ ਦੀ ਸੂਚੀ ਜਾਂਚਣ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ : ਇੱਥੇ" +queue_4 : "➲ ਕਤਾਰ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ #{0}\n\n‣ ਸਿਰਲੇਖ : {1}\n‣ ਅੰਤਰਾਲ : {2} ਮਿੰਟ\n‣ ਬੇਨਕਾਰਨ ਕੇਵਲ : {3}" +queue_5 : "ਇੱਥੇ ਪਲੇਅਲਿਸਟ ਵਿੱਚ ਸਿਰਫ ਇੱਕ ਕਤਾਰ ਵਾਲਾ ਗੀਤ ਹੈ.\n\nਇੱਕ ਹੋਰ ਗੀਤ ਸ਼ਾਮਲ ਕਰੋ ਸੂਚੀ ਜਾਂਚਣ ਲਈ." +queue_6 : "🕚 ਅੰਤਰਾਲ : ਅਣਜਾਣ ਸ਼੍ਰੇਣੀ ਦੀ ਅਵਧੀ\n\nਪੂਰੀ ਕਤਾਰ ਦੀ ਸੂਚੀ ਲੱਭਣ ਲਈ ਹੇਠਾਂ ਦਿੱਤੇ ਬਟਨ 'ਤੇ ਕਲਿਕ ਕਰੋ." +queue_7 : "\nਪੂਰੀ ਕਤਾਰ ਦੀ ਸੂਚੀ ਲੱਭਣ ਲਈ ਹੇਠਾਂ ਦਿੱਤੇ ਬਟਨ 'ਤੇ ਕਲਿਕ ਕਰੋ." +queue_8 : "{0} ਪਲੇਅਰ\n\n🎄 ਸਟ੍ਰੀਮਿੰਗ : {1}\n\n🔗 ਸਟ੍ਰੀਮ ਕਿਸਮ : {2}\n🥀 ਬੇਨਕਾਰਨ ਕੇਵਲ : {3}\n{4}" + +stream_1 : "➲ ਸਟਰਟੇਡ ਸਟਰੀਮਿੰਗ |\n\n‣ ਟਾਈਟਲ : {1}\n‣ ਮੁੱਦਤ : {2} ਮਿੰਟ\n‣ ਬੇਨਕਾਰਨ ਕੇਵਲ : {3}" +stream_2 : "➲ ਸਟਰਟੇਡ ਸਟਰੀਮਿੰਗ |\n\n‣ ਸਟਰੀਮ ਕਿਸਮ : ਲਾਈਵ ਸਟਰੀਮ [ਯੂਆਰਐਲ]\n‣ ਬੇਨਕਾਰਨ ਕੇਵਲ : {0}" + +CLOSE_BUTTON : "ਬੰਦ ਕਰੋ" +BACK_BUTTON : "ਵਾਪਸ" + +S_B_1 : "ਮੈਨੂੰ ਸ਼ਾਮਲ ਕਰੋ" +S_B_2 : "ਸਹਿਯੋਗ" +S_B_3 : "ਮੇਰੇ ਗਰੁੱਪ ਵਿੱਚ ਮੈਨੂੰ ਸ਼ਾਮਲ ਕਰੋ" +S_B_4 : "ਮਦਦ ਅਤੇ ਕਮਾਂਡਾਂ" +S_B_5 : "ਡੈਵੇਲਪਰ" +S_B_6 : "ਚੈਨਲ" +S_B_7 : "ਸਰੋਤ ਕੋਡ" +S_B_8 : "👀 ਯੂਟਿਊਬ 👀" +S_B_9 : "🥀 ਸਹਿਯੋਗ 🥀" + +H_B_1 : "ਐਡਮਿਨ" +H_B_2 : "ਆਥ" +H_B_3 : "ਬ੍ਰੋਡਕਾਸਟ" +H_B_4 : "ਬਲ-ਚੈਟ" +H_B_5 : "ਬਲ-ਯੂਜ਼ਰ" +H_B_6 : "ਸੀ-ਪਲੇ" +H_B_7 : "ਜੀ-ਬੈਨ" +H_B_8 : "ਲੂਪ" +H_B_9 : "ਮੈਂਟੀਨੈਂਸ" +H_B_10 : "ਪਿੰਗ" +H_B_11 : "ਪਲੇ" +H_B_12 : "ਸ਼ਫਲ" +H_B_13 : "ਸੀਕ" +H_B_14 : "ਗੀਤ" +H_B_15 : "ਸਪੀਡ" + +P_B_1 : "ਆਡੀਓ" +P_B_2 : "ਵੀਡੀਓ" +P_B_3 : "ਲਾਈਵ ਸਟ੍ਰੀਮ" +P_B_4 : "ਨਾਰਮਲ" + +ST_B_1 : "ਆਥ ਯੂਜ਼ਰ" +ST_B_2 : "ਪਲੇ ਮੋਡ" +ST_B_3 : "ਭਾਸ਼ਾ" +ST_B_4 : "ਵੋਟਿੰਗ ਮੋਡ" +ST_B_5 : "ਚਾਲੂ" +ST_B_6 : "ਬੰਦ" +ST_B_7 : "ਆਥ ਯੂਜ਼ਰ ➜" +ST_B_8 : "ਐਡਮਿਨ" +ST_B_9 : "ਹਰ ਕੋਈ" +ST_B_10 : "ਸਰਚ ਮੋਡ ➜" +ST_B_11 : "ਸਿੱਧਾ" +ST_B_12 : "ਇਨਲਾਇਨ" +ST_B_13 : "ਐਡਮਿਨ ਕੰਮਾਂਡ ➜" +ST_B_14 : "ਪਲੇ ਟਾਈਪ ➜" + +SA_B_1 : "ਸੰਪੂਰਨ ਸਥਿਤੀ" +SA_B_2 : "ਆਮ" +SA_B_3 : "ਸੰਪੂਰਨ" + +QU_B_1 : "ਕਤਾਰ" +QU_B_2 : " {0} —————————— {1}" + +sudo_1 : "» {0} ਪਹਿਲਾਂ ਹੀ ਸੁਡੋ ਯੂਜ਼ਰ ਸੂਚੀ ਵਿੱਚ ਹੈ." +sudo_2 : "» {0} ਨੂੰ ਸੁਡੋ ਯੂਜ਼ਰ ਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਹੈ." +sudo_3 : "» {0} ਸੁਡੋ ਯੂਜ਼ਰ ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਹੈ." +sudo_4 : "» {0} ਨੂੰ ਸੁਡੋ ਯੂਜ਼ਰ ਸੂਚੀ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ." +sudo_5 : "🥀 ਮਾਲਕ :\n" +sudo_6 : "\n✨ ਸੁਡੋ ਯੂਜ਼ਰ :\n" +sudo_7 : "» ਕੋਈ ਸੁਡੋ ਯੂਜ਼ਰ ਨਹੀਂ ਮਿਲਿਆ." +sudo_8 : "ਅਸਫਲ." + +block_1 : "» {0} ਪਹਿਲਾਂ ਹੀ ਬਲਾਕ ਯੂਜ਼ਰ ਸੂਚੀ ਵਿੱਚ ਹੈ." +block_2 : "» {0} ਨੂੰ ਬਲਾਕ ਯੂਜ਼ਰ ਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਹੈ." +block_3 : "» {0} ਬਲਾਕ ਯੂਜ਼ਰ ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਹੈ." +block_4 : "» {0} ਨੂੰ ਬਲਾਕ ਯੂਜ਼ਰ ਸੂਚੀ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ." +block_5 : "» ਕੋਈ ਬਲਾਕ ਯੂਜ਼ਰ ਨਹੀਂ ਮਿਲਿਆ." +block_6 : "» ਬਲਾਕ ਯੂਜ਼ਰ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..." +block_7 : "😫 ਬਲਾਕ ਯੂਜ਼ਰ :\n\n" + +black_1 : "ਉਦਾਹਰਨ:\n\n/blacklistchat [ਚੈਟ ਆਈਡੀ]" +black_2 : "» ਇਹ ਚੈਟ ਪਹਿਲਾਂ ਹੀ ਬਲੈਕਲਿਸਟ 'ਤੇ ਹੈ।" +black_3 : "» ਸਫਲਤਾਪੂਰਕ ਤੌਰ 'ਤੇ ਬਲੈਕਲਿਸਟ 'ਤੇ ਚੈਟਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਹੈ।" +black_4 : "ਉਦਾਹਰਨ:\n\n/whitelistchat [ਚੈਟ ਆਈਡੀ]" +black_5 : "» ਇਹ ਚੈਟ ਬਲੈਕਲਿਸਟ 'ਤੇ ਨਹੀਂ ਹੈ।" +black_6 : "» ਸਫਲਤਾਪੂਰਕ ਤੌਰ 'ਤੇ ਚੈਟ ਨੂੰ ਬਲੈਕਲਿਸਟ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।" +black_7 : "» ਬਲੈਕਲਿਸਟ 'ਤੇ ਚੈਟਾਂ ਦੀ ਸੂਚੀ:\n\n" +black_8 : "» {0} 'ਤੇ ਕੋਈ ਬਲੈਕਲਿਸਟ 'ਤੇ ਨਹੀਂ ਹੈ।" +black_9 : "» ਕੁਝ ਗਲਤ ਹੋ ਗਿਆ ਸੀ।" + +maint_1 : "ਉਦਾਹਰਨ:\n/maintenance [ਚਾਲੂ | ਬੰਦ]" +maint_2 : "» {0} ਮੈਂਟੀਨੈਂਸ ਮੋਡ ਚਾਲੂ ਹੋ ਗਿਆ ਹੈ." +maint_3 : "» {0} ਮੈਂਟੀਨੈਸ ਮੋਡ ਬੰਦ ਹੋ ਗਿਆ ਹੈ." +maint_4 : "» ਮੈਂਟੀਨੈਸ ਮੋਡ ਹੀ ਚਾਲੂ ਹੈ." +maint_5 : "» ਮੈਂਟੀਨੈਸ ਮੋਡ ਹੀ ਬੰਦ ਹੈ." + +log_1 : "ਉਦਾਹਰਨ:\n/logger [ਚਾਲੂ | ਬੰਦ]" +log_2 : "ਲਾਗਰ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਹੈ." +log_3 : "ਲਾਗਰ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ." + +broad_1 : "» ਬਰੋਡਕਾਸਟਿੰਗ ਸ਼ੁਰੂ ਹੋ ਗਈ ਹੈ..." +broad_2 : "ਉਦਾਹਰਨ:\n\n/broadcast [ਸੁਨੇਹਾ ਜਾਂ ਉਤਤਰ ਦੇਣ ਲਈ ਇੱਕ ਸੁਨੇਹਾ]" +broad_3 : "» {0} ਸੁਨੇਹਿਆਂ ਨੂੰ {1} ਪਿੰਸ ਨਾਲ ਚੈਟਾਂ ਵਿੱਚ ਬ੍ਰੋਡਕਾਸਟ ਕੀਤਾ ਗਿਆ ਹੈ." +broad_4 : "» {0} ਯੂਜ਼ਰਾਂ ਨੂੰ ਸੁਨੇਹਾ ਮੁੱਕਾਬਲਾ ਕੀਤਾ ਗਿਆ ਹੈ." +broad_5 : "» ਅਸਿਸਟੈਂਟ ਬਰੋਡਕਾਸਟ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ..." +broad_6 : "➻ ਅਸਿਸਟੈਂਟ ਬਰੋਡਕਾਸਟ :\n\n" +broad_7 : "↬ ਅਸਿਸਟੈਂਟ ਨੇ {0} ਬਰੋਡਕਾਸਟ ਕੀਤਾ {1} ਚੈਟਾਂ ਵਿੱਚ." +broad_8 : "» ਕਿਰਪਾ ਕਰਕੇ ਬਰੋਡਕਾਸਟ ਕਰਨ ਲਈ ਕੁਝ ਟੈਕਸਟ ਪ੍ਰਦਾਨ ਕਰੋ." + +server_1 : "» ਲੋਗਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਹੋਇਆ।" +server_2 : "ਕ੍ਰਿਪਾ ਕਰਕੇ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੀ Heroku API ਕੀ ਅਤੇ ਐਪ ਨਾਮ ਠੀਕ ਤਰ੍ਹਾ ਸੰਰਚਿਤ ਹਨ।" +server_3 : "ਉਪਲਬਧ ਅੱਪਡੇਟਾਂ ਦੀ ਜਾਂਚ ਹੋ ਰਹੀ ਹੈ..." +server_4 : "Git ਕੰਮਾਂਡ ਦਾ ਤਰਾਂਗ ਹੋਇਆ ਹੈ।" +server_5 : "ਅਮਾਨਤ ਨਾਂ ਦੀ ਅਮਾਨਤ ਨਹੀਂ ਹੈ।" +server_6 : "» ਬੋਟ ਅੱਪ-ਟੁ-ਡੇਟ ਹੈ।" +server_7 : "» ਬੋਟ ਨੂੰ ਸਫਲਤਾਪੂਰਵਕ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ ਹੈ! ਹੁਣ ਕੁਝ ਮਿੰਟ ਬਾਅਦ ਬੋਟ ਨੂੰ ਮੁੜ-ਆਰੰਭ ਹੋਣ ਦੀ ਪ੍ਰਤੀਕਰਤਾ ਕਰੋ ਅਤੇ ਤਬਦੀਲੀਆਂ ਨੂੰ ਪੁੱਸ਼ ਕਰੋ!" +server_8 : "{0} ਮੁੜ-ਆਰੰਭ ਹੋ ਰਿਹਾ ਹੈ...\n\n15-20 ਸਕਿੰਟਾਂ ਬਾਅਦ ਤੁਸੀਂ ਮਾਜੂਦਾ ਖੇਡਣਾ ਸ਼ੁਰੂ ਕਰ ਸਕਦੇ ਹੋ।" +server_9 : "ਕੁਝ ਗਲਤੀ ਹੋਈ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਲੋਗ ਜਾਂਚੋ।" +server_10 : "ਕਿਸੇ ਕਾਰਣਵਾਂ, #ਅੱਪਡੇਟਰ 'ਤੇ ਇੱਕ ਅਸਮਾਨ ਵਾਰੀ ਆਯੋਜਨ ਹੋ ਗਿਆ ਹੈ: {0}" +server_11 : "» ਸਪੀਡਟੈਸਟ ਚੱਲ ਰਿਹਾ ਹੈ..." +server_12 : "⇆ ਡਾਊਨਲੋਡ ਸਪੀਡਟੈਸਟ ਚੱਲ ਰਿਹਾ ਹੈ..." +server_13 : "⇆ ਅੱਪਲੋਡ ਸਪੀਡਟੈਸਟ ਚੱਲ ਰਿਹਾ ਹੈ..." +server_14 : "↻ ਸਪੀਡਟੈਸਟ ਨਤੀਜਿਆਂ ਨੂੰ ਸਾਂਝਾ ਕਰ ਰਿਹਾ ਹੈ..." +server_15 : "✯ ਸਪੀਡਟੈਸਟ ਨਤੀਜੇ ✯\n\nਗਾਹਕ :\n» ਆਈਪੀ : {0}\n» ਦੇਸ਼ : {1}\n\nਸਰਵਰ :\n» ਨਾਮ : {2}\n» ਦੇਸ਼ : {3}, {4}\n» ਸਪਾਂਸਰ : {5}\n» ਲੈਟੈਂਸੀ : {6}\n» ਪਿੰਗ : {7}" + +gban_1 : "» ਕਿਉਂ ਤੁਸੀਂ ਆਪਣੇ ਆਪ ਨੂੰ gban ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?" +gban_2 : "» ਕਿਉਂ ਮੈਂ ਆਪਣੇ ਆਪ ਨੂੰ gban ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ?" +gban_3 : "» ਤੁਸੀਂ ਮੇਰੀ sudoers ਨੂੰ gban ਨਹੀਂ ਕਰ ਸਕਦੇ." +gban_4 : "» {0} ਹੀ ਪਹਿਲਾਂ ਹੀ ਬੋਟ ਤੋਂ ਗਲੋਬਲ ਤੌਰ 'ਤੇ ਬੈਨ ਹੈ।" +gban_5 : "» {0} 'ਤੇ ਗਲੋਬਲ ਬੈਨ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ।\n\nਉਮੀਦਵਾਰ ਸਮਾਂ: {1}" +gban_6 : "{0} 'ਤੇ ਨਵਾਂ ਗਲੋਬਲ ਬੈਨ:\n\nਉੱਤਪਤਤ: {1} [{2}]\nਯੂਜ਼ਰ: {3}\nਯੂਜ਼ਰ ਆਈਡੀ: {4}\n\nਬੈਨ ਕਰਨ ਵਾਲਾ: {5}\nਚੈਟਸ: {6}" +gban_7 : "» {0} ਬੋਟ ਤੋਂ ਗਲੋਬਲ ਤੌਰ 'ਤੇ ਬੈਨ ਨਹੀਂ ਹੈ।" +gban_8 : "» {0} 'ਤੋਂ ਗਲੋਬਲ ਬੈਨ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਜਾ ਰਿਹਾ ਹੈ।\n\nਉਮੀਦਵਾਰ ਸਮਾਂ: {1}" +gban_9 : "» {0} 'ਤੋਂ ਗਲੋਬਲ ਬੈਨ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਜਾ ਰਿਹਾ ਹੈ।\n\n{1} ਚੈਟਾਂ ਵਿਚ ਵਾਪਸ ਆ ਸਕਦਾ ਹੈ।" +gban_10 : "» ਕੋਈ ਵੀ ਬੋਟ ਤੋਂ ਗਲੋਬਲ ਤੌਰ 'ਤੇ ਬੈਨ ਨਹੀਂ ਹੈ।" +gban_11 : "» ਗਲੋਬਲ ਬੈਨ ਕਿਏ ਗਏ ਯੂਜ਼ਰਾਂ ਦੀ ਸੂਚੀ ਲਵੋ ਰਹੀ ਹੈ..." +gban_12 : "🙂 ਗਲੋਬਲ ਬੈਨ ਕੀਤੇ ਗਏ ਯੂਜ਼ਰ:\n\n" From c011ce98ed4183f46312e18493dab93e87d62e5f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:11:46 +0530 Subject: [PATCH 002/184] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 32076bb7d544..e66d224fa599 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@

Click the button below to deploy Tanu Music Bot on Heroku!

If You show any error like failed to app Creation Then fork and deploy

- + ## 🖇 VPS Deployment @@ -56,4 +56,4 @@ Together, we can make **TanuMusic** better! - \ No newline at end of file + From 8d16f07bf870872fbc9f406e10d0eae06e10ab72 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:35:08 +0530 Subject: [PATCH 003/184] remove welcome and left database --- TanuMusic/utils/database.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index a83b8a59db92..a82b2903a42c 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -38,22 +38,13 @@ pause = {} playmode = {} playtype = {} -skipmode = {} - -async def add_wlcm(chat_id: int): - return await wlcm.insert_one({"chat_id": chat_id}) - -async def rm_wlcm(chat_id: int): - chat = await wlcm.find_one({"chat_id": chat_id}) - if chat: - return await wlcm.delete_one({"chat_id": chat_id}) +skipmode = {} async def get_assistant_number(chat_id: int) -> str: assistant = assistantdict.get(chat_id) return assistant - async def get_client(assistant: int): if int(assistant) == 1: return userbot.one From 836e19e441120d7f47f6e58eaa4b4e54cab76f84 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:36:23 +0530 Subject: [PATCH 004/184] Remove welcome file --- TanuMusic/plugins/tools/welcome.py | 149 ----------------------------- 1 file changed, 149 deletions(-) delete mode 100644 TanuMusic/plugins/tools/welcome.py diff --git a/TanuMusic/plugins/tools/welcome.py b/TanuMusic/plugins/tools/welcome.py deleted file mode 100644 index e4b86e0f5d2f..000000000000 --- a/TanuMusic/plugins/tools/welcome.py +++ /dev/null @@ -1,149 +0,0 @@ -import os -from unidecode import unidecode -from PIL import ImageDraw, Image, ImageFont, ImageChops -from pyrogram import * -from pyrogram.types import * -from logging import getLogger -from TanuMusic import LOGGER -from pyrogram.types import Message -from TanuMusic.misc import SUDOERS -from TanuMusic import app -from TanuMusic.utils.database import * -from config import LOGGER_ID - -LOGGER = getLogger(__name__) - - -class temp: - ME = None - CURRENT = 2 - CANCEL = False - MELCOW = {} - U_NAME = None - B_NAME = None - -def circle(pfp, size=(450, 450)): - pfp = pfp.resize(size, Image.LANCZOS).convert("RGBA") - bigsize = (pfp.size[0] * 3, pfp.size[1] * 3) - mask = Image.new("L", bigsize, 0) - draw = ImageDraw.Draw(mask) - draw.ellipse((0, 0) + bigsize, fill=255) - mask = mask.resize(pfp.size, Image.LANCZOS) - mask = ImageChops.darker(mask, pfp.split()[-1]) - pfp.putalpha(mask) - return pfp - -def welcomepic(pic, user, chat, id, uname): - background = Image.open("TanuMusic/assets/welcome.png") - pfp = Image.open(pic).convert("RGBA") - pfp = circle(pfp) - pfp = pfp.resize( - (450, 450) - ) - draw = ImageDraw.Draw(background) - font = ImageFont.truetype('TanuMusic/assets/font.ttf', size=45) - font2 = ImageFont.truetype('TanuMusic/assets/font.ttf', size=90) - draw.text((65, 250), f'NAME : {unidecode(user)}', fill="white", font=font) - draw.text((65, 340), f'ID : {id}', fill="white", font=font) - draw.text((65, 430), f"USERNAME : {uname}", fill="white",font=font) - pfp_position = (767, 133) - background.paste(pfp, pfp_position, pfp) - background.save( - f"downloads/welcome#{id}.png" - ) - return f"downloads/welcome#{id}.png" - - -HUHU = """** -@app.on_message(filters.command("swel") & ~filters.private) -async def auto_state(_, message): - usage = "**❖ ᴜsᴀɢᴇ ➥** /swel [ᴇɴᴀʙʟᴇ|ᴅɪsᴀʙʟᴇ]" - if len(message.command) == 1: - return await message.reply_text(usage) - chat_id = message.chat.id - user = await app.get_chat_member(message.chat.id, message.from_user.id) - if user.status in ( - enums.ChatMemberStatus.ADMINISTRATOR, - enums.ChatMemberStatus.OWNER, - ): - A = await wlcm.find_one({"chat_id" : chat_id}) - state = message.text.split(None, 1)[1].strip() - state = state.lower() - if state == "enable": - if A: - return await message.reply_text("✦ Special Welcome Already Enabled") - elif not A: - await add_wlcm(chat_id) - await message.reply_text(f"✦ Enabled Special Welcome in {message.chat.title}") - elif state == "disable": - if not A: - return await message.reply_text("✦ Special Welcome Already Disabled") - elif A: - await rm_wlcm(chat_id) - await message.reply_text(f"✦ Disabled Special Welcome in {message.chat.title}") - else: - await message.reply_text(usage) - else: - await message.reply("✦ Only Admins Can Use This Command") - ** """ -#bhag - -@app.on_chat_member_updated(filters.group, group=-3) -async def greet_group(_, member: ChatMemberUpdated): - chat_id = member.chat.id - # A = await wlcm.find_one({"chat_id" : chat_id}) - # if not A: - # return - if ( - not member.new_chat_member - or member.new_chat_member.status in {"banned", "left", "restricted"} - or member.old_chat_member - ): - return - user = member.new_chat_member.user if member.new_chat_member else member.from_user - try: - pic = await app.download_media( - user.photo.big_file_id, file_name=f"pp{user.id}.png" - ) - except AttributeError: - pic = "TanuMusic/assets/upic.png" - if (temp.MELCOW).get(f"welcome-{member.chat.id}") is not None: - try: - await temp.MELCOW[f"welcome-{member.chat.id}"].delete() - except Exception as e: - LOGGER.error(e) - try: - welcomeimg = welcomepic( - pic, user.first_name, member.chat.title, user.id, user.username - ) - temp.MELCOW[f"welcome-{member.chat.id}"] = await app.send_photo( - member.chat.id, - photo=welcomeimg, - caption= f""" -ㅤ ㅤ●◉✿ ᴡᴇʟᴄᴏᴍᴇ ʙᴀʙʏ ✿◉● -▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰ - -● ɴᴀᴍᴇ ➥ {user.mention} -● ᴜsᴇʀɴᴀᴍᴇ ➥ @{user.username} -● ᴜsᴇʀ ɪᴅ ➥ {user.id} - -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ -▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰ -""", -reply_markup=InlineKeyboardMarkup( -[ -[InlineKeyboardButton(f"ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ", url=f"https://t.me/TanuMusicxBot?startgroup=new"), -] -] -)) - - except Exception as e: - LOGGER.error(e) - try: - os.remove(f"downloads/welcome#{user.id}.png") - os.remove(f"downloads/pp{user.id}.png") - except Exception as e: - pass - - - From d47994e71ada541db7fd228221945deda7b3f8f4 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:36:53 +0530 Subject: [PATCH 005/184] Delete left.py --- TanuMusic/plugins/tools/left.py | 108 -------------------------------- 1 file changed, 108 deletions(-) delete mode 100644 TanuMusic/plugins/tools/left.py diff --git a/TanuMusic/plugins/tools/left.py b/TanuMusic/plugins/tools/left.py deleted file mode 100644 index 98f9cf16fc5f..000000000000 --- a/TanuMusic/plugins/tools/left.py +++ /dev/null @@ -1,108 +0,0 @@ -from TanuMusic import app -from pyrogram import Client, filters -from pyrogram.errors import RPCError -from pyrogram.types import ChatMemberUpdated, InlineKeyboardMarkup, InlineKeyboardButton -from os import environ -from typing import Union, Optional -from PIL import Image, ImageDraw, ImageFont - -BUTTONS = [ - [ - InlineKeyboardButton(text="ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ", url=f"https://t.me/TanuMusicxBot?startgroup=true"), - ], -] - -# --------------------------------------------------------------------------------- # - -get_font = lambda font_size, font_path: ImageFont.truetype(font_path, font_size) -resize_text = ( - lambda text_size, text: (text[:text_size] + "...").upper() - if len(text) > text_size - else text.upper() -) - -# --------------------------------------------------------------------------------- # - -async def get_userinfo_img( - bg_path: str, - font_path: str, - user_id: Union[int, str], - profile_path: Optional[str] = None -): - bg = Image.open(bg_path) - - if profile_path: - img = Image.open(profile_path) - mask = Image.new("L", img.size, 0) - draw = ImageDraw.Draw(mask) - draw.pieslice([(0, 0), img.size], 0, 360, fill=255) - - circular_img = Image.new("RGBA", img.size, (0, 0, 0, 0)) - circular_img.paste(img, (0, 0), mask) - resized = circular_img.resize((286, 286)) - bg.paste(resized, (297, 117), resized) - - - img_draw = ImageDraw.Draw(bg) - - path = f"./cache/userinfo_img_{user_id}.png" - bg.save(path) - return path - - -# --------------------------------------------------------------------------------- # - -bg_path = "TanuMusic/assets/left.jpg" -font_path = "TanuMusic/assets/font4.ttf" - -# --------------------------------------------------------------------------------- # - - -@app.on_chat_member_updated(filters.group, group=20) -async def member_has_left(client: app, member: ChatMemberUpdated): - - if ( - not member.new_chat_member - and member.old_chat_member.status not in { - "💌" - } - and member.old_chat_member - ): - pass - else: - return - - user = ( - member.old_chat_member.user - if member.old_chat_member - else member.from_user - ) - - # Check if the user has a profile photo - if user.photo and user.photo.big_file_id: - try: - # Add the photo path, caption, and button details - photo = await app.download_media(user.photo.big_file_id) - - welcome_photo = await get_userinfo_img( - bg_path=bg_path, - font_path=font_path, - user_id=user.id, - profile_path=photo, - ) - - caption = f"ㅤㅤ ㅤ•●◉✿ ᴜsᴇʀ ʟᴇғᴛ ✿◉●•\n▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰\n\n❖ ᴀ ᴍᴇᴍʙᴇʀ ʟᴇғᴛ ғʀᴏᴍ ɢʀᴏᴜᴘ.\n\n● ɢʀᴏᴜᴘ ➥ {member.chat.title}\n● ᴜsᴇʀ ɴᴀᴍᴇ ➥ {user.mention}\n● sᴇᴇ ʏᴏᴜ sᴏᴏɴ ᴀɢᴀɪɴ, ʙᴀʙʏ.\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙\n▰▱▱▱▱▱▱▱▱▱▱▱▱▱▰" - - # Send the message with the photo, caption, and button - await client.send_photo( - chat_id=member.chat.id, - photo=welcome_photo, - caption=caption, - reply_markup=InlineKeyboardMarkup(BUTTONS),) - except RPCError as e: - print(e) - return - else: - # Handle the case where the user has no profile photo - print(f"❖ User {user.id} has no profile photo.") - From ac030b546b5c5926b9faf244c08527c41c28e277 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:41:24 +0530 Subject: [PATCH 006/184] Deletle welcome font --- TanuMusic/assets/font4.ttf | Bin 52340 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TanuMusic/assets/font4.ttf diff --git a/TanuMusic/assets/font4.ttf b/TanuMusic/assets/font4.ttf deleted file mode 100644 index d6cadf6ccfaa7158f9239f0055862bbef3bb9d7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52340 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�JQ1m|)NM>21gvwy>{= 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 TfA&3giT4B6(CDhgX&nC-aB(z* From 4ac87b0fdc2d7d1e6bdd50f4ff55e1ba9ffc4279 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:41:49 +0530 Subject: [PATCH 007/184] Remove left imge --- TanuMusic/assets/left.jpg | Bin 51963 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TanuMusic/assets/left.jpg diff --git a/TanuMusic/assets/left.jpg b/TanuMusic/assets/left.jpg deleted file mode 100644 index 480893395d423a1a5f9034613fdc93a023cb116e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51963 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 Qpu{iNy2=Af$kHqS*^*(&1poj5 From 0f85e7e90b961e7dfdb1b44abe5e62533aaca3f6 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:42:18 +0530 Subject: [PATCH 008/184] Delete welcome image --- TanuMusic/assets/welcome.png | Bin 59669 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TanuMusic/assets/welcome.png diff --git a/TanuMusic/assets/welcome.png b/TanuMusic/assets/welcome.png deleted file mode 100644 index 755e985cfc12a918ee4c438bd8844d0a2aa16ddd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59669 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 qXLj`+U Date: Sun, 17 Nov 2024 19:42:40 +0530 Subject: [PATCH 009/184] Remove faltu iamg --- TanuMusic/assets/upic.png | Bin 19293 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TanuMusic/assets/upic.png diff --git a/TanuMusic/assets/upic.png b/TanuMusic/assets/upic.png deleted file mode 100644 index 2b8b658355da59697e17ce72946d1f9bb1642631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19293 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 From 67dd8275d761a0ecdabab83b176b3a609f2c7d91 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:57:09 +0530 Subject: [PATCH 010/184] Update tools --- TanuMusic/plugins/tools/eco.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 TanuMusic/plugins/tools/eco.py diff --git a/TanuMusic/plugins/tools/eco.py b/TanuMusic/plugins/tools/eco.py new file mode 100644 index 000000000000..0e1a9662fa23 --- /dev/null +++ b/TanuMusic/plugins/tools/eco.py @@ -0,0 +1,23 @@ +from pyrogram import Client, filters +from TanuMusic.misc import SUDOERS +from TanuMusic import app + +# /eco command handler +@app.on_message(filters.command(["eco"], flags=0) & filters.reply & SUDOERS) +async def eco_reply(client, message): + if not message.reply_to_message: + await message.reply("ᴘʟᴇᴀsᴇ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴛᴏ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ.") + return + + # Split the command from the message (removing the command /eco) + command_text = message.text.lower().split("eco ", 1) + + if len(command_text) < 2: + await message.reply("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ᴍᴇssᴀɢᴇ ᴀғᴛᴇʀ ᴛʜᴇ /eco ᴄᴏᴍᴍᴀɴᴅ.") + return + + # The message to reply with + reply_message = command_text[1] + + await message.delete() + await message.reply_to_message.reply(reply_message) \ No newline at end of file From 30712ba10b634809f5d93328ed7fefe8c4714ed3 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:57:41 +0530 Subject: [PATCH 011/184] Delete TanuMusic/plugins/tools/ask.py --- TanuMusic/plugins/tools/ask.py | 53 ---------------------------------- 1 file changed, 53 deletions(-) delete mode 100644 TanuMusic/plugins/tools/ask.py diff --git a/TanuMusic/plugins/tools/ask.py b/TanuMusic/plugins/tools/ask.py deleted file mode 100644 index 388379d7ac66..000000000000 --- a/TanuMusic/plugins/tools/ask.py +++ /dev/null @@ -1,53 +0,0 @@ -from pyrogram import Client, filters -from pyrogram.types import Message -from pyrogram.enums import ChatAction -import requests -import urllib.parse -import asyncio -from TanuMusic import app - -# Function to process the query -def ask_query(query, model=None): - default_model = 'mistralai/Mixtral-8x7B-Instruct-v0.1' - system_prompt = """You are Tanu from One Piece Ai, a Telegram bot owned by 𝐓ʜᴇ 𝐂ᴀᴘᴛᴀɪɴ's (@itzAsuraa). You have a love personality, respond with emojis, and act as a Telegram bot. You love Indian people💖, and your favorite AI is @ResponseByAi_Bot . respond accurately, concisely, and professionally. """ - - model = model or default_model - - if model == default_model: - query = f"{system_prompt}\n\nUser: {query}" - - encoded_query = urllib.parse.quote(query) - url = f"https://darkness.ashlynn.workers.dev/chat/?prompt={encoded_query}&model={model}" - - response = requests.get(url) - - if response.status_code == 200: - return response.json().get("response", "😕 Sorry, no response found.") - else: - return f"⚠️ Error fetching response from API. Status code: {response.status_code}" - -# Command handler for the ask command -@app.on_message(filters.command("ask")) -async def ask_handler(client: Client, message: Message): - query = message.text.split(" ", 1) # Split the command to get the query - if len(query) > 1: - user_query = query[1] # Get the actual question part - - # Send typing action to simulate a response delay - await send_typing_action(client, message.chat.id) - - # Call the ask_query function to process the user query - reply = ask_query(user_query) - user_mention = message.from_user.mention - await message.reply_text(f"{user_mention}, {reply}🚀") - else: - await message.reply_text("📝 Please provide a query to ask Tanu.") - - -# Simulate Typing Action -async def send_typing_action(client, chat_id, duration=1): - """ - Simulate typing action. - """ - await client.send_chat_action(chat_id, ChatAction.TYPING) # Use ChatAction enum - await asyncio.sleep(duration) # Wait for the specified duration From 592a0fba18d020d65424ad2f2237b0c2170a3cde Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:03:19 +0530 Subject: [PATCH 012/184] Update eco.py --- TanuMusic/plugins/tools/eco.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/eco.py b/TanuMusic/plugins/tools/eco.py index 0e1a9662fa23..5f43af984cbf 100644 --- a/TanuMusic/plugins/tools/eco.py +++ b/TanuMusic/plugins/tools/eco.py @@ -3,7 +3,7 @@ from TanuMusic import app # /eco command handler -@app.on_message(filters.command(["eco"], flags=0) & filters.reply & SUDOERS) +@app.on_message(filters.command("eco") & filters.reply & SUDOERS) async def eco_reply(client, message): if not message.reply_to_message: await message.reply("ᴘʟᴇᴀsᴇ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴛᴏ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ.") From e71048b86c0b25ab6ce2cb0b43847dec0e6a86ef Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:12:34 +0530 Subject: [PATCH 013/184] Remove eco --- TanuMusic/plugins/tools/eco.py | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 TanuMusic/plugins/tools/eco.py diff --git a/TanuMusic/plugins/tools/eco.py b/TanuMusic/plugins/tools/eco.py deleted file mode 100644 index 5f43af984cbf..000000000000 --- a/TanuMusic/plugins/tools/eco.py +++ /dev/null @@ -1,23 +0,0 @@ -from pyrogram import Client, filters -from TanuMusic.misc import SUDOERS -from TanuMusic import app - -# /eco command handler -@app.on_message(filters.command("eco") & filters.reply & SUDOERS) -async def eco_reply(client, message): - if not message.reply_to_message: - await message.reply("ᴘʟᴇᴀsᴇ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴛᴏ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ.") - return - - # Split the command from the message (removing the command /eco) - command_text = message.text.lower().split("eco ", 1) - - if len(command_text) < 2: - await message.reply("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ᴍᴇssᴀɢᴇ ᴀғᴛᴇʀ ᴛʜᴇ /eco ᴄᴏᴍᴍᴀɴᴅ.") - return - - # The message to reply with - reply_message = command_text[1] - - await message.delete() - await message.reply_to_message.reply(reply_message) \ No newline at end of file From 9ab35fac695dc5350d0c94b34509fe72421840d6 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:15:34 +0530 Subject: [PATCH 014/184] change Kang command --- TanuMusic/plugins/tools/stickers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/stickers.py b/TanuMusic/plugins/tools/stickers.py index 98740e5df48c..f815a41d88d6 100644 --- a/TanuMusic/plugins/tools/stickers.py +++ b/TanuMusic/plugins/tools/stickers.py @@ -18,7 +18,7 @@ ######### sticker id -@app.on_message(filters.command("packkang")) +@app.on_message(filters.command("kang")) async def _packkang(app :app,message): txt = await message.reply_text("✦ ᴘʀᴏᴄᴇssɪɴɢ.... ") if not message.reply_to_message: From b67b7e1d0e8ea8b0590626455431e0797948241f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:22:22 +0530 Subject: [PATCH 015/184] @itzAsuraa --- TanuMusic/misc.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py index 0bec89400e59..cac1ac864409 100644 --- a/TanuMusic/misc.py +++ b/TanuMusic/misc.py @@ -39,7 +39,7 @@ def is_heroku(): def dbb(): global db db = {} - LOGGER(__name__).info(f"✦ Local Database Initialized...💛") + LOGGER(__name__).info(f"❖ Local Database Initialized...💛") async def sudo(): @@ -58,7 +58,7 @@ async def sudo(): if sudoers: for user_id in sudoers: SUDOERS.add(user_id) - LOGGER(__name__).info(f"✦ Sudoers Loaded...❤️") + LOGGER(__name__).info(f"❖ Sudoers Loaded...❤️") def heroku(): @@ -68,8 +68,8 @@ def heroku(): try: Heroku = heroku3.from_key(config.HEROKU_API_KEY) HAPP = Heroku.app(config.HEROKU_APP_NAME) - LOGGER(__name__).info(f"✦ Heroku App Configured...💙") + LOGGER(__name__).info(f"❖ Heroku App Configured...💙") except BaseException: LOGGER(__name__).warning( - f"✦ Please make sure your Heroku API Key and Your App name are configured correctly in the heroku...💚" + f"❖ Please make sure your Heroku API Key and Your App name are configured correctly in the heroku...💚" ) From 38a4aa6691b4a5ccc89f748958dbf9639cbeb385 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:23:23 +0530 Subject: [PATCH 016/184] Update __main__.py --- TanuMusic/__main__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TanuMusic/__main__.py b/TanuMusic/__main__.py index 2bcdd075e601..9bdd199b82f0 100644 --- a/TanuMusic/__main__.py +++ b/TanuMusic/__main__.py @@ -21,7 +21,7 @@ async def init(): and not config.STRING4 and not config.STRING5 ): - LOGGER(__name__).error("✦ Assistant client variables not defined, exiting...") + LOGGER(__name__).error("❖ Assistant client variables not defined, exiting...") exit() await sudo() try: @@ -36,21 +36,21 @@ async def init(): await app.start() for all_module in ALL_MODULES: importlib.import_module("TanuMusic.plugins" + all_module) - LOGGER("TanuMusic.plugins").info("✦ Successfully Imported Modules...💞") + LOGGER("TanuMusic.plugins").info("❖ Successfully Imported Modules...💞") await userbot.start() await Tanu.start() try: await Tanu.stream_call("https://te.legra.ph/file/29f784eb49d230ab62e9e.mp4") except NoActiveGroupCall: LOGGER("TanuMusic").error( - "✦ Please turn on the videochat of your log group\channel.\n\n✦ Stopping Bot...💣" + "❖ Please turn on the videochat of your log group\channel.\n\n✦ Stopping Bot...💣" ) exit() except: pass await Tanu.decorators() LOGGER("TanuMusic").info( - "✦ Created By ➥ The Captain...🐝" + "❖ Created By ➥ The Captain...🐝" ) await idle() await app.stop() From 6637eab250c63740a1a99cab251a95960591ebc2 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:24:07 +0530 Subject: [PATCH 017/184] Update mongo.py --- TanuMusic/core/mongo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/TanuMusic/core/mongo.py b/TanuMusic/core/mongo.py index e410a3d71d18..3896fd5c6bca 100644 --- a/TanuMusic/core/mongo.py +++ b/TanuMusic/core/mongo.py @@ -11,7 +11,7 @@ # Check if a custom MongoDB URI is provided in the config if config.MONGO_DB_URI is None: LOGGER(__name__).warning( - "No mongodb found, defaulting to public MongoDB...💚" + "❖ No mongodb found, defaulting to public MongoDB...💚" ) # Initialize a temporary Pyrogram client to retrieve bot's username @@ -30,10 +30,10 @@ mongodb = _mongo_async_[username] pymongodb = _mongo_sync_[username] - LOGGER(__name__).info(f"Connected to public MongoDB with username: {username}...💛") + LOGGER(__name__).info(f"❖ Connected to public MongoDB with username: {username}...💛") else: - LOGGER(__name__).info("✦ Connecting to your custom Mongo Database...💛") + LOGGER(__name__).info("❖ Connecting to your custom Mongo Database...💛") # Use custom MongoDB URI from config _mongo_async_ = _mongo_client_(config.MONGO_DB_URI) @@ -41,9 +41,9 @@ mongodb = _mongo_async_.Tannu pymongodb = _mongo_sync_.Tannu - LOGGER(__name__).info("✦ Connected to your Mongo Database...❤️") + LOGGER(__name__).info("❖ Connected to your Mongo Database...❤️") except Exception as e: # Log any exceptions that occur during connection - LOGGER(__name__).error(f"✦ Failed to connect to your Mongo Database: {str(e)}...💚") + LOGGER(__name__).error(f"❖ Failed to connect to your Mongo Database: {str(e)}...💚") exit() \ No newline at end of file From a339cfa56c190a79af7c4e6248ce5372ae99d366 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:24:43 +0530 Subject: [PATCH 018/184] Update pornplay.py# --- TanuMusic/plugins/play/pornplay.py# | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/play/pornplay.py# b/TanuMusic/plugins/play/pornplay.py# index d35d355a11cc..3818b2145180 100644 --- a/TanuMusic/plugins/play/pornplay.py# +++ b/TanuMusic/plugins/play/pornplay.py# @@ -78,7 +78,7 @@ def get_video_info(title): @app.on_message(filters.command("porn")) async def get_random_video_info(client, message): if len(message.command) == 1: - await message.reply("✦ Please provide a title to search.") + await message.reply("❖ Please provide a title to search.") return title = ' '.join(message.command[1:]) From c2167d58c4a3a17e4eb60efb845f8b5815566ea6 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:24:58 +0530 Subject: [PATCH 019/184] Update sangmata.py# --- TanuMusic/plugins/tools/sangmata.py# | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/sangmata.py# b/TanuMusic/plugins/tools/sangmata.py# index 5e3003cba1c1..0f089187c7cc 100644 --- a/TanuMusic/plugins/tools/sangmata.py# +++ b/TanuMusic/plugins/tools/sangmata.py# @@ -22,7 +22,7 @@ async def sg(client: Client, message: Message): try: user = await client.get_users(f"{args}") except Exception: - return await lol.edit("✦ Please specify a valid user!") + return await lol.edit("❖ Please specify a valid user!") bo = ["sangmata_bot", "sangmata_beta_bot"] sg = random.choice(bo) if 1 in assistants: From bf41df4d7b939d4121e6d5c051f1a261d8c2ef64 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:25:23 +0530 Subject: [PATCH 020/184] Update sangmata.py# --- TanuMusic/plugins/tools/sangmata.py# | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/sangmata.py# b/TanuMusic/plugins/tools/sangmata.py# index 0f089187c7cc..5e3003cba1c1 100644 --- a/TanuMusic/plugins/tools/sangmata.py# +++ b/TanuMusic/plugins/tools/sangmata.py# @@ -22,7 +22,7 @@ async def sg(client: Client, message: Message): try: user = await client.get_users(f"{args}") except Exception: - return await lol.edit("❖ Please specify a valid user!") + return await lol.edit("✦ Please specify a valid user!") bo = ["sangmata_bot", "sangmata_beta_bot"] sg = random.choice(bo) if 1 in assistants: From ce2d8074eaebb28e3f656b8aec2d8c8609766ff1 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:26:03 +0530 Subject: [PATCH 021/184] Update pornplay.py# --- TanuMusic/plugins/play/pornplay.py# | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/play/pornplay.py# b/TanuMusic/plugins/play/pornplay.py# index 3818b2145180..d35d355a11cc 100644 --- a/TanuMusic/plugins/play/pornplay.py# +++ b/TanuMusic/plugins/play/pornplay.py# @@ -78,7 +78,7 @@ def get_video_info(title): @app.on_message(filters.command("porn")) async def get_random_video_info(client, message): if len(message.command) == 1: - await message.reply("❖ Please provide a title to search.") + await message.reply("✦ Please provide a title to search.") return title = ' '.join(message.command[1:]) From c7b618053baee9390fc436848240e9388754c10f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:28:03 +0530 Subject: [PATCH 022/184] Remove porn play --- TanuMusic/plugins/play/pornplay.py# | 93 ----------------------------- 1 file changed, 93 deletions(-) delete mode 100644 TanuMusic/plugins/play/pornplay.py# diff --git a/TanuMusic/plugins/play/pornplay.py# b/TanuMusic/plugins/play/pornplay.py# deleted file mode 100644 index d35d355a11cc..000000000000 --- a/TanuMusic/plugins/play/pornplay.py# +++ /dev/null @@ -1,93 +0,0 @@ -from pyrogram import filters -import requests, random -from bs4 import BeautifulSoup -from TanuMusic import app -import pytgcalls -import os, yt_dlp -from pyrogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup -from pytgcalls.types import AudioVideoPiped -from TanuMusic.plugins.play import play -from TanuMusic.plugins.play.pornplay import play - -##### - -keyboard = InlineKeyboardMarkup([ - [ - InlineKeyboardButton("ᴄʟᴏsᴇ", callback_data="close_data"), - ] -]) - - -# Define your callback function -@app.on_callback_query(filters.regex("^play")) -async def play_callback(_, query): - # You can add more logic here before initiating playback - await play(query.from_user.id) # Assuming play function accepts user ID - await query.answer("Playback started!") - -####### - -@app.on_callback_query(filters.regex("^close_data")) -async def close_callback(_, query): - chat_id = query.message.chat.id - await query.message.delete() - -async def get_video_stream(link): - ydl_opts = { - "format": "bestvideo+bestaudio/best", - "outtmpl": "downloads/%(id)s.%(ext)s", - "geo_bypass": True, - "nocheckcertificate": True, - "quiet": True, - "no_warnings": True, - } - x = yt_dlp.YoutubeDL(ydl_opts) - info = x.extract_info(link, False) - video = os.path.join( - "downloads", f"{info['id']}.{info['ext']}" - ) - if os.path.exists(video): - return video - x.download([link]) - return video - -##### - -def get_video_info(title): - url_base = f'https://www.xnxx.com/search/{title}' - try: - with requests.Session() as s: - r = s.get(url_base) - soup = BeautifulSoup(r.text, "html.parser") - video_list = soup.findAll('div', attrs={'class': 'thumb-block'}) - if video_list: - random_video = random.choice(video_list) - thumbnail = random_video.find('div', class_="thumb").find('img').get("src") - if thumbnail: - # Replace the size in the thumbnail URL to get 500x500 - thumbnail_500 = thumbnail.replace('/h', '/m').replace('/1.jpg', '/3.jpg') - link = random_video.find('div', class_="thumb-under").find('a').get("href") - if link and 'https://' not in link: # Check if the link is a valid video link - return {'link': 'https://www.xnxx.com' + link, 'thumbnail': thumbnail_500} - except Exception as e: - print(f"Error: {e}") - return None - - - -@app.on_message(filters.command("porn")) -async def get_random_video_info(client, message): - if len(message.command) == 1: - await message.reply("✦ Please provide a title to search.") - return - - title = ' '.join(message.command[1:]) - video_info = get_video_info(title) - - if video_info: - video_link = video_info['link'] - video = await get_video_stream(video_link) - await message.reply_video(video, caption=f"❖ ᴛʜɪs ɪs ʏᴏᴜʀ sᴇᴀʀᴄʜ ᴠɪᴅᴇᴏ ➥ {title}", reply_markup=keyboard) - - else: - await message.reply(f"✦ No video link found for ➥ {title}") From aee9b3dbde767738323591ed72c84d5357c601e8 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:42:49 +0530 Subject: [PATCH 023/184] Delete TanuMusic/plugins/tools/quiz.py --- TanuMusic/plugins/tools/quiz.py | 159 -------------------------------- 1 file changed, 159 deletions(-) delete mode 100644 TanuMusic/plugins/tools/quiz.py diff --git a/TanuMusic/plugins/tools/quiz.py b/TanuMusic/plugins/tools/quiz.py deleted file mode 100644 index ecb406d30880..000000000000 --- a/TanuMusic/plugins/tools/quiz.py +++ /dev/null @@ -1,159 +0,0 @@ -import random -import requests -import asyncio -from pyrogram import filters -from pyrogram.enums import PollType -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic import app - -# Track quiz loops and active polls per user -quiz_loops = {} -active_polls = {} # To track active poll messages for each user - -# Function to fetch a quiz question from the API -async def fetch_quiz_question(): - categories = [9, 17, 18, 20, 21, 27] # Quiz categories - url = f"https://opentdb.com/api.php?amount=1&category={random.choice(categories)}&type=multiple" - response = requests.get(url).json() - - question_data = response["results"][0] - question = question_data["question"] - correct_answer = question_data["correct_answer"] - incorrect_answers = question_data["incorrect_answers"] - - all_answers = incorrect_answers + [correct_answer] - random.shuffle(all_answers) - - cid = all_answers.index(correct_answer) - - return question, all_answers, cid - -# Function to send a quiz poll with an open_period for countdown -async def send_quiz_poll(client, chat_id, user_id, interval): - # Fetch quiz question - question, all_answers, cid = await fetch_quiz_question() - - # Delete the previous active poll if it exists - if user_id in active_polls: - try: - await app.delete_messages(chat_id=chat_id, message_ids=active_polls[user_id]) - except Exception as e: - print(f"Failed to delete previous poll: {e}") - - # Send new quiz poll with a countdown using open_period - poll_message = await app.send_poll( - chat_id=chat_id, - question=question, - options=all_answers, - is_anonymous=False, - type=PollType.QUIZ, - #allows_multiple_answers=True, # Allow multiple answers - correct_option_id=cid, - open_period=interval # Countdown timer for the poll in seconds - ) - - # Store the message ID of the new poll - if poll_message: - active_polls[user_id] = poll_message.id # Corrected to use `.id` - -@app.on_message(filters.command(["quiz", "uiz"], prefixes=["/", "!", ".", "Q", "q"])) -async def quiz_info(client, message): - user_id = message.from_user.id - - # Send the informational message - await message.reply_text( - "ᴡᴇʟᴄᴏᴍᴇ ᴛᴏ ᴛʜᴇ ǫᴜɪᴢ ʙᴏᴛ\n\n" - "ʜᴇʀᴇ ɪs ʜᴏᴡ ɪᴛ ᴡᴏʀᴋs:\n" - "𝟷. ᴜsᴇ /quizon ᴛᴏ sᴛᴀʀᴛ ᴀ ǫᴜɪᴢ ʟᴏᴏᴘ. ᴀғᴛᴇʀ ʏᴏᴜ sᴛᴀʀᴛ, ʏᴏᴜ ᴡɪʟʟ ʙᴇ ᴀsᴋᴇᴅ ᴛᴏ ᴄʜᴏᴏsᴇ ᴀ ᴛɪᴍᴇ ɪɴᴛᴇʀᴠᴀʟ ғᴏʀ ᴛʜᴇ ǫᴜɪᴢ.\n" - "𝟸. ᴛʜᴇ ᴀᴠᴀɪʟᴀʙʟᴇ ɪɴᴛᴇʀᴠᴀʟs ᴀʀᴇ:\n" - " - 30 sᴇᴄᴏɴᴅs\n" - " - 1 ᴍɪɴᴜᴛᴇ\n" - " - 5 ᴍɪɴᴜᴛᴇs\n" - " - 10 ᴍɪɴᴜᴛᴇs\n" - "𝟹. ᴏɴᴄᴇ ʏᴏᴜ ᴄʜᴏᴏsᴇ ᴀɴ ɪɴᴛᴇʀᴠᴀʟ, ᴛʜᴇ ǫᴜɪᴢ ᴡɪʟʟ sᴛᴀʀᴛ, ᴀɴᴅ ʏᴏᴜ ᴡɪʟʟ ɢᴇᴛ ᴀ ɴᴇᴡ ǫᴜᴇsᴛɪᴏɴ ᴀᴛ ᴛʜᴇ ᴄʜᴏsᴇɴ ɪɴᴛᴇʀᴠᴀʟ. ᴇᴀᴄʜ ǫᴜɪᴢ ᴡɪʟʟ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴄʟᴏsᴇ ᴀғᴛᴇʀ ᴀ sᴘᴇᴄɪғɪᴄ ᴛɪᴍᴇ.\n" - "𝟺. ᴜsᴇ /quizoff ᴛᴏ sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ ᴀᴛ ᴀɴʏ ᴛɪᴍᴇ.\n\n" - "ᴄᴏᴍᴍᴀɴᴅs:\n" - "• /quizon - sᴛᴀʀᴛ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ\n" - "• /quizoff - sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ\n\n" - "sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ 🎉" - ) - -# /quiz on command to show time interval options -@app.on_message(filters.command(["quizon", "uizon"], prefixes=["/", "!", ".", "Q", "q"])) -async def quiz_on(client, message): - user_id = message.from_user.id - - # Create time interval buttons arranged in 4x2 grid - keyboard = InlineKeyboardMarkup( - [ - [InlineKeyboardButton("30s", callback_data="30_sec"), InlineKeyboardButton("1min", callback_data="1_min")], - [InlineKeyboardButton("5min", callback_data="5_min"), InlineKeyboardButton("10min", callback_data="10_min")], - ] - ) - - # Send buttons with a description - await message.reply_text( - "ᴄʜᴏᴏsᴇ ʜᴏᴡ ᴏғᴛᴇɴ ʏᴏᴜ ᴡᴀɴᴛ ᴛʜᴇ ǫᴜɪᴢ ᴛᴏ ʀᴜɴ:\n\n" - "- 30s: ǫᴜɪᴢ ᴇᴠᴇʀʏ 30 sᴇᴄᴏɴᴅs\n" - "- 1min: ǫᴜɪᴢ ᴇᴠᴇʀʏ 1 ᴍɪɴᴜᴛᴇ\n" - "- 5min: ǫᴜɪᴢ ᴇᴠᴇʀʏ 5 ᴍɪɴᴜᴛᴇs\n" - "- 10min: ǫᴜɪᴢ ᴇᴠᴇʀʏ 10 ᴍɪɴᴜᴛᴇs\n\n" - "ᴜsᴇ /quizoff sᴛᴏᴘ ᴛʜᴇ ǫᴜɪᴢ ʟᴏᴏᴘ ᴀᴛ ᴀɴʏ ᴛɪᴍᴇ.", - reply_markup=keyboard - ) - -# Handle button presses for time intervals -@app.on_callback_query(filters.regex(r"^\d+_sec$|^\d+_min$")) -async def start_quiz_loop(client, callback_query): - user_id = callback_query.from_user.id - chat_id = callback_query.message.chat.id - - if user_id in quiz_loops: - await callback_query.answer("ǫᴜɪᴢ ʟᴏᴏᴘ ɪs ᴀʟʀᴇᴀᴅʏ ʀᴜɴɴɪɴɢ...!!", show_alert=True) - return - - # Determine interval based on the button pressed - if callback_query.data == "30_sec": - interval = 30 - interval_text = "30 sᴇᴄᴏɴᴅs" - elif callback_query.data == "1_min": - interval = 60 - interval_text = "1 ᴍɪɴᴜᴛᴇ" - elif callback_query.data == "5_min": - interval = 300 - interval_text = "5 ᴍɪɴᴜᴛᴇs" - elif callback_query.data == "10_min": - interval = 600 - interval_text = "10 ᴍɪɴᴜᴛᴇs" - - # Delete the original message with buttons - await callback_query.message.delete() - - # Confirm that the quiz loop has started - await callback_query.message.reply_text(f"✅ ǫᴜɪᴢ ʟᴏᴏᴘ sᴛᴀʀᴛᴇᴅ! ʏᴏᴜ'ʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ǫᴜɪᴢ ᴇᴠᴇʀʏ {interval_text}.") - - quiz_loops[user_id] = True # Mark loop as running - - # Start the quiz loop with the selected interval - while quiz_loops.get(user_id, False): - await send_quiz_poll(client, chat_id, user_id, interval) - await asyncio.sleep(interval) # Wait for the selected interval before sending the next quiz - -# /quiz off command to stop the quiz loop -@app.on_message(filters.command(["quizoff", "uizoff"], prefixes=["/", "!", ".", "Q", "q"])) -async def stop_quiz(client, message): - user_id = message.from_user.id - - if user_id not in quiz_loops: - await message.reply_text("ɴᴏ ǫᴜɪᴢ ʟᴏᴏᴘ ɪs ʀᴜɴɴɪɴɢ.") - else: - quiz_loops.pop(user_id) # Stop the loop - await message.reply_text("ǫᴜɪᴢ ʟᴏᴏᴘ sᴛᴏᴘᴘᴇᴅ...!!") - - # Delete the active poll if there's one - if user_id in active_polls: - try: - await app.delete_messages(chat_id=message.chat.id, message_ids=active_polls[user_id]) - active_polls.pop(user_id) - except Exception as e: - print(f"Failed to delete active poll: {e}") \ No newline at end of file From 5349e39e6f803a085018562a171ac7f6e52c5f85 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:56:18 +0530 Subject: [PATCH 024/184] Update ytsearch.py --- TanuMusic/plugins/bot/ytsearch.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/bot/ytsearch.py b/TanuMusic/plugins/bot/ytsearch.py index 03e299178466..43a111a95352 100644 --- a/TanuMusic/plugins/bot/ytsearch.py +++ b/TanuMusic/plugins/bot/ytsearch.py @@ -10,10 +10,10 @@ async def ytsearch(_, message: Message): try: if len(message.command) < 2: - await message.reply_text("✦ /yt needs an argument!") + await message.reply_text("ɢɪᴠᴇ ᴍᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ sᴇᴀʀᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ ᴜsɪɴɢ ᴛʜᴇ /yt ᴄᴏᴍᴍᴀɴᴅ.") return query = message.text.split(None, 1)[1] - m = await message.reply_text("✦ searching....") + m = await message.reply_text("sᴇᴀʀᴄʜɪɴɢ....") results = YoutubeSearch(query, max_results=5).to_dict() i = 0 text = "" From 4877d1cc818406b715d76f0e6ead72cc17302e98 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:58:07 +0530 Subject: [PATCH 025/184] Update speedtest.py adding user command ping --- TanuMusic/plugins/tools/speedtest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/speedtest.py b/TanuMusic/plugins/tools/speedtest.py index 57b8d1506ff2..54f52a3435fb 100644 --- a/TanuMusic/plugins/tools/speedtest.py +++ b/TanuMusic/plugins/tools/speedtest.py @@ -25,7 +25,7 @@ def testspeed(m, _): return result -@app.on_message(filters.command(["speedtest", "spt"]) & SUDOERS) +@app.on_message(filters.command(["speedtest", "spt", "ping"])) @language async def speedtest_function(client, message: Message, _): m = await message.reply_text(_["server_11"]) From 0b370f45a09040f990e3fa0bfa646ca7c1e41516 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 21:00:03 +0530 Subject: [PATCH 026/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 0efbef92ab5c..d57be8a5e2cd 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -286,7 +286,7 @@ server_11 : "❖ ʀᴜɴɴɪɴɢ ᴀ sᴘᴇᴇᴅᴛᴇsᴛ..." server_12 : "❖ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." server_13 : "❖ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." server_14 : "❖ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs..." -server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ ➥\n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ ➥\n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ ➥ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" +server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ \n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ ➥\n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" gban_1 : "❖ ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴡᴀɴɴᴀ ɢʙᴀɴ ʏᴏᴜʀsᴇʟғ ʙᴀʙʏ ?" gban_2 : "❖ ᴡʜʏ sʜᴏᴜʟᴅ ɪ ɢʙᴀɴ ᴍʏsᴇʟғ ?" From cbec3fc5453acb27473f5a206de3372e035e3ddb Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 21:05:47 +0530 Subject: [PATCH 027/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index d57be8a5e2cd..61f23502276f 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -286,7 +286,7 @@ server_11 : "❖ ʀᴜɴɴɪɴɢ ᴀ sᴘᴇᴇᴅᴛᴇsᴛ..." server_12 : "❖ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." server_13 : "❖ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." server_14 : "❖ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs..." -server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ \n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ ➥\n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" +server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ \n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ \n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" gban_1 : "❖ ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴡᴀɴɴᴀ ɢʙᴀɴ ʏᴏᴜʀsᴇʟғ ʙᴀʙʏ ?" gban_2 : "❖ ᴡʜʏ sʜᴏᴜʟᴅ ɪ ɢʙᴀɴ ᴍʏsᴇʟғ ?" From 169118b673f13ccffe9ea77e151a0e9b956be11a Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:30:26 +0530 Subject: [PATCH 028/184] Update requirements.txt --- requirements.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9240988819b1..d31dd5a5b4d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,13 +26,11 @@ python-dotenv pyyaml requests speedtest-cli +HorridAPI==1.0.67 spotipy tgcrypto urllib3 -uvloop flask -blackpink -pycountry pyshorteners gunicorn==22.0.0 youtube-search @@ -47,7 +45,6 @@ cloudscraper blackpink pycryptodome pickledb -Faker pyfiglet qrcode pytz From 5f7d81513f27103b5123a3ac1789d1f258a2ddbd Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:30:55 +0530 Subject: [PATCH 029/184] Update tools --- TanuMusic/plugins/tools/draw.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 TanuMusic/plugins/tools/draw.py diff --git a/TanuMusic/plugins/tools/draw.py b/TanuMusic/plugins/tools/draw.py new file mode 100644 index 000000000000..b82d6942f1fe --- /dev/null +++ b/TanuMusic/plugins/tools/draw.py @@ -0,0 +1,13 @@ +from pyrogram import Client, filters +from HorridAPI import Mango + +@app.on_message(filters.command("draw")) +def draw(client, message): + prompt = " ".join(message.command[1:]) if len(message.command) > 1 else None + if not prompt: + return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴀɴ ɪᴍᴀɢᴇ ᴜsɪɴɢ /draw ᴄᴏᴍᴍᴀɴᴅs.") + try: + response = Mango.images.generate(model="flux-1.1-pro", prompt=prompt) + message.reply_photo(photo=response.url, caption=" ɪᴍᴀɢᴇ ɢᴇɴᴇʀᴀᴛᴇᴅ ʙʏ ˹ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™♡゙") + except Exception as e: + message.reply_text(f"ɢᴇᴛᴛɪɴɢ ᴇʀʀᴏʀ: {e}") \ No newline at end of file From fc99c44c68dff63fdde2a060f6fdd3af697673df Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:36:53 +0530 Subject: [PATCH 030/184] nothing --- TanuMusic/utils/inline/play.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/utils/inline/play.py b/TanuMusic/utils/inline/play.py index 7615cc6dcf10..6a70aa32e474 100644 --- a/TanuMusic/utils/inline/play.py +++ b/TanuMusic/utils/inline/play.py @@ -32,7 +32,7 @@ def stream_markup_timer(_, chat_id, played, dur): percentage = (played_sec / duration_sec) * 100 umm = math.floor(percentage) if 0 < umm <= 10: - bar = "Ⓝ▱▱▱▱▱▱▱▱▰" + bar = "Ⓝ▰▱▱▱▱▱▱▱▰" elif 10 < umm < 20: bar = "▰Ⓝ▱▱▱▱▱▱▱▰" elif 20 <= umm < 30: @@ -50,7 +50,7 @@ def stream_markup_timer(_, chat_id, played, dur): elif 80 <= umm < 95: bar = "▰▱▱▱▱▱▱▱Ⓝ▰" else: - bar = "▰▱▱▱▱▱▱▱▱Ⓝ" + bar = "▰▱▱▱▱▱▱▱▰Ⓝ" buttons = [ [ InlineKeyboardButton( From b29df7de5a392242adbb8d193d412f4942f59ed7 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:40:45 +0530 Subject: [PATCH 031/184] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index d31dd5a5b4d6..e079cef25204 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,6 +14,7 @@ httpx[http2] lyricsgenius motor wget +pycountry pillow==11.0.0 pymongo==4.9.1 psutil From 95937d62e54ddcf87d04de32b2f469411a42039b Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:44:29 +0530 Subject: [PATCH 032/184] Update draw.py --- TanuMusic/plugins/tools/draw.py | 1 + 1 file changed, 1 insertion(+) diff --git a/TanuMusic/plugins/tools/draw.py b/TanuMusic/plugins/tools/draw.py index b82d6942f1fe..198fdf29eccf 100644 --- a/TanuMusic/plugins/tools/draw.py +++ b/TanuMusic/plugins/tools/draw.py @@ -1,5 +1,6 @@ from pyrogram import Client, filters from HorridAPI import Mango +from TanuMusic import app @app.on_message(filters.command("draw")) def draw(client, message): From 7186b2a0b17c7ec5e3916a4966b614bf6d892232 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:45:09 +0530 Subject: [PATCH 033/184] Update git.py --- TanuMusic/core/git.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/core/git.py b/TanuMusic/core/git.py index 8f0f417c03fe..fa21bcd99ed7 100644 --- a/TanuMusic/core/git.py +++ b/TanuMusic/core/git.py @@ -68,4 +68,4 @@ def git(): except GitCommandError: repo.git.reset("--hard", "FETCH_HEAD") install_req("pip3 install --no-cache-dir -r requirements.txt") - LOGGER(__name__).info(f"Fetching updates from upstream repository...") + LOGGER(__name__).info(f"❖Fetching updates from upstream repository...❤️") From 30c61048f94e487a4c259499e3f1594ffa10db15 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:49:45 +0530 Subject: [PATCH 034/184] type object 'Mango' has no attribute 'images' try yo fix this error --- TanuMusic/plugins/tools/draw.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/TanuMusic/plugins/tools/draw.py b/TanuMusic/plugins/tools/draw.py index 198fdf29eccf..77738a8e9a5a 100644 --- a/TanuMusic/plugins/tools/draw.py +++ b/TanuMusic/plugins/tools/draw.py @@ -1,14 +1,25 @@ from pyrogram import Client, filters from HorridAPI import Mango -from TanuMusic import app +from TanuMusic import app + +# Initialize the Mango client +mango = Mango() @app.on_message(filters.command("draw")) def draw(client, message): + # Extract the prompt from the command prompt = " ".join(message.command[1:]) if len(message.command) > 1 else None if not prompt: return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴀɴ ɪᴍᴀɢᴇ ᴜsɪɴɢ /draw ᴄᴏᴍᴍᴀɴᴅs.") + + # Send a waiting message + wait_message = message.reply_text("ɢᴇɴᴇʀᴀᴛɪɴɢ ɪᴍᴀɢᴇ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ... ⏳") + try: - response = Mango.images.generate(model="flux-1.1-pro", prompt=prompt) - message.reply_photo(photo=response.url, caption=" ɪᴍᴀɢᴇ ɢᴇɴᴇʀᴀᴛᴇᴅ ʙʏ ˹ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™♡゙") + # Generate the image + response = mango.generate_image(model="flux-1.1-pro", prompt=prompt) # Adjust method as per API + wait_message.delete() # Remove the waiting message + message.reply_photo(photo=response.url, caption="ɪᴍᴀɢᴇ ɢᴇɴᴇʀᴀᴛᴇᴅ ʙʏ ˹ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™♡゙") except Exception as e: + wait_message.delete() # Remove the waiting message message.reply_text(f"ɢᴇᴛᴛɪɴɢ ᴇʀʀᴏʀ: {e}") \ No newline at end of file From f264fc7b9c7bf20e9479aa53b8ac00e1fd2c18e7 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:55:08 +0530 Subject: [PATCH 035/184] Update draw.py --- TanuMusic/plugins/tools/draw.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/TanuMusic/plugins/tools/draw.py b/TanuMusic/plugins/tools/draw.py index 77738a8e9a5a..06ee8cbf6def 100644 --- a/TanuMusic/plugins/tools/draw.py +++ b/TanuMusic/plugins/tools/draw.py @@ -10,16 +10,18 @@ def draw(client, message): # Extract the prompt from the command prompt = " ".join(message.command[1:]) if len(message.command) > 1 else None if not prompt: - return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴀɴ ɪᴍᴀɢᴇ ᴜsɪɴɢ /draw ᴄᴏᴍᴍᴀɴᴅs.") + return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴀɴ ɪᴍᴀɢᴇ ᴜsɪɴɢ /draw ᴄᴏᴍᴍᴀɴᴅ.") # Send a waiting message wait_message = message.reply_text("ɢᴇɴᴇʀᴀᴛɪɴɢ ɪᴍᴀɢᴇ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ... ⏳") try: - # Generate the image - response = mango.generate_image(model="flux-1.1-pro", prompt=prompt) # Adjust method as per API + # Generate the image using the Mango API + response = mango.images.generate(model="flux-1.1-pro", prompt=prompt) wait_message.delete() # Remove the waiting message + # Send the generated image as a reply message.reply_photo(photo=response.url, caption="ɪᴍᴀɢᴇ ɢᴇɴᴇʀᴀᴛᴇᴅ ʙʏ ˹ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™♡゙") except Exception as e: wait_message.delete() # Remove the waiting message + # Send the error message message.reply_text(f"ɢᴇᴛᴛɪɴɢ ᴇʀʀᴏʀ: {e}") \ No newline at end of file From 643cd4c54400c2760aa35a68e3f7bbd8792aaf06 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:52:57 +0530 Subject: [PATCH 036/184] Update en.yml --- strings/langs/en.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 61f23502276f..a80037d23b84 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -196,8 +196,7 @@ H_B_2 : "ᴀᴜᴛʜ" H_B_3 : "ʙʀᴏᴀᴅᴄᴀsᴛ" H_B_4 : "sᴜᴅᴏ" H_B_5 : "ᴜsᴇʀ" -H_B_6 : "ᴘʟᴀʏ" -H_B_7 : "sᴏɴɢ" +H_B_6 : "sᴏɴɢ" P_B_1 : "ᴀᴜᴅɪᴏ" P_B_2 : "ᴠɪᴅᴇᴏ" From b009158596361d807cea576ec7aa8f64193b953d Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:55:19 +0530 Subject: [PATCH 037/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index a80037d23b84..66d96c09facf 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -285,7 +285,7 @@ server_11 : "❖ ʀᴜɴɴɪɴɢ ᴀ sᴘᴇᴇᴅᴛᴇsᴛ..." server_12 : "❖ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." server_13 : "❖ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." server_14 : "❖ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs..." -server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ \n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ \n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" +server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ \n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ \n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" gban_1 : "❖ ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴡᴀɴɴᴀ ɢʙᴀɴ ʏᴏᴜʀsᴇʟғ ʙᴀʙʏ ?" gban_2 : "❖ ᴡʜʏ sʜᴏᴜʟᴅ ɪ ɢʙᴀɴ ᴍʏsᴇʟғ ?" From 5de5d859f3c3aec293c4cad52fdc85febc8a472e Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:04:37 +0530 Subject: [PATCH 038/184] nothing --- TanuMusic/utils/inline/queue.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/TanuMusic/utils/inline/queue.py b/TanuMusic/utils/inline/queue.py index 59356ba0a2b5..164e9b1b6d12 100644 --- a/TanuMusic/utils/inline/queue.py +++ b/TanuMusic/utils/inline/queue.py @@ -65,12 +65,6 @@ def queue_back_markup(_, CPLAY): def aq_markup(_, chat_id): buttons = [ - [ - InlineKeyboardButton(text="◁", callback_data=f"ADMIN Resume|{chat_id}"), - InlineKeyboardButton(text="၊၊", callback_data=f"ADMIN Pause|{chat_id}"), - InlineKeyboardButton(text="▷", callback_data=f"ADMIN Skip|{chat_id}"), - InlineKeyboardButton(text="▢", callback_data=f"ADMIN Stop|{chat_id}"), - ], [ InlineKeyboardButton( text=_["CLOSE_BUTTON"], From 4aad8d718b1fdff256400e4c747762de95b1402f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:10:39 +0530 Subject: [PATCH 039/184] Update tools --- TanuMusic/plugins/tools/ping.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 TanuMusic/plugins/tools/ping.py diff --git a/TanuMusic/plugins/tools/ping.py b/TanuMusic/plugins/tools/ping.py new file mode 100644 index 000000000000..1b84c4042492 --- /dev/null +++ b/TanuMusic/plugins/tools/ping.py @@ -0,0 +1,28 @@ +from datetime import datetime + +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.core.call import Anony +from TanuMusic.utils import bot_sys_stats +from TanuMusic.utils.decorators.language import language +from TanuMusic.utils.inline import supp_markup +from config import BANNED_USERS, PING_IMG_URL + + +@app.on_message(filters.command(["ping", "alive"]) & ~BANNED_USERS) +@language +async def ping_com(client, message: Message, _): + start = datetime.now() + response = await message.reply_photo( + photo=PING_IMG_URL, + caption=_["ping_1"].format(app.mention), + ) + pytgping = await Anony.ping() + UP, CPU, RAM, DISK = await bot_sys_stats() + resp = (datetime.now() - start).microseconds / 1000 + await response.edit_text( + _["ping_2"].format(resp, app.mention, UP, RAM, CPU, DISK, pytgping), + reply_markup=supp_markup(_), + ) \ No newline at end of file From 084636cab2e5420ac13bd102664ee653fcbd6060 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:10:53 +0530 Subject: [PATCH 040/184] Update speedtest.py --- TanuMusic/plugins/tools/speedtest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/speedtest.py b/TanuMusic/plugins/tools/speedtest.py index 54f52a3435fb..eb6cb99172a1 100644 --- a/TanuMusic/plugins/tools/speedtest.py +++ b/TanuMusic/plugins/tools/speedtest.py @@ -25,7 +25,7 @@ def testspeed(m, _): return result -@app.on_message(filters.command(["speedtest", "spt", "ping"])) +@app.on_message(filters.command(["speedtest", "spt"])) @language async def speedtest_function(client, message: Message, _): m = await message.reply_text(_["server_11"]) From 37c2fee3997bdc361b8cefa1fca2334aba7f5063 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:12:29 +0530 Subject: [PATCH 041/184] Update ping.py --- TanuMusic/plugins/tools/ping.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/ping.py b/TanuMusic/plugins/tools/ping.py index 1b84c4042492..87bbfbefd4be 100644 --- a/TanuMusic/plugins/tools/ping.py +++ b/TanuMusic/plugins/tools/ping.py @@ -4,7 +4,7 @@ from pyrogram.types import Message from TanuMusic import app -from TanuMusic.core.call import Anony +from TanuMusic.core.call import Tanu from TanuMusic.utils import bot_sys_stats from TanuMusic.utils.decorators.language import language from TanuMusic.utils.inline import supp_markup From a5f056df5892c75184713137d0db85d83e0f6c23 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:14:37 +0530 Subject: [PATCH 042/184] Update ping.py --- TanuMusic/plugins/tools/ping.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/ping.py b/TanuMusic/plugins/tools/ping.py index 87bbfbefd4be..2967c2bfa0e4 100644 --- a/TanuMusic/plugins/tools/ping.py +++ b/TanuMusic/plugins/tools/ping.py @@ -19,7 +19,7 @@ async def ping_com(client, message: Message, _): photo=PING_IMG_URL, caption=_["ping_1"].format(app.mention), ) - pytgping = await Anony.ping() + pytgping = await Tanu.ping() UP, CPU, RAM, DISK = await bot_sys_stats() resp = (datetime.now() - start).microseconds / 1000 await response.edit_text( From 2375c2d406a7a1714b46db79a62535caeb50119b Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:27:52 +0530 Subject: [PATCH 043/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 66d96c09facf..68dcd302a1bf 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -163,7 +163,7 @@ str_2 : "❖ ᴠᴀʟɪᴅ sᴛʀᴇᴀᴍ ᴠᴇʀɪғɪᴇᴅ.\n\n● ᴘʀᴏ str_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴛʀᴇᴀᴍ ʏᴏᴜᴛᴜʙᴇ ʟɪᴠᴇ sᴛʀᴇᴀᴍ, ɴᴏ ʟɪᴠᴇ ꜰᴏʀᴍᴀᴛ ꜰᴏᴜɴᴅ." ping_1 : "❖ {0} ɪs ᴘɪɴɢɪɴɢ..." -ping_2 : "❖ 🏓ᴛᴀɴᴜ ᴍᴜsɪᴄ ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ ⏤‌★\n\n╭✠──────⊱◈◈◈⊰──────✠╮\n│● ᴘɪɴɢ ➥ {0}ᴍs\n│● ᴜᴘᴛɪᴍᴇ ➥ {2}\n│● ʀᴀᴍ ➥ {3}\n│● ᴄᴘᴜ ➥ {4}\n│● ᴅɪsᴋ ➥ {5}\n│● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ {6}ᴍs\n╰✠──────⊱◈◈◈⊰──────✠╯\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" +ping_2 : "❖ 🏓 ᴛᴀɴᴜ ᴍᴜsɪᴄ ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ ⏤‌★\n\n╭✠──────⊱◈◈◈⊰──────✠╮\n│● ᴘɪɴɢ ➥ {0}ᴍs\n│● ᴜᴘᴛɪᴍᴇ ➥ {2}\n│● ʀᴀᴍ ➥ {3}\n│● ᴄᴘᴜ ➥ {4}\n│● ᴅɪsᴋ ➥ {5}\n│● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ {6}ᴍs\n╰✠──────⊱◈◈◈⊰──────✠╯\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" queue_1 : "❖ ғᴇᴛᴄʜɪɴɢ ǫᴜᴇᴜᴇ...\n\nᴘʟᴇᴀsᴇ ᴡᴀɪᴛ..." queue_2 : "❖ ǫᴜᴇᴜᴇ ᴇᴍᴘᴛʏ." From dd6084cdef72e25584330f5fc0abd661467dd834 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:43:33 +0530 Subject: [PATCH 044/184] nothing --- strings/langs/ar.yml | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/strings/langs/ar.yml b/strings/langs/ar.yml index 9571535e36f2..b37930121867 100644 --- a/strings/langs/ar.yml +++ b/strings/langs/ar.yml @@ -202,21 +202,13 @@ S_B_7 : "الشيفرة المصدرية" S_B_8 : "👀 يوتيوب 👀" S_B_9 : "🥀 الدعم 🥀" -H_B_1 : "أدمن" -H_B_2 : "أوث" -H_B_3 : "بث" -H_B_4 : "بل-دردشة" -H_B_5 : "بل-مستخدم" -H_B_6 : "تشغيل-عشوائي" -H_B_7 : "حظر-جماعي" -H_B_8 : "تكرار" -H_B_9 : "صيانة" -H_B_10 : "بنج" -H_B_11 : "تشغيل" -H_B_12 : "تبديل-عشوائي" -H_B_13 : "بحث" -H_B_14 : "أغنية" -H_B_15 : "سرعة" +H_B_1 : "مسؤل" +H_B_2 : "المصادقة" +H_B_3 : "إذاعة" +H_B_4 : "سودو" +H_B_5 : "مستخدم" +H_B_6 : "أغنية" + P_B_1 : "صوتي" P_B_2 : "فيديو" @@ -305,7 +297,8 @@ server_11 : "» جاري إجراء اختبار سرعة..." server_12 : "⇆ جاري اختبار سرعة التنزيل..." server_13 : "⇆ جاري اختبار سرعة الرفع..." server_14 : "↻ مشاركة نتائج اختبار السرعة..." -server_15 : "✯ نتائج اختبار السرعة ✯\n\nالعميل :\n» عنوان IP : {0}\n» البلد : {1}\n\nالخادم :\n» الاسم : {2}\n» البلد : {3}, {4}\n» الراعي : {5}\n» التأخير : {6}\n» التأخير في الشبكة : {7}" +server_15 : "✯ نتائج اختبار السرعة ✯\n\nالعميل :\n» عنوان ISP : {0}\n» البلد : {1}\n\nالخادم :\n» الاسم : {2}\n» البلد : {3}, {4}\n» الراعي : {5}\n» التأخير : {6}\n» التأخير في الشبكة : {7}" + gban_1 : "» لماذا تريد حظر نفسك يا صغيري؟" gban_2 : "» لماذا يجب أن أحظر نفسي؟" gban_3 : "» لا يمكنك حظر المستخدمين المصرح لهم." From de336eeb5285ab1379c78e1dcb1d26728272257f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:08:48 +0530 Subject: [PATCH 045/184] nothing --- strings/langs/hi.yml | 603 +++++++++++++++++++++---------------------- 1 file changed, 297 insertions(+), 306 deletions(-) diff --git a/strings/langs/hi.yml b/strings/langs/hi.yml index f01471aa5b1e..01b961cf28a7 100644 --- a/strings/langs/hi.yml +++ b/strings/langs/hi.yml @@ -1,306 +1,297 @@ -name : 🇮🇳 हिंदी - - -general_1: "» एक उपयोगकर्ता के संदेश का उत्तर दें या उपयोगकर्ता नाम / उपयोगकर्ता ID दें।" -general_2: "» कुछ गड़बड़ हो गई थी आपके क्वेरी को प्रोसेस करते समय।\n\nअपवाद: {0}" -general_3: "आप इस चैट में एक गुमनाम व्यवस्थापक हैं, मुझे उपयोग करने के लिए उपयोगकर्ता खाता पर वापस लौटें।" -general_4: "» आपकी अनुमतियाँ वीडियो चैट प्रबंधित करने के लिए नहीं हैं।\n\nव्यवस्थापक कैश को पुनः लोड करें /reload के माध्यम से" -general_5: "» बॉट वीडियोचैट पर स्ट्रीमिंग नहीं कर रहा है।" - -tg_1: "{0} डाउनलोडर\n\nफ़ाइल का आकार : {1}\nपूर्ण हो गया : {2}\nप्रतिशत : {3}%\n\nगति : {4}/s\nETA : {5}" -tg_2: "सफलतापूर्वक डाउनलोड किया गया, फ़ाइल प्रोसेस की जा रही है...\n\nसमय गुजरा : {0}" -tg_3: "मीडिया टेलीग्राम से डाउनलोड करने में विफल, कृपया पुनः प्रयास करें..." -tg_4: "» पहले से ही डाउनलोड पूरा हो गया है।" -tg_5: "» डाउनलोड पहले से ही पूरा हो गया है या रद्द किया गया है।" -tg_6: "» डाउनलोड रद्द कर दिया गया है।" -tg_7: "» डाउनलोड रद्द किया गया है द्वारा : {0}" -tg_8: "डाउनलोड रोकने में विफल।" -tg_9: "चल रहे डाउनलोड कार्य प्राप्त करने में विफल।" - -call_1: "» बोट को लिंक के माध्यम से उपयोगकर्ताओं को आमंत्रित करने की अनुमति की आवश्यकता होती है ताकि सहायक को आपकी चैट में आमंत्रित किया जा सके।" -call_2: "{0} सहायक आपके समूह/चैनल में प्रतिबंधित है।\n\nआईडी : {1}\nनाम : {2}\nउपयोगकर्ता नाम : @{3}\n\nकृपया सहायक को अनबैन करें और पुनः प्रयास करें।" -call_3: "सहायक को आपकी चैट में आमंत्रित करने में विफल।\n\nकारण : {1}" -call_4: "कृपया प्रतीक्षा करें...\n\n{0} सहायक को आपकी चैट में आमंत्रित किया जा रहा है..." -call_5: "{0} सहायक सफलतापूर्वक शामिल हो गया।\n\nप्रसारण शुरू करने का प्रयास किया जा रहा है..." -call_6: "» प्रसारण स्विच करने में विफल। कृपया पुनः /skip का उपयोग करके ट्रैक को फिर से बदलें।" -call_7: "» अगले ट्रैक को कतार से डाउनलोड किया जा रहा है।\n\nकृपया प्रतीक्षा करें..." -call_8: "↬ द्वारा जोड़ा गया :" - -auth_1: "» आपके समूह में केवल 25 प्रमाणित उपयोगकर्ताएँ हो सकती हैं।" -auth_2: "» {0} को प्रमाणित उपयोगकर्ताओं की सूची में जोड़ दिया गया है।" -auth_3: "{0} पहले से ही प्रमाणित उपयोगकर्ताओं की सूची में है।" -auth_4: "» {0} को प्रमाणित उपयोगकर्ताओं की सूची से हटा दिया गया है।" -auth_5: "{0} प्रमाणित उपयोगकर्ताओं की सूची में नहीं है।" -auth_6: "» प्रमाणित उपयोगकर्ताओं की सूची को पुनर्प्राप्त किया जा रहा है..." -auth_7: "» {0} की प्रमाणित उपयोगकर्ताओं की सूची में :\n\n" -auth_8: "↬ द्वारा जोड़ा गया :" - -reload_1: "» आपको केवल 3 मिनट में एक बार व्यवस्थापक कैश को ताज़ा करने की अनुमति होती है।\n\nकृपया {0} के बाद पुनः प्रयास करें।" -reload_2: "» व्यवस्थापक कैश सफलतापूर्वक ताज़ा किया गया।" -reload_3: "» व्यवस्थापक कैश को ताज़ा करने में विफल, सुनिश्चित करें कि बोट आपकी चैट में व्यवस्थापक है।" -reload_4: "» कृपया प्रतीक्षा करें...\n\n{0} को आपकी चैट के लिए दोबारा शुरू किया जा रहा है।" -reload_5: "{0} को आपकी चैट के लिए सफलतापूर्वक दोबारा आरंभ किया गया।\n\nफिर से प्रारंभ करने का प्रयास किया जा रहा है..." - -admin_1: "» क्या आपको याद है कि आपने प्रसारण को पुनः आरंभ किया था?" -admin_2: "➻ प्रसारण ठहरा दिया 🎄\n│ \n└द्वारा : {0} 🥀" -admin_3: "» क्या आपको याद है कि आपने प्रसारण को ठहराया था?" -admin_4: "➻ प्रसारण पुनः आरंभ 🎄\n│ \n└द्वारा : {0} 🥀" -admin_5: "➻ प्रसारण समाप्त/रोक दिया 🎄\n│ \n└द्वारा : {0} 🥀" -admin_6: "➻ प्रसारण रोका 🎄\n│ \n└द्वारा : {0} 🥀\n\n» {1} में अब कोई और ट्रैक कतार में नहीं है, वीडियोचैट छोड़ रहे हैं।" -admin_7: "स्ट्रीम {0} को बदलते समय त्रुटि।" -admin_8: "» कृपया लूप प्ले को अक्षम करें और फिर से स्किप का प्रयास करें। /loop disable के माध्यम से लूप प्ले को अक्षम करें।" -admin_9: "कृपया स्किप के लिए विशिष्ट संख्याएँ उपयोग करें, जैसे 1, 2, 4..." -admin_10: "कम से कम 2 ट्रैक्स की आवश्यकता होती है विशिष्ट स्किप के लिए।\n\nकृपया ट्रैक कतार देखें: /queue" -admin_11: "» ट्रैक्स कतार में पर्याप्त नहीं है विशिष्ट स्किप के लिए।\n\nकृपया 1 और {0} के बीच स्किप करें।" -admin_12: "» विशिष्ट ट्रैक पर स्किप करने में विफल।\n\nकृपया बचे हुए कतार की जाँच करें: /queue" -admin_13: "» कृपया व्यवस्थापक कैश को ताज़ा करें: /reload" -admin_14: "» वीडियो चैट प्रबंधित करने की अनुमति नहीं है।\n\nकृपया व्यवस्थापक कैश को ताज़ा करें: /reload" -admin_15: "» शफल करने में विफल।\n\nकतार देखें: /queue" -admin_16: "» कतार को शफल किया गया है {0} द्वारा।\n\nशफल किया गया कतार देखें: /queue" -admin_17: "{0} स्पीड नियंत्रण पैनल\n\nकर्रेंट प्लेइंग स्ट्रीम की स्पीड बदलने के लिए नीचे दिए गए बटन पर क्लिक करें।" -admin_18: "» {0} के लिए स्पीड चालू की गई है।\n\nद्वारा : {1}।" -admin_19: "» स्पीड कंट्रोल बंद किया गया है।\n\nद्वारा : {0}।" -admin_20: "उदाहरण:\n\n/seek या /seekback [सेकंड में अवधि]" -admin_21: "» कृपया सेकंड में अवधि के लिए केवल न्यूमेरिक डिजिट्स का उपयोग करें।" -admin_22: "» लाइव स्ट्रीम्स को सीक नहीं किया जा सकता।" -admin_23: "» कृपया कम अवधि में सीक करने का प्रयास करें।\n\n{0} मिनटों में प्ले हुआ, {1} मिनटों की क़तार से।" -admin_24: "सीक किया जा रहा है...\n\nकृपया प्रतीक्षा करें..." -admin_25: "» स्पीड के साथ सफलतापूर्वक सीक किया गया।\n\nअवधि : {0} मिनटों\nद्वारा : {1}" -admin_26: "सीक में विफल।" -admin_27: "» केवल यूट्यूब स्ट्रीम की स्पीड को वर्तमान में नियंत्रित किया जा सकता है।" -admin_28: "{0} स्पीड नियंत्रण पैनल\n\nकृपया वीडियो चैट पर प्लेइंग स्ट्रीम की स्पीड बदलने के लिए नीचे दिए गए बटनों पर क्लिक करें।" -admin_29: "» बॉट पहले से ही सामान्य स्पीड पर प्ले कर रहा है।" -admin_30: "» कृपया प्रतीक्षा करें...\n\nकोई अन्य व्यक्ति स्ट्रीम की स्पीड बदलने का प्रयास कर रहा है।" -admin_31: "स्पीड बदल रहा है..." -admin_32: "» चल रहे स्ट्रीम की स्पीड सफलतापूर्वक बदली गई।\n\nअनुरोधकर्ता : {0}" -admin_33: "» चल रहे स्ट्रीम की स्पीड बदलने में विफल।" -admin_34: "» चल रहे स्ट्रीम की स्पीड सफलतापूर्वक {0}x की गई।\n\nअनुरोधकर्ता : {1}" -admin_35: "मतदान समाप्त हो गया है क्योंकि वोटिंग प्रदान किए जाने वाले ट्रैक के लिए समाप्त हो गया है।" -admin_36: "इस क्रिया को करने में विफल क्योंकि वोटिंग प्रदान किए जाने वाले ट्रैक के लिए समाप्त हो गया है या वो रुका हुआ है।" -admin_37: "सफलतापूर्वक {0} अपवोट प्राप्त किए गए।" -admin_38: "» 1 अपवोट जोड़ा गया।" -admin_39: "» 1 अपवोट हटा दिया गया।" -admin_40: "अपवोट किया गया।" - -start_1 : "{0} जिंदा है बेबी।\n\n✫ उपकाल : {1}" -start_2 : "हे {0}, 🥀\n\n๏ यह {1} है !\n\n➻ एक तेज़ और शक्तिशाली टेलीग्राम संगीत प्लेयर बॉट जिसमें कुछ शानदार सुविधाएँ हैं।\n\nसमर्थित प्लेटफ़ॉर्म्स : यूट्यूब, स्पॉटिफ़ाई, रेसो, एप्पल म्यूज़िक और साउंडक्लाउड।\n──────────────────\n๏ मेरे मॉड्यूल्स और कमांड्स के बारे में जानकारी प्राप्त करने के लिए हेल्प बटन पर क्लिक करें।" -start_3 : "हे {0},\nयह {1} है\n\nआपके द्वारा {2} में मुझे जोड़ने के लिए धन्यवाद, {3} अब इस चैट में गाने बजा सकता है।" -start_4 : "🎄 सुपरग्रुप की आवश्यकता है 🎄\n\nकृपया अपने ग्रुप को सुपरग्रुप में बदलें और फिर मुझे फिर से जोड़ें।\n\nसुपरग्रुप कैसे बनाएं ?\n- अपने ग्रुप की चैट इतिहास को दृश्यमान बनाएं।" -start_5 : "↝ ब्लैकलिस्ट की गई चैट ↜\n\nयह चैट {0} डेटाबेस पर ब्लैकलिस्ट है।\nअपनी चैट को अनब्लैकलिस्ट करने के लिए सुडो उपयोगकर्ता से अनुरोध करें या समर्थन चैट पर जाएं।" -start_6 : "😲 ट्रैक जानकारी 😲\n\n📌 शीर्षक : {0}\n\n⏳ अवधि : {1} मिनट\n👀 दृश्य : {2}\n⏰ प्रकाशित हुआ : {3}\n📎 चैनल : {5}\n\n🥀 सर्च पावर्ड बाय {6}" - -help_1 : "इस ग्रुप के लिए उपयोगकर्ता की मदद के लिए कृपया उपयोगकर्ता जाति को चुनें।\nअपने संदेहों को पूछें समर्थन चैट में\n\nसभी कमांड्स का उपयोग करने के लिए : /" -help_2 : "अपने प्राइवेट में मेरे मदद मेनू प्राप्त करने के लिए कृपया नीचे दिए गए बटन पर क्लिक करें।" - -lang_1 : "» कृपया ग्रुप की डिफ़ॉल्ट भाषा के रूप में सेट करने के लिए भाषा चुनें :" -lang_2 : "भाषा सफलतापूर्वक बदल दी गई।" -lang_3 : "भाषा बदलने में विफल।" -lang_4 : "आप पहले से ही वही भाषा में हैं।" - -setting_1 : "{0} सेटिंग्स पैनल\n\nचैट आईडी : {1}\nचैट टाइटल : {2}\n\nसेटिंग्स बदलने के लिए नीचे दिए गए बटनों पर क्लिक करें." -setting_2 : "» डायरेक्ट: सीधे सर्च क्वेरी को चलाता है।\n\n» इनलाइन: वीडियो और ऑडियो के बीच चयन करने के लिए इनलाइन बटन्स प्रदान करता है।" -setting_3 : "» सभी: किसी भी व्यक्ति को इस ग्रुप में एडमिन कमांड्स [स्किप, पॉज, रिज्यूम आदि] का उपयोग करने की अनुमति है।\n\n» केवल एडमिन: केवल एडमिन और अधिकृत उपयोगकर्ता एडमिन कमांड्स का उपयोग कर सकते हैं।" -setting_4 : "» कोई अधिकृत उपयोगकर्ता नहीं मिले." -setting_5 : "» ग्रुप: ग्रुप में संगीत बजाता है जहां कमांड दी जाती है।\n\n» चैनल: वह चैनल चुनें जिसमें संगीत बजना है। /channelplay के माध्यम से चैनल आईडी सेट करें" -setting_6 : "» सभी: किसी भी व्यक्ति को इस ग्रुप में संगीत बजाने की अनुमति है।\n\n» केवल एडमिन: केवल एडमिन्स ही इस ग्रुप में संगीत बजा सकते हैं।" -setting_7 : "» कृपया /channelplay के माध्यम से चैनल आईडी सेट करें" -setting_8 : "जब यह मोड सक्षम होता है, तो वे लोग भी एडमिन कमांड्स का उपयोग कर सकते हैं जिनके पास एडमिन अधिकार नहीं होते हैं, एक निश्चित संख्या में वोट के बाद।" -setting_9 : "वर्तमान उपवोट्स की आवश्यकता जो एडमिन कमांड्स का उपयोग करने के लिए हैं : {0}" -setting_10 : "वोटिंग मोड अक्षम है।" -setting_11 : "न्यूनतम उपवोट्स की गिनती 2 हो सकती है। आप 2 से कम नहीं सेट कर सकते" -setting_12 : "अधिकतम उपवोट्स की गिनती 15 हो सकती है। आप 15 से अधिक नहीं सेट कर सकते" - -set_cb_1 : "आधीकृत उपयोगकर्ताओं का पैनल प्राप्त किया जा रहा है..." -set_cb_2 : "प्ले मोड पैनल प्राप्त किया जा रहा है..." -set_cb_3 : "सेटिंग्स बदल रहे हैं..." -set_cb_4 : "» आधीकृत उपयोगकर्ता सूची प्राप्त की जा रही है..." -set_cb_5 : "» पीछे जा रहे हैं..." - -gstats_1: "गेटिंग {0} स्टैट्स और इनफ़ोर्मेशन...\n\nइसमें समय लग सकता है, कृपया होल्ड ऑन..." -gstats_2: "क्लिक ऑन थे बट्टन्स बेलोव तो चेक थे स्टैट्स ऑफ {0}." -gstats_3: "{0} स्टैट्स और इनफ़ोर्मेशन :\n\nअसिस्टंट्स : {1}\nब्लॉक्ड : {2}\nचैट्स: {3}\nयूज़र्स : {4}\nमॉड्यूल्स : {5}\nसुडोएर्स : {6}\n\nऑटो लीविंग असिस्टंट : {7}\nप्ले दुरातिओन लिमिट : {8} मिनट्स" -gstats_4: "इस बट्टन इस ओनली फॉर सुडोएर्स." -gstats_5: "{0} स्टैट्स और इनफ़ोर्मेशन :\n\nमॉड्यूल्स : {1}\nप्लैटफॉर्म : {2}\nरैम : {3}\nफिजिकल कोर्स : {4}\nटोटल कोर्स : {5}\nसीपीयू फ़्रेक्वेंसी : {6}\n\nपायथन : {7}\nपायरोग्राम : {8}\nपाय-टीजीकैल्स : {9}\n\nस्टोरेज अवेलेबल : {10} गीब\nस्टोरेज यूज़्ड : {11} गीब\nस्टोरेज लेफ्ट : {12} गीब\n\nसर्व्ह्ड चैट्स : {13}\nसर्व्ह्ड यूज़र्स : {14}\nब्लॉक्ड यूज़र्स : {15}\nसुडो यूज़र्स : {16}\n\nटोटल डीबी साइज़ : {17} एम्बी\nटोटल डीबी स्टोरेज : {18} एम्बी\nटोटल डीबी कलेक्शन्स : {19}\nटोटल डीबी कीज़ : {20}" - -playcb_1: "» अव्व, थिस इस नोट फ़ॉर यू बेबी." -playcb_2: "» गेटिंग नेक्स्ट रेसुल्ट,\n\nप्लीज़ वेट..." - -cplay_1: "» यू कैन प्ले म्यूज़िक इन चैनल्स फ्रोम {0} तो अन्य चैनल और योर चैट्स लिंकेड चैनल.\n\nफ़ॉर लिंकेड चैनल :\n/channelplay linked\n\nफ़ॉर अन्य चैनल :\n/channelplay [चैनल आईडी]" -cplay_2: "» थिस चैट डोन'ट हेव अन्य लिंकेड चैनल." -cplay_3: "» चैनल डिफ़ाइन्ड टू {0}.\nचैनल आईडी : {1}" -cplay_4: "» फ़ेल्ड टो गेट चैनल.\n\nमेक सुरे यू'वे अद्देड थे बोट इन योर चैनल एंड प्रोमोटेड अस अद्मिन." -cplay_5: "ओन्ली चैनल्स आरे सुप्पोर्टेड." -cplay_6: "» यू नीड टो बी थे ओव्नर ऑफ थे चैनल {0} टो कन्नेक्ट इट विथ थिस ग्रूप.\nचैनल'स ओव्नर : @{1}\n\nआल्टरनटिवली यू कैन लिंक योर ग्रूप टो थाट चैनल एंड थेन ट्राई कन्नेक्टिंग विथ /channelplay linked" -cplay_7: "» चैनल प्लेय डिसअब्लेड." - -play_1: "🔎" -play_2: "➻ चैनल प्लेय मोड\n\nप्रोसेसिंग, प्लीज़ वेट...\n\nलिंकेड चैनल : {0}" -play_3: "» फ़ेल्ड टो प्रोसेस क़ुएरी." -play_4: "एड्मिन्स ओनली प्लेय\nओन्ली एड्मिन्स ऑफ थिस चैट आरे अल्लोवेड टो प्लेय\n\nचेंगे प्लेय मोड विआ /playmode" -play_5: "» फ़ेल्ड टो प्रोसेस ऑडियो फ़िले.\n\nऑडियो फ़िले सिज़े इस लार्जर थान थे डिफ़ाइन्ड लिमिट." -play_6: "» स्ट्रीम'स लोंगेर थान {0} आरें'ट अल्लोवेड टो प्लेय ऑन {1}" -play_7: "» नोट अ वैलिड विडियो फ़िले एक्सटेंशन.\n\nसुप्पोर्टेड एक्सटेंशन्स : {0}" -play_8: "» विडियो फ़िले सिज़े शोल्ड बी लेस थान 1गीब." -play_9: "यूट्यूब प्लेयलिस्ट फीचर\n\nसेलेक्ट थे मोड इन व्हिच यू वॉन्ट टो प्लेय होले यूट्यूब प्लेयलिस्ट." -play_10: "टाइटल : {0}\nड्युरेशन : {1} मिनट्स" -play_11: "{0} स्पोटिफ़ाई प्लेयर\n\nरिक्वेस्टेड बाय : {1}" -play_12: "{0} अप्प्ले प्लेयर\n\nरिक्वेस्टेड बाय : {1}" -play_13: "» लाइव स्ट्रीम डिटेक्टेड.\n\nआरे यू सुरे थाट यू वॉन्ट टो प्लेय लाइव स्ट्रीम इन थिस चैनल?" -play_14: "ट्रैक डिटेल्स प्राप्त करने में विफल।\n\nकृपया कोई अन्य ट्रैक प्ले करने का प्रयास करें।" -play_15: "» क्वेरी प्रोसेस करने में विफल।\n\nमैं केवल स्पॉटिफाई ट्रैक्स, एल्बम्स, कलाकारों और प्लेलिस्ट्स प्ले कर सकता हूँ।" -play_16: "कोई सक्रिय वॉयस चैट नहीं।\n\nफोर्स प्ले का उपयोग करने के लिए किसी सक्रिय वॉयस चैट होनी चाहिए।" -play_17: "कृपया वीडियो चैट ऑन करें, मैं URL्स को स्ट्रीम करने में असमर्थ हूँ।" -play_18: "उपयोग: /play [गाने का नाम/YouTube URL/ऑडियो/वीडियो फ़ाइल का उत्तर]" -play_19: "कतार में जोड़ा गया प्लेलिस्ट:" -play_20: "कतार में स्थिति-" -play_21: "{0} ट्रैक्स को कतार में जोड़ा गया।\n\nजाँच करें: यहाँ क्लिक करें" -play_22: "आपके ग्रुप के अंदर क्यूइड सूचियों को प्ले करने के लिए आपके द्वारा चुने गए मोड: {0}" - -str_1 : "कृपया m3u8 या इंडेक्स लिंक्स प्रदान करें।" -str_2 : "➻ मान्य स्ट्रीम सत्यापित।\n\nप्रोसेसिंग..." -str_3 : "यूट्यूब लाइव स्ट्रीम प्ले करने में विफल। कोई लाइव प्रारूप नहीं मिला।" - -ping_1 : "{0} पिंग कर रहा है..." -ping_2 : "🏓 पोंग : {0}ms\n\n{1} सिस्टम स्थिति :\n\n↬ अपटाइम : {2}\n↬ रैम : {3}\n↬ सीपीयू : {4}\n↬ डिस्क : {5}\n↬ पायथन-टीजीसीएल : {6}ms" - -queue_1 : "» कतार प्राप्त हो रही है...\n\nकृपया प्रतीक्षा करें..." -queue_2 : "» कतार खाली है।" -queue_3 : "» कतार में ट्रैकों की सूची देखने के लिए यहाँ क्लिक करें : यहाँ" -queue_4 : "➲ कतार में जोड़ा गया #{0}\n\n‣ शीर्षक : {1}\n‣ अवधि : {2} मिनट\n‣ द्वारा अनुरोधित : {3}" -queue_5 : "केवल एक कतार में ट्रैक है।\n\nलिस्ट देखने के लिए अधिक ट्रैक जोड़ें।" -queue_6 : "🕚 अवधि : अज्ञात स्ट्रीम\n\nपूरी कतार की सूची प्राप्त करने के लिए नीचे बटन पर क्लिक करें।" -queue_7 : "\nनीचे बटन पर क्लिक करें।" -queue_8 : "{0} प्लेयर\n\n🎄 स्ट्रीमिंग : {1}\n\n🔗 स्ट्रीम प्रकार : {2}\n🥀 अनुरोधक : {3}\n{4}" - -stream_1 : "➲ स्ट्रीमिंग शुरू की गई |\n\n‣ शीर्षक : {1}\n‣ अवधि : {2} मिनट\n‣ द्वारा अनुरोधित : {3}" -stream_2 : "➲ स्ट्रीमिंग शुरू की गई |\n\n‣ स्ट्रीम प्रकार : लाइव स्ट्रीम [URL]\n‣ द्वारा अनुरोधित : {0}" - -CLOSE_BUTTON : "बंद करें" -BACK_BUTTON : "वापस" - -S_B_1 : "मुझे जोड़ें" -S_B_2 : "समर्थन" -S_B_3 : "मुझे अपने समूह में जोड़ें" -S_B_4 : "मदद और कमांड्स" -S_B_5 : "डेवलपर" -S_B_6 : "चैनल" -S_B_7 : "स्रोत कोड" -S_B_8 : "👀 YouTube 👀" -S_B_9 : "🥀 समर्थन 🥀" - -H_B_1 : "एडमिन" -H_B_2 : "ऑथ" -H_B_3 : "ब्रॉडकास्ट" -H_B_4 : "ब्लैकलिस्ट" -H_B_5 : "ब्लॉक" -H_B_6 : "चैनल प्ले" -H_B_7 : "जी-बैन" -H_B_8 : "लूप" -H_B_9 : "सुडो" -H_B_10 : "पिंग" -H_B_11 : "प्ले" -H_B_12 : "शफल" -H_B_13 : "सीक-बैक" -H_B_14 : "गाना" -H_B_15 : "गति" - -P_B_1 : "ऑडियो" -P_B_2 : "वीडियो" -P_B_3 : "लाइव स्ट्रीम" -P_B_4 : "नॉर्मल" - -ST_B_1 : "ऑथ उपयोगकर्ता" -ST_B_2 : "प्ले मोड" -ST_B_3 : "भाषा" -ST_B_4 : "वोटिंग मोड" -ST_B_5 : "चालू" -ST_B_6 : "बंद" -ST_B_7 : "ऑथ उपयोगकर्ता ➜" -ST_B_8 : "व्यवस्थापक" -ST_B_9 : "सभी" -ST_B_10 : "खोज मोड ➜" -ST_B_11 : "प्रत्यक्ष" -ST_B_12 : "इनलाइन" -ST_B_13 : "व्यवस्थापक कमांड ➜" -ST_B_14 : "प्ले प्रकार ➜" - -SA_B_1 : "कुल स्थितियाँ" -SA_B_2 : "सामान्य" -SA_B_3 : "कुल" - -QU_B_1 : "कतार" -QU_B_2 : " {0} —————————— {1}" - -sudo_1 : "» {0} पहले से ही सुडो उपयोगकर्ताओं की सूची में है।" -sudo_2 : "» {0} को सुडो उपयोगकर्ताओं की सूची में जोड़ दिया गया।" -sudo_3 : "» {0} सुडो उपयोगकर्ताओं की सूची में नहीं है।" -sudo_4 : "» {0} को सुडो उपयोगकर्ताओं की सूची से हटा दिया गया।" -sudo_5 : "🥀 मालिक :\n" -sudo_6 : "\n✨ सुडो उपयोगकर्ताएँ :\n" -sudo_7 : "» सुडो उपयोगकर्ताएँ नहीं मिलीं।" -sudo_8 : "विफल।" - -block_1 : "» {0} पहले से ही ब्लॉक किया गया है।" -block_2 : "» {0} को ब्लॉक की सूची में जोड़ दिया गया।" -block_3 : "» {0} ब्लॉक की सूची में नहीं है।" -block_4 : "» {0} को ब्लॉक की सूची से हटा दिया गया।" -block_5 : "» ब्लॉक की सूची में कोई उपयोगकर्ता नहीं मिला।" -block_6 : "» ब्लॉक की सूची मिल रही है..." -block_7 : "😫 ब्लॉक की सूची :\n\n" - -black_1 : "उदाहरण :\n\n/blacklistchat [चैट आईडी]" -black_2 : "» यह चैट पहले से ही ब्लैकलिस्ट की सूची में है।" -black_3 : "» सफलतापूर्वक ब्लैकलिस्ट में जोड़ दिया गया।" -black_4 : "उदाहरण :\n\n/whitelistchat [चैट आईडी]" -black_5 : "» यह चैट ब्लैकलिस्ट की सूची में नहीं है।" -black_6 : "» सफलतापूर्वक ब्लैकलिस्ट से हटा दिया गया।" -black_7 : "» ब्लैकलिस्ट की सूची :\n\n" -black_8 : "» {0} के ऊपर कोई चैट ब्लैकलिस्ट की सूची में नहीं है।" -black_9 : "» कुछ गड़बड़ हो गई।" - -maint_1 : "उदाहरण :\n/maintenance [on|off]" -maint_2 : "» {0} ने मेंटेनेंस मोड सक्रिय किया।" -maint_3 : "» {0} ने मेंटेनेंस मोड अक्षम किया।" -maint_4 : "» मेंटेनेंस मोड पहले से ही सक्रिय है।" -maint_5 : "» मेंटेनेंस मोड पहले से ही अक्षम है।" - -log_1 : "उदाहरण :\n/logger [on|off]" -log_2 : "लॉगिंग सक्रिय किया" - -broad_1 : "» प्रसारण शुरू किया जा रहा है..." -broad_2 : "उदाहरण :\n\n/broadcast [संदेश या किसी संदेश के उत्तर में]" -broad_3 : "» संदेश को {0} चैट्स में प्रसारित किया गया, {1} पिन से बोट से।" -broad_4 : "» संदेश को {0} उपयोगकर्ताओं को प्रसारित किया गया।" -broad_5 : "» सहायक प्रसारण शुरू कर रहा है..." -broad_6 : "➻ सहायक प्रसारण :\n\n" -broad_7 : "↬ सहायक ने {0} चैटों में प्रसारित किया, {1} से।" -broad_8 : "» कृपया प्रसारित करने के लिए कुछ टेक्स्ट प्रदान करें।" - -server_1 : "» लॉग्स प्राप्त करने में विफल हुआ।" -server_2 : "कृपया सुनिश्चित करें कि आपका Heroku API कुंजी और ऐप का नाम सही रूप से कॉन्फ़िगर किए गए हैं।" -server_3 : "उपलब्ध अपडेटों की जांच की जा रही है..." -server_4 : "git कमांड त्रुटि।" -server_5 : "अमान्य git रिपॉजिटरी।" -server_6 : "» बोट अप-टू-डेट है।" -server_7 : "» बोट को सफलतापूर्वक अपडेट किया गया! अब कुछ मिनटों तक प्रतीक्षा करें जब तक बोट पुनरारंभ और परिवर्तनों को पुश नहीं करता है!" -server_8 : "{0} रीस्टार्ट हो रहा है...\n\n15-20 सेकंड के बाद आप फिर से खेलना शुरू कर सकते हैं।" -server_9 : "कुछ गलत हो गया, कृपया लॉग जांचें।" -server_10 : "{0} पर एक अपवाद हुआ #अपडेटर में : {0}" -server_11 : "» एक स्पीड टेस्ट चल रहा है..." -server_12 : "⇆ डाउनलोड स्पीड टेस्ट चल रहा है..." -server_13 : "⇆ अपलोड स्पीड टेस्ट चल रहा है..." -server_14 : "↻ स्पीड टेस्ट परिणाम साझा किए जा रहे हैं..." -server_15 : "✯ स्पीड टेस्ट परिणाम ✯\n\nग्राहक :\n» आईपी : {0}\n» देश : {1}\n\nसर्वर :\n» नाम : {2}\n» देश : {3}, {4}\nस्पॉन्सर : {5}\nलैटेंसी : {6}\nपिंग : {7}" - -gban_1 : "» तुमने क्यों खुद को ग्लोबल बैन करना चाहा बेबी?" -gban_2 : "» मैं क्यों खुद को ग्लोबल बैन करूँ?" -gban_3 : "» तुम मेरे सुडोएर्स को ग्लोबल बैन नहीं कर सकते।" -gban_4 : "» {0} पहले से ही बोट से ग्लोबल बैन है।" -gban_5 : "» {0} पर ग्लोबल बैन को आरंभ किया जा रहा है।\n\nप्रत्याशित समय: {1}" -gban_6 : "नया ग्लोबल बैन {0} पर:\n\nमूल श्रोत से: {1} [{2}]\nउपयोगकर्ता: {3}\nउपयोगकर्ता आईडी: {4}\n\nद्वारा बैन किया गया: {5}\nचैट्स: {6}" -gban_7 : "» {0} बोट से ग्लोबल बैन नहीं है।" -gban_8 : "» {0} से ग्लोबल बैन को हटाया जा रहा है।\n\nप्रत्याशित समय: {1}" -gban_9 : "» {0} से ग्लोबल बैन हटाया गया है।\n\n{1} चैट्स में अनबैन हो गया है।" -gban_10 : "» किसी भी उपयोगकर्ता को बोट से ग्लोबल बैन नहीं किया गया है।" -gban_11 : "» ग्लोबल बैन उपयोगकर्ता सूची प्राप्त की जा रही है..." -gban_12 : "🙂 ग्लोबल बैन उपयोगकर्ता :\n\n" +name : 🇮🇳 हिंदी + + +general_1: "» एक उपयोगकर्ता के संदेश का उत्तर दें या उपयोगकर्ता नाम / उपयोगकर्ता ID दें।" +general_2: "» कुछ गड़बड़ हो गई थी आपके क्वेरी को प्रोसेस करते समय।\n\nअपवाद: {0}" +general_3: "आप इस चैट में एक गुमनाम व्यवस्थापक हैं, मुझे उपयोग करने के लिए उपयोगकर्ता खाता पर वापस लौटें।" +general_4: "» आपकी अनुमतियाँ वीडियो चैट प्रबंधित करने के लिए नहीं हैं।\n\nव्यवस्थापक कैश को पुनः लोड करें /reload के माध्यम से" +general_5: "» बॉट वीडियोचैट पर स्ट्रीमिंग नहीं कर रहा है।" + +tg_1: "{0} डाउनलोडर\n\nफ़ाइल का आकार : {1}\nपूर्ण हो गया : {2}\nप्रतिशत : {3}%\n\nगति : {4}/s\nETA : {5}" +tg_2: "सफलतापूर्वक डाउनलोड किया गया, फ़ाइल प्रोसेस की जा रही है...\n\nसमय गुजरा : {0}" +tg_3: "मीडिया टेलीग्राम से डाउनलोड करने में विफल, कृपया पुनः प्रयास करें..." +tg_4: "» पहले से ही डाउनलोड पूरा हो गया है।" +tg_5: "» डाउनलोड पहले से ही पूरा हो गया है या रद्द किया गया है।" +tg_6: "» डाउनलोड रद्द कर दिया गया है।" +tg_7: "» डाउनलोड रद्द किया गया है द्वारा : {0}" +tg_8: "डाउनलोड रोकने में विफल।" +tg_9: "चल रहे डाउनलोड कार्य प्राप्त करने में विफल।" + +call_1: "» बोट को लिंक के माध्यम से उपयोगकर्ताओं को आमंत्रित करने की अनुमति की आवश्यकता होती है ताकि सहायक को आपकी चैट में आमंत्रित किया जा सके।" +call_2: "{0} सहायक आपके समूह/चैनल में प्रतिबंधित है।\n\nआईडी : {1}\nनाम : {2}\nउपयोगकर्ता नाम : @{3}\n\nकृपया सहायक को अनबैन करें और पुनः प्रयास करें।" +call_3: "सहायक को आपकी चैट में आमंत्रित करने में विफल।\n\nकारण : {1}" +call_4: "कृपया प्रतीक्षा करें...\n\n{0} सहायक को आपकी चैट में आमंत्रित किया जा रहा है..." +call_5: "{0} सहायक सफलतापूर्वक शामिल हो गया।\n\nप्रसारण शुरू करने का प्रयास किया जा रहा है..." +call_6: "» प्रसारण स्विच करने में विफल। कृपया पुनः /skip का उपयोग करके ट्रैक को फिर से बदलें।" +call_7: "» अगले ट्रैक को कतार से डाउनलोड किया जा रहा है।\n\nकृपया प्रतीक्षा करें..." +call_8: "↬ द्वारा जोड़ा गया :" + +auth_1: "» आपके समूह में केवल 25 प्रमाणित उपयोगकर्ताएँ हो सकती हैं।" +auth_2: "» {0} को प्रमाणित उपयोगकर्ताओं की सूची में जोड़ दिया गया है।" +auth_3: "{0} पहले से ही प्रमाणित उपयोगकर्ताओं की सूची में है।" +auth_4: "» {0} को प्रमाणित उपयोगकर्ताओं की सूची से हटा दिया गया है।" +auth_5: "{0} प्रमाणित उपयोगकर्ताओं की सूची में नहीं है।" +auth_6: "» प्रमाणित उपयोगकर्ताओं की सूची को पुनर्प्राप्त किया जा रहा है..." +auth_7: "» {0} की प्रमाणित उपयोगकर्ताओं की सूची में :\n\n" +auth_8: "↬ द्वारा जोड़ा गया :" + +reload_1: "» आपको केवल 3 मिनट में एक बार व्यवस्थापक कैश को ताज़ा करने की अनुमति होती है।\n\nकृपया {0} के बाद पुनः प्रयास करें।" +reload_2: "» व्यवस्थापक कैश सफलतापूर्वक ताज़ा किया गया।" +reload_3: "» व्यवस्थापक कैश को ताज़ा करने में विफल, सुनिश्चित करें कि बोट आपकी चैट में व्यवस्थापक है।" +reload_4: "» कृपया प्रतीक्षा करें...\n\n{0} को आपकी चैट के लिए दोबारा शुरू किया जा रहा है।" +reload_5: "{0} को आपकी चैट के लिए सफलतापूर्वक दोबारा आरंभ किया गया।\n\nफिर से प्रारंभ करने का प्रयास किया जा रहा है..." + +admin_1: "» क्या आपको याद है कि आपने प्रसारण को पुनः आरंभ किया था?" +admin_2: "➻ प्रसारण ठहरा दिया 🎄\n│ \n└द्वारा : {0} 🥀" +admin_3: "» क्या आपको याद है कि आपने प्रसारण को ठहराया था?" +admin_4: "➻ प्रसारण पुनः आरंभ 🎄\n│ \n└द्वारा : {0} 🥀" +admin_5: "➻ प्रसारण समाप्त/रोक दिया 🎄\n│ \n└द्वारा : {0} 🥀" +admin_6: "➻ प्रसारण रोका 🎄\n│ \n└द्वारा : {0} 🥀\n\n» {1} में अब कोई और ट्रैक कतार में नहीं है, वीडियोचैट छोड़ रहे हैं।" +admin_7: "स्ट्रीम {0} को बदलते समय त्रुटि।" +admin_8: "» कृपया लूप प्ले को अक्षम करें और फिर से स्किप का प्रयास करें। /loop disable के माध्यम से लूप प्ले को अक्षम करें।" +admin_9: "कृपया स्किप के लिए विशिष्ट संख्याएँ उपयोग करें, जैसे 1, 2, 4..." +admin_10: "कम से कम 2 ट्रैक्स की आवश्यकता होती है विशिष्ट स्किप के लिए।\n\nकृपया ट्रैक कतार देखें: /queue" +admin_11: "» ट्रैक्स कतार में पर्याप्त नहीं है विशिष्ट स्किप के लिए।\n\nकृपया 1 और {0} के बीच स्किप करें।" +admin_12: "» विशिष्ट ट्रैक पर स्किप करने में विफल।\n\nकृपया बचे हुए कतार की जाँच करें: /queue" +admin_13: "» कृपया व्यवस्थापक कैश को ताज़ा करें: /reload" +admin_14: "» वीडियो चैट प्रबंधित करने की अनुमति नहीं है।\n\nकृपया व्यवस्थापक कैश को ताज़ा करें: /reload" +admin_15: "» शफल करने में विफल।\n\nकतार देखें: /queue" +admin_16: "» कतार को शफल किया गया है {0} द्वारा।\n\nशफल किया गया कतार देखें: /queue" +admin_17: "{0} स्पीड नियंत्रण पैनल\n\nकर्रेंट प्लेइंग स्ट्रीम की स्पीड बदलने के लिए नीचे दिए गए बटन पर क्लिक करें।" +admin_18: "» {0} के लिए स्पीड चालू की गई है।\n\nद्वारा : {1}।" +admin_19: "» स्पीड कंट्रोल बंद किया गया है।\n\nद्वारा : {0}।" +admin_20: "उदाहरण:\n\n/seek या /seekback [सेकंड में अवधि]" +admin_21: "» कृपया सेकंड में अवधि के लिए केवल न्यूमेरिक डिजिट्स का उपयोग करें।" +admin_22: "» लाइव स्ट्रीम्स को सीक नहीं किया जा सकता।" +admin_23: "» कृपया कम अवधि में सीक करने का प्रयास करें।\n\n{0} मिनटों में प्ले हुआ, {1} मिनटों की क़तार से।" +admin_24: "सीक किया जा रहा है...\n\nकृपया प्रतीक्षा करें..." +admin_25: "» स्पीड के साथ सफलतापूर्वक सीक किया गया।\n\nअवधि : {0} मिनटों\nद्वारा : {1}" +admin_26: "सीक में विफल।" +admin_27: "» केवल यूट्यूब स्ट्रीम की स्पीड को वर्तमान में नियंत्रित किया जा सकता है।" +admin_28: "{0} स्पीड नियंत्रण पैनल\n\nकृपया वीडियो चैट पर प्लेइंग स्ट्रीम की स्पीड बदलने के लिए नीचे दिए गए बटनों पर क्लिक करें।" +admin_29: "» बॉट पहले से ही सामान्य स्पीड पर प्ले कर रहा है।" +admin_30: "» कृपया प्रतीक्षा करें...\n\nकोई अन्य व्यक्ति स्ट्रीम की स्पीड बदलने का प्रयास कर रहा है।" +admin_31: "स्पीड बदल रहा है..." +admin_32: "» चल रहे स्ट्रीम की स्पीड सफलतापूर्वक बदली गई।\n\nअनुरोधकर्ता : {0}" +admin_33: "» चल रहे स्ट्रीम की स्पीड बदलने में विफल।" +admin_34: "» चल रहे स्ट्रीम की स्पीड सफलतापूर्वक {0}x की गई।\n\nअनुरोधकर्ता : {1}" +admin_35: "मतदान समाप्त हो गया है क्योंकि वोटिंग प्रदान किए जाने वाले ट्रैक के लिए समाप्त हो गया है।" +admin_36: "इस क्रिया को करने में विफल क्योंकि वोटिंग प्रदान किए जाने वाले ट्रैक के लिए समाप्त हो गया है या वो रुका हुआ है।" +admin_37: "सफलतापूर्वक {0} अपवोट प्राप्त किए गए।" +admin_38: "» 1 अपवोट जोड़ा गया।" +admin_39: "» 1 अपवोट हटा दिया गया।" +admin_40: "अपवोट किया गया।" + +start_1 : "{0} जिंदा है बेबी।\n\n✫ उपकाल : {1}" +start_2 : "हे {0}, 🥀\n\n๏ यह {1} है !\n\n➻ एक तेज़ और शक्तिशाली टेलीग्राम संगीत प्लेयर बॉट जिसमें कुछ शानदार सुविधाएँ हैं।\n\nसमर्थित प्लेटफ़ॉर्म्स : यूट्यूब, स्पॉटिफ़ाई, रेसो, एप्पल म्यूज़िक और साउंडक्लाउड।\n──────────────────\n๏ मेरे मॉड्यूल्स और कमांड्स के बारे में जानकारी प्राप्त करने के लिए हेल्प बटन पर क्लिक करें।" +start_3 : "हे {0},\nयह {1} है\n\nआपके द्वारा {2} में मुझे जोड़ने के लिए धन्यवाद, {3} अब इस चैट में गाने बजा सकता है।" +start_4 : "🎄 सुपरग्रुप की आवश्यकता है 🎄\n\nकृपया अपने ग्रुप को सुपरग्रुप में बदलें और फिर मुझे फिर से जोड़ें।\n\nसुपरग्रुप कैसे बनाएं ?\n- अपने ग्रुप की चैट इतिहास को दृश्यमान बनाएं।" +start_5 : "↝ ब्लैकलिस्ट की गई चैट ↜\n\nयह चैट {0} डेटाबेस पर ब्लैकलिस्ट है।\nअपनी चैट को अनब्लैकलिस्ट करने के लिए सुडो उपयोगकर्ता से अनुरोध करें या समर्थन चैट पर जाएं।" +start_6 : "😲 ट्रैक जानकारी 😲\n\n📌 शीर्षक : {0}\n\n⏳ अवधि : {1} मिनट\n👀 दृश्य : {2}\n⏰ प्रकाशित हुआ : {3}\n📎 चैनल : {5}\n\n🥀 सर्च पावर्ड बाय {6}" + +help_1 : "इस ग्रुप के लिए उपयोगकर्ता की मदद के लिए कृपया उपयोगकर्ता जाति को चुनें।\nअपने संदेहों को पूछें समर्थन चैट में\n\nसभी कमांड्स का उपयोग करने के लिए : /" +help_2 : "अपने प्राइवेट में मेरे मदद मेनू प्राप्त करने के लिए कृपया नीचे दिए गए बटन पर क्लिक करें।" + +lang_1 : "» कृपया ग्रुप की डिफ़ॉल्ट भाषा के रूप में सेट करने के लिए भाषा चुनें :" +lang_2 : "भाषा सफलतापूर्वक बदल दी गई।" +lang_3 : "भाषा बदलने में विफल।" +lang_4 : "आप पहले से ही वही भाषा में हैं।" + +setting_1 : "{0} सेटिंग्स पैनल\n\nचैट आईडी : {1}\nचैट टाइटल : {2}\n\nसेटिंग्स बदलने के लिए नीचे दिए गए बटनों पर क्लिक करें." +setting_2 : "» डायरेक्ट: सीधे सर्च क्वेरी को चलाता है।\n\n» इनलाइन: वीडियो और ऑडियो के बीच चयन करने के लिए इनलाइन बटन्स प्रदान करता है।" +setting_3 : "» सभी: किसी भी व्यक्ति को इस ग्रुप में एडमिन कमांड्स [स्किप, पॉज, रिज्यूम आदि] का उपयोग करने की अनुमति है।\n\n» केवल एडमिन: केवल एडमिन और अधिकृत उपयोगकर्ता एडमिन कमांड्स का उपयोग कर सकते हैं।" +setting_4 : "» कोई अधिकृत उपयोगकर्ता नहीं मिले." +setting_5 : "» ग्रुप: ग्रुप में संगीत बजाता है जहां कमांड दी जाती है।\n\n» चैनल: वह चैनल चुनें जिसमें संगीत बजना है। /channelplay के माध्यम से चैनल आईडी सेट करें" +setting_6 : "» सभी: किसी भी व्यक्ति को इस ग्रुप में संगीत बजाने की अनुमति है।\n\n» केवल एडमिन: केवल एडमिन्स ही इस ग्रुप में संगीत बजा सकते हैं।" +setting_7 : "» कृपया /channelplay के माध्यम से चैनल आईडी सेट करें" +setting_8 : "जब यह मोड सक्षम होता है, तो वे लोग भी एडमिन कमांड्स का उपयोग कर सकते हैं जिनके पास एडमिन अधिकार नहीं होते हैं, एक निश्चित संख्या में वोट के बाद।" +setting_9 : "वर्तमान उपवोट्स की आवश्यकता जो एडमिन कमांड्स का उपयोग करने के लिए हैं : {0}" +setting_10 : "वोटिंग मोड अक्षम है।" +setting_11 : "न्यूनतम उपवोट्स की गिनती 2 हो सकती है। आप 2 से कम नहीं सेट कर सकते" +setting_12 : "अधिकतम उपवोट्स की गिनती 15 हो सकती है। आप 15 से अधिक नहीं सेट कर सकते" + +set_cb_1 : "आधीकृत उपयोगकर्ताओं का पैनल प्राप्त किया जा रहा है..." +set_cb_2 : "प्ले मोड पैनल प्राप्त किया जा रहा है..." +set_cb_3 : "सेटिंग्स बदल रहे हैं..." +set_cb_4 : "» आधीकृत उपयोगकर्ता सूची प्राप्त की जा रही है..." +set_cb_5 : "» पीछे जा रहे हैं..." + +gstats_1: "गेटिंग {0} स्टैट्स और इनफ़ोर्मेशन...\n\nइसमें समय लग सकता है, कृपया होल्ड ऑन..." +gstats_2: "क्लिक ऑन थे बट्टन्स बेलोव तो चेक थे स्टैट्स ऑफ {0}." +gstats_3: "{0} स्टैट्स और इनफ़ोर्मेशन :\n\nअसिस्टंट्स : {1}\nब्लॉक्ड : {2}\nचैट्स: {3}\nयूज़र्स : {4}\nमॉड्यूल्स : {5}\nसुडोएर्स : {6}\n\nऑटो लीविंग असिस्टंट : {7}\nप्ले दुरातिओन लिमिट : {8} मिनट्स" +gstats_4: "इस बट्टन इस ओनली फॉर सुडोएर्स." +gstats_5: "{0} स्टैट्स और इनफ़ोर्मेशन :\n\nमॉड्यूल्स : {1}\nप्लैटफॉर्म : {2}\nरैम : {3}\nफिजिकल कोर्स : {4}\nटोटल कोर्स : {5}\nसीपीयू फ़्रेक्वेंसी : {6}\n\nपायथन : {7}\nपायरोग्राम : {8}\nपाय-टीजीकैल्स : {9}\n\nस्टोरेज अवेलेबल : {10} गीब\nस्टोरेज यूज़्ड : {11} गीब\nस्टोरेज लेफ्ट : {12} गीब\n\nसर्व्ह्ड चैट्स : {13}\nसर्व्ह्ड यूज़र्स : {14}\nब्लॉक्ड यूज़र्स : {15}\nसुडो यूज़र्स : {16}\n\nटोटल डीबी साइज़ : {17} एम्बी\nटोटल डीबी स्टोरेज : {18} एम्बी\nटोटल डीबी कलेक्शन्स : {19}\nटोटल डीबी कीज़ : {20}" + +playcb_1: "» अव्व, थिस इस नोट फ़ॉर यू बेबी." +playcb_2: "» गेटिंग नेक्स्ट रेसुल्ट,\n\nप्लीज़ वेट..." + +cplay_1: "» यू कैन प्ले म्यूज़िक इन चैनल्स फ्रोम {0} तो अन्य चैनल और योर चैट्स लिंकेड चैनल.\n\nफ़ॉर लिंकेड चैनल :\n/channelplay linked\n\nफ़ॉर अन्य चैनल :\n/channelplay [चैनल आईडी]" +cplay_2: "» थिस चैट डोन'ट हेव अन्य लिंकेड चैनल." +cplay_3: "» चैनल डिफ़ाइन्ड टू {0}.\nचैनल आईडी : {1}" +cplay_4: "» फ़ेल्ड टो गेट चैनल.\n\nमेक सुरे यू'वे अद्देड थे बोट इन योर चैनल एंड प्रोमोटेड अस अद्मिन." +cplay_5: "ओन्ली चैनल्स आरे सुप्पोर्टेड." +cplay_6: "» यू नीड टो बी थे ओव्नर ऑफ थे चैनल {0} टो कन्नेक्ट इट विथ थिस ग्रूप.\nचैनल'स ओव्नर : @{1}\n\nआल्टरनटिवली यू कैन लिंक योर ग्रूप टो थाट चैनल एंड थेन ट्राई कन्नेक्टिंग विथ /channelplay linked" +cplay_7: "» चैनल प्लेय डिसअब्लेड." + +play_1: "🔎" +play_2: "➻ चैनल प्लेय मोड\n\nप्रोसेसिंग, प्लीज़ वेट...\n\nलिंकेड चैनल : {0}" +play_3: "» फ़ेल्ड टो प्रोसेस क़ुएरी." +play_4: "एड्मिन्स ओनली प्लेय\nओन्ली एड्मिन्स ऑफ थिस चैट आरे अल्लोवेड टो प्लेय\n\nचेंगे प्लेय मोड विआ /playmode" +play_5: "» फ़ेल्ड टो प्रोसेस ऑडियो फ़िले.\n\nऑडियो फ़िले सिज़े इस लार्जर थान थे डिफ़ाइन्ड लिमिट." +play_6: "» स्ट्रीम'स लोंगेर थान {0} आरें'ट अल्लोवेड टो प्लेय ऑन {1}" +play_7: "» नोट अ वैलिड विडियो फ़िले एक्सटेंशन.\n\nसुप्पोर्टेड एक्सटेंशन्स : {0}" +play_8: "» विडियो फ़िले सिज़े शोल्ड बी लेस थान 1गीब." +play_9: "यूट्यूब प्लेयलिस्ट फीचर\n\nसेलेक्ट थे मोड इन व्हिच यू वॉन्ट टो प्लेय होले यूट्यूब प्लेयलिस्ट." +play_10: "टाइटल : {0}\nड्युरेशन : {1} मिनट्स" +play_11: "{0} स्पोटिफ़ाई प्लेयर\n\nरिक्वेस्टेड बाय : {1}" +play_12: "{0} अप्प्ले प्लेयर\n\nरिक्वेस्टेड बाय : {1}" +play_13: "» लाइव स्ट्रीम डिटेक्टेड.\n\nआरे यू सुरे थाट यू वॉन्ट टो प्लेय लाइव स्ट्रीम इन थिस चैनल?" +play_14: "ट्रैक डिटेल्स प्राप्त करने में विफल।\n\nकृपया कोई अन्य ट्रैक प्ले करने का प्रयास करें।" +play_15: "» क्वेरी प्रोसेस करने में विफल।\n\nमैं केवल स्पॉटिफाई ट्रैक्स, एल्बम्स, कलाकारों और प्लेलिस्ट्स प्ले कर सकता हूँ।" +play_16: "कोई सक्रिय वॉयस चैट नहीं।\n\nफोर्स प्ले का उपयोग करने के लिए किसी सक्रिय वॉयस चैट होनी चाहिए।" +play_17: "कृपया वीडियो चैट ऑन करें, मैं URL्स को स्ट्रीम करने में असमर्थ हूँ।" +play_18: "उपयोग: /play [गाने का नाम/YouTube URL/ऑडियो/वीडियो फ़ाइल का उत्तर]" +play_19: "कतार में जोड़ा गया प्लेलिस्ट:" +play_20: "कतार में स्थिति-" +play_21: "{0} ट्रैक्स को कतार में जोड़ा गया।\n\nजाँच करें: यहाँ क्लिक करें" +play_22: "आपके ग्रुप के अंदर क्यूइड सूचियों को प्ले करने के लिए आपके द्वारा चुने गए मोड: {0}" + +str_1 : "कृपया m3u8 या इंडेक्स लिंक्स प्रदान करें।" +str_2 : "➻ मान्य स्ट्रीम सत्यापित।\n\nप्रोसेसिंग..." +str_3 : "यूट्यूब लाइव स्ट्रीम प्ले करने में विफल। कोई लाइव प्रारूप नहीं मिला।" + +ping_1 : "{0} पिंग कर रहा है..." +ping_2 : "🏓 पोंग : {0}ms\n\n{1} सिस्टम स्थिति :\n\n↬ अपटाइम : {2}\n↬ रैम : {3}\n↬ सीपीयू : {4}\n↬ डिस्क : {5}\n↬ पायथन-टीजीसीएल : {6}ms" + +queue_1 : "» कतार प्राप्त हो रही है...\n\nकृपया प्रतीक्षा करें..." +queue_2 : "» कतार खाली है।" +queue_3 : "» कतार में ट्रैकों की सूची देखने के लिए यहाँ क्लिक करें : यहाँ" +queue_4 : "➲ कतार में जोड़ा गया #{0}\n\n‣ शीर्षक : {1}\n‣ अवधि : {2} मिनट\n‣ द्वारा अनुरोधित : {3}" +queue_5 : "केवल एक कतार में ट्रैक है।\n\nलिस्ट देखने के लिए अधिक ट्रैक जोड़ें।" +queue_6 : "🕚 अवधि : अज्ञात स्ट्रीम\n\nपूरी कतार की सूची प्राप्त करने के लिए नीचे बटन पर क्लिक करें।" +queue_7 : "\nनीचे बटन पर क्लिक करें।" +queue_8 : "{0} प्लेयर\n\n🎄 स्ट्रीमिंग : {1}\n\n🔗 स्ट्रीम प्रकार : {2}\n🥀 अनुरोधक : {3}\n{4}" + +stream_1 : "➲ स्ट्रीमिंग शुरू की गई |\n\n‣ शीर्षक : {1}\n‣ अवधि : {2} मिनट\n‣ द्वारा अनुरोधित : {3}" +stream_2 : "➲ स्ट्रीमिंग शुरू की गई |\n\n‣ स्ट्रीम प्रकार : लाइव स्ट्रीम [URL]\n‣ द्वारा अनुरोधित : {0}" + +CLOSE_BUTTON : "बंद करें" +BACK_BUTTON : "वापस" + +S_B_1 : "मुझे जोड़ें" +S_B_2 : "समर्थन" +S_B_3 : "मुझे अपने समूह में जोड़ें" +S_B_4 : "मदद और कमांड्स" +S_B_5 : "डेवलपर" +S_B_6 : "चैनल" +S_B_7 : "स्रोत कोड" +S_B_8 : "👀 YouTube 👀" +S_B_9 : "🥀 समर्थन 🥀" + +H_B_1 : "एडमिन" +H_B_2 : "ऑथ" +H_B_3 : "ब्रॉडकास्ट" +H_B_4 : "सुड" +H_B_5 : "उपयोगकर" +H_B_6 : "गाना" + +P_B_1 : "ऑडियो" +P_B_2 : "वीडियो" +P_B_3 : "लाइव स्ट्रीम" +P_B_4 : "नॉर्मल" + +ST_B_1 : "ऑथ उपयोगकर्ता" +ST_B_2 : "प्ले मोड" +ST_B_3 : "भाषा" +ST_B_4 : "वोटिंग मोड" +ST_B_5 : "चालू" +ST_B_6 : "बंद" +ST_B_7 : "ऑथ उपयोगकर्ता ➜" +ST_B_8 : "व्यवस्थापक" +ST_B_9 : "सभी" +ST_B_10 : "खोज मोड ➜" +ST_B_11 : "प्रत्यक्ष" +ST_B_12 : "इनलाइन" +ST_B_13 : "व्यवस्थापक कमांड ➜" +ST_B_14 : "प्ले प्रकार ➜" + +SA_B_1 : "कुल स्थितियाँ" +SA_B_2 : "सामान्य" +SA_B_3 : "कुल" + +QU_B_1 : "कतार" +QU_B_2 : " {0} —————————— {1}" + +sudo_1 : "» {0} पहले से ही सुडो उपयोगकर्ताओं की सूची में है।" +sudo_2 : "» {0} को सुडो उपयोगकर्ताओं की सूची में जोड़ दिया गया।" +sudo_3 : "» {0} सुडो उपयोगकर्ताओं की सूची में नहीं है।" +sudo_4 : "» {0} को सुडो उपयोगकर्ताओं की सूची से हटा दिया गया।" +sudo_5 : "🥀 मालिक :\n" +sudo_6 : "\n✨ सुडो उपयोगकर्ताएँ :\n" +sudo_7 : "» सुडो उपयोगकर्ताएँ नहीं मिलीं।" +sudo_8 : "विफल।" + +block_1 : "» {0} पहले से ही ब्लॉक किया गया है।" +block_2 : "» {0} को ब्लॉक की सूची में जोड़ दिया गया।" +block_3 : "» {0} ब्लॉक की सूची में नहीं है।" +block_4 : "» {0} को ब्लॉक की सूची से हटा दिया गया।" +block_5 : "» ब्लॉक की सूची में कोई उपयोगकर्ता नहीं मिला।" +block_6 : "» ब्लॉक की सूची मिल रही है..." +block_7 : "😫 ब्लॉक की सूची :\n\n" + +black_1 : "उदाहरण :\n\n/blacklistchat [चैट आईडी]" +black_2 : "» यह चैट पहले से ही ब्लैकलिस्ट की सूची में है।" +black_3 : "» सफलतापूर्वक ब्लैकलिस्ट में जोड़ दिया गया।" +black_4 : "उदाहरण :\n\n/whitelistchat [चैट आईडी]" +black_5 : "» यह चैट ब्लैकलिस्ट की सूची में नहीं है।" +black_6 : "» सफलतापूर्वक ब्लैकलिस्ट से हटा दिया गया।" +black_7 : "» ब्लैकलिस्ट की सूची :\n\n" +black_8 : "» {0} के ऊपर कोई चैट ब्लैकलिस्ट की सूची में नहीं है।" +black_9 : "» कुछ गड़बड़ हो गई।" + +maint_1 : "उदाहरण :\n/maintenance [on|off]" +maint_2 : "» {0} ने मेंटेनेंस मोड सक्रिय किया।" +maint_3 : "» {0} ने मेंटेनेंस मोड अक्षम किया।" +maint_4 : "» मेंटेनेंस मोड पहले से ही सक्रिय है।" +maint_5 : "» मेंटेनेंस मोड पहले से ही अक्षम है।" + +log_1 : "उदाहरण :\n/logger [on|off]" +log_2 : "लॉगिंग सक्रिय किया" + +broad_1 : "» प्रसारण शुरू किया जा रहा है..." +broad_2 : "उदाहरण :\n\n/broadcast [संदेश या किसी संदेश के उत्तर में]" +broad_3 : "» संदेश को {0} चैट्स में प्रसारित किया गया, {1} पिन से बोट से।" +broad_4 : "» संदेश को {0} उपयोगकर्ताओं को प्रसारित किया गया।" +broad_5 : "» सहायक प्रसारण शुरू कर रहा है..." +broad_6 : "➻ सहायक प्रसारण :\n\n" +broad_7 : "↬ सहायक ने {0} चैटों में प्रसारित किया, {1} से।" +broad_8 : "» कृपया प्रसारित करने के लिए कुछ टेक्स्ट प्रदान करें।" + +server_1 : "» लॉग्स प्राप्त करने में विफल हुआ।" +server_2 : "कृपया सुनिश्चित करें कि आपका Heroku API कुंजी और ऐप का नाम सही रूप से कॉन्फ़िगर किए गए हैं।" +server_3 : "उपलब्ध अपडेटों की जांच की जा रही है..." +server_4 : "git कमांड त्रुटि।" +server_5 : "अमान्य git रिपॉजिटरी।" +server_6 : "» बोट अप-टू-डेट है।" +server_7 : "» बोट को सफलतापूर्वक अपडेट किया गया! अब कुछ मिनटों तक प्रतीक्षा करें जब तक बोट पुनरारंभ और परिवर्तनों को पुश नहीं करता है!" +server_8 : "{0} रीस्टार्ट हो रहा है...\n\n15-20 सेकंड के बाद आप फिर से खेलना शुरू कर सकते हैं।" +server_9 : "कुछ गलत हो गया, कृपया लॉग जांचें।" +server_10 : "{0} पर एक अपवाद हुआ #अपडेटर में : {0}" +server_11 : "» एक स्पीड टेस्ट चल रहा है..." +server_12 : "⇆ डाउनलोड स्पीड टेस्ट चल रहा है..." +server_13 : "⇆ अपलोड स्पीड टेस्ट चल रहा है..." +server_14 : "↻ स्पीड टेस्ट परिणाम साझा किए जा रहे हैं..." +server_15 : "✯ स्पीड टेस्ट परिणाम ✯\n\nग्राहक :\n» आईपी : {0}\n» देश : {1}\n\nसर्वर :\n» नाम : {2}\n» देश : {3}, {4}\nस्पॉन्सर : {5}\nलैटेंसी : {6}\nपिंग : {7}" + +gban_1 : "» तुमने क्यों खुद को ग्लोबल बैन करना चाहा बेबी?" +gban_2 : "» मैं क्यों खुद को ग्लोबल बैन करूँ?" +gban_3 : "» तुम मेरे सुडोएर्स को ग्लोबल बैन नहीं कर सकते।" +gban_4 : "» {0} पहले से ही बोट से ग्लोबल बैन है।" +gban_5 : "» {0} पर ग्लोबल बैन को आरंभ किया जा रहा है।\n\nप्रत्याशित समय: {1}" +gban_6 : "नया ग्लोबल बैन {0} पर:\n\nमूल श्रोत से: {1} [{2}]\nउपयोगकर्ता: {3}\nउपयोगकर्ता आईडी: {4}\n\nद्वारा बैन किया गया: {5}\nचैट्स: {6}" +gban_7 : "» {0} बोट से ग्लोबल बैन नहीं है।" +gban_8 : "» {0} से ग्लोबल बैन को हटाया जा रहा है।\n\nप्रत्याशित समय: {1}" +gban_9 : "» {0} से ग्लोबल बैन हटाया गया है।\n\n{1} चैट्स में अनबैन हो गया है।" +gban_10 : "» किसी भी उपयोगकर्ता को बोट से ग्लोबल बैन नहीं किया गया है।" +gban_11 : "» ग्लोबल बैन उपयोगकर्ता सूची प्राप्त की जा रही है..." +gban_12 : "🙂 ग्लोबल बैन उपयोगकर्ता :\n\n" From 9449c5e52b79a620c830b35df8bb087511876f5d Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:28:12 +0530 Subject: [PATCH 046/184] adding buttons txt --- strings/helpers.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/strings/helpers.py b/strings/helpers.py index 3c7ba9f8dee0..719a1fc78ace 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -92,7 +92,29 @@ HELP_6 = """ ● sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ ➥ -● /song [sᴏɴɢ ɴᴀᴍᴇ] ➥ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴʏ ᴛʀᴀᴄᴋ ғʀᴏᴍ ʏᴏᴜᴛᴜʙᴇ ɪɴ ᴍᴘ3 ᴏʀ ᴍᴘ4 ғᴏʀᴍᴀᴛs. +● /song [sᴏɴɢ ɴᴀᴍᴇ] ➥ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴʏ ᴛʀᴀᴄᴋ ғʀᴏᴍ sᴘᴏᴛɪғʏ ɪɴ ᴍᴘ4 ғᴏʀᴍᴀᴛs. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" + +HELP_7 = """ + ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ ➥ + +⬤ /q ➥ ᴄʀᴇᴀᴛᴇ ᴀ ǫᴜᴏᴛᴇ ғʀᴏᴍ ᴛʜᴇ ᴍᴇssᴀɢᴇ. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" +HELP_8 = """ + sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs ➥ + +⬤ /stickerid ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴍᴇ ᴛᴏ ᴛᴇʟʟ ʏᴏᴜ ɪᴛs ғɪʟᴇ ɪᴅ. +⬤ /kang ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴀᴅᴅ ɪᴛ ᴛᴏ ʏᴏᴜʀ ᴘᴀᴄᴋ. + +❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +""" +HELP_9 = """ + ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs Date: Mon, 18 Nov 2024 19:33:46 +0530 Subject: [PATCH 047/184] adding buttons code --- TanuMusic/utils/inline/help.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/TanuMusic/utils/inline/help.py b/TanuMusic/utils/inline/help.py index a32da9c13f55..ed66ac81259a 100644 --- a/TanuMusic/utils/inline/help.py +++ b/TanuMusic/utils/inline/help.py @@ -44,6 +44,20 @@ def help_pannel(_, START: Union[bool, int] = None): callback_data="help_callback hb6", ), ], + [ + InlineKeyboardButton( + text=_["H_B_7"], + callback_data="help_callback hb13", + ), + InlineKeyboardButton( + text=_["H_B_8"], + callback_data="help_callback hb14", + ), + InlineKeyboardButton( + text=_["H_B_9"], + callback_data="help_callback hb15", + ), + ], mark, ] ) @@ -73,4 +87,4 @@ def private_help_panel(_): ), ], ] - return buttons + return buttons \ No newline at end of file From 22063dc2651cecc1d614578bb5cd6f9966ab2f93 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:36:59 +0530 Subject: [PATCH 048/184] nothing --- strings/langs/en.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 68dcd302a1bf..8f17b2ac9034 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -197,6 +197,9 @@ H_B_3 : "ʙʀᴏᴀᴅᴄᴀsᴛ" H_B_4 : "sᴜᴅᴏ" H_B_5 : "ᴜsᴇʀ" H_B_6 : "sᴏɴɢ" +H_B_7 : "ǫᴜᴏᴛʟʏ" +H_B_8 : "sᴛɪᴄᴋᴇʀ" +H_B_9 : "ɪᴍᴀɢᴇ" P_B_1 : "ᴀᴜᴅɪᴏ" P_B_2 : "ᴠɪᴅᴇᴏ" From 44b3874f9a7341ea3b0ecdbe5dbb78ccc8437645 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:49:13 +0530 Subject: [PATCH 049/184] nothing --- TanuMusic/utils/inline/help.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TanuMusic/utils/inline/help.py b/TanuMusic/utils/inline/help.py index ed66ac81259a..08b1bbee6c54 100644 --- a/TanuMusic/utils/inline/help.py +++ b/TanuMusic/utils/inline/help.py @@ -47,15 +47,15 @@ def help_pannel(_, START: Union[bool, int] = None): [ InlineKeyboardButton( text=_["H_B_7"], - callback_data="help_callback hb13", + callback_data="help_callback hb7", ), InlineKeyboardButton( text=_["H_B_8"], - callback_data="help_callback hb14", + callback_data="help_callback hb8", ), InlineKeyboardButton( text=_["H_B_9"], - callback_data="help_callback hb15", + callback_data="help_callback hb9", ), ], mark, From f6c27873ecc64bdcacb9dedcd7a90aa783f253f2 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:57:21 +0530 Subject: [PATCH 050/184] Update helpers.py --- strings/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/helpers.py b/strings/helpers.py index 719a1fc78ace..807121bf3a5b 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -113,7 +113,7 @@ ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_9 = """ - ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs ➥ ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ From 354a5070f1f5dae703dffef8e6dceb0e6608ed57 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:50:49 +0530 Subject: [PATCH 051/184] Update config.py --- config/config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/config.py b/config/config.py index dd989ac0391c..7619f2800834 100644 --- a/config/config.py +++ b/config/config.py @@ -34,7 +34,9 @@ LOGGER_ID = int(getenv("LOGGER_ID", "-1002100219353")) #❖ Get this value from @MissRose_bot on Telegram by /id -OWNER_ID = getenv("OWNER_ID", "7453278496") +OWNER_ID = list( + map(int, getenv("OWNER_ID", "7453278496").split()) +) #❖ Your heroku app name HEROKU_APP_NAME = getenv("HEROKU_APP_NAME", None) From 82692dbac3e259a43cab1730e2a15eeb3d1efdb3 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:06:16 +0530 Subject: [PATCH 052/184] Update misc.py --- TanuMusic/misc.py | 49 ++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py index cac1ac864409..5333e97bdc45 100644 --- a/TanuMusic/misc.py +++ b/TanuMusic/misc.py @@ -11,6 +11,7 @@ SUDOERS = filters.user() + HAPP = None _boot_ = time.time() @@ -32,33 +33,41 @@ def is_heroku(): "https", str(config.HEROKU_APP_NAME), "HEAD", - "master", + "main", ] def dbb(): global db + global clonedb db = {} - LOGGER(__name__).info(f"❖ Local Database Initialized...💛") + clonedb = {} + LOGGER(__name__).info(f"✦ Local Database Initialized...💛.") -async def sudo(): +def sudo(): global SUDOERS - SUDOERS.add(config.OWNER_ID) - sudoersdb = mongodb.sudoers - sudoers = await sudoersdb.find_one({"sudo": "sudo"}) - sudoers = [] if not sudoers else sudoers["sudoers"] - if config.OWNER_ID not in sudoers: - sudoers.append(config.OWNER_ID) - await sudoersdb.update_one( - {"sudo": "sudo"}, - {"$set": {"sudoers": sudoers}}, - upsert=True, - ) - if sudoers: - for user_id in sudoers: + OWNER = config.OWNER_ID + if config.MONGO_DB_URI is None: + for user_id in OWNER: + SUDOERS.add(user_id) + else: + sudoersdb = mongodb.sudoers + sudoers = sudoersdb.find_one({"sudo": "sudo"}) + sudoers = [] if not sudoers else sudoers["sudoers"] + for user_id in OWNER: SUDOERS.add(user_id) - LOGGER(__name__).info(f"❖ Sudoers Loaded...❤️") + if user_id not in sudoers: + sudoers.append(user_id) + sudoersdb.update_one( + {"sudo": "sudo"}, + {"$set": {"sudoers": sudoers}}, + upsert=True, + ) + if sudoers: + for x in sudoers: + SUDOERS.add(x) + LOGGER(__name__).info(f"✦ Sudoers Loaded...❤️.") def heroku(): @@ -68,8 +77,8 @@ def heroku(): try: Heroku = heroku3.from_key(config.HEROKU_API_KEY) HAPP = Heroku.app(config.HEROKU_APP_NAME) - LOGGER(__name__).info(f"❖ Heroku App Configured...💙") + LOGGER(__name__).info(f"✦ Heroku App Configured...💙") except BaseException: LOGGER(__name__).warning( - f"❖ Please make sure your Heroku API Key and Your App name are configured correctly in the heroku...💚" - ) + f"✦ Please make sure your Heroku API Key and Your App name are configured correctly in the heroku...💚." + ) \ No newline at end of file From f8cd2d130128f151fb1273e6cb2cf9a7e55d6674 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:06:32 +0530 Subject: [PATCH 053/184] Update misc.py --- TanuMusic/misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py index 5333e97bdc45..73b46b099548 100644 --- a/TanuMusic/misc.py +++ b/TanuMusic/misc.py @@ -33,7 +33,7 @@ def is_heroku(): "https", str(config.HEROKU_APP_NAME), "HEAD", - "main", + "master", ] From 7376fc405608de5637d25e372e04ccdcf2b76154 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:27:57 +0530 Subject: [PATCH 054/184] Update misc.py --- TanuMusic/misc.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py index 73b46b099548..0bc2b6d83e35 100644 --- a/TanuMusic/misc.py +++ b/TanuMusic/misc.py @@ -45,7 +45,7 @@ def dbb(): LOGGER(__name__).info(f"✦ Local Database Initialized...💛.") -def sudo(): +async def sudo(): global SUDOERS OWNER = config.OWNER_ID if config.MONGO_DB_URI is None: @@ -53,13 +53,13 @@ def sudo(): SUDOERS.add(user_id) else: sudoersdb = mongodb.sudoers - sudoers = sudoersdb.find_one({"sudo": "sudo"}) - sudoers = [] if not sudoers else sudoers["sudoers"] + sudoers = await sudoersdb.find_one({"sudo": "sudo"}) # Await the database call + sudoers = [] if not sudoers else sudoers.get("sudoers", []) for user_id in OWNER: SUDOERS.add(user_id) if user_id not in sudoers: sudoers.append(user_id) - sudoersdb.update_one( + await sudoersdb.update_one( {"sudo": "sudo"}, {"$set": {"sudoers": sudoers}}, upsert=True, From 1293ca4a833930e85591efbbb95853b559f8e5ba Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:37:29 +0530 Subject: [PATCH 055/184] fix sudo listsudo --- TanuMusic/plugins/sudo/sudoers.py | 63 ++++++++++++++++++------------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/TanuMusic/plugins/sudo/sudoers.py b/TanuMusic/plugins/sudo/sudoers.py index dfb8ece08c4a..95f31d5dc17f 100644 --- a/TanuMusic/plugins/sudo/sudoers.py +++ b/TanuMusic/plugins/sudo/sudoers.py @@ -43,29 +43,40 @@ async def userdel(client, message: Message, _): else: await message.reply_text(_["sudo_8"]) - -@app.on_message(filters.command(["sudolist", "listsudo", "sudoers"]) & ~BANNED_USERS) -@language -async def sudoers_list(client, message: Message, _): - text = _["sudo_5"] - user = await app.get_users(OWNER_ID) - user = user.first_name if not user.mention else user.mention - text += f"❖ {user}\n" - count = 0 - smex = 0 - for user_id in SUDOERS: - if user_id != OWNER_ID: - try: - user = await app.get_users(user_id) - user = user.first_name if not user.mention else user.mention - if smex == 0: - smex += 1 - text += _["sudo_6"] - count += 1 - text += f"❖ {count} ➥ {user}\n" - except: - continue - if not text: - await message.reply_text(_["sudo_7"]) - else: - await message.reply_text(text, reply_markup=close_markup(_)) +@app.on_message(filters.command(["sudolist", "listsudo", "sudoers"]) & ~BANNED_USERS) +@language +async def sudoers_list(client, message: Message, _): + text = _["sudo_5"] + count = 0 + smex = 0 + + # Ensure OWNER_ID is a single user ID or handle multiple owners + if isinstance(config.OWNER_ID, list): + for owner_id in config.OWNER_ID: + user = await app.get_users(owner_id) + user = user.first_name if not hasattr(user, "mention") else user.mention + text += f"❖ {user}\n" + else: + user = await app.get_users(config.OWNER_ID) + user = user.first_name if not hasattr(user, "mention") else user.mention + text += f"❖ {user}\n" + + # Loop through SUDOERS and list them + for user_id in SUDOERS: + if user_id != config.OWNER_ID: + try: + user = await app.get_users(user_id) + user = user.first_name if not hasattr(user, "mention") else user.mention + if smex == 0: + smex += 1 + text += _["sudo_6"] + count += 1 + text += f"❖ {count} ➥ {user}\n" + except Exception as e: + continue # Skip if fetching user details fails + + if count == 0: + text += _["sudo_7"] + + # Send response + await message.reply_text(text, reply_markup=close_markup(_)) \ No newline at end of file From 6f5f7ea2ef5da8a87e96ea0f1ea5b1ed6d9b3d92 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:47:53 +0530 Subject: [PATCH 056/184] Update sudoers.py --- TanuMusic/plugins/sudo/sudoers.py | 60 ++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/TanuMusic/plugins/sudo/sudoers.py b/TanuMusic/plugins/sudo/sudoers.py index 95f31d5dc17f..f1a7a07e49c7 100644 --- a/TanuMusic/plugins/sudo/sudoers.py +++ b/TanuMusic/plugins/sudo/sudoers.py @@ -47,36 +47,56 @@ async def userdel(client, message: Message, _): @language async def sudoers_list(client, message: Message, _): text = _["sudo_5"] - count = 0 - smex = 0 - - # Ensure OWNER_ID is a single user ID or handle multiple owners - if isinstance(config.OWNER_ID, list): + + # Handle OWNER_ID as a list + if isinstance(config.OWNER_ID, (list, tuple, set)): for owner_id in config.OWNER_ID: user = await app.get_users(owner_id) - user = user.first_name if not hasattr(user, "mention") else user.mention - text += f"❖ {user}\n" + if isinstance(user, list): # Handle multiple users returned + for u in user: + user_text = u.mention if hasattr(u, "mention") else u.first_name + text += f"❖ {user_text}\n" + else: + user_text = user.mention if hasattr(user, "mention") else user.first_name + text += f"❖ {user_text}\n" else: user = await app.get_users(config.OWNER_ID) - user = user.first_name if not hasattr(user, "mention") else user.mention - text += f"❖ {user}\n" + if isinstance(user, list): + for u in user: + user_text = u.mention if hasattr(u, "mention") else u.first_name + text += f"❖ {user_text}\n" + else: + user_text = user.mention if hasattr(user, "mention") else user.first_name + text += f"❖ {user_text}\n" + + count = 0 + smex = 0 - # Loop through SUDOERS and list them + # Loop through SUDOERS to list them for user_id in SUDOERS: - if user_id != config.OWNER_ID: + if user_id not in config.OWNER_ID: # Avoid listing owners twice try: user = await app.get_users(user_id) - user = user.first_name if not hasattr(user, "mention") else user.mention - if smex == 0: - smex += 1 - text += _["sudo_6"] - count += 1 - text += f"❖ {count} ➥ {user}\n" + if isinstance(user, list): # Handle multiple users + for u in user: + user_text = u.mention if hasattr(u, "mention") else u.first_name + if smex == 0: + smex += 1 + text += _["sudo_6"] + count += 1 + text += f"❖ {count} ➥ {user_text}\n" + else: + user_text = user.mention if hasattr(user, "mention") else user.first_name + if smex == 0: + smex += 1 + text += _["sudo_6"] + count += 1 + text += f"❖ {count} ➥ {user_text}\n" except Exception as e: - continue # Skip if fetching user details fails - + continue # Skip if user lookup fails + if count == 0: text += _["sudo_7"] - # Send response + # Reply with the sudoers list await message.reply_text(text, reply_markup=close_markup(_)) \ No newline at end of file From 78756067e605dfc39f5be6271ef1654e6fd4a5b3 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 19 Nov 2024 19:04:48 +0530 Subject: [PATCH 057/184] Update sudoers.py --- TanuMusic/plugins/sudo/sudoers.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TanuMusic/plugins/sudo/sudoers.py b/TanuMusic/plugins/sudo/sudoers.py index f1a7a07e49c7..b5f51ca424a6 100644 --- a/TanuMusic/plugins/sudo/sudoers.py +++ b/TanuMusic/plugins/sudo/sudoers.py @@ -49,8 +49,8 @@ async def sudoers_list(client, message: Message, _): text = _["sudo_5"] # Handle OWNER_ID as a list - if isinstance(config.OWNER_ID, (list, tuple, set)): - for owner_id in config.OWNER_ID: + if isinstance(OWNER_ID, (list, tuple, set)): # Use imported OWNER_ID directly + for owner_id in OWNER_ID: user = await app.get_users(owner_id) if isinstance(user, list): # Handle multiple users returned for u in user: @@ -60,7 +60,7 @@ async def sudoers_list(client, message: Message, _): user_text = user.mention if hasattr(user, "mention") else user.first_name text += f"❖ {user_text}\n" else: - user = await app.get_users(config.OWNER_ID) + user = await app.get_users(OWNER_ID) if isinstance(user, list): for u in user: user_text = u.mention if hasattr(u, "mention") else u.first_name @@ -74,7 +74,7 @@ async def sudoers_list(client, message: Message, _): # Loop through SUDOERS to list them for user_id in SUDOERS: - if user_id not in config.OWNER_ID: # Avoid listing owners twice + if user_id not in OWNER_ID: # Avoid listing owners twice try: user = await app.get_users(user_id) if isinstance(user, list): # Handle multiple users From cf5ad6dbe07e1a84c040ffc9054bc74066e2e010 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 20 Nov 2024 21:15:21 +0530 Subject: [PATCH 058/184] Update ar.yml --- strings/langs/ar.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/strings/langs/ar.yml b/strings/langs/ar.yml index b37930121867..55d0910d4493 100644 --- a/strings/langs/ar.yml +++ b/strings/langs/ar.yml @@ -208,7 +208,9 @@ H_B_3 : "إذاعة" H_B_4 : "سودو" H_B_5 : "مستخدم" H_B_6 : "أغنية" - +H_B_7 : "اقتباسات" +H_B_8 : "ملصق" +H_B_9 : "صورة" P_B_1 : "صوتي" P_B_2 : "فيديو" From cedb9556e0ea34b38b51f03b32f3e3cad73c1e50 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 20 Nov 2024 21:20:30 +0530 Subject: [PATCH 059/184] Update hi.yml --- strings/langs/hi.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/strings/langs/hi.yml b/strings/langs/hi.yml index 01b961cf28a7..7c91b3aa92b6 100644 --- a/strings/langs/hi.yml +++ b/strings/langs/hi.yml @@ -194,6 +194,9 @@ H_B_3 : "ब्रॉडकास्ट" H_B_4 : "सुड" H_B_5 : "उपयोगकर" H_B_6 : "गाना" +H_B_7 : "उद्धृत" +H_B_8 : "कँटिया" +H_B_9 : "छवि" P_B_1 : "ऑडियो" P_B_2 : "वीडियो" From 2979d2aa6a71ad5bb13a09ebc95e7f99ecf29eed Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 20 Nov 2024 21:27:11 +0530 Subject: [PATCH 060/184] Update pa.yml --- strings/langs/pa.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/strings/langs/pa.yml b/strings/langs/pa.yml index 7f57c3215091..e7b19242a015 100644 --- a/strings/langs/pa.yml +++ b/strings/langs/pa.yml @@ -196,14 +196,8 @@ H_B_4 : "ਬਲ-ਚੈਟ" H_B_5 : "ਬਲ-ਯੂਜ਼ਰ" H_B_6 : "ਸੀ-ਪਲੇ" H_B_7 : "ਜੀ-ਬੈਨ" -H_B_8 : "ਲੂਪ" -H_B_9 : "ਮੈਂਟੀਨੈਂਸ" -H_B_10 : "ਪਿੰਗ" -H_B_11 : "ਪਲੇ" -H_B_12 : "ਸ਼ਫਲ" -H_B_13 : "ਸੀਕ" -H_B_14 : "ਗੀਤ" -H_B_15 : "ਸਪੀਡ" +H_B_8 : "ਸਟਿੱਕਰ" +H_B_9 : "ਚਿੱਤਰ" P_B_1 : "ਆਡੀਓ" P_B_2 : "ਵੀਡੀਓ" From d470570d1f6e3180ac0a07326719e05cd60a516e Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 20 Nov 2024 23:17:23 +0530 Subject: [PATCH 061/184] Update tools --- TanuMusic/plugins/tools/ask.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 TanuMusic/plugins/tools/ask.py diff --git a/TanuMusic/plugins/tools/ask.py b/TanuMusic/plugins/tools/ask.py new file mode 100644 index 000000000000..4d48da895a95 --- /dev/null +++ b/TanuMusic/plugins/tools/ask.py @@ -0,0 +1,25 @@ +import requests +from pyrogram import filters +from TanuMusic import app + +@app.on_message(filters.command("ask")) +def search_api(client, message): + # Check if the user provided a query + query = " ".join(message.command[1:]) if len(message.command) > 1 else None + if not query: + # Prompt the user for a query if none is provided + return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ᴀsᴋ.") + + try: + # Send request to the search API + url = f"https://search.codesearch.workers.dev/?query={query}" + response = requests.get(url).json() + results = response.get("results", []) + + # Send only the search results + if results: + message.reply_text("\n".join(results)) # Send results as plain text + else: + message.reply_text("ɴᴏᴛ ʀᴇsᴘᴏɴsᴇ ғᴏᴜɴᴅ ғᴏʀᴍ ᴀᴘɪ.") + except Exception as e: + message.reply_text(f"An error occurred: {str(e)}") \ No newline at end of file From ad4cdbf58fff8084fadef6294ee8b6e2d596a50d Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 20 Nov 2024 23:26:45 +0530 Subject: [PATCH 062/184] Update ask.py --- TanuMusic/plugins/tools/ask.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/TanuMusic/plugins/tools/ask.py b/TanuMusic/plugins/tools/ask.py index 4d48da895a95..5ce330e2915b 100644 --- a/TanuMusic/plugins/tools/ask.py +++ b/TanuMusic/plugins/tools/ask.py @@ -7,19 +7,28 @@ def search_api(client, message): # Check if the user provided a query query = " ".join(message.command[1:]) if len(message.command) > 1 else None if not query: - # Prompt the user for a query if none is provided return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ᴀsᴋ.") try: # Send request to the search API url = f"https://search.codesearch.workers.dev/?query={query}" - response = requests.get(url).json() - results = response.get("results", []) - - # Send only the search results + response = requests.get(url) + + # Check if the response is valid + if response.status_code != 200: + return message.reply_text(f"API returned an error: {response.status_code}") + + # Parse JSON response + try: + data = response.json() + except ValueError: + return message.reply_text("API returned invalid data.") + + # Extract results + results = data.get("results", []) if results: message.reply_text("\n".join(results)) # Send results as plain text else: message.reply_text("ɴᴏᴛ ʀᴇsᴘᴏɴsᴇ ғᴏᴜɴᴅ ғᴏʀᴍ ᴀᴘɪ.") except Exception as e: - message.reply_text(f"An error occurred: {str(e)}") \ No newline at end of file + message.reply_text(f"An unexpected error occurred: {str(e)}") \ No newline at end of file From fda3561ef264a46a30680f30b8870df386eeaa78 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 20 Nov 2024 23:46:33 +0530 Subject: [PATCH 063/184] Delete TanuMusic/plugins/tools/ask.py --- TanuMusic/plugins/tools/ask.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 TanuMusic/plugins/tools/ask.py diff --git a/TanuMusic/plugins/tools/ask.py b/TanuMusic/plugins/tools/ask.py deleted file mode 100644 index 5ce330e2915b..000000000000 --- a/TanuMusic/plugins/tools/ask.py +++ /dev/null @@ -1,34 +0,0 @@ -import requests -from pyrogram import filters -from TanuMusic import app - -@app.on_message(filters.command("ask")) -def search_api(client, message): - # Check if the user provided a query - query = " ".join(message.command[1:]) if len(message.command) > 1 else None - if not query: - return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ᴀsᴋ.") - - try: - # Send request to the search API - url = f"https://search.codesearch.workers.dev/?query={query}" - response = requests.get(url) - - # Check if the response is valid - if response.status_code != 200: - return message.reply_text(f"API returned an error: {response.status_code}") - - # Parse JSON response - try: - data = response.json() - except ValueError: - return message.reply_text("API returned invalid data.") - - # Extract results - results = data.get("results", []) - if results: - message.reply_text("\n".join(results)) # Send results as plain text - else: - message.reply_text("ɴᴏᴛ ʀᴇsᴘᴏɴsᴇ ғᴏᴜɴᴅ ғᴏʀᴍ ᴀᴘɪ.") - except Exception as e: - message.reply_text(f"An unexpected error occurred: {str(e)}") \ No newline at end of file From 585ece799a0221ec8378c96a93f52f2310d870a7 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 21 Nov 2024 19:03:32 +0530 Subject: [PATCH 064/184] fixing --- TanuMusic/plugins/bot/start.py | 366 +++++++++++++++------------------ 1 file changed, 168 insertions(+), 198 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 47d3b955199c..862d47b8b382 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -1,198 +1,168 @@ -import time -import random -from pyrogram import filters -from pyrogram.enums import ChatType -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from youtubesearchpython.__future__ import VideosSearch - -import config -from TanuMusic import app -from TanuMusic.misc import _boot_ -from TanuMusic.plugins.sudo.sudoers import sudoers_list -from TanuMusic.utils.database import ( - add_served_chat, - add_served_user, - blacklisted_chats, - get_lang, - is_banned_user, - is_on_off, -) -from TanuMusic.utils.decorators.language import LanguageStart -from TanuMusic.utils.formatters import get_readable_time -from TanuMusic.utils.inline import help_pannel, private_panel, start_panel -from config import BANNED_USERS -from strings import get_string - -IMAGE = [ -"https://graph.org/file/f76fd86d1936d45a63c64.jpg", -"https://graph.org/file/69ba894371860cd22d92e.jpg", -"https://graph.org/file/67fde88d8c3aa8327d363.jpg", -"https://graph.org/file/3a400f1f32fc381913061.jpg", -"https://graph.org/file/a0893f3a1e6777f6de821.jpg", -"https://graph.org/file/5a285fc0124657c7b7a0b.jpg", -"https://graph.org/file/25e215c4602b241b66829.jpg", -"https://graph.org/file/a13e9733afdad69720d67.jpg", -"https://graph.org/file/692e89f8fe20554e7a139.jpg", -"https://graph.org/file/db277a7810a3f65d92f22.jpg", -"https://graph.org/file/a00f89c5aa75735896e0f.jpg", -"https://graph.org/file/f86b71018196c5cfe7344.jpg", -"https://graph.org/file/a3db9af88f25bb1b99325.jpg", -"https://graph.org/file/5b344a55f3d5199b63fa5.jpg", -"https://graph.org/file/84de4b440300297a8ecb3.jpg", -"https://graph.org/file/84e84ff778b045879d24f.jpg", -"https://graph.org/file/a4a8f0e5c0e6b18249ffc.jpg", -"https://graph.org/file/ed92cada78099c9c3a4f7.jpg", -"https://graph.org/file/d6360613d0fa7a9d2f90b.jpg", -"https://graph.org/file/37248e7bdff70c662a702.jpg", -"https://graph.org/file/0bfe29d15e918917d1305.jpg", -"https://graph.org/file/16b1a2828cc507f8048bd.jpg", -"https://graph.org/file/e6b01f23f2871e128dad8.jpg", -"https://graph.org/file/cacbdddee77784d9ed2b7.jpg", -"https://graph.org/file/ddc5d6ec1c33276507b19.jpg", -"https://graph.org/file/39d7277189360d2c85b62.jpg", -"https://graph.org/file/5846b9214eaf12c3ed100.jpg", -"https://graph.org/file/ad4f9beb4d526e6615e18.jpg", -"https://graph.org/file/3514efaabe774e4f181f2.jpg", -"https://graph.org/file/eaa3a2602e43844a488a5.jpg", -"https://graph.org/file/b129e98b6e5c4db81c15f.jpg", -"https://graph.org/file/3ccb86d7d62e8ee0a2e8b.jpg", -"https://graph.org/file/df11d8257613418142063.jpg", -"https://graph.org/file/9e23720fedc47259b6195.jpg", -"https://graph.org/file/826485f2d7db6f09db8ed.jpg", -"https://graph.org/file/ff3ad786da825b5205691.jpg", -"https://graph.org/file/52713c9fe9253ae668f13.jpg", -"https://graph.org/file/8f8516c86677a8c91bfb1.jpg", -"https://graph.org/file/6603c3740378d3f7187da.jpg", -"https://graph.org/file/66cb6ec40eea5c4670118.jpg", -"https://graph.org/file/2e3cf4327b169b981055e.jpg", - -] - - - -@app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) -@LanguageStart -async def start_pm(client, message: Message, _): - await add_served_user(message.from_user.id) - if len(message.text.split()) > 1: - name = message.text.split(None, 1)[1] - if name[0:4] == "help": - keyboard = help_pannel(_) - return await message.reply_photo( - random.choice(IMAGE), - caption=_["help_1"].format(config.SUPPORT_CHAT), - reply_markup=keyboard, - ) - if name[0:3] == "sud": - await sudoers_list(client=client, message=message, _=_) - if await is_on_off(2): - return await app.send_message( - chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", - ) - return - if name[0:3] == "inf": - m = await message.reply_text("🔎") - query = (str(name)).replace("info_", "", 1) - query = f"https://www.youtube.com/watch?v={query}" - results = VideosSearch(query, limit=1) - for result in (await results.next())["result"]: - title = result["title"] - duration = result["duration"] - views = result["viewCount"]["short"] - thumbnail = result["thumbnails"][0]["url"].split("?")[0] - channellink = result["channel"]["link"] - channel = result["channel"]["name"] - link = result["link"] - published = result["publishedTime"] - searched_text = _["start_6"].format( - title, duration, views, published, channellink, channel, app.mention - ) - key = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton(text=_["S_B_8"], url=link), - InlineKeyboardButton(text=_["S_B_9"], url=config.SUPPORT_CHAT), - ], - ] - ) - await m.delete() - await app.send_photo( - chat_id=message.chat.id, - photo=thumbnail, - caption=searched_text, - reply_markup=key, - ) - if await is_on_off(2): - return await app.send_message( - chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", - ) - else: - out = private_panel(_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_2"].format(message.from_user.mention, app.mention), - reply_markup=InlineKeyboardMarkup(out), - ) - if await is_on_off(2): - return await app.send_message( - chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", - ) - - -@app.on_message(filters.command(["start"]) & filters.group & ~BANNED_USERS) -@LanguageStart -async def start_gp(client, message: Message, _): - out = start_panel(_) - uptime = int(time.time() - _boot_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_1"].format(app.mention, get_readable_time(uptime)), - reply_markup=InlineKeyboardMarkup(out), - ) - return await add_served_chat(message.chat.id) - - -@app.on_message(filters.new_chat_members, group=-1) -async def welcome(client, message: Message): - for member in message.new_chat_members: - try: - language = await get_lang(message.chat.id) - _ = get_string(language) - if await is_banned_user(member.id): - try: - await message.chat.ban_member(member.id) - except: - pass - if member.id == app.id: - if message.chat.type != ChatType.SUPERGROUP: - await message.reply_text(_["start_4"]) - return await app.leave_chat(message.chat.id) - if message.chat.id in await blacklisted_chats(): - await message.reply_text( - _["start_5"].format( - app.mention, - f"https://t.me/{app.username}?start=sudolist", - config.SUPPORT_CHAT, - ), - disable_web_page_preview=True, - ) - return await app.leave_chat(message.chat.id) - - out = start_panel(_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_3"].format( - message.from_user.first_name, - app.mention, - message.chat.title, - app.mention, - ), - reply_markup=InlineKeyboardMarkup(out), - ) - await add_served_chat(message.chat.id) - await message.stop_propagation() - except Exception as ex: - print(ex) +import time +import random +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtubesearchpython.__future__ import VideosSearch + +import config +from TanuMusic import app +from TanuMusic.misc import _boot_ +from TanuMusic.plugins.sudo.sudoers import sudoers_list +from TanuMusic.utils.database import ( + add_served_chat, + add_served_user, + blacklisted_chats, + get_lang, + is_banned_user, + is_on_off, +) +from TanuMusic.utils.decorators.language import LanguageStart +from TanuMusic.utils.formatters import get_readable_time +from TanuMusic.utils.inline import help_pannel, private_panel, start_panel +from config import BANNED_USERS +from strings import get_string + +IMAGE = [ + "https://graph.org/file/f76fd86d1936d45a63c64.jpg", + "https://graph.org/file/69ba894371860cd22d92e.jpg", + "https://graph.org/file/67fde88d8c3aa8327d363.jpg", + # Add more images here... +] + + +@app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) +@LanguageStart +async def start_pm(client, message: Message, _): + await add_served_user(message.from_user.id) + args = message.text.split() + + if len(args) > 1: + name = args[1] + if name.startswith("help"): + keyboard = help_pannel(_) + return await message.reply_photo( + photo=random.choice(IMAGE), + caption=_["help_1"].format(config.SUPPORT_CHAT), + reply_markup=keyboard, + ) + if name.startswith("sud"): + await sudoers_list(client=client, message=message, _=_) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=( + f"❖ {message.from_user.mention} started the bot to check Sudo List.\n\n" + f"● User ID ➥ {message.from_user.id}\n" + f"● Username ➥ @{message.from_user.username}" + ), + ) + if name.startswith("inf"): + m = await message.reply_text("🔎 Searching...") + query = f"https://www.youtube.com/watch?v={name[5:]}" + results = VideosSearch(query, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + duration = result["duration"] + views = result["viewCount"]["short"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + channellink = result["channel"]["link"] + channel = result["channel"]["name"] + link = result["link"] + published = result["publishedTime"] + searched_text = _["start_6"].format( + title, duration, views, published, channellink, channel, app.mention + ) + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text=_["S_B_8"], url=link), + InlineKeyboardButton(text=_["S_B_9"], url=config.SUPPORT_CHAT), + ] + ] + ) + await m.delete() + await app.send_photo( + chat_id=message.chat.id, + photo=thumbnail, + caption=searched_text, + reply_markup=key, + ) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=( + f"❖ {message.from_user.mention} started the bot to check Track Information.\n\n" + f"● User ID ➥ {message.from_user.id}\n" + f"● Username ➥ @{message.from_user.username}" + ), + ) + else: + out = private_panel(_) + await message.reply_photo( + photo=random.choice(IMAGE), + caption=_["start_2"].format(message.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(out), + ) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=( + f"❖ {message.from_user.mention} started the bot.\n\n" + f"● User ID ➥ {message.from_user.id}\n" + f"● Username ➥ @{message.from_user.username}" + ), + ) + + +@app.on_message(filters.command(["start"]) & filters.group & ~BANNED_USERS) +@LanguageStart +async def start_gp(client, message: Message, _): + out = start_panel(_) + uptime = int(time.time() - _boot_) + await message.reply_photo( + photo=random.choice(IMAGE), + caption=_["start_1"].format(app.mention, get_readable_time(uptime)), + reply_markup=InlineKeyboardMarkup(out), + ) + return await add_served_chat(message.chat.id) + + +@app.on_message(filters.new_chat_members, group=-1) +async def welcome(client, message: Message): + for member in message.new_chat_members: + try: + language = await get_lang(message.chat.id) + _ = get_string(language) + if await is_banned_user(member.id): + await message.chat.ban_member(member.id) + if member.id == app.id: + if message.chat.type != ChatType.SUPERGROUP: + await message.reply_text(_["start_4"]) + return await app.leave_chat(message.chat.id) + if message.chat.id in await blacklisted_chats(): + await message.reply_text( + _["start_5"].format( + app.mention, + f"https://t.me/{app.username}?start=sudolist", + config.SUPPORT_CHAT, + ), + disable_web_page_preview=True, + ) + return await app.leave_chat(message.chat.id) + + out = start_panel(_) + await message.reply_photo( + photo=random.choice(IMAGE), + caption=_["start_3"].format( + message.from_user.first_name, + app.mention, + message.chat.title, + app.mention, + ), + reply_markup=InlineKeyboardMarkup(out), + ) + await add_served_chat(message.chat.id) + await message.stop_propagation() + except Exception as ex: + print(f"Error: {ex}") \ No newline at end of file From df1fd091fa4315aebcd3ff3caad7fef4cf5fba31 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 21 Nov 2024 19:11:13 +0530 Subject: [PATCH 065/184] fixing --- TanuMusic/plugins/bot/start.py | 108 ++++++++++++++++----------------- 1 file changed, 51 insertions(+), 57 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 862d47b8b382..021a45ab99dc 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -23,95 +23,86 @@ from config import BANNED_USERS from strings import get_string +# Image List IMAGE = [ "https://graph.org/file/f76fd86d1936d45a63c64.jpg", "https://graph.org/file/69ba894371860cd22d92e.jpg", "https://graph.org/file/67fde88d8c3aa8327d363.jpg", - # Add more images here... + # Add other URLs here ] - @app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) @LanguageStart async def start_pm(client, message: Message, _): await add_served_user(message.from_user.id) - args = message.text.split() - - if len(args) > 1: - name = args[1] - if name.startswith("help"): + if len(message.text.split()) > 1: + name = message.text.split(None, 1)[1] + if name[0:4] == "help": keyboard = help_pannel(_) return await message.reply_photo( - photo=random.choice(IMAGE), + random.choice(IMAGE), caption=_["help_1"].format(config.SUPPORT_CHAT), reply_markup=keyboard, ) - if name.startswith("sud"): + if name[0:3] == "sud": await sudoers_list(client=client, message=message, _=_) if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=( - f"❖ {message.from_user.mention} started the bot to check Sudo List.\n\n" - f"● User ID ➥ {message.from_user.id}\n" - f"● Username ➥ @{message.from_user.username}" - ), + text=f"❖ {message.from_user.mention} started the bot to check sudolist.\n\n● User ID ➥ {message.from_user.id}\n● Username ➥ @{message.from_user.username}", ) - if name.startswith("inf"): - m = await message.reply_text("🔎 Searching...") - query = f"https://www.youtube.com/watch?v={name[5:]}" + return + if name[0:3] == "inf": + m = await message.reply_text("🔎") + query = name.replace("info_", "", 1) + query = f"https://www.youtube.com/watch?v={query}" results = VideosSearch(query, limit=1) - for result in (await results.next())["result"]: - title = result["title"] - duration = result["duration"] - views = result["viewCount"]["short"] - thumbnail = result["thumbnails"][0]["url"].split("?")[0] - channellink = result["channel"]["link"] - channel = result["channel"]["name"] - link = result["link"] - published = result["publishedTime"] - searched_text = _["start_6"].format( - title, duration, views, published, channellink, channel, app.mention - ) - key = InlineKeyboardMarkup( - [ + try: + for result in (await results.next())["result"]: + title = result["title"] + duration = result["duration"] + views = result["viewCount"]["short"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + channellink = result["channel"]["link"] + channel = result["channel"]["name"] + link = result["link"] + published = result["publishedTime"] + searched_text = _["start_6"].format( + title, duration, views, published, channellink, channel, app.mention + ) + key = InlineKeyboardMarkup( [ - InlineKeyboardButton(text=_["S_B_8"], url=link), - InlineKeyboardButton(text=_["S_B_9"], url=config.SUPPORT_CHAT), + [ + InlineKeyboardButton(text=_["S_B_8"], url=link), + InlineKeyboardButton(text=_["S_B_9"], url=config.SUPPORT_CHAT), + ], ] - ] - ) - await m.delete() - await app.send_photo( - chat_id=message.chat.id, - photo=thumbnail, - caption=searched_text, - reply_markup=key, - ) + ) + await m.delete() + await app.send_photo( + chat_id=message.chat.id, + photo=thumbnail, + caption=searched_text, + reply_markup=key, + ) + except Exception as e: + print(f"Error fetching video details: {e}") if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=( - f"❖ {message.from_user.mention} started the bot to check Track Information.\n\n" - f"● User ID ➥ {message.from_user.id}\n" - f"● Username ➥ @{message.from_user.username}" - ), + text=f"❖ {message.from_user.mention} started the bot to check track information.\n\n● User ID ➥ {message.from_user.id}\n● Username ➥ @{message.from_user.username}", ) else: out = private_panel(_) await message.reply_photo( - photo=random.choice(IMAGE), + random.choice(IMAGE), caption=_["start_2"].format(message.from_user.mention, app.mention), reply_markup=InlineKeyboardMarkup(out), ) if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=( - f"❖ {message.from_user.mention} started the bot.\n\n" - f"● User ID ➥ {message.from_user.id}\n" - f"● Username ➥ @{message.from_user.username}" - ), + text=f"❖ {message.from_user.mention} started the bot.\n\n● User ID ➥ {message.from_user.id}\n● Username ➥ @{message.from_user.username}", ) @@ -121,7 +112,7 @@ async def start_gp(client, message: Message, _): out = start_panel(_) uptime = int(time.time() - _boot_) await message.reply_photo( - photo=random.choice(IMAGE), + random.choice(IMAGE), caption=_["start_1"].format(app.mention, get_readable_time(uptime)), reply_markup=InlineKeyboardMarkup(out), ) @@ -135,7 +126,10 @@ async def welcome(client, message: Message): language = await get_lang(message.chat.id) _ = get_string(language) if await is_banned_user(member.id): - await message.chat.ban_member(member.id) + try: + await message.chat.ban_member(member.id) + except: + pass if member.id == app.id: if message.chat.type != ChatType.SUPERGROUP: await message.reply_text(_["start_4"]) @@ -153,7 +147,7 @@ async def welcome(client, message: Message): out = start_panel(_) await message.reply_photo( - photo=random.choice(IMAGE), + random.choice(IMAGE), caption=_["start_3"].format( message.from_user.first_name, app.mention, @@ -165,4 +159,4 @@ async def welcome(client, message: Message): await add_served_chat(message.chat.id) await message.stop_propagation() except Exception as ex: - print(f"Error: {ex}") \ No newline at end of file + print(f"Error during welcome: {ex}") \ No newline at end of file From b172d467e2bd34af7aa0f26f39eb63785c3743ed Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 21 Nov 2024 19:18:11 +0530 Subject: [PATCH 066/184] nothing --- TanuMusic/plugins/bot/start.py | 148 ++++++++++++++++----------------- 1 file changed, 70 insertions(+), 78 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 021a45ab99dc..7c2dd8b14ae9 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -23,100 +23,93 @@ from config import BANNED_USERS from strings import get_string -# Image List IMAGE = [ + # List of image URLs (same as provided) "https://graph.org/file/f76fd86d1936d45a63c64.jpg", - "https://graph.org/file/69ba894371860cd22d92e.jpg", - "https://graph.org/file/67fde88d8c3aa8327d363.jpg", - # Add other URLs here + # Add more image URLs here... ] +# Utility function to safely resolve peer +async def safe_resolve_peer(client, user_id): + try: + if not isinstance(user_id, (int, str)): + raise ValueError(f"Unsupported type for user_id: {type(user_id)} | user_id: {user_id}") + return await client.resolve_peer(user_id) + except Exception as e: + print(f"Error resolving peer: {e} | user_id: {user_id}") + return None + + @app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) @LanguageStart async def start_pm(client, message: Message, _): - await add_served_user(message.from_user.id) - if len(message.text.split()) > 1: - name = message.text.split(None, 1)[1] - if name[0:4] == "help": - keyboard = help_pannel(_) - return await message.reply_photo( - random.choice(IMAGE), - caption=_["help_1"].format(config.SUPPORT_CHAT), - reply_markup=keyboard, - ) - if name[0:3] == "sud": - await sudoers_list(client=client, message=message, _=_) - if await is_on_off(2): - return await app.send_message( - chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} started the bot to check sudolist.\n\n● User ID ➥ {message.from_user.id}\n● Username ➥ @{message.from_user.username}", + user_id = message.from_user.id + try: + # Debug: Validate user_id + if not isinstance(user_id, int): + raise ValueError(f"Invalid user_id type: {type(user_id)} | user_id: {user_id}") + + await add_served_user(user_id) + if len(message.text.split()) > 1: + name = message.text.split(None, 1)[1] + if name[0:4] == "help": + keyboard = help_pannel(_) + return await message.reply_photo( + random.choice(IMAGE), + caption=_["help_1"].format(config.SUPPORT_CHAT), + reply_markup=keyboard, ) - return - if name[0:3] == "inf": - m = await message.reply_text("🔎") - query = name.replace("info_", "", 1) - query = f"https://www.youtube.com/watch?v={query}" - results = VideosSearch(query, limit=1) - try: + if name[0:3] == "sud": + await sudoers_list(client=client, message=message, _=_) + return + if name[0:3] == "inf": + query = f"https://www.youtube.com/watch?v={name.replace('info_', '', 1)}" + results = VideosSearch(query, limit=1) for result in (await results.next())["result"]: title = result["title"] duration = result["duration"] views = result["viewCount"]["short"] thumbnail = result["thumbnails"][0]["url"].split("?")[0] - channellink = result["channel"]["link"] channel = result["channel"]["name"] link = result["link"] - published = result["publishedTime"] - searched_text = _["start_6"].format( - title, duration, views, published, channellink, channel, app.mention - ) - key = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton(text=_["S_B_8"], url=link), - InlineKeyboardButton(text=_["S_B_9"], url=config.SUPPORT_CHAT), - ], - ] - ) - await m.delete() - await app.send_photo( - chat_id=message.chat.id, - photo=thumbnail, - caption=searched_text, - reply_markup=key, - ) - except Exception as e: - print(f"Error fetching video details: {e}") - if await is_on_off(2): - return await app.send_message( - chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} started the bot to check track information.\n\n● User ID ➥ {message.from_user.id}\n● Username ➥ @{message.from_user.username}", - ) - else: - out = private_panel(_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_2"].format(message.from_user.mention, app.mention), - reply_markup=InlineKeyboardMarkup(out), - ) - if await is_on_off(2): - return await app.send_message( - chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} started the bot.\n\n● User ID ➥ {message.from_user.id}\n● Username ➥ @{message.from_user.username}", + searched_text = _["start_6"].format( + title, duration, views, channel, link, app.mention + ) + key = InlineKeyboardMarkup( + [[InlineKeyboardButton(text=_["S_B_8"], url=link)]] + ) + return await app.send_photo( + chat_id=message.chat.id, + photo=thumbnail, + caption=searched_text, + reply_markup=key, + ) + else: + out = private_panel(_) + return await message.reply_photo( + random.choice(IMAGE), + caption=_["start_2"].format(message.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(out), ) + except Exception as e: + print(f"Error in start_pm: {e}") + await message.reply_text("An unexpected error occurred.") @app.on_message(filters.command(["start"]) & filters.group & ~BANNED_USERS) @LanguageStart async def start_gp(client, message: Message, _): - out = start_panel(_) - uptime = int(time.time() - _boot_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_1"].format(app.mention, get_readable_time(uptime)), - reply_markup=InlineKeyboardMarkup(out), - ) - return await add_served_chat(message.chat.id) + try: + out = start_panel(_) + uptime = int(time.time() - _boot_) + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_1"].format(app.mention, get_readable_time(uptime)), + reply_markup=InlineKeyboardMarkup(out), + ) + await add_served_chat(message.chat.id) + except Exception as e: + print(f"Error in start_gp: {e}") @app.on_message(filters.new_chat_members, group=-1) @@ -128,8 +121,8 @@ async def welcome(client, message: Message): if await is_banned_user(member.id): try: await message.chat.ban_member(member.id) - except: - pass + except Exception as e: + print(f"Failed to ban user: {e}") if member.id == app.id: if message.chat.type != ChatType.SUPERGROUP: await message.reply_text(_["start_4"]) @@ -157,6 +150,5 @@ async def welcome(client, message: Message): reply_markup=InlineKeyboardMarkup(out), ) await add_served_chat(message.chat.id) - await message.stop_propagation() - except Exception as ex: - print(f"Error during welcome: {ex}") \ No newline at end of file + except Exception as e: + print(f"Error in welcome: {e}") \ No newline at end of file From 867f5e76be6a9495517ff2203c57dc6660aec327 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 21 Nov 2024 19:24:09 +0530 Subject: [PATCH 067/184] nothing --- TanuMusic/plugins/bot/start.py | 196 ++++++++++++++++++++------------- 1 file changed, 120 insertions(+), 76 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 7c2dd8b14ae9..311bd2eccd80 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -1,5 +1,5 @@ import time -import random +import random from pyrogram import filters from pyrogram.enums import ChatType from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message @@ -24,92 +24,135 @@ from strings import get_string IMAGE = [ - # List of image URLs (same as provided) - "https://graph.org/file/f76fd86d1936d45a63c64.jpg", - # Add more image URLs here... +"https://graph.org/file/f76fd86d1936d45a63c64.jpg", +"https://graph.org/file/69ba894371860cd22d92e.jpg", +"https://graph.org/file/67fde88d8c3aa8327d363.jpg", +"https://graph.org/file/3a400f1f32fc381913061.jpg", +"https://graph.org/file/a0893f3a1e6777f6de821.jpg", +"https://graph.org/file/5a285fc0124657c7b7a0b.jpg", +"https://graph.org/file/25e215c4602b241b66829.jpg", +"https://graph.org/file/a13e9733afdad69720d67.jpg", +"https://graph.org/file/692e89f8fe20554e7a139.jpg", +"https://graph.org/file/db277a7810a3f65d92f22.jpg", +"https://graph.org/file/a00f89c5aa75735896e0f.jpg", +"https://graph.org/file/f86b71018196c5cfe7344.jpg", +"https://graph.org/file/a3db9af88f25bb1b99325.jpg", +"https://graph.org/file/5b344a55f3d5199b63fa5.jpg", +"https://graph.org/file/84de4b440300297a8ecb3.jpg", +"https://graph.org/file/84e84ff778b045879d24f.jpg", +"https://graph.org/file/a4a8f0e5c0e6b18249ffc.jpg", +"https://graph.org/file/ed92cada78099c9c3a4f7.jpg", +"https://graph.org/file/d6360613d0fa7a9d2f90b.jpg", +"https://graph.org/file/37248e7bdff70c662a702.jpg", +"https://graph.org/file/0bfe29d15e918917d1305.jpg", +"https://graph.org/file/16b1a2828cc507f8048bd.jpg", +"https://graph.org/file/e6b01f23f2871e128dad8.jpg", +"https://graph.org/file/cacbdddee77784d9ed2b7.jpg", +"https://graph.org/file/ddc5d6ec1c33276507b19.jpg", +"https://graph.org/file/39d7277189360d2c85b62.jpg", +"https://graph.org/file/5846b9214eaf12c3ed100.jpg", +"https://graph.org/file/ad4f9beb4d526e6615e18.jpg", +"https://graph.org/file/3514efaabe774e4f181f2.jpg", +"https://graph.org/file/eaa3a2602e43844a488a5.jpg", +"https://graph.org/file/b129e98b6e5c4db81c15f.jpg", +"https://graph.org/file/3ccb86d7d62e8ee0a2e8b.jpg", +"https://graph.org/file/df11d8257613418142063.jpg", +"https://graph.org/file/9e23720fedc47259b6195.jpg", +"https://graph.org/file/826485f2d7db6f09db8ed.jpg", +"https://graph.org/file/ff3ad786da825b5205691.jpg", +"https://graph.org/file/52713c9fe9253ae668f13.jpg", +"https://graph.org/file/8f8516c86677a8c91bfb1.jpg", +"https://graph.org/file/6603c3740378d3f7187da.jpg", +"https://graph.org/file/66cb6ec40eea5c4670118.jpg", +"https://graph.org/file/2e3cf4327b169b981055e.jpg", + ] -# Utility function to safely resolve peer -async def safe_resolve_peer(client, user_id): - try: - if not isinstance(user_id, (int, str)): - raise ValueError(f"Unsupported type for user_id: {type(user_id)} | user_id: {user_id}") - return await client.resolve_peer(user_id) - except Exception as e: - print(f"Error resolving peer: {e} | user_id: {user_id}") - return None @app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) @LanguageStart async def start_pm(client, message: Message, _): - user_id = message.from_user.id - try: - # Debug: Validate user_id - if not isinstance(user_id, int): - raise ValueError(f"Invalid user_id type: {type(user_id)} | user_id: {user_id}") - - await add_served_user(user_id) - if len(message.text.split()) > 1: - name = message.text.split(None, 1)[1] - if name[0:4] == "help": - keyboard = help_pannel(_) - return await message.reply_photo( - random.choice(IMAGE), - caption=_["help_1"].format(config.SUPPORT_CHAT), - reply_markup=keyboard, - ) - if name[0:3] == "sud": - await sudoers_list(client=client, message=message, _=_) - return - if name[0:3] == "inf": - query = f"https://www.youtube.com/watch?v={name.replace('info_', '', 1)}" - results = VideosSearch(query, limit=1) - for result in (await results.next())["result"]: - title = result["title"] - duration = result["duration"] - views = result["viewCount"]["short"] - thumbnail = result["thumbnails"][0]["url"].split("?")[0] - channel = result["channel"]["name"] - link = result["link"] - searched_text = _["start_6"].format( - title, duration, views, channel, link, app.mention - ) - key = InlineKeyboardMarkup( - [[InlineKeyboardButton(text=_["S_B_8"], url=link)]] - ) - return await app.send_photo( - chat_id=message.chat.id, - photo=thumbnail, - caption=searched_text, - reply_markup=key, - ) - else: - out = private_panel(_) + await add_served_user(message.from_user.id) + if len(message.text.split()) > 1: + name = message.text.split(None, 1)[1] + if name[0:4] == "help": + keyboard = help_pannel(_) return await message.reply_photo( random.choice(IMAGE), - caption=_["start_2"].format(message.from_user.mention, app.mention), - reply_markup=InlineKeyboardMarkup(out), + caption=_["help_1"].format(config.SUPPORT_CHAT), + reply_markup=keyboard, + ) + if name[0:3] == "sud": + await sudoers_list(client=client, message=message, _=_) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + ) + return + if name[0:3] == "inf": + m = await message.reply_text("🔎") + query = (str(name)).replace("info_", "", 1) + query = f"https://www.youtube.com/watch?v={query}" + results = VideosSearch(query, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + duration = result["duration"] + views = result["viewCount"]["short"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + channellink = result["channel"]["link"] + channel = result["channel"]["name"] + link = result["link"] + published = result["publishedTime"] + searched_text = _["start_6"].format( + title, duration, views, published, channellink, channel, app.mention + ) + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text=_["S_B_8"], url=link), + InlineKeyboardButton(text=_["S_B_9"], url=config.SUPPORT_CHAT), + ], + ] + ) + await m.delete() + await app.send_photo( + chat_id=message.chat.id, + photo=thumbnail, + caption=searched_text, + reply_markup=key, + ) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + ) + else: + out = private_panel(_) + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_2"].format(message.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(out), + ) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) - except Exception as e: - print(f"Error in start_pm: {e}") - await message.reply_text("An unexpected error occurred.") @app.on_message(filters.command(["start"]) & filters.group & ~BANNED_USERS) @LanguageStart async def start_gp(client, message: Message, _): - try: - out = start_panel(_) - uptime = int(time.time() - _boot_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_1"].format(app.mention, get_readable_time(uptime)), - reply_markup=InlineKeyboardMarkup(out), - ) - await add_served_chat(message.chat.id) - except Exception as e: - print(f"Error in start_gp: {e}") + out = start_panel(_) + uptime = int(time.time() - _boot_) + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_1"].format(app.mention, get_readable_time(uptime)), + reply_markup=InlineKeyboardMarkup(out), + ) + return await add_served_chat(message.chat.id) @app.on_message(filters.new_chat_members, group=-1) @@ -121,8 +164,8 @@ async def welcome(client, message: Message): if await is_banned_user(member.id): try: await message.chat.ban_member(member.id) - except Exception as e: - print(f"Failed to ban user: {e}") + except: + pass if member.id == app.id: if message.chat.type != ChatType.SUPERGROUP: await message.reply_text(_["start_4"]) @@ -150,5 +193,6 @@ async def welcome(client, message: Message): reply_markup=InlineKeyboardMarkup(out), ) await add_served_chat(message.chat.id) - except Exception as e: - print(f"Error in welcome: {e}") \ No newline at end of file + await message.stop_propagation() + except Exception as ex: + print(ex) \ No newline at end of file From 5a7917b636b499e9bdaf31e26fd223e4087224ff Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 22 Nov 2024 16:21:30 +0530 Subject: [PATCH 068/184] Updating --- TanuMusic/plugins/tools/draw.py | 57 +++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/TanuMusic/plugins/tools/draw.py b/TanuMusic/plugins/tools/draw.py index 06ee8cbf6def..1296d859c376 100644 --- a/TanuMusic/plugins/tools/draw.py +++ b/TanuMusic/plugins/tools/draw.py @@ -1,27 +1,42 @@ from pyrogram import Client, filters -from HorridAPI import Mango -from TanuMusic import app +import aiohttp +from TanuMusic import app -# Initialize the Mango client -mango = Mango() +# Generate a detailed prompt for image creation +def generate_long_query(query): + return f"{query}." @app.on_message(filters.command("draw")) -def draw(client, message): - # Extract the prompt from the command - prompt = " ".join(message.command[1:]) if len(message.command) > 1 else None - if not prompt: - return message.reply_text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴀɴ ɪᴍᴀɢᴇ ᴜsɪɴɢ /draw ᴄᴏᴍᴍᴀɴᴅ.") - - # Send a waiting message - wait_message = message.reply_text("ɢᴇɴᴇʀᴀᴛɪɴɢ ɪᴍᴀɢᴇ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ... ⏳") - +async def draw_image(client, message): + if len(message.command) < 2: + await message.reply_text("Please provide a query to generate an image. 😊") + return + + # Generate a long query for better image results + user_query = message.text.split(" ", 1)[1] + query = generate_long_query(user_query) + + # Send initial message + wait_message = await message.reply_text("**Generating image, please wait...** ⏳") + + # Asynchronous request using aiohttp + url = f"https://text2img.codesearch.workers.dev/?prompt={query}" try: - # Generate the image using the Mango API - response = mango.images.generate(model="flux-1.1-pro", prompt=prompt) - wait_message.delete() # Remove the waiting message - # Send the generated image as a reply - message.reply_photo(photo=response.url, caption="ɪᴍᴀɢᴇ ɢᴇɴᴇʀᴀᴛᴇᴅ ʙʏ ˹ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™♡゙") + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + image_data = await response.json() + if "imageUrl" in image_data: + image_url = image_data["imageUrl"] + await wait_message.delete() # Delete wait message + await message.reply_photo(photo=image_url, caption=f"Generated Image for: {user_query} 🖼️") + else: + await wait_message.edit_text("No images were returned. Please try again. ❌") + else: + await wait_message.edit_text("Error: Unable to generate image at this time. Please try later. 🚫") except Exception as e: - wait_message.delete() # Remove the waiting message - # Send the error message - message.reply_text(f"ɢᴇᴛᴛɪɴɢ ᴇʀʀᴏʀ: {e}") \ No newline at end of file + # Try to edit or delete the message only if it exists + try: + await wait_message.edit_text(f"An error occurred: {e} ⚠️") + except Exception: + await message.reply_text(f"An error occurred: {e} ⚠️") \ No newline at end of file From 3891339cc1d8254b826fbdbf3c542ca1ae4ab4e4 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 22 Nov 2024 21:34:41 +0530 Subject: [PATCH 069/184] Update draw.py --- TanuMusic/plugins/tools/draw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/draw.py b/TanuMusic/plugins/tools/draw.py index 1296d859c376..328918dcb73f 100644 --- a/TanuMusic/plugins/tools/draw.py +++ b/TanuMusic/plugins/tools/draw.py @@ -17,7 +17,7 @@ async def draw_image(client, message): query = generate_long_query(user_query) # Send initial message - wait_message = await message.reply_text("**Generating image, please wait...** ⏳") + wait_message = await message.reply_text("Generating image, please wait... ⏳") # Asynchronous request using aiohttp url = f"https://text2img.codesearch.workers.dev/?prompt={query}" From 1a1a2675d4887a4a9a19cd1f3f9ad7146c1158f9 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 23 Nov 2024 19:46:48 +0530 Subject: [PATCH 070/184] Update start.py --- TanuMusic/plugins/bot/start.py | 97 ++++++++++++---------------------- 1 file changed, 34 insertions(+), 63 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 311bd2eccd80..29f2d636e389 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -1,5 +1,5 @@ import time -import random +import random from pyrogram import filters from pyrogram.enums import ChatType from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message @@ -20,81 +20,46 @@ from TanuMusic.utils.decorators.language import LanguageStart from TanuMusic.utils.formatters import get_readable_time from TanuMusic.utils.inline import help_pannel, private_panel, start_panel -from config import BANNED_USERS from strings import get_string +from config import BANNED_USERS IMAGE = [ -"https://graph.org/file/f76fd86d1936d45a63c64.jpg", -"https://graph.org/file/69ba894371860cd22d92e.jpg", -"https://graph.org/file/67fde88d8c3aa8327d363.jpg", -"https://graph.org/file/3a400f1f32fc381913061.jpg", -"https://graph.org/file/a0893f3a1e6777f6de821.jpg", -"https://graph.org/file/5a285fc0124657c7b7a0b.jpg", -"https://graph.org/file/25e215c4602b241b66829.jpg", -"https://graph.org/file/a13e9733afdad69720d67.jpg", -"https://graph.org/file/692e89f8fe20554e7a139.jpg", -"https://graph.org/file/db277a7810a3f65d92f22.jpg", -"https://graph.org/file/a00f89c5aa75735896e0f.jpg", -"https://graph.org/file/f86b71018196c5cfe7344.jpg", -"https://graph.org/file/a3db9af88f25bb1b99325.jpg", -"https://graph.org/file/5b344a55f3d5199b63fa5.jpg", -"https://graph.org/file/84de4b440300297a8ecb3.jpg", -"https://graph.org/file/84e84ff778b045879d24f.jpg", -"https://graph.org/file/a4a8f0e5c0e6b18249ffc.jpg", -"https://graph.org/file/ed92cada78099c9c3a4f7.jpg", -"https://graph.org/file/d6360613d0fa7a9d2f90b.jpg", -"https://graph.org/file/37248e7bdff70c662a702.jpg", -"https://graph.org/file/0bfe29d15e918917d1305.jpg", -"https://graph.org/file/16b1a2828cc507f8048bd.jpg", -"https://graph.org/file/e6b01f23f2871e128dad8.jpg", -"https://graph.org/file/cacbdddee77784d9ed2b7.jpg", -"https://graph.org/file/ddc5d6ec1c33276507b19.jpg", -"https://graph.org/file/39d7277189360d2c85b62.jpg", -"https://graph.org/file/5846b9214eaf12c3ed100.jpg", -"https://graph.org/file/ad4f9beb4d526e6615e18.jpg", -"https://graph.org/file/3514efaabe774e4f181f2.jpg", -"https://graph.org/file/eaa3a2602e43844a488a5.jpg", -"https://graph.org/file/b129e98b6e5c4db81c15f.jpg", -"https://graph.org/file/3ccb86d7d62e8ee0a2e8b.jpg", -"https://graph.org/file/df11d8257613418142063.jpg", -"https://graph.org/file/9e23720fedc47259b6195.jpg", -"https://graph.org/file/826485f2d7db6f09db8ed.jpg", -"https://graph.org/file/ff3ad786da825b5205691.jpg", -"https://graph.org/file/52713c9fe9253ae668f13.jpg", -"https://graph.org/file/8f8516c86677a8c91bfb1.jpg", -"https://graph.org/file/6603c3740378d3f7187da.jpg", -"https://graph.org/file/66cb6ec40eea5c4670118.jpg", -"https://graph.org/file/2e3cf4327b169b981055e.jpg", - + "https://graph.org/file/f76fd86d1936d45a63c64.jpg", + "https://graph.org/file/69ba894371860cd22d92e.jpg", + "https://graph.org/file/67fde88d8c3aa8327d363.jpg", + "https://graph.org/file/3a400f1f32fc381913061.jpg", + # Add more URLs if needed ] - @app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) @LanguageStart async def start_pm(client, message: Message, _): await add_served_user(message.from_user.id) if len(message.text.split()) > 1: name = message.text.split(None, 1)[1] - if name[0:4] == "help": + if name.startswith("help"): keyboard = help_pannel(_) return await message.reply_photo( random.choice(IMAGE), caption=_["help_1"].format(config.SUPPORT_CHAT), reply_markup=keyboard, ) - if name[0:3] == "sud": + elif name.startswith("sud"): await sudoers_list(client=client, message=message, _=_) if await is_on_off(2): - return await app.send_message( + await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + text=( + f"❖ {message.from_user.mention} checked the Sudo List.\n\n" + f"**User ID:** `{message.from_user.id}`\n" + f"**Username:** @{message.from_user.username}" + ), ) return - if name[0:3] == "inf": - m = await message.reply_text("🔎") - query = (str(name)).replace("info_", "", 1) - query = f"https://www.youtube.com/watch?v={query}" + elif name.startswith("inf"): + query = name.replace("info_", "", 1) + m = await message.reply_text("🔎 Searching...") results = VideosSearch(query, limit=1) for result in (await results.next())["result"]: title = result["title"] @@ -105,6 +70,7 @@ async def start_pm(client, message: Message, _): channel = result["channel"]["name"] link = result["link"] published = result["publishedTime"] + searched_text = _["start_6"].format( title, duration, views, published, channellink, channel, app.mention ) @@ -124,9 +90,13 @@ async def start_pm(client, message: Message, _): reply_markup=key, ) if await is_on_off(2): - return await app.send_message( + await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + text=( + f"❖ {message.from_user.mention} checked Track Information.\n\n" + f"**User ID:** `{message.from_user.id}`\n" + f"**Username:** @{message.from_user.username}" + ), ) else: out = private_panel(_) @@ -136,9 +106,13 @@ async def start_pm(client, message: Message, _): reply_markup=InlineKeyboardMarkup(out), ) if await is_on_off(2): - return await app.send_message( + await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + text=( + f"❖ {message.from_user.mention} started the bot.\n\n" + f"**User ID:** `{message.from_user.id}`\n" + f"**Username:** @{message.from_user.username}" + ), ) @@ -152,7 +126,7 @@ async def start_gp(client, message: Message, _): caption=_["start_1"].format(app.mention, get_readable_time(uptime)), reply_markup=InlineKeyboardMarkup(out), ) - return await add_served_chat(message.chat.id) + await add_served_chat(message.chat.id) @app.on_message(filters.new_chat_members, group=-1) @@ -162,10 +136,7 @@ async def welcome(client, message: Message): language = await get_lang(message.chat.id) _ = get_string(language) if await is_banned_user(member.id): - try: - await message.chat.ban_member(member.id) - except: - pass + await message.chat.ban_member(member.id) if member.id == app.id: if message.chat.type != ChatType.SUPERGROUP: await message.reply_text(_["start_4"]) @@ -195,4 +166,4 @@ async def welcome(client, message: Message): await add_served_chat(message.chat.id) await message.stop_propagation() except Exception as ex: - print(ex) \ No newline at end of file + print(f"Error in welcome: {ex}") \ No newline at end of file From d85cb6ad95f44c7b1c4b474f64f94f9181cbaa8c Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 05:15:41 +0530 Subject: [PATCH 071/184] Update dev.py --- TanuMusic/plugins/sudo/dev.py | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/TanuMusic/plugins/sudo/dev.py b/TanuMusic/plugins/sudo/dev.py index 67c9c0623701..3ebde250145c 100644 --- a/TanuMusic/plugins/sudo/dev.py +++ b/TanuMusic/plugins/sudo/dev.py @@ -199,30 +199,3 @@ async def shellrunner(_, message: Message): await message.stop_propagation() - -__MODULE__ = "Deᴠ" -__HELP__ = """ -🔰Aᴅᴅ Aɴᴅ Rᴇᴍᴏᴠᴇ Sᴜᴅᴏ Usᴇʀ's: - -★ /addsudo [Usᴇʀɴᴀᴍᴇ ᴏʀ Rᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] -★ /delsudo [Usᴇʀɴᴀᴍᴇ ᴏʀ Rᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] - -🛃Hᴇʀᴏᴋᴜ: - -★ /usage - Dʏɴᴏ Usᴀɢᴇ. -★ /get_var - Gᴇᴛ ᴀ ᴄᴏɴғɪɢ ᴠᴀʀ ғʀᴏᴍ Hᴇʀᴏᴋᴜ ᴏʀ .env -★ /del_var - Dᴇʟᴇᴛᴇ ᴀɴʏ ᴠᴀʀ ᴏɴ Hᴇʀᴏᴋᴜ ᴏʀ .ᴇɴᴠ. -★ /set_var [Vᴀʀ Nᴀᴍᴇ] [Vᴀʟᴜᴇ] - Sᴇᴛ ᴀ Vᴀʀ ᴏʀ Uᴘᴅᴀᴛᴇ ᴀ Vᴀʀ ᴏɴ ʜᴇʀᴏᴋᴜ ᴏʀ .ᴇɴᴠ. Sᴇᴘᴇʀᴀᴛᴇ Vᴀʀ ᴀɴᴅ ɪᴛs Vᴀʟᴜᴇ ᴡɪᴛʜ ᴀ sᴘᴀᴄᴇ. - -🤖Bᴏᴛ Cᴏᴍᴍᴀɴᴅs: - -★ /restart - Rᴇsᴛᴀʀᴛ ʏᴏᴜʀ Bᴏᴛ. -★ /update , /gitpull - Uᴘᴅᴀᴛᴇ Bᴏᴛ. -★ /speedtest - Cʜᴇᴄᴋ sᴇʀᴠᴇʀ sᴘᴇᴇᴅs -★ /maintenance [ᴇɴᴀʙʟᴇ / ᴅɪsᴀʙʟᴇ] -★ /logger [ᴇɴᴀʙʟᴇ / ᴅɪsᴀʙʟᴇ] - Bᴏᴛ ʟᴏɢs ᴛʜᴇ sᴇᴀʀᴄʜᴇᴅ ǫᴜᴇʀɪᴇs ɪɴ ʟᴏɢɢᴇʀ ɢʀᴏᴜᴘ. -★ /get_log [Nᴜᴍʙᴇʀ ᴏғ Lɪɴᴇs] - Gᴇᴛ ʟᴏɢ ᴏғ ʏᴏᴜʀ ʙᴏᴛ ғʀᴏᴍ ʜᴇʀᴏᴋᴜ ᴏʀ ᴠᴘs. Wᴏʀᴋs ғᴏʀ ʙᴏᴛʜ. -★ /autoend [ᴇɴᴀʙʟᴇ|ᴅɪsᴀʙʟᴇ] - Eɴᴀʙʟᴇ Aᴜᴛᴏ sᴛʀᴇᴀᴍ ᴇɴᴅ ᴀғᴛᴇʀ 𝟹 ᴍɪɴs ɪғ ɴᴏ ᴏɴᴇ ɪs ʟɪsᴛᴇɴɪɴɢ. - -""" - From 53990b6d8bc0a29ae727afd307f7f1c9be38bdd7 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:11:23 +0530 Subject: [PATCH 072/184] Update requirements.txt --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e079cef25204..32332322afc6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,7 +27,6 @@ python-dotenv pyyaml requests speedtest-cli -HorridAPI==1.0.67 spotipy tgcrypto urllib3 From 50ab14c54b32e77531be15c859158d00d7d5ddad Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:25:28 +0530 Subject: [PATCH 073/184] nothing --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 32332322afc6..fdc6ee9d109b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ deep-translator -pyromod openai aiofiles aiohttp @@ -21,7 +20,6 @@ psutil pytube pykeyboard unidecode -pyromod ntgcalls==1.1.2 python-dotenv pyyaml From 2b39798e529e1f675156c7ae9401b932008c80c1 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:26:28 +0530 Subject: [PATCH 074/184] Update language.py --- TanuMusic/utils/decorators/language.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/utils/decorators/language.py b/TanuMusic/utils/decorators/language.py index 02c1f9a2a020..f33ff1e0979b 100644 --- a/TanuMusic/utils/decorators/language.py +++ b/TanuMusic/utils/decorators/language.py @@ -3,7 +3,7 @@ from TanuMusic import app from TanuMusic.misc import SUDOERS from TanuMusic.utils.database import get_lang, is_maintenance - +from config import SUPPORT_CHAT def language(mystic): async def wrapper(_, message, **kwargs): From 646abbe39d088e00fcc9e7050c8d12606bee2443 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:27:53 +0530 Subject: [PATCH 075/184] Delete TanuMusic/utils/decorators/#play.py --- TanuMusic/utils/decorators/#play.py | 1 - 1 file changed, 1 deletion(-) delete mode 100644 TanuMusic/utils/decorators/#play.py diff --git a/TanuMusic/utils/decorators/#play.py b/TanuMusic/utils/decorators/#play.py deleted file mode 100644 index 8b137891791f..000000000000 --- a/TanuMusic/utils/decorators/#play.py +++ /dev/null @@ -1 +0,0 @@ - From 85249f76496224eda024241dfeee3a082c9d544e Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:30:58 +0530 Subject: [PATCH 076/184] Update misc.py --- TanuMusic/misc.py | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py index 0bc2b6d83e35..6c1013ab8cd2 100644 --- a/TanuMusic/misc.py +++ b/TanuMusic/misc.py @@ -1,22 +1,19 @@ import socket import time - import heroku3 from pyrogram import filters import config from TanuMusic.core.mongo import mongodb - from .logging import LOGGER SUDOERS = filters.user() - - HAPP = None _boot_ = time.time() def is_heroku(): + """Check if the environment is Heroku.""" return "heroku" in socket.getfqdn() @@ -38,14 +35,15 @@ def is_heroku(): def dbb(): - global db - global clonedb + """Initialize the local database.""" + global db, clonedb db = {} clonedb = {} - LOGGER(__name__).info(f"✦ Local Database Initialized...💛.") + LOGGER(__name__).info("✦ Local Database Initialized...💛.") async def sudo(): + """Load sudoers from the configuration or database.""" global SUDOERS OWNER = config.OWNER_ID if config.MONGO_DB_URI is None: @@ -53,7 +51,7 @@ async def sudo(): SUDOERS.add(user_id) else: sudoersdb = mongodb.sudoers - sudoers = await sudoersdb.find_one({"sudo": "sudo"}) # Await the database call + sudoers = await sudoersdb.find_one({"sudo": "sudo"}) sudoers = [] if not sudoers else sudoers.get("sudoers", []) for user_id in OWNER: SUDOERS.add(user_id) @@ -65,20 +63,22 @@ async def sudo(): upsert=True, ) if sudoers: - for x in sudoers: - SUDOERS.add(x) - LOGGER(__name__).info(f"✦ Sudoers Loaded...❤️.") + for user_id in sudoers: + SUDOERS.add(user_id) + LOGGER(__name__).info("✦ Sudoers Loaded...❤️.") def heroku(): + """Configure the Heroku app.""" global HAPP - if is_heroku: + if is_heroku(): if config.HEROKU_API_KEY and config.HEROKU_APP_NAME: try: - Heroku = heroku3.from_key(config.HEROKU_API_KEY) - HAPP = Heroku.app(config.HEROKU_APP_NAME) - LOGGER(__name__).info(f"✦ Heroku App Configured...💙") - except BaseException: + heroku_client = heroku3.from_key(config.HEROKU_API_KEY) + HAPP = heroku_client.app(config.HEROKU_APP_NAME) + LOGGER(__name__).info("✦ Heroku App Configured...💙") + except Exception as e: LOGGER(__name__).warning( - f"✦ Please make sure your Heroku API Key and Your App name are configured correctly in the heroku...💚." - ) \ No newline at end of file + "✦ Please make sure your Heroku API Key and Your App name are configured correctly.💚" + ) + LOGGER(__name__).debug(f"Error: {e}") \ No newline at end of file From 1f310d64b44282e1bd8d0e074410c354b3c3f611 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:41:04 +0530 Subject: [PATCH 077/184] Update cookies.txt --- cookies/cookies.txt | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 60bd0cb0f744..a0792e3a3d2c 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -1,20 +1 @@ -# Netscape HTTP Cookie File -# http://curl.haxx.se/rfc/cookie_spec.html -# This is a generated file! Do not edit. - -.youtube.com TRUE / TRUE 1762671255 __Secure-1PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA -.youtube.com TRUE / TRUE 1762671255 __Secure-3PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA -.youtube.com TRUE / FALSE 1765695255 HSID A69vSCW39JPHQGxt3 -.youtube.com TRUE / TRUE 1765695255 SSID AbtE2g0gOfLqyADgx -.youtube.com TRUE / FALSE 1765695255 APISID bmovEQwfG97_p3Xn/AOGoT55Q1syWHDQCM -.youtube.com TRUE / TRUE 1765695255 SAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd -.youtube.com TRUE / TRUE 1765695255 __Secure-1PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd -.youtube.com TRUE / TRUE 1765695255 __Secure-3PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd -.youtube.com TRUE / FALSE 1765695255 SID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNMMZrHnz7kTw25L6r6usfJQACgYKAT8SARYSFQHGX2MiulzzOploKQ0SBbTJFNsZ2BoVAUF8yKoU7P_YqvqOV6X9h5Ri0QoJ0076 -.youtube.com TRUE / TRUE 1765695255 __Secure-1PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNIQpKBM8Ol4MxnQh0himPjwACgYKAWwSARYSFQHGX2MiA66JWckeknTlYjQ2zsaf7hoVAUF8yKpoeDw0weLjlxGdNCDRwctz0076 -.youtube.com TRUE / TRUE 1765695255 __Secure-3PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNkhfWPqQ8m6mQMHn1SdsG9QACgYKAX0SARYSFQHGX2MigaNR2A4QljvtfCBFuWSsihoVAUF8yKpOBvzZ4QAOFa4c5UrPfAfi0076 -.youtube.com TRUE / TRUE 1765695413 LOGIN_INFO AFmmF2swRgIhAKxYmInMGYmFdDLzw_zZFbJgEmYY63UZyagWPdtjOj2kAiEAhs6JCdjRu1cK5JR--BJBq43w8t9jmVBp1Y9n_29zYlg:QUQ3MjNmelJEV3ZuQTduYXVZZHh2ZlVpZnNLUEdKdGlkUEJFSklRdlhCMk85a3ZXRFo0RGVMTHF0a2NQM1dDWWp2U091eVVVZ2tmMk9GQmNqLU1rNWJmUUF5alNSZWU4Z04yaW55OU5CSjRaRlBPMFhaSmVxR1hJbkFhMXA1dVZQb1dGaHRMcEZybmd4bmludmdwTW04Q2pjeDkwYnNGUHhB -.youtube.com TRUE / TRUE 1766403772 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 -.youtube.com TRUE / FALSE 1763379781 SIDCC AKEyXzVMqEJTfwpfaABjwNgDvd2cgI5Gt0uX2s-7QJ2qkEs2r2Azfnkp8vhINXFYd00GmCMGXQ -.youtube.com TRUE / TRUE 1763379781 __Secure-1PSIDCC AKEyXzUcekplMITXHWzE_Ohxxdtke4vv_Gy074KnF2jfmosQHItQLFQCYsnqxdDH0H-hZAnF -.youtube.com TRUE / TRUE 1763379781 __Secure-3PSIDCC AKEyXzVBzcw8-2Q3_Z6RHxUvXvZJmh8RM6rnRdS25XuAonpC1ymIiPbLvd0Z8-ai2Qmx84zLEQ \ No newline at end of file +##### From 5056036b900d6f48d787fcdbc09c2b7a153978f0 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:54:58 +0530 Subject: [PATCH 078/184] Update start.py --- TanuMusic/plugins/bot/start.py | 97 ++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 29f2d636e389..311bd2eccd80 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -1,5 +1,5 @@ import time -import random +import random from pyrogram import filters from pyrogram.enums import ChatType from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message @@ -20,46 +20,81 @@ from TanuMusic.utils.decorators.language import LanguageStart from TanuMusic.utils.formatters import get_readable_time from TanuMusic.utils.inline import help_pannel, private_panel, start_panel -from strings import get_string from config import BANNED_USERS +from strings import get_string IMAGE = [ - "https://graph.org/file/f76fd86d1936d45a63c64.jpg", - "https://graph.org/file/69ba894371860cd22d92e.jpg", - "https://graph.org/file/67fde88d8c3aa8327d363.jpg", - "https://graph.org/file/3a400f1f32fc381913061.jpg", - # Add more URLs if needed +"https://graph.org/file/f76fd86d1936d45a63c64.jpg", +"https://graph.org/file/69ba894371860cd22d92e.jpg", +"https://graph.org/file/67fde88d8c3aa8327d363.jpg", +"https://graph.org/file/3a400f1f32fc381913061.jpg", +"https://graph.org/file/a0893f3a1e6777f6de821.jpg", +"https://graph.org/file/5a285fc0124657c7b7a0b.jpg", +"https://graph.org/file/25e215c4602b241b66829.jpg", +"https://graph.org/file/a13e9733afdad69720d67.jpg", +"https://graph.org/file/692e89f8fe20554e7a139.jpg", +"https://graph.org/file/db277a7810a3f65d92f22.jpg", +"https://graph.org/file/a00f89c5aa75735896e0f.jpg", +"https://graph.org/file/f86b71018196c5cfe7344.jpg", +"https://graph.org/file/a3db9af88f25bb1b99325.jpg", +"https://graph.org/file/5b344a55f3d5199b63fa5.jpg", +"https://graph.org/file/84de4b440300297a8ecb3.jpg", +"https://graph.org/file/84e84ff778b045879d24f.jpg", +"https://graph.org/file/a4a8f0e5c0e6b18249ffc.jpg", +"https://graph.org/file/ed92cada78099c9c3a4f7.jpg", +"https://graph.org/file/d6360613d0fa7a9d2f90b.jpg", +"https://graph.org/file/37248e7bdff70c662a702.jpg", +"https://graph.org/file/0bfe29d15e918917d1305.jpg", +"https://graph.org/file/16b1a2828cc507f8048bd.jpg", +"https://graph.org/file/e6b01f23f2871e128dad8.jpg", +"https://graph.org/file/cacbdddee77784d9ed2b7.jpg", +"https://graph.org/file/ddc5d6ec1c33276507b19.jpg", +"https://graph.org/file/39d7277189360d2c85b62.jpg", +"https://graph.org/file/5846b9214eaf12c3ed100.jpg", +"https://graph.org/file/ad4f9beb4d526e6615e18.jpg", +"https://graph.org/file/3514efaabe774e4f181f2.jpg", +"https://graph.org/file/eaa3a2602e43844a488a5.jpg", +"https://graph.org/file/b129e98b6e5c4db81c15f.jpg", +"https://graph.org/file/3ccb86d7d62e8ee0a2e8b.jpg", +"https://graph.org/file/df11d8257613418142063.jpg", +"https://graph.org/file/9e23720fedc47259b6195.jpg", +"https://graph.org/file/826485f2d7db6f09db8ed.jpg", +"https://graph.org/file/ff3ad786da825b5205691.jpg", +"https://graph.org/file/52713c9fe9253ae668f13.jpg", +"https://graph.org/file/8f8516c86677a8c91bfb1.jpg", +"https://graph.org/file/6603c3740378d3f7187da.jpg", +"https://graph.org/file/66cb6ec40eea5c4670118.jpg", +"https://graph.org/file/2e3cf4327b169b981055e.jpg", + ] + @app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) @LanguageStart async def start_pm(client, message: Message, _): await add_served_user(message.from_user.id) if len(message.text.split()) > 1: name = message.text.split(None, 1)[1] - if name.startswith("help"): + if name[0:4] == "help": keyboard = help_pannel(_) return await message.reply_photo( random.choice(IMAGE), caption=_["help_1"].format(config.SUPPORT_CHAT), reply_markup=keyboard, ) - elif name.startswith("sud"): + if name[0:3] == "sud": await sudoers_list(client=client, message=message, _=_) if await is_on_off(2): - await app.send_message( + return await app.send_message( chat_id=config.LOGGER_ID, - text=( - f"❖ {message.from_user.mention} checked the Sudo List.\n\n" - f"**User ID:** `{message.from_user.id}`\n" - f"**Username:** @{message.from_user.username}" - ), + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) return - elif name.startswith("inf"): - query = name.replace("info_", "", 1) - m = await message.reply_text("🔎 Searching...") + if name[0:3] == "inf": + m = await message.reply_text("🔎") + query = (str(name)).replace("info_", "", 1) + query = f"https://www.youtube.com/watch?v={query}" results = VideosSearch(query, limit=1) for result in (await results.next())["result"]: title = result["title"] @@ -70,7 +105,6 @@ async def start_pm(client, message: Message, _): channel = result["channel"]["name"] link = result["link"] published = result["publishedTime"] - searched_text = _["start_6"].format( title, duration, views, published, channellink, channel, app.mention ) @@ -90,13 +124,9 @@ async def start_pm(client, message: Message, _): reply_markup=key, ) if await is_on_off(2): - await app.send_message( + return await app.send_message( chat_id=config.LOGGER_ID, - text=( - f"❖ {message.from_user.mention} checked Track Information.\n\n" - f"**User ID:** `{message.from_user.id}`\n" - f"**Username:** @{message.from_user.username}" - ), + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) else: out = private_panel(_) @@ -106,13 +136,9 @@ async def start_pm(client, message: Message, _): reply_markup=InlineKeyboardMarkup(out), ) if await is_on_off(2): - await app.send_message( + return await app.send_message( chat_id=config.LOGGER_ID, - text=( - f"❖ {message.from_user.mention} started the bot.\n\n" - f"**User ID:** `{message.from_user.id}`\n" - f"**Username:** @{message.from_user.username}" - ), + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) @@ -126,7 +152,7 @@ async def start_gp(client, message: Message, _): caption=_["start_1"].format(app.mention, get_readable_time(uptime)), reply_markup=InlineKeyboardMarkup(out), ) - await add_served_chat(message.chat.id) + return await add_served_chat(message.chat.id) @app.on_message(filters.new_chat_members, group=-1) @@ -136,7 +162,10 @@ async def welcome(client, message: Message): language = await get_lang(message.chat.id) _ = get_string(language) if await is_banned_user(member.id): - await message.chat.ban_member(member.id) + try: + await message.chat.ban_member(member.id) + except: + pass if member.id == app.id: if message.chat.type != ChatType.SUPERGROUP: await message.reply_text(_["start_4"]) @@ -166,4 +195,4 @@ async def welcome(client, message: Message): await add_served_chat(message.chat.id) await message.stop_propagation() except Exception as ex: - print(f"Error in welcome: {ex}") \ No newline at end of file + print(ex) \ No newline at end of file From 0110035bebf4f11e178629d5bd9d64fe3e9f497e Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 20:42:59 +0530 Subject: [PATCH 079/184] Update sudoers.py --- TanuMusic/plugins/sudo/sudoers.py | 155 ++++++++++++------------------ 1 file changed, 62 insertions(+), 93 deletions(-) diff --git a/TanuMusic/plugins/sudo/sudoers.py b/TanuMusic/plugins/sudo/sudoers.py index b5f51ca424a6..8c986de5a566 100644 --- a/TanuMusic/plugins/sudo/sudoers.py +++ b/TanuMusic/plugins/sudo/sudoers.py @@ -1,102 +1,71 @@ -from pyrogram import filters -from pyrogram.types import Message - -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import add_sudo, remove_sudo -from TanuMusic.utils.decorators.language import language -from TanuMusic.utils.extraction import extract_user -from TanuMusic.utils.inline import close_markup -from config import BANNED_USERS, OWNER_ID - - -@app.on_message(filters.command(["addsudo"]) & filters.user(OWNER_ID)) -@language -async def useradd(client, message: Message, _): - if not message.reply_to_message: - if len(message.command) != 2: - return await message.reply_text(_["general_1"]) - user = await extract_user(message) - if user.id in SUDOERS: - return await message.reply_text(_["sudo_1"].format(user.mention)) - added = await add_sudo(user.id) - if added: - SUDOERS.add(user.id) - await message.reply_text(_["sudo_2"].format(user.mention)) - else: - await message.reply_text(_["sudo_8"]) - - -@app.on_message(filters.command(["delsudo", "rmsudo"]) & filters.user(OWNER_ID)) -@language -async def userdel(client, message: Message, _): - if not message.reply_to_message: - if len(message.command) != 2: - return await message.reply_text(_["general_1"]) - user = await extract_user(message) - if user.id not in SUDOERS: - return await message.reply_text(_["sudo_3"].format(user.mention)) - removed = await remove_sudo(user.id) - if removed: - SUDOERS.remove(user.id) - await message.reply_text(_["sudo_4"].format(user.mention)) - else: - await message.reply_text(_["sudo_8"]) - +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import add_sudo, remove_sudo +from TanuMusic.utils.decorators.language import language +from TanuMusic.utils.extraction import extract_user +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS, OWNER_ID + + +@app.on_message(filters.command(["addsudo"]) & filters.user(OWNER_ID)) +@language +async def useradd(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + if user.id in SUDOERS: + return await message.reply_text(_["sudo_1"].format(user.mention)) + added = await add_sudo(user.id) + if added: + SUDOERS.add(user.id) + await message.reply_text(_["sudo_2"].format(user.mention)) + else: + await message.reply_text(_["sudo_8"]) + + +@app.on_message(filters.command(["delsudo", "rmsudo"]) & filters.user(OWNER_ID)) +@language +async def userdel(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + if user.id not in SUDOERS: + return await message.reply_text(_["sudo_3"].format(user.mention)) + removed = await remove_sudo(user.id) + if removed: + SUDOERS.remove(user.id) + await message.reply_text(_["sudo_4"].format(user.mention)) + else: + await message.reply_text(_["sudo_8"]) + + @app.on_message(filters.command(["sudolist", "listsudo", "sudoers"]) & ~BANNED_USERS) @language async def sudoers_list(client, message: Message, _): text = _["sudo_5"] - - # Handle OWNER_ID as a list - if isinstance(OWNER_ID, (list, tuple, set)): # Use imported OWNER_ID directly - for owner_id in OWNER_ID: - user = await app.get_users(owner_id) - if isinstance(user, list): # Handle multiple users returned - for u in user: - user_text = u.mention if hasattr(u, "mention") else u.first_name - text += f"❖ {user_text}\n" - else: - user_text = user.mention if hasattr(user, "mention") else user.first_name - text += f"❖ {user_text}\n" - else: - user = await app.get_users(OWNER_ID) - if isinstance(user, list): - for u in user: - user_text = u.mention if hasattr(u, "mention") else u.first_name - text += f"❖ {user_text}\n" - else: - user_text = user.mention if hasattr(user, "mention") else user.first_name - text += f"❖ {user_text}\n" - + user = await app.get_users(OWNER_ID) + user = user.first_name if not user.mention else user.mention + text += f"❖ {user}\n" count = 0 smex = 0 - - # Loop through SUDOERS to list them for user_id in SUDOERS: - if user_id not in OWNER_ID: # Avoid listing owners twice + if user_id != OWNER_ID: try: user = await app.get_users(user_id) - if isinstance(user, list): # Handle multiple users - for u in user: - user_text = u.mention if hasattr(u, "mention") else u.first_name - if smex == 0: - smex += 1 - text += _["sudo_6"] - count += 1 - text += f"❖ {count} ➥ {user_text}\n" - else: - user_text = user.mention if hasattr(user, "mention") else user.first_name - if smex == 0: - smex += 1 - text += _["sudo_6"] - count += 1 - text += f"❖ {count} ➥ {user_text}\n" - except Exception as e: - continue # Skip if user lookup fails - - if count == 0: - text += _["sudo_7"] - - # Reply with the sudoers list - await message.reply_text(text, reply_markup=close_markup(_)) \ No newline at end of file + user = user.first_name if not user.mention else user.mention + if smex == 0: + smex += 1 + text += _["sudo_6"] + count += 1 + text += f"❖ {count} ➥ {user}\n" + except: + continue + if not text: + await message.reply_text(_["sudo_7"]) + else: + await message.reply_text(text, reply_markup=close_markup(_)) From 6ed643356355917b3b62cde9a531e882e82ba3d9 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 20:48:18 +0530 Subject: [PATCH 080/184] Update misc.py --- TanuMusic/misc.py | 63 ++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py index 6c1013ab8cd2..63fd93061d81 100644 --- a/TanuMusic/misc.py +++ b/TanuMusic/misc.py @@ -1,19 +1,21 @@ import socket import time + import heroku3 from pyrogram import filters import config -from TanuMusic.core.mongo import mongodb +from ERAVIBES.core.mongo import mongodb + from .logging import LOGGER SUDOERS = filters.user() + HAPP = None _boot_ = time.time() def is_heroku(): - """Check if the environment is Heroku.""" return "heroku" in socket.getfqdn() @@ -35,50 +37,39 @@ def is_heroku(): def dbb(): - """Initialize the local database.""" - global db, clonedb + global db db = {} - clonedb = {} - LOGGER(__name__).info("✦ Local Database Initialized...💛.") + LOGGER(__name__).info(f"✦ Local Database Initialized...💛") async def sudo(): - """Load sudoers from the configuration or database.""" global SUDOERS - OWNER = config.OWNER_ID - if config.MONGO_DB_URI is None: - for user_id in OWNER: - SUDOERS.add(user_id) - else: - sudoersdb = mongodb.sudoers - sudoers = await sudoersdb.find_one({"sudo": "sudo"}) - sudoers = [] if not sudoers else sudoers.get("sudoers", []) - for user_id in OWNER: + SUDOERS.add(config.OWNER_ID) + sudoersdb = mongodb.sudoers + sudoers = await sudoersdb.find_one({"sudo": "sudo"}) + sudoers = [] if not sudoers else sudoers["sudoers"] + if config.OWNER_ID not in sudoers: + sudoers.append(config.OWNER_ID) + await sudoersdb.update_one( + {"sudo": "sudo"}, + {"$set": {"sudoers": sudoers}}, + upsert=True, + ) + if sudoers: + for user_id in sudoers: SUDOERS.add(user_id) - if user_id not in sudoers: - sudoers.append(user_id) - await sudoersdb.update_one( - {"sudo": "sudo"}, - {"$set": {"sudoers": sudoers}}, - upsert=True, - ) - if sudoers: - for user_id in sudoers: - SUDOERS.add(user_id) - LOGGER(__name__).info("✦ Sudoers Loaded...❤️.") + LOGGER(__name__).info(f"✦ Sudoers Loaded...❤️") def heroku(): - """Configure the Heroku app.""" global HAPP - if is_heroku(): + if is_heroku: if config.HEROKU_API_KEY and config.HEROKU_APP_NAME: try: - heroku_client = heroku3.from_key(config.HEROKU_API_KEY) - HAPP = heroku_client.app(config.HEROKU_APP_NAME) - LOGGER(__name__).info("✦ Heroku App Configured...💙") - except Exception as e: + Heroku = heroku3.from_key(config.HEROKU_API_KEY) + HAPP = Heroku.app(config.HEROKU_APP_NAME) + LOGGER(__name__).info(f"✦ Heroku App Configured...💙") + except BaseException: LOGGER(__name__).warning( - "✦ Please make sure your Heroku API Key and Your App name are configured correctly.💚" - ) - LOGGER(__name__).debug(f"Error: {e}") \ No newline at end of file + f"✦ Please make sure your Heroku API Key and Your App name are configured correctly in the heroku...💚" + ) \ No newline at end of file From 3f47c4d7c5fa20f5c76c7de0c871bdb36067ee76 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 20:52:24 +0530 Subject: [PATCH 081/184] Update misc.py --- TanuMusic/misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py index 63fd93061d81..d5d8f973e58b 100644 --- a/TanuMusic/misc.py +++ b/TanuMusic/misc.py @@ -5,7 +5,7 @@ from pyrogram import filters import config -from ERAVIBES.core.mongo import mongodb +from TanuMusic.core.mongo import mongodb from .logging import LOGGER From 7f1b96ca1dcd7d1c72ac2e629c095d10523ee8cd Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 20:56:34 +0530 Subject: [PATCH 082/184] Update config.py --- config/config.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/config.py b/config/config.py index 7619f2800834..dd989ac0391c 100644 --- a/config/config.py +++ b/config/config.py @@ -34,9 +34,7 @@ LOGGER_ID = int(getenv("LOGGER_ID", "-1002100219353")) #❖ Get this value from @MissRose_bot on Telegram by /id -OWNER_ID = list( - map(int, getenv("OWNER_ID", "7453278496").split()) -) +OWNER_ID = getenv("OWNER_ID", "7453278496") #❖ Your heroku app name HEROKU_APP_NAME = getenv("HEROKU_APP_NAME", None) From c6a31d65f1d38ad90b47bd7a4c13ba0a9f489e73 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 22:10:43 +0530 Subject: [PATCH 083/184] Update cookies.txt --- cookies/cookies.txt | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index a0792e3a3d2c..e03a97feafe8 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -1 +1,20 @@ -##### +# Netscape HTTP Cookie File +# http://curl.haxx.se/rfc/cookie_spec.html +# This is a generated file! Do not edit. + +.youtube.com TRUE / TRUE 1762671255 __Secure-1PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA +.youtube.com TRUE / TRUE 1762671255 __Secure-3PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA +.youtube.com TRUE / FALSE 1765695255 HSID A69vSCW39JPHQGxt3 +.youtube.com TRUE / TRUE 1765695255 SSID AbtE2g0gOfLqyADgx +.youtube.com TRUE / FALSE 1765695255 APISID bmovEQwfG97_p3Xn/AOGoT55Q1syWHDQCM +.youtube.com TRUE / TRUE 1765695255 SAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd +.youtube.com TRUE / TRUE 1765695255 __Secure-1PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd +.youtube.com TRUE / TRUE 1765695255 __Secure-3PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd +.youtube.com TRUE / FALSE 1765695255 SID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNMMZrHnz7kTw25L6r6usfJQACgYKAT8SARYSFQHGX2MiulzzOploKQ0SBbTJFNsZ2BoVAUF8yKoU7P_YqvqOV6X9h5Ri0QoJ0076 +.youtube.com TRUE / TRUE 1765695255 __Secure-1PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNIQpKBM8Ol4MxnQh0himPjwACgYKAWwSARYSFQHGX2MiA66JWckeknTlYjQ2zsaf7hoVAUF8yKpoeDw0weLjlxGdNCDRwctz0076 +.youtube.com TRUE / TRUE 1765695255 __Secure-3PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNkhfWPqQ8m6mQMHn1SdsG9QACgYKAX0SARYSFQHGX2MigaNR2A4QljvtfCBFuWSsihoVAUF8yKpOBvzZ4QAOFa4c5UrPfAfi0076 +.youtube.com TRUE / TRUE 1765695413 LOGIN_INFO AFmmF2swRgIhAKxYmInMGYmFdDLzw_zZFbJgEmYY63UZyagWPdtjOj2kAiEAhs6JCdjRu1cK5JR--BJBq43w8t9jmVBp1Y9n_29zYlg:QUQ3MjNmelJEV3ZuQTduYXVZZHh2ZlVpZnNLUEdKdGlkUEJFSklRdlhCMk85a3ZXRFo0RGVMTHF0a2NQM1dDWWp2U091eVVVZ2tmMk9GQmNqLU1rNWJmUUF5alNSZWU4Z04yaW55OU5CSjRaRlBPMFhaSmVxR1hJbkFhMXA1dVZQb1dGaHRMcEZybmd4bmludmdwTW04Q2pjeDkwYnNGUHhB +.youtube.com TRUE / TRUE 1766403772 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 +.youtube.com TRUE / FALSE 1763379781 SIDCC AKEyXzVMqEJTfwpfaABjwNgDvd2cgI5Gt0uX2s-7QJ2qkEs2r2Azfnkp8vhINXFYd00GmCMGXQ +.youtube.com TRUE / TRUE 1763379781 __Secure-1PSIDCC AKEyXzUcekplMITXHWzE_Ohxxdtke4vv_Gy074KnF2jfmosQHItQLFQCYsnqxdDH0H-hZAnF +.youtube.com TRUE / TRUE 1763379781 __Secure-3PSIDCC AKEyXzVBzcw8-2Q3_Z6RHxUvXvZJmh8RM6rnRdS25XuAonpC1ymIiPbLvd0Z8-ai2Qmx84zLEQ From eb1e33007c1c99f483f2330dbdcd6debe88b8e62 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 24 Nov 2024 22:15:16 +0530 Subject: [PATCH 084/184] Update cookies.txt --- cookies/cookies.txt | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index e03a97feafe8..16d5594a2403 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -2,19 +2,20 @@ # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1762671255 __Secure-1PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA -.youtube.com TRUE / TRUE 1762671255 __Secure-3PSIDTS sidts-CjEBQT4rX5Nb2HFnmDRetnFkS0SZ7CBfaiR16Y2akzdGCZpMYfDAPRywDWJYPPFVmsvzEAA -.youtube.com TRUE / FALSE 1765695255 HSID A69vSCW39JPHQGxt3 -.youtube.com TRUE / TRUE 1765695255 SSID AbtE2g0gOfLqyADgx -.youtube.com TRUE / FALSE 1765695255 APISID bmovEQwfG97_p3Xn/AOGoT55Q1syWHDQCM -.youtube.com TRUE / TRUE 1765695255 SAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd -.youtube.com TRUE / TRUE 1765695255 __Secure-1PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd -.youtube.com TRUE / TRUE 1765695255 __Secure-3PAPISID EGhuGPtQyWIu8WBS/Ayxj-ERmq0oL9t0Fd -.youtube.com TRUE / FALSE 1765695255 SID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNMMZrHnz7kTw25L6r6usfJQACgYKAT8SARYSFQHGX2MiulzzOploKQ0SBbTJFNsZ2BoVAUF8yKoU7P_YqvqOV6X9h5Ri0QoJ0076 -.youtube.com TRUE / TRUE 1765695255 __Secure-1PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNIQpKBM8Ol4MxnQh0himPjwACgYKAWwSARYSFQHGX2MiA66JWckeknTlYjQ2zsaf7hoVAUF8yKpoeDw0weLjlxGdNCDRwctz0076 -.youtube.com TRUE / TRUE 1765695255 __Secure-3PSID g.a000qAg14yLWr3JFYKdP5AY3QjTT3oTEmXm47ziziwiMuNKJUmcNkhfWPqQ8m6mQMHn1SdsG9QACgYKAX0SARYSFQHGX2MigaNR2A4QljvtfCBFuWSsihoVAUF8yKpOBvzZ4QAOFa4c5UrPfAfi0076 -.youtube.com TRUE / TRUE 1765695413 LOGIN_INFO AFmmF2swRgIhAKxYmInMGYmFdDLzw_zZFbJgEmYY63UZyagWPdtjOj2kAiEAhs6JCdjRu1cK5JR--BJBq43w8t9jmVBp1Y9n_29zYlg:QUQ3MjNmelJEV3ZuQTduYXVZZHh2ZlVpZnNLUEdKdGlkUEJFSklRdlhCMk85a3ZXRFo0RGVMTHF0a2NQM1dDWWp2U091eVVVZ2tmMk9GQmNqLU1rNWJmUUF5alNSZWU4Z04yaW55OU5CSjRaRlBPMFhaSmVxR1hJbkFhMXA1dVZQb1dGaHRMcEZybmd4bmludmdwTW04Q2pjeDkwYnNGUHhB -.youtube.com TRUE / TRUE 1766403772 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 -.youtube.com TRUE / FALSE 1763379781 SIDCC AKEyXzVMqEJTfwpfaABjwNgDvd2cgI5Gt0uX2s-7QJ2qkEs2r2Azfnkp8vhINXFYd00GmCMGXQ -.youtube.com TRUE / TRUE 1763379781 __Secure-1PSIDCC AKEyXzUcekplMITXHWzE_Ohxxdtke4vv_Gy074KnF2jfmosQHItQLFQCYsnqxdDH0H-hZAnF -.youtube.com TRUE / TRUE 1763379781 __Secure-3PSIDCC AKEyXzVBzcw8-2Q3_Z6RHxUvXvZJmh8RM6rnRdS25XuAonpC1ymIiPbLvd0Z8-ai2Qmx84zLEQ +.youtube.com TRUE / TRUE 1732468351 GPS 1 +.youtube.com TRUE / TRUE 1767026657 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=20000 +.youtube.com TRUE / FALSE 1767026622 SID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJpSkIFzIqJghQ8MoIfzNaWAACgYKAb0SARYSFQHGX2MixKJJU8PxfP7s2Im2q1FxNhoVAUF8yKreeYquPFKxMF3JHNIjSzDW0076 +.youtube.com TRUE / TRUE 1764002622 __Secure-1PSIDTS sidts-CjEBQT4rX8fuSFBZHSHFSEV6T6uRdUs9x_wvQAS4kUlooBZjen2hwj_SVAW3rUIjRzbSEAA +.youtube.com TRUE / TRUE 1764002622 __Secure-3PSIDTS sidts-CjEBQT4rX8fuSFBZHSHFSEV6T6uRdUs9x_wvQAS4kUlooBZjen2hwj_SVAW3rUIjRzbSEAA +.youtube.com TRUE / TRUE 1767026622 __Secure-1PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJqbXZkv88VxHeFyrax1RG2AACgYKATMSARYSFQHGX2MilQh1Js3v3ONy6LFQa9AnIBoVAUF8yKq-OSARtfCvrzJnPogXD8Ss0076 +.youtube.com TRUE / TRUE 1767026622 __Secure-3PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJDGrYcjzvpb2pC5YWXa61RgACgYKAZYSARYSFQHGX2Miks0VyDEqEhFUL5liR7ZJzhoVAUF8yKowuPGUqyqI2N9hY05wlZ9M0076 +.youtube.com TRUE / FALSE 1767026622 HSID APbJbQUNG0V4lwk-R +.youtube.com TRUE / TRUE 1767026622 SSID AxN9BRCWy4p43wxSQ +.youtube.com TRUE / FALSE 1767026622 APISID EWUXhVT466K1TbU9/AdoaJWu2XXc5P0KeI +.youtube.com TRUE / TRUE 1767026622 SAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 +.youtube.com TRUE / TRUE 1767026622 __Secure-1PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 +.youtube.com TRUE / TRUE 1767026622 __Secure-3PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 +.youtube.com TRUE / TRUE 1767026623 LOGIN_INFO AFmmF2swRQIgPOUyNBezY4Cv61n1G2ph1YffgNyH38N8TFd2HSY-zyQCIQDqCzUb06OGpLYUV42aMn4xvWDY2sMkVaLOnLJ0N7Uwlg:QUQ3MjNmeVk2TU81bGxDbmNkNnhOTTZveXNFZ3RSVFVQSmRHTzRmVThRU2FZcnR6bjM4QWw0VjVwWTBzRVFMYV9DdEFCaDVHenpZMml2TWZOLU9TLTh0ZEhiSlp3M3FEZXdCVE5qT29vMjBpeVJSV2lXQV9SeDYwVkJJZFR0YlU2cmNKWGt1THkwaUNPTEh5SVRDazI4Sk1zMVB2TzZRd2lB +.youtube.com TRUE / FALSE 1764002646 SIDCC AKEyXzVXaVz0sqk_4rDm4ZM27rDuqiDvLYumULvmOaT8x1Ds83_1QuD4-Kh6Rp1WLFhUO2Aa +.youtube.com TRUE / TRUE 1764002646 __Secure-1PSIDCC AKEyXzW4_gzrtfqR7fFQKE0rMLcc0GuFknsS17Gec1ZubRSefJhPT5PEIfe8PrYq9FwxZgAZ +.youtube.com TRUE / TRUE 1764002646 __Secure-3PSIDCC AKEyXzWPqlzu6meSzurPQCe8zFEhl7P3l3aEM2MY_6P9iKymrFsoIKOxtmIgd72EomshLMTXiA From 88ec5cd44c3db1bdb1d0da1388ad1cc233dddb2d Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:09:08 +0530 Subject: [PATCH 085/184] Update en.yml --- strings/langs/en.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 8f17b2ac9034..f5777a730cab 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -284,10 +284,10 @@ server_7 : "❖ ʙᴏᴛ ᴜᴩᴅᴀᴛᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ ! ɴ server_8 : "❖ {0} ɪs ʀᴇsᴛᴀʀᴛɪɴɢ...\n\n● ʏᴏᴜ ᴄᴀɴ sᴛᴀʀᴛ ᴩʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴀғᴛᴇʀ 15-20 sᴇᴄᴏɴᴅs." server_9 : "❖ sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ, ᴩʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʟᴏɢs." server_10 : "❖ ᴀɴ ᴇxᴄᴇᴩᴛɪᴏɴ ᴏᴄᴄᴜʀᴇᴅ ᴀᴛ #ᴜᴩᴅᴀᴛᴇʀ ᴅᴜᴇ ᴛᴏ ➥ {0}" -server_11 : "❖ ʀᴜɴɴɪɴɢ ᴀ sᴘᴇᴇᴅᴛᴇsᴛ..." -server_12 : "❖ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." -server_13 : "❖ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." -server_14 : "❖ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs..." +server_11 : "⇆ ʀᴜɴɴɪɴɢ ᴀ sᴘᴇᴇᴅᴛᴇsᴛ..." +server_12 : "⇆ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." +server_13 : "⇆ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." +server_14 : "⇆ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs..." server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ \n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ \n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" gban_1 : "❖ ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴡᴀɴɴᴀ ɢʙᴀɴ ʏᴏᴜʀsᴇʟғ ʙᴀʙʏ ?" From 3f80a9b707c1332985f32e3fd6d592adc4e95915 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:13:06 +0530 Subject: [PATCH 086/184] Update config.py --- config/config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/config.py b/config/config.py index dd989ac0391c..6dc0b7d93449 100644 --- a/config/config.py +++ b/config/config.py @@ -53,6 +53,11 @@ "GIT_TOKEN", None ) #❖ Fill this variable if your upstream repository is private +#❖ Make your bots privacy from telegra.ph and put your url here +PRIVACY_LINK = getenv( + "PRIVACY_LINK", "https://telegra.ph/Privacy-Policy-for-DV-MUSIC-08-30" +) + SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/C0DE_SEARCH") SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/AsuraaSupports") From abb500e8df30e8b136cc4e2618c773c064b9bfcc Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:13:33 +0530 Subject: [PATCH 087/184] Update config.py --- config/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.py b/config/config.py index 6dc0b7d93449..b4b3b66e96ad 100644 --- a/config/config.py +++ b/config/config.py @@ -55,7 +55,7 @@ #❖ Make your bots privacy from telegra.ph and put your url here PRIVACY_LINK = getenv( - "PRIVACY_LINK", "https://telegra.ph/Privacy-Policy-for-DV-MUSIC-08-30" + "PRIVACY_LINK", "https://telegra.ph/" ) SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/C0DE_SEARCH") From d3b0cd5be5c776617356d05f953fff8877ffa07f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:19:29 +0530 Subject: [PATCH 088/184] Update bot --- TanuMusic/plugins/bot/privacy.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 TanuMusic/plugins/bot/privacy.py diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py new file mode 100644 index 000000000000..a2c4593b27de --- /dev/null +++ b/TanuMusic/plugins/bot/privacy.py @@ -0,0 +1,27 @@ +from pyrogram import filters +from pyrogram.enums import ParseMode +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +import config +from TanuMusic import app + + +@app.on_message(filters.command("privacy")) +async def privacy(client, message: Message): + keyboard = InlineKeyboardMarkup( + [[InlineKeyboardButton("ᴠɪᴇᴡ ᴘʀɪᴠᴀᴄʏ ᴘᴏʟɪᴄʏ", url=config.PRIVACY_LINK)]] + ) + TEXT = f""" +🔒 **Privacy Policy for {client.me.mention} !** + +Your privacy is important to us. To learn more about how we collect, use, and protect your data, please review our Privacy Policy here: [Privacy Policy]({config.PRIVACY_LINK}). + +If you have any questions or concerns, feel free to reach out to our [Support Team]({config.SUPPORT_GROUP}). + """ + + await message.reply_text( + TEXT, + reply_markup=keyboard, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + ) \ No newline at end of file From 06a01cd2b24f82146d0105515097fb6ed0536b0a Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:20:35 +0530 Subject: [PATCH 089/184] Rename repo.py# to repo.py --- TanuMusic/plugins/bot/{repo.py# => repo.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename TanuMusic/plugins/bot/{repo.py# => repo.py} (100%) diff --git a/TanuMusic/plugins/bot/repo.py# b/TanuMusic/plugins/bot/repo.py similarity index 100% rename from TanuMusic/plugins/bot/repo.py# rename to TanuMusic/plugins/bot/repo.py From e813792fa3de418511c8a0510b07d5edd204045b Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:22:39 +0530 Subject: [PATCH 090/184] Update helpers.py --- strings/helpers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/strings/helpers.py b/strings/helpers.py index 807121bf3a5b..55c43cf9dccf 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -115,6 +115,7 @@ HELP_9 = """ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs ➥ +⬤ /draw ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴀɴ ɪᴍᴀɢᴇ. ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ From d59b2c1b3e67be278c8c7034297310b615ff9ed0 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:28:09 +0530 Subject: [PATCH 091/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index a2c4593b27de..2cd7baf56e1b 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -4,7 +4,7 @@ import config from TanuMusic import app - +from config import SUPPORT_CHAT @app.on_message(filters.command("privacy")) async def privacy(client, message: Message): From e0e14a33ce351c660fe6c801720e3078b27b4cc1 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:28:44 +0530 Subject: [PATCH 092/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 1 - 1 file changed, 1 deletion(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index 2cd7baf56e1b..fccdcfebb5bb 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -2,7 +2,6 @@ from pyrogram.enums import ParseMode from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -import config from TanuMusic import app from config import SUPPORT_CHAT From 778c2b94e9a52e693ba955239d4049e531ec6562 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:33:59 +0530 Subject: [PATCH 093/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index fccdcfebb5bb..82342cd80b10 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -2,6 +2,7 @@ from pyrogram.enums import ParseMode from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +import config from TanuMusic import app from config import SUPPORT_CHAT From 0bf2c1fde1bd635d507657f84e98dccc1a0bc499 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:41:41 +0530 Subject: [PATCH 094/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index 82342cd80b10..3ea82610ad99 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -16,7 +16,7 @@ async def privacy(client, message: Message): Your privacy is important to us. To learn more about how we collect, use, and protect your data, please review our Privacy Policy here: [Privacy Policy]({config.PRIVACY_LINK}). -If you have any questions or concerns, feel free to reach out to our [Support Team]({config.SUPPORT_GROUP}). +If you have any questions or concerns, feel free to reach out to our [Support Team]({config.SUPPORT_CHAT}). """ await message.reply_text( From 12e18da4718fd8a81afff6da274de62ad97cfadb Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:56:17 +0530 Subject: [PATCH 095/184] Update play.py --- TanuMusic/utils/inline/play.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/TanuMusic/utils/inline/play.py b/TanuMusic/utils/inline/play.py index 6a70aa32e474..fa6b551f15e9 100644 --- a/TanuMusic/utils/inline/play.py +++ b/TanuMusic/utils/inline/play.py @@ -32,25 +32,25 @@ def stream_markup_timer(_, chat_id, played, dur): percentage = (played_sec / duration_sec) * 100 umm = math.floor(percentage) if 0 < umm <= 10: - bar = "Ⓝ▰▱▱▱▱▱▱▱▰" + bar = "◉—————————" elif 10 < umm < 20: - bar = "▰Ⓝ▱▱▱▱▱▱▱▰" + bar = "—◉————————" elif 20 <= umm < 30: - bar = "▰▱Ⓝ▱▱▱▱▱▱▰" + bar = "——◉———————" elif 30 <= umm < 40: - bar = "▰▱▱Ⓝ▱▱▱▱▱▰" + bar = "———◉——————" elif 40 <= umm < 50: - bar = "▰▱▱▱Ⓝ▱▱▱▱▰" + bar = "————◉—————" elif 50 <= umm < 60: - bar = "▰▱▱▱▱Ⓝ▱▱▱▰" + bar = "—————◉————" elif 60 <= umm < 70: - bar = "▰▱▱▱▱▱Ⓝ▱▱▰" + bar = "——————◉———" elif 70 <= umm < 80: - bar = "▰▱▱▱▱▱▱Ⓝ▱▰" + bar = "———————◉——" elif 80 <= umm < 95: - bar = "▰▱▱▱▱▱▱▱Ⓝ▰" + bar = "————————◉—" else: - bar = "▰▱▱▱▱▱▱▱▰Ⓝ" + bar = "—————————◉" buttons = [ [ InlineKeyboardButton( @@ -182,5 +182,4 @@ def slider_markup(_, videoid, user_id, query, query_type, channel, fplay): ), ], ] - return buttons - + return buttons \ No newline at end of file From 183c887d6698b4fe57923291d586ca07f9e12c93 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:28:40 +0530 Subject: [PATCH 096/184] Update requirements.txt --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index fdc6ee9d109b..6f9b6153227a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,6 @@ gunicorn==22.0.0 youtube-search youtube-search-python pornhub-api==0.3.0 -telegraph async_pymongo gpytranslate search_engine_parser @@ -55,4 +54,4 @@ git+https://github.com/KurimuzonAkuma/pyrogram@dev git+https://github.com/yt-dlp/yt-dlp git+https://github.com/alexmercerind/youtube-search-python@main git+https://github.com/joetats/youtube_search@master -git+https://github.com/Vivekkumar-IN/yt-dlp-youtube-oauth2 + From 4db441878c907788a2902ac521d313bc1a58c5e6 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 26 Nov 2024 19:10:09 +0530 Subject: [PATCH 097/184] Update config.py --- config/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.py b/config/config.py index b4b3b66e96ad..e951c4215116 100644 --- a/config/config.py +++ b/config/config.py @@ -55,7 +55,7 @@ #❖ Make your bots privacy from telegra.ph and put your url here PRIVACY_LINK = getenv( - "PRIVACY_LINK", "https://telegra.ph/" + "PRIVACY_LINK", "https://graph.org/Privacy-Policy-for-Tanu-Music-11-26" ) SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/C0DE_SEARCH") From b4a73f7b3dff454e1563a9f36a63e87938c247c7 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 27 Nov 2024 19:26:51 +0530 Subject: [PATCH 098/184] Update userbot.py --- TanuMusic/core/userbot.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/TanuMusic/core/userbot.py b/TanuMusic/core/userbot.py index a326df4234bb..492dda2f502e 100644 --- a/TanuMusic/core/userbot.py +++ b/TanuMusic/core/userbot.py @@ -51,8 +51,8 @@ async def start(self): if config.STRING1: await self.one.start() try: - await self.one.join_chat("krishnetwork") - await self.one.join_chat("krishsupport") + await self.one.join_chat("C0DE_SEARCH") + await self.one.join_chat("AsuraaSupports") except: pass assistants.append(1) @@ -72,8 +72,8 @@ async def start(self): if config.STRING2: await self.two.start() try: - await self.two.join_chat("krishnetwork") - await self.one.join_chat("krishsupport") + await self.two.join_chat("C0DE_SEARCH") + await self.one.join_chat("AsuraaSupports") except: pass assistants.append(2) @@ -93,8 +93,8 @@ async def start(self): if config.STRING3: await self.three.start() try: - await self.three.join_chat("krishnetwork") - await self.one.join_chat("krishsupport") + await self.three.join_chat("C0DE_SEARCH") + await self.one.join_chat("AsuraaSupports") except: pass assistants.append(3) @@ -114,8 +114,8 @@ async def start(self): if config.STRING4: await self.four.start() try: - await self.four.join_chat("krishnetwork") - await self.one.join_chat("krishsupport") + await self.four.join_chat("C0DE_SEARCH") + await self.one.join_chat("AsuraaSupports") except: pass assistants.append(4) @@ -135,8 +135,8 @@ async def start(self): if config.STRING5: await self.five.start() try: - await self.five.join_chat("krishnetwork") - await self.one.join_chat("krishsupport") + await self.five.join_chat("C0DE_SEARCH") + await self.one.join_chat("AsuraaSupports") except: pass assistants.append(5) @@ -167,4 +167,4 @@ async def stop(self): if config.STRING5: await self.five.stop() except: - pass + pass \ No newline at end of file From 0e558d98f9db32afe84ab5d295a42104c41d662f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:16:47 +0530 Subject: [PATCH 099/184] Update filemanager.py --- TanuMusic/plugins/sudo/filemanager.py | 140 +++++++++++++++----------- 1 file changed, 80 insertions(+), 60 deletions(-) diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py index 0ee944710b9c..8bf2e80339f6 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -1,6 +1,5 @@ import io import os -import os.path import time from inspect import getfullargspec from os.path import exists, isdir @@ -10,11 +9,47 @@ from TanuMusic import app from TanuMusic.misc import SUDOERS -from TanuMusic.utils.error import capture_err MAX_MESSAGE_SIZE_LIMIT = 4095 +def humanbytes(size): + """Convert bytes into a human-readable format.""" + for unit in ["B", "KB", "MB", "GB", "TB", "PB"]: + if size < 1024: + return f"{size:.2f} {unit}" + size /= 1024 + + +def split_limits(text, limit=MAX_MESSAGE_SIZE_LIMIT): + """Split text into chunks that do not exceed the given limit.""" + return [text[i : i + limit] for i in range(0, len(text), limit)] + + +async def eor(msg: Message, **kwargs): + """Edit or reply to a message.""" + func = ( + (msg.edit_text if msg.from_user.is_self else msg.reply) + if msg.from_user + else msg.reply + ) + spec = getfullargspec(func.__wrapped__).args + return await func(**{k: v for k, v in kwargs.items() if k in spec}) + + +async def capture_err(func): + """Decorator to handle errors gracefully.""" + async def wrapper(client, message, *args, **kwargs): + try: + return await func(client, message, *args, **kwargs) + except Exception as e: + error_feedback = split_limits(str(e)) + for feedback in error_feedback: + await message.reply(feedback) + raise e + return wrapper + + @app.on_message(filters.command("ls") & ~filters.forwarded & ~filters.via_bot & SUDOERS) @capture_err async def lst(_, message): @@ -23,72 +58,71 @@ async def lst(_, message): path = os.getcwd() text = message.text.split(" ", 1) directory = None + if len(text) > 1: directory = text[1].strip() path = directory + if not exists(path): await eor( message, - text=f"There is no such directory or file with the name `{directory}` check again!", + text=f"There is no such directory or file with the name `{directory}`. Check again!", ) return + if isdir(path): if directory: - msg = "Folders and Files in `{}` :\n\n".format(path) + msg = f"Folders and Files in `{path}` :\n\n" lists = os.listdir(path) else: - msg = "Folders and Files in Current Directory :\n\n" + msg = "Folders and Files in Current Directory:\n\n" lists = os.listdir(path) + files = "" folders = "" for contents in sorted(lists): - thepathoflight = path + "/" + contents - if not isdir(thepathoflight): - size = os.stat(thepathoflight).st_size + item_path = os.path.join(path, contents) + if not isdir(item_path): + size = os.stat(item_path).st_size if contents.endswith((".mp3", ".flac", ".wav", ".m4a")): - files += "🎵 " + f"{contents}\n" - if contents.endswith((".opus")): - files += "🎙 " + f"{contents}\n" - elif contents.endswith( - (".mkv", ".mp4", ".webm", ".avi", ".mov", ".flv") - ): - files += "🎞 " + f"{contents}\n" - elif contents.endswith( - (".zip", ".tar", ".tar.gz", ".rar", ".7z", ".xz") - ): - files += "🗜 " + f"{contents}\n" - elif contents.endswith( - (".jpg", ".jpeg", ".png", ".gif", ".bmp", ".ico", ". webp") - ): - files += "🖼 " + f"{contents}\n" + files += f"🎵 {contents}\n" + elif contents.endswith(".opus"): + files += f"🎙 {contents}\n" + elif contents.endswith((".mkv", ".mp4", ".webm", ".avi", ".mov", ".flv")): + files += f"🎞 {contents}\n" + elif contents.endswith((".zip", ".tar", ".tar.gz", ".rar", ".7z", ".xz")): + files += f"🗜 {contents}\n" + elif contents.endswith((".jpg", ".jpeg", ".png", ".gif", ".bmp", ".ico", ".webp")): + files += f"🖼 {contents}\n" elif contents.endswith((".exe", ".deb")): - files += "⚙️ " + f"{contents}\n" + files += f"⚙️ {contents}\n" elif contents.endswith((".iso", ".img")): - files += "💿 " + f"{contents}\n" - elif contents.endswith((".apk", ".apk")): - files += "📱 " + f"{contents}\n" - elif contents.endswith((".py")): - files += "🐍 " + f"{contents}\n" + files += f"💿 {contents}\n" + elif contents.endswith((".apk", ".xapk")): + files += f"📱 {contents}\n" + elif contents.endswith(".py"): + files += f"🐍 {contents}\n" else: - files += "📄 " + f"{contents}\n" + files += f"📄 {contents}\n" else: folders += f"📁 {contents}\n" + if files or folders: - msg = msg + folders + files + msg += folders + files else: - msg = msg + "__empty path__" + msg += "__empty path__" else: size = os.stat(path).st_size - msg = "The details of given file :\n\n" + msg = "The details of the given file:\n\n" if path.endswith((".mp3", ".flac", ".wav", ".m4a")): mode = "🎵 " - if path.endswith((".opus")): + elif path.endswith(".opus"): mode = "🎙 " elif path.endswith((".mkv", ".mp4", ".webm", ".avi", ".mov", ".flv")): mode = "🎞 " elif path.endswith((".zip", ".tar", ".tar.gz", ".rar", ".7z", ".xz")): mode = "🗜 " - elif path.endswith((".jpg", ".jpeg", ".png", ".gif", ".bmp", ".ico", ". webp")): + elif path.endswith((".jpg", ".jpeg", ".png", ".gif", ".bmp", ".ico", ".webp")): mode = "🖼 " elif path.endswith((".exe", ".deb")): mode = "⚙️ " @@ -96,27 +130,23 @@ async def lst(_, message): mode = "💿 " elif path.endswith((".apk", ".xapk")): mode = "📱 " - elif path.endswith((".py")): + elif path.endswith(".py"): mode = "🐍 " else: mode = "📄 " - time.ctime(os.path.getctime(path)) - time2 = time.ctime(os.path.getmtime(path)) - time3 = time.ctime(os.path.getatime(path)) - msg += f"Location : {path}\n" - msg += f"Icon : {mode}\n" - msg += f"Size : {humanbytes(size)}\n" - msg += f"Last Modified Time: {time2}\n" - msg += f"Last Accessed Time: {time3}" + + last_modified = time.ctime(os.path.getmtime(path)) + last_accessed = time.ctime(os.path.getatime(path)) + msg += f"Location: {path}\n" + msg += f"Icon: {mode}\n" + msg += f"Size: {humanbytes(size)}\n" + msg += f"Last Modified Time: {last_modified}\n" + msg += f"Last Accessed Time: {last_accessed}" if len(msg) > MAX_MESSAGE_SIZE_LIMIT: with io.BytesIO(str.encode(msg)) as out_file: out_file.name = "ls.txt" - await app.send_document( - chat_id, - out_file, - caption=path, - ) + await app.send_document(chat_id, out_file, caption=path) await message.delete() else: await eor(message, text=msg) @@ -132,14 +162,4 @@ async def rm_file(client, message): os.remove(file) await eor(message, text=f"{file} has been deleted.") else: - await eor(message, text=f"{file} doesn't exist!") - - -async def eor(msg: Message, **kwargs): - func = ( - (msg.edit_text if msg.from_user.is_self else msg.reply) - if msg.from_user - else msg.reply - ) - spec = getfullargspec(func.__wrapped__).args - return await func(**{k: v for k, v in kwargs.items() if k in spec}) \ No newline at end of file + await eor(message, text=f"{file} doesn't exist!") \ No newline at end of file From b6361fe835af8ccb1a1f91bbcd7d70f703c625fa Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 29 Nov 2024 17:07:58 +0530 Subject: [PATCH 100/184] Update filemanager.py --- TanuMusic/plugins/sudo/filemanager.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py index 8bf2e80339f6..bc4a8848b5c2 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -23,18 +23,22 @@ def humanbytes(size): def split_limits(text, limit=MAX_MESSAGE_SIZE_LIMIT): """Split text into chunks that do not exceed the given limit.""" - return [text[i : i + limit] for i in range(0, len(text), limit)] + return [text[i: i + limit] for i in range(0, len(text), limit)] async def eor(msg: Message, **kwargs): """Edit or reply to a message.""" - func = ( - (msg.edit_text if msg.from_user.is_self else msg.reply) - if msg.from_user - else msg.reply - ) - spec = getfullargspec(func.__wrapped__).args - return await func(**{k: v for k, v in kwargs.items() if k in spec}) + if msg.from_user and msg.from_user.is_self: + func = msg.edit_text + else: + func = msg.reply + + # Ensure we only pass valid arguments + spec = getfullargspec(func).args + valid_kwargs = {k: v for k, v in kwargs.items() if k in spec} + + # Call the function with await + return await func(**valid_kwargs) async def capture_err(func): @@ -45,7 +49,8 @@ async def wrapper(client, message, *args, **kwargs): except Exception as e: error_feedback = split_limits(str(e)) for feedback in error_feedback: - await message.reply(feedback) + if isinstance(message, Message): + await message.reply(feedback) raise e return wrapper From c14b26afa43fa03fbe57ebd1207846ccb8994a54 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 29 Nov 2024 17:19:28 +0530 Subject: [PATCH 101/184] Update filemanager.py --- TanuMusic/plugins/sudo/filemanager.py | 89 ++++++++++++--------------- 1 file changed, 40 insertions(+), 49 deletions(-) diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py index bc4a8848b5c2..f57589b209ef 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -1,7 +1,7 @@ import io import os import time -from inspect import getfullargspec +from inspect import signature from os.path import exists, isdir from pyrogram import filters @@ -33,15 +33,14 @@ async def eor(msg: Message, **kwargs): else: func = msg.reply - # Ensure we only pass valid arguments - spec = getfullargspec(func).args - valid_kwargs = {k: v for k, v in kwargs.items() if k in spec} + # Get valid arguments for the function + valid_args = signature(func).parameters.keys() + filtered_kwargs = {k: v for k, v in kwargs.items() if k in valid_args} - # Call the function with await - return await func(**valid_kwargs) + return await func(**filtered_kwargs) -async def capture_err(func): +def capture_err(func): """Decorator to handle errors gracefully.""" async def wrapper(client, message, *args, **kwargs): try: @@ -49,8 +48,7 @@ async def wrapper(client, message, *args, **kwargs): except Exception as e: error_feedback = split_limits(str(e)) for feedback in error_feedback: - if isinstance(message, Message): - await message.reply(feedback) + await message.reply(feedback) raise e return wrapper @@ -58,8 +56,6 @@ async def wrapper(client, message, *args, **kwargs): @app.on_message(filters.command("ls") & ~filters.forwarded & ~filters.via_bot & SUDOERS) @capture_err async def lst(_, message): - prefix = message.text.split()[0][0] - chat_id = message.chat.id path = os.getcwd() text = message.text.split(" ", 1) directory = None @@ -76,18 +72,15 @@ async def lst(_, message): return if isdir(path): - if directory: - msg = f"Folders and Files in `{path}` :\n\n" - lists = os.listdir(path) - else: - msg = "Folders and Files in Current Directory:\n\n" - lists = os.listdir(path) - + msg = f"Folders and Files in `{path}`:\n\n" if directory else "Folders and Files in Current Directory:\n\n" files = "" folders = "" - for contents in sorted(lists): + + for contents in sorted(os.listdir(path)): item_path = os.path.join(path, contents) - if not isdir(item_path): + if isdir(item_path): + folders += f"📁 {contents}\n" + else: size = os.stat(item_path).st_size if contents.endswith((".mp3", ".flac", ".wav", ".m4a")): files += f"🎵 {contents}\n" @@ -109,49 +102,46 @@ async def lst(_, message): files += f"🐍 {contents}\n" else: files += f"📄 {contents}\n" - else: - folders += f"📁 {contents}\n" - if files or folders: - msg += folders + files - else: - msg += "__empty path__" + msg += folders + files if files or folders else "__empty path__" else: size = os.stat(path).st_size - msg = "The details of the given file:\n\n" + last_modified = time.ctime(os.path.getmtime(path)) + last_accessed = time.ctime(os.path.getatime(path)) + if path.endswith((".mp3", ".flac", ".wav", ".m4a")): - mode = "🎵 " + mode = "🎵" elif path.endswith(".opus"): - mode = "🎙 " + mode = "🎙" elif path.endswith((".mkv", ".mp4", ".webm", ".avi", ".mov", ".flv")): - mode = "🎞 " + mode = "🎞" elif path.endswith((".zip", ".tar", ".tar.gz", ".rar", ".7z", ".xz")): - mode = "🗜 " + mode = "🗜" elif path.endswith((".jpg", ".jpeg", ".png", ".gif", ".bmp", ".ico", ".webp")): - mode = "🖼 " + mode = "🖼" elif path.endswith((".exe", ".deb")): - mode = "⚙️ " + mode = "⚙️" elif path.endswith((".iso", ".img")): - mode = "💿 " + mode = "💿" elif path.endswith((".apk", ".xapk")): - mode = "📱 " + mode = "📱" elif path.endswith(".py"): - mode = "🐍 " + mode = "🐍" else: - mode = "📄 " - - last_modified = time.ctime(os.path.getmtime(path)) - last_accessed = time.ctime(os.path.getatime(path)) - msg += f"Location: {path}\n" - msg += f"Icon: {mode}\n" - msg += f"Size: {humanbytes(size)}\n" - msg += f"Last Modified Time: {last_modified}\n" - msg += f"Last Accessed Time: {last_accessed}" + mode = "📄" + + msg = ( + f"Location: {path}\n" + f"Icon: {mode}\n" + f"Size: {humanbytes(size)}\n" + f"Last Modified: {last_modified}\n" + f"Last Accessed: {last_accessed}\n" + ) if len(msg) > MAX_MESSAGE_SIZE_LIMIT: with io.BytesIO(str.encode(msg)) as out_file: out_file.name = "ls.txt" - await app.send_document(chat_id, out_file, caption=path) + await app.send_document(message.chat.id, out_file, caption=path) await message.delete() else: await eor(message, text=msg) @@ -159,12 +149,13 @@ async def lst(_, message): @app.on_message(filters.command("rm") & ~filters.forwarded & ~filters.via_bot & SUDOERS) @capture_err -async def rm_file(client, message): +async def rm_file(_, message): if len(message.command) < 2: return await eor(message, text="Please provide a file name to delete.") file = message.text.split(" ", 1)[1] + if exists(file): os.remove(file) - await eor(message, text=f"{file} has been deleted.") + await eor(message, text=f"`{file}` has been deleted.") else: - await eor(message, text=f"{file} doesn't exist!") \ No newline at end of file + await eor(message, text=f"`{file}` doesn't exist!") \ No newline at end of file From fc909299c0aa906d119502ce417fb05c71b518c8 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:43:43 +0530 Subject: [PATCH 102/184] Update filemanager.py --- TanuMusic/plugins/sudo/filemanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py index f57589b209ef..74f050905a61 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -156,6 +156,6 @@ async def rm_file(_, message): if exists(file): os.remove(file) - await eor(message, text=f"`{file}` has been deleted.") + await eor(message, text=f"{file} has been deleted.") else: - await eor(message, text=f"`{file}` doesn't exist!") \ No newline at end of file + await eor(message, text=f"{file} doesn't exist!") \ No newline at end of file From affb6139b3ce62fab3a451d3d9b6f9a0941fde27 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:45:39 +0530 Subject: [PATCH 103/184] Update cookies.txt --- cookies/cookies.txt | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 16d5594a2403..8b79c5e10389 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -2,20 +2,24 @@ # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1732468351 GPS 1 -.youtube.com TRUE / TRUE 1767026657 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=20000 -.youtube.com TRUE / FALSE 1767026622 SID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJpSkIFzIqJghQ8MoIfzNaWAACgYKAb0SARYSFQHGX2MixKJJU8PxfP7s2Im2q1FxNhoVAUF8yKreeYquPFKxMF3JHNIjSzDW0076 -.youtube.com TRUE / TRUE 1764002622 __Secure-1PSIDTS sidts-CjEBQT4rX8fuSFBZHSHFSEV6T6uRdUs9x_wvQAS4kUlooBZjen2hwj_SVAW3rUIjRzbSEAA -.youtube.com TRUE / TRUE 1764002622 __Secure-3PSIDTS sidts-CjEBQT4rX8fuSFBZHSHFSEV6T6uRdUs9x_wvQAS4kUlooBZjen2hwj_SVAW3rUIjRzbSEAA -.youtube.com TRUE / TRUE 1767026622 __Secure-1PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJqbXZkv88VxHeFyrax1RG2AACgYKATMSARYSFQHGX2MilQh1Js3v3ONy6LFQa9AnIBoVAUF8yKq-OSARtfCvrzJnPogXD8Ss0076 -.youtube.com TRUE / TRUE 1767026622 __Secure-3PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJDGrYcjzvpb2pC5YWXa61RgACgYKAZYSARYSFQHGX2Miks0VyDEqEhFUL5liR7ZJzhoVAUF8yKowuPGUqyqI2N9hY05wlZ9M0076 -.youtube.com TRUE / FALSE 1767026622 HSID APbJbQUNG0V4lwk-R -.youtube.com TRUE / TRUE 1767026622 SSID AxN9BRCWy4p43wxSQ -.youtube.com TRUE / FALSE 1767026622 APISID EWUXhVT466K1TbU9/AdoaJWu2XXc5P0KeI -.youtube.com TRUE / TRUE 1767026622 SAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 -.youtube.com TRUE / TRUE 1767026622 __Secure-1PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 -.youtube.com TRUE / TRUE 1767026622 __Secure-3PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 -.youtube.com TRUE / TRUE 1767026623 LOGIN_INFO AFmmF2swRQIgPOUyNBezY4Cv61n1G2ph1YffgNyH38N8TFd2HSY-zyQCIQDqCzUb06OGpLYUV42aMn4xvWDY2sMkVaLOnLJ0N7Uwlg:QUQ3MjNmeVk2TU81bGxDbmNkNnhOTTZveXNFZ3RSVFVQSmRHTzRmVThRU2FZcnR6bjM4QWw0VjVwWTBzRVFMYV9DdEFCaDVHenpZMml2TWZOLU9TLTh0ZEhiSlp3M3FEZXdCVE5qT29vMjBpeVJSV2lXQV9SeDYwVkJJZFR0YlU2cmNKWGt1THkwaUNPTEh5SVRDazI4Sk1zMVB2TzZRd2lB -.youtube.com TRUE / FALSE 1764002646 SIDCC AKEyXzVXaVz0sqk_4rDm4ZM27rDuqiDvLYumULvmOaT8x1Ds83_1QuD4-Kh6Rp1WLFhUO2Aa -.youtube.com TRUE / TRUE 1764002646 __Secure-1PSIDCC AKEyXzW4_gzrtfqR7fFQKE0rMLcc0GuFknsS17Gec1ZubRSefJhPT5PEIfe8PrYq9FwxZgAZ -.youtube.com TRUE / TRUE 1764002646 __Secure-3PSIDCC AKEyXzWPqlzu6meSzurPQCe8zFEhl7P3l3aEM2MY_6P9iKymrFsoIKOxtmIgd72EomshLMTXiA +.youtube.com TRUE / TRUE 1731491019 GPS 1 +.youtube.com TRUE / TRUE 0 YSC UeVuM-mYvvs +.youtube.com TRUE / TRUE 1747041219 VISITOR_INFO1_LIVE _tjaip9hAeE +.youtube.com TRUE / TRUE 1747041219 VISITOR_PRIVACY_METADATA CgJJThIEGgAgIg%3D%3D +.youtube.com TRUE / FALSE 1766049467 HSID AKsvKFK5TQ2JFyiPc +.youtube.com TRUE / TRUE 1766049467 SSID Adsuwte-o5vGNOk_x +.youtube.com TRUE / FALSE 1766049467 APISID 3ckY1hh-UfRqi_zh/Aj07GE3d1jpFglXl6 +.youtube.com TRUE / TRUE 1766049467 SAPISID XRCB3IqIiAsE_Qvo/ABkvtWEvKnLT3emok +.youtube.com TRUE / TRUE 1766049467 __Secure-1PAPISID XRCB3IqIiAsE_Qvo/ABkvtWEvKnLT3emok +.youtube.com TRUE / TRUE 1766049467 __Secure-3PAPISID XRCB3IqIiAsE_Qvo/ABkvtWEvKnLT3emok +.youtube.com TRUE / FALSE 1766049467 SID g.a000qAgFd0OiOXcYEOOl_w0MId5VOIBOnDGdDQoRGdJb_D4cCsQaijlqWKsTdehx3qTaXbufwAACgYKAYESARQSFQHGX2Mina9iKq0DJB4iT9q4WGDXvxoVAUF8yKoSSFf6JdP1peXDoBvhgU-C0076 +.youtube.com TRUE / TRUE 1766049467 __Secure-1PSID g.a000qAgFd0OiOXcYEOOl_w0MId5VOIBOnDGdDQoRGdJb_D4cCsQaJiFZD6RQppmDWY3Wweuw6gACgYKAb0SARQSFQHGX2MirWlzOLkik05HRhCs_IVyRRoVAUF8yKrKzE-AISTmKeJihpB84q9V0076 +.youtube.com TRUE / TRUE 1766049467 __Secure-3PSID g.a000qAgFd0OiOXcYEOOl_w0MId5VOIBOnDGdDQoRGdJb_D4cCsQaoRAs8n_Ma4Z3rME6-HQNXQACgYKAVcSARQSFQHGX2Mio2EAq4T3_ekCYt1A5ktUxBoVAUF8yKp5c9WqQD5mT7bi4Uoq2amF0076 +.youtube.com TRUE / TRUE 1763025467 __Secure-1PSIDTS sidts-CjIBQT4rXyS0_3iT-ZnfvaNhurNb-r8H4KSXx4MioAUeQKc1VZ28QBf5p8dKZ9p6am3mMhAA +.youtube.com TRUE / TRUE 1763025467 __Secure-3PSIDTS sidts-CjIBQT4rXyS0_3iT-ZnfvaNhurNb-r8H4KSXx4MioAUeQKc1VZ28QBf5p8dKZ9p6am3mMhAA +.youtube.com TRUE / TRUE 1766049468 LOGIN_INFO AFmmF2swRQIgHImmchtfV3Je1FeChH53Gr0Ma8rh4tMKd-9ArCEkjCoCIQDSAGHtimYDexCiE0R5WBKef63Hume4zdKTCvpqa0Uw_w:QUQ3MjNmdzZjdkdPcF9MNnRkNU5EdnNHWFRlYkVidklKZzhSVHNaVmxjMXlFTnhWQWplZmk0X1h2ZVgxX01leDMyeEpDR3ljWm5BOFFBRHRlNkVwZnpmSGhnaWgwb2xyZG9pNjZCOTBxd0ZHZEVQdWx5SFJ0aUFoYmJUN3BPS0dqdjdYLWhUNGxlcEFJVmtqRnhEUW1ENXZXX1dPMUgzeXlR +.youtube.com TRUE / TRUE 1766049490 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100 +.youtube.com TRUE / TRUE 1731490114 CONSISTENCY AKreu9u6SWAbT3e52SYGSxi1LRuaroDixX6KtP6QNOhwMaSJw8pzjmmjERrAZSDERbNtq7uk1Tuar_T6ZB4yXmcQO0owyclOox6cczm2ehAIVToTk9pHOx_xBMD8QcsUscfSiNsGs2BaM2NHSrgONQjR +.youtube.com TRUE / FALSE 1763025520 SIDCC AKEyXzXMQvYOR0VPv6fTKEqhUyYDyg_yLVFoZDQpJoTqFGn0dSs-iipgWcu6dVnw-1Gkgt8QnQ +.youtube.com TRUE / TRUE 1763025520 __Secure-1PSIDCC AKEyXzVfoEK6mUnD9fUIJSyqqSB-2B4HoJ6Mse-iJY4RzIA8YD3aoNdgb8j_pYTO26OW-vsh +.youtube.com TRUE / TRUE 1763025520 __Secure-3PSIDCC AKEyXzV97iUC-FYmUF4gC2h54gpR0YwfmbaXavg6-vV-P7B5-KhhGKAp2yDnFDEZXsgSYHT_ \ No newline at end of file From 89629abed27e3edba6cc47060810a2ab1c891859 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:49:08 +0530 Subject: [PATCH 104/184] TypeError: 'coroutine' object is not callable fixed --- TanuMusic/plugins/sudo/filemanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py index 74f050905a61..f57589b209ef 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -156,6 +156,6 @@ async def rm_file(_, message): if exists(file): os.remove(file) - await eor(message, text=f"{file} has been deleted.") + await eor(message, text=f"`{file}` has been deleted.") else: - await eor(message, text=f"{file} doesn't exist!") \ No newline at end of file + await eor(message, text=f"`{file}` doesn't exist!") \ No newline at end of file From 0bfceee59b1561c755312da8f79e095dcbd2c550 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:50:00 +0530 Subject: [PATCH 105/184] Update filemanager.py --- TanuMusic/plugins/sudo/filemanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py index f57589b209ef..74f050905a61 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -156,6 +156,6 @@ async def rm_file(_, message): if exists(file): os.remove(file) - await eor(message, text=f"`{file}` has been deleted.") + await eor(message, text=f"{file} has been deleted.") else: - await eor(message, text=f"`{file}` doesn't exist!") \ No newline at end of file + await eor(message, text=f"{file} doesn't exist!") \ No newline at end of file From 619180c50b2f49a6a7da297263a686a9f34cac1d Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 29 Nov 2024 19:04:51 +0530 Subject: [PATCH 106/184] Update cookies.txt --- cookies/cookies.txt | 47 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 8b79c5e10389..97401edf6b48 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -1,25 +1,24 @@ -# Netscape HTTP Cookie File -# http://curl.haxx.se/rfc/cookie_spec.html -# This is a generated file! Do not edit. +# Netscape HTTP Cookie File +# This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1731491019 GPS 1 -.youtube.com TRUE / TRUE 0 YSC UeVuM-mYvvs -.youtube.com TRUE / TRUE 1747041219 VISITOR_INFO1_LIVE _tjaip9hAeE -.youtube.com TRUE / TRUE 1747041219 VISITOR_PRIVACY_METADATA CgJJThIEGgAgIg%3D%3D -.youtube.com TRUE / FALSE 1766049467 HSID AKsvKFK5TQ2JFyiPc -.youtube.com TRUE / TRUE 1766049467 SSID Adsuwte-o5vGNOk_x -.youtube.com TRUE / FALSE 1766049467 APISID 3ckY1hh-UfRqi_zh/Aj07GE3d1jpFglXl6 -.youtube.com TRUE / TRUE 1766049467 SAPISID XRCB3IqIiAsE_Qvo/ABkvtWEvKnLT3emok -.youtube.com TRUE / TRUE 1766049467 __Secure-1PAPISID XRCB3IqIiAsE_Qvo/ABkvtWEvKnLT3emok -.youtube.com TRUE / TRUE 1766049467 __Secure-3PAPISID XRCB3IqIiAsE_Qvo/ABkvtWEvKnLT3emok -.youtube.com TRUE / FALSE 1766049467 SID g.a000qAgFd0OiOXcYEOOl_w0MId5VOIBOnDGdDQoRGdJb_D4cCsQaijlqWKsTdehx3qTaXbufwAACgYKAYESARQSFQHGX2Mina9iKq0DJB4iT9q4WGDXvxoVAUF8yKoSSFf6JdP1peXDoBvhgU-C0076 -.youtube.com TRUE / TRUE 1766049467 __Secure-1PSID g.a000qAgFd0OiOXcYEOOl_w0MId5VOIBOnDGdDQoRGdJb_D4cCsQaJiFZD6RQppmDWY3Wweuw6gACgYKAb0SARQSFQHGX2MirWlzOLkik05HRhCs_IVyRRoVAUF8yKrKzE-AISTmKeJihpB84q9V0076 -.youtube.com TRUE / TRUE 1766049467 __Secure-3PSID g.a000qAgFd0OiOXcYEOOl_w0MId5VOIBOnDGdDQoRGdJb_D4cCsQaoRAs8n_Ma4Z3rME6-HQNXQACgYKAVcSARQSFQHGX2Mio2EAq4T3_ekCYt1A5ktUxBoVAUF8yKp5c9WqQD5mT7bi4Uoq2amF0076 -.youtube.com TRUE / TRUE 1763025467 __Secure-1PSIDTS sidts-CjIBQT4rXyS0_3iT-ZnfvaNhurNb-r8H4KSXx4MioAUeQKc1VZ28QBf5p8dKZ9p6am3mMhAA -.youtube.com TRUE / TRUE 1763025467 __Secure-3PSIDTS sidts-CjIBQT4rXyS0_3iT-ZnfvaNhurNb-r8H4KSXx4MioAUeQKc1VZ28QBf5p8dKZ9p6am3mMhAA -.youtube.com TRUE / TRUE 1766049468 LOGIN_INFO AFmmF2swRQIgHImmchtfV3Je1FeChH53Gr0Ma8rh4tMKd-9ArCEkjCoCIQDSAGHtimYDexCiE0R5WBKef63Hume4zdKTCvpqa0Uw_w:QUQ3MjNmdzZjdkdPcF9MNnRkNU5EdnNHWFRlYkVidklKZzhSVHNaVmxjMXlFTnhWQWplZmk0X1h2ZVgxX01leDMyeEpDR3ljWm5BOFFBRHRlNkVwZnpmSGhnaWgwb2xyZG9pNjZCOTBxd0ZHZEVQdWx5SFJ0aUFoYmJUN3BPS0dqdjdYLWhUNGxlcEFJVmtqRnhEUW1ENXZXX1dPMUgzeXlR -.youtube.com TRUE / TRUE 1766049490 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100 -.youtube.com TRUE / TRUE 1731490114 CONSISTENCY AKreu9u6SWAbT3e52SYGSxi1LRuaroDixX6KtP6QNOhwMaSJw8pzjmmjERrAZSDERbNtq7uk1Tuar_T6ZB4yXmcQO0owyclOox6cczm2ehAIVToTk9pHOx_xBMD8QcsUscfSiNsGs2BaM2NHSrgONQjR -.youtube.com TRUE / FALSE 1763025520 SIDCC AKEyXzXMQvYOR0VPv6fTKEqhUyYDyg_yLVFoZDQpJoTqFGn0dSs-iipgWcu6dVnw-1Gkgt8QnQ -.youtube.com TRUE / TRUE 1763025520 __Secure-1PSIDCC AKEyXzVfoEK6mUnD9fUIJSyqqSB-2B4HoJ6Mse-iJY4RzIA8YD3aoNdgb8j_pYTO26OW-vsh -.youtube.com TRUE / TRUE 1763025520 __Secure-3PSIDCC AKEyXzV97iUC-FYmUF4gC2h54gpR0YwfmbaXavg6-vV-P7B5-KhhGKAp2yDnFDEZXsgSYHT_ \ No newline at end of file +# domain include_subdomains path secure expiration_date name value +.youtube.com TRUE / TRUE 1763049097 __Secure-1PSIDCC AKEyXzUmK2qJy3thrS8miuX-k5qVVir7qcaEQkTD-qp7GylQ_YJYd1a-a1W6iZbJtbog2y9z9Q +.youtube.com TRUE / TRUE 1763049097 __Secure-3PSIDCC AKEyXzUrCVvrXxYO88S2Bz-OypwVJ5vozEyCJPvHQzFpCk9ozvcsVGIu87rIhDGgpbozdCSTYw +.youtube.com TRUE / TRUE 0 YSC SAIF2EPtorM +.youtube.com TRUE / TRUE 1766072994 LOGIN_INFO AFmmF2swRAIgJwriYOPNyURF1BCKCVah4xoDI2Es_xLsQdNUtM7G_-MCIBOWveto2T-RMTei6c5CSjBEy-ty5OG8s_weM5elAlH2:QUQ3MjNmempkLWk5QnNaTGtVdkZ0UFNoVzI3bWg5NHppcmNvY3RwaFhEUHNLVkJRUDNhcWtlMTE5QkNtVm5LZV9sajl2clpaVVVEQXJLbUFnMGV1YjNfZi1BVWZnQzNxODFBTTJUdWdacGJTVGNscUpmWGlzaWhxQ3JUbmlzT1FscTlfblRzT3VvbjFQQ21ZWDlkQk05VmtSYlpNUnUyTHVR +.youtube.com TRUE / TRUE 1766072995 __Secure-1PSID g.a000qAjpLV3urRxsoGnUUGO24Kv4UPBGpjNkjL90rAZsGLpBoyzoF6eZ-7OvZX5anFuwHCKF7AACgYKAWQSARMSFQHGX2MiJ2fkUM7fPnbw_PSpuzg_PhoVAUF8yKqg9-2V3bL47ma2VXKb9BRj0076 +.youtube.com TRUE / TRUE 1766072995 __Secure-3PAPISID eC-ppCKhKNCefx-7/AADuusu5nJQYbwbzR +.youtube.com TRUE / TRUE 1766072995 SAPISID eC-ppCKhKNCefx-7/AADuusu5nJQYbwbzR +.youtube.com TRUE / TRUE 1731514562 GPS 1 +.youtube.com TRUE / FALSE 1763049097 SIDCC AKEyXzXCDyjace4GYDZuMgj-IxJLksNmhwL5YoT-UNOl_b5-cJyy5kUbBOhD2yT86PBPfXUj +.youtube.com TRUE / TRUE 1766072995 __Secure-3PSID g.a000qAjpLV3urRxsoGnUUGO24Kv4UPBGpjNkjL90rAZsGLpBoyzoHetaSvB0TBUKWL4ok9D3wQACgYKAboSARMSFQHGX2MiAb5RPHdWKAju7MPcochnAxoVAUF8yKpyRC7PFpAfaVL5su9SsBTQ0076 +.youtube.com TRUE / TRUE 1763048990 __Secure-1PSIDTS sidts-CjIBQT4rX5CN_IOunLw2Bd_MbGpLNPLtHZbZH31-J4pzOj87hkfEsPMJPpRuzMB74dIcshAA +.youtube.com TRUE / FALSE 1766072995 HSID Au0nOfHcwxGCoEN8m +.youtube.com TRUE / TRUE 1766073037 PREF f6=40000000&tz=Asia.Colombo&f7=100 +.youtube.com TRUE / FALSE 1766072995 SID g.a000qAjpLV3urRxsoGnUUGO24Kv4UPBGpjNkjL90rAZsGLpBoyzoTYkU_5mjgF_FGIlAzrZxnAACgYKAU8SARMSFQHGX2Mi7kniOC0K2k0Np0NTGfGVthoVAUF8yKrcRfszIKksvD2Z01oKwSU60076 +.youtube.com TRUE / TRUE 1766072995 __Secure-1PAPISID eC-ppCKhKNCefx-7/AADuusu5nJQYbwbzR +.youtube.com TRUE / TRUE 1766072995 SSID Al4mw2AW_8UcrmSxp +.youtube.com TRUE / TRUE 1745506070 VISITOR_PRIVACY_METADATA CgJJThIEGgAgHg%3D%3D +.youtube.com TRUE / FALSE 1766072995 APISID 9r-E76ZGlLhQbM1Y/AhWKBFekX5H1HH9rg +.youtube.com TRUE / TRUE 1763048990 __Secure-3PSIDTS sidts-CjIBQT4rX5CN_IOunLw2Bd_MbGpLNPLtHZbZH31-J4pzOj87hkfEsPMJPpRuzMB74dIcshAA +.youtube.com TRUE / TRUE 1745506070 VISITOR_INFO1_LIVE P4REyzcC85c From 41f903f1cfa394d6b4c094b48a20cf1133476094 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 30 Nov 2024 22:27:42 +0530 Subject: [PATCH 107/184] Update tools --- TanuMusic/plugins/tools/search.py | 55 +++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 TanuMusic/plugins/tools/search.py diff --git a/TanuMusic/plugins/tools/search.py b/TanuMusic/plugins/tools/search.py new file mode 100644 index 000000000000..0cc4177dc14d --- /dev/null +++ b/TanuMusic/plugins/tools/search.py @@ -0,0 +1,55 @@ +from pyrogram import Client, filters +import requests +from bs4 import BeautifulSoup +from TanuMusic import app + +# Function to perform Google search +def google_search(query, max_results=5): + """Fetches the top search results from Google.""" + url = f"https://www.google.com/search?q={query}" + headers = { + "User-Agent": ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" + ) + } + + try: + response = requests.get(url, headers=headers) + response.raise_for_status() + + # Parse the response with BeautifulSoup + soup = BeautifulSoup(response.content, "html.parser") + links = soup.find_all("a") + + # Extract links + results = [] + for link in links: + href = link.get("href") + if href and href.startswith("/url?q="): + results.append(href[7:].split("&")[0]) + if len(results) >= max_results: + break + + return results or ["No results found."] + except requests.exceptions.RequestException as e: + return [f"Error fetching results: {e}"] + +# Command handler for "/search" +@app.on_message(filters.command("search")) +def search_handler(client, message): + """Handles the /search command.""" + # Check if query is provided + if len(message.command) > 1: + query = " ".join(message.command[1:]) + results = google_search(query) + + # Format the results for the user + response = f"Search Results for: {query}\n\n" + response += "\n".join([f"{i+1}. {url}" for i, url in enumerate(results)]) + message.reply_text(response, disable_web_page_preview=True) + else: + message.reply_text( + "Please provide a search query.\n\nUsage: /search ", + parse_mode="Markdown", + ) \ No newline at end of file From 1f8f55b022a5b8ccb6c7fa165217e5b2f03454e2 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 17:11:38 +0530 Subject: [PATCH 108/184] Update requirements.txt --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6f9b6153227a..a01c0426e881 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,8 @@ ffmpeg-python gitpython hachoir heroku3 -httpx[http2] +#httpx[http2] +httpx==0.27.2 lyricsgenius motor wget From 44de3d77fd38d01f87f5c07fc5a6c2d3953e65e7 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 17:16:21 +0530 Subject: [PATCH 109/184] Update app.json --- app.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app.json b/app.json index 887651b622a9..367e02c2ea35 100644 --- a/app.json +++ b/app.json @@ -14,12 +14,12 @@ "env": { "API_ID": { "description": "Get this value from https://my.telegram.org", - "value": "", + "value": "20851717", "required": true }, "API_HASH": { "description": "Get this value from https://my.telegram.org", - "value": "", + "value": "0217fe5cd94ff3f4d4555b1551670144", "required": true }, "BOT_TOKEN": { @@ -34,7 +34,7 @@ }, "OWNER_ID": { "description": "The user id of user whom you would like to add as OWNER.", - "value": "6922271843", + "value": "7453278496", "required": true }, "STRING_SESSION": { @@ -54,7 +54,7 @@ }, "LOGGER_ID": { "description": "Your Log Group ID, add your bot and promote as an admin with full rights!. Channel ki id mat daal dena bsdk.", - "value": "", + "value": "-1002100219353", "required": true } }, From c2e161ee78103162eca88c36ab03f25b05687f65 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 17:39:19 +0530 Subject: [PATCH 110/184] Update cookies.txt --- cookies/cookies.txt | 51 +++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 97401edf6b48..612a730dc3e5 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -1,24 +1,29 @@ -# Netscape HTTP Cookie File -# This is a generated file! Do not edit. -# domain include_subdomains path secure expiration_date name value -.youtube.com TRUE / TRUE 1763049097 __Secure-1PSIDCC AKEyXzUmK2qJy3thrS8miuX-k5qVVir7qcaEQkTD-qp7GylQ_YJYd1a-a1W6iZbJtbog2y9z9Q -.youtube.com TRUE / TRUE 1763049097 __Secure-3PSIDCC AKEyXzUrCVvrXxYO88S2Bz-OypwVJ5vozEyCJPvHQzFpCk9ozvcsVGIu87rIhDGgpbozdCSTYw -.youtube.com TRUE / TRUE 0 YSC SAIF2EPtorM -.youtube.com TRUE / TRUE 1766072994 LOGIN_INFO AFmmF2swRAIgJwriYOPNyURF1BCKCVah4xoDI2Es_xLsQdNUtM7G_-MCIBOWveto2T-RMTei6c5CSjBEy-ty5OG8s_weM5elAlH2:QUQ3MjNmempkLWk5QnNaTGtVdkZ0UFNoVzI3bWg5NHppcmNvY3RwaFhEUHNLVkJRUDNhcWtlMTE5QkNtVm5LZV9sajl2clpaVVVEQXJLbUFnMGV1YjNfZi1BVWZnQzNxODFBTTJUdWdacGJTVGNscUpmWGlzaWhxQ3JUbmlzT1FscTlfblRzT3VvbjFQQ21ZWDlkQk05VmtSYlpNUnUyTHVR -.youtube.com TRUE / TRUE 1766072995 __Secure-1PSID g.a000qAjpLV3urRxsoGnUUGO24Kv4UPBGpjNkjL90rAZsGLpBoyzoF6eZ-7OvZX5anFuwHCKF7AACgYKAWQSARMSFQHGX2MiJ2fkUM7fPnbw_PSpuzg_PhoVAUF8yKqg9-2V3bL47ma2VXKb9BRj0076 -.youtube.com TRUE / TRUE 1766072995 __Secure-3PAPISID eC-ppCKhKNCefx-7/AADuusu5nJQYbwbzR -.youtube.com TRUE / TRUE 1766072995 SAPISID eC-ppCKhKNCefx-7/AADuusu5nJQYbwbzR -.youtube.com TRUE / TRUE 1731514562 GPS 1 -.youtube.com TRUE / FALSE 1763049097 SIDCC AKEyXzXCDyjace4GYDZuMgj-IxJLksNmhwL5YoT-UNOl_b5-cJyy5kUbBOhD2yT86PBPfXUj -.youtube.com TRUE / TRUE 1766072995 __Secure-3PSID g.a000qAjpLV3urRxsoGnUUGO24Kv4UPBGpjNkjL90rAZsGLpBoyzoHetaSvB0TBUKWL4ok9D3wQACgYKAboSARMSFQHGX2MiAb5RPHdWKAju7MPcochnAxoVAUF8yKpyRC7PFpAfaVL5su9SsBTQ0076 -.youtube.com TRUE / TRUE 1763048990 __Secure-1PSIDTS sidts-CjIBQT4rX5CN_IOunLw2Bd_MbGpLNPLtHZbZH31-J4pzOj87hkfEsPMJPpRuzMB74dIcshAA -.youtube.com TRUE / FALSE 1766072995 HSID Au0nOfHcwxGCoEN8m -.youtube.com TRUE / TRUE 1766073037 PREF f6=40000000&tz=Asia.Colombo&f7=100 -.youtube.com TRUE / FALSE 1766072995 SID g.a000qAjpLV3urRxsoGnUUGO24Kv4UPBGpjNkjL90rAZsGLpBoyzoTYkU_5mjgF_FGIlAzrZxnAACgYKAU8SARMSFQHGX2Mi7kniOC0K2k0Np0NTGfGVthoVAUF8yKrcRfszIKksvD2Z01oKwSU60076 -.youtube.com TRUE / TRUE 1766072995 __Secure-1PAPISID eC-ppCKhKNCefx-7/AADuusu5nJQYbwbzR -.youtube.com TRUE / TRUE 1766072995 SSID Al4mw2AW_8UcrmSxp -.youtube.com TRUE / TRUE 1745506070 VISITOR_PRIVACY_METADATA CgJJThIEGgAgHg%3D%3D -.youtube.com TRUE / FALSE 1766072995 APISID 9r-E76ZGlLhQbM1Y/AhWKBFekX5H1HH9rg -.youtube.com TRUE / TRUE 1763048990 __Secure-3PSIDTS sidts-CjIBQT4rX5CN_IOunLw2Bd_MbGpLNPLtHZbZH31-J4pzOj87hkfEsPMJPpRuzMB74dIcshAA -.youtube.com TRUE / TRUE 1745506070 VISITOR_INFO1_LIVE P4REyzcC85c +# Netscape HTTP Cookie File +# https://curl.haxx.se/rfc/cookie_spec.html +# This is a generated file! Do not edit. + +.youtube.com TRUE / TRUE 1731927262 GPS 1 +.youtube.com TRUE / TRUE 0 YSC TYPDTKRCQXw +.youtube.com TRUE / TRUE 1747477462 VISITOR_INFO1_LIVE SfArWzaGSy4 +.youtube.com TRUE / TRUE 1747477462 VISITOR_PRIVACY_METADATA CgJJThIEGgAgFg%3D%3D +.youtube.com TRUE / TRUE 1763461692 __Secure-1PSIDTS sidts-CjIBQT4rX5WuHi8rluppo_-hnrxLW1mUTTRW5HrsHuCAg9zJCvJz407oLRj4wK8eIkoXURAA +.youtube.com TRUE / TRUE 1763461692 __Secure-3PSIDTS sidts-CjIBQT4rX5WuHi8rluppo_-hnrxLW1mUTTRW5HrsHuCAg9zJCvJz407oLRj4wK8eIkoXURAA +.youtube.com TRUE / FALSE 1766485692 HSID AfUZUhx43TaaiT2rj +.youtube.com TRUE / TRUE 1766485692 SSID AJ2EKPEn3qY5WzPuK +.youtube.com TRUE / FALSE 1766485692 APISID M0HJpVRsEj91ARX1/AyZEboHbGAkB95itz +.youtube.com TRUE / TRUE 1766485692 SAPISID x7AIPG58_IHAOO-P/AmjrGdCLfoG4EzTZB +.youtube.com TRUE / TRUE 1766485692 __Secure-1PAPISID x7AIPG58_IHAOO-P/AmjrGdCLfoG4EzTZB +.youtube.com TRUE / TRUE 1766485692 __Secure-3PAPISID x7AIPG58_IHAOO-P/AmjrGdCLfoG4EzTZB +.youtube.com TRUE / FALSE 1766485692 SID g.a000qQh3pFOijuo5pbWhJb9T492rLblLTR6EHHMhHjGw2fg4SdO7uVLar51ag5IJNCEvs5uyOAACgYKATESARESFQHGX2Mirx-BAkPr_QnnYtUzeR-mKBoVAUF8yKq6d-8KShzHIdETdr10C6t20076 +.youtube.com TRUE / TRUE 1766485692 __Secure-1PSID g.a000qQh3pFOijuo5pbWhJb9T492rLblLTR6EHHMhHjGw2fg4SdO7_iFNmfTFUA7qEPxb4wTNDQACgYKAQISARESFQHGX2MiSV19WCxyVnOP-xXqEreY6xoVAUF8yKpMW0HO3oI5WTH499023S2V0076 +.youtube.com TRUE / TRUE 1766485692 __Secure-3PSID g.a000qQh3pFOijuo5pbWhJb9T492rLblLTR6EHHMhHjGw2fg4SdO7QvyddfJyeKk7Ebt8H-92BwACgYKAUgSARESFQHGX2MiZr5ABl0W27DCIPaGYg8iVRoVAUF8yKrPNOuveDoQ5Bt2ZD0U2lAT0076 +.youtube.com TRUE / TRUE 1766485693 LOGIN_INFO AFmmF2swRQIhAMajNKTiu8j5RKB-A1A5F77lo3zrTn_s0h1HbpwQvbc4AiAHQTnSW1Oq7MEAEGVqw6AHLavdYkjG8Xcd17Tvnmgx7g:QUQ3MjNmem1VcWpJVGFFcTh3Rm4zTzgwZWRsdHJsdHlCaERzYTBsak9mZjlRRk5YbS04bDVpaWh2bW9JN0RwVGQ2LWMzZEt4TnlLbjZkSFJhODBMOUFSSERLdTdFcS1MVEZkSnA5cGFOYnQtOFdYZDNMZGRpdWZxLU9TS1lnb2NtNkhVX0trNnJERVBzWllCaGZYWnFJb0dfdHcwNFRqQ0h3 +.youtube.com TRUE / TRUE 1766485694 PREF tz=Asia.Kolkata +.youtube.com TRUE / FALSE 1731925728 ST-18d4i61 csn=j1K7wZcTzUG7guKk&itct=CJcBEKEwGAEiEwjD_JCJ1uWJAxX6jtgFHU-fImk%3D +.youtube.com TRUE / FALSE 1731925730 ST-1n9u4q0 csn=j1K7wZcTzUG7guKk&itct=CJUBEPxaGAMiEwjD_JCJ1uWJAxX6jtgFHU-fImkyBnNlYXJjaFIQY29weXJpZ2h0IG11c2ljIJoBAxD0JA%3D%3D +.youtube.com TRUE / FALSE 1731925732 ST-17ayohu csn=j1K7wZcTzUG7guKk&itct=CJYBEPxaGAIiEwjD_JCJ1uWJAxX6jtgFHU-fImkyBnNlYXJjaFIQY29weXJpZ2h0IG11c2ljIJoBAxD0JA%3D%3D +.youtube.com TRUE / FALSE 1731925734 ST-1u7pba3 csn=j1K7wZcTzUG7guKk&itct=CJMBEPxaGAUiEwjD_JCJ1uWJAxX6jtgFHU-fImkyBnNlYXJjaFIQY29weXJpZ2h0IG11c2ljIJoBAxD0JA%3D%3D +.youtube.com TRUE / FALSE 1763461860 SIDCC AKEyXzWMISjG_gNXIwjauaQ_6ndA72Yg3tsXqZKEx_Pc-2sopHeJUDQxyGm3jjPc4JEmrJ67 +.youtube.com TRUE / TRUE 1763461860 __Secure-1PSIDCC AKEyXzUU9NKsYkzaj8cChG9VvTD5ikN9GwFD3nuteKIfu9uwipPBGW95T1lAVSfPr_c26Z4r1w +.youtube.com TRUE / TRUE 1763461860 __Secure-3PSIDCC AKEyXzWe37bB-5p98wPwkhdcNhkMSxOljs097bH_ajJwk3LpcvQV-HPSR3C9KzWnua2Yapvj \ No newline at end of file From 085abdbd90692bd6de0470306502cdb52d9820ed Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 17:44:50 +0530 Subject: [PATCH 111/184] Update cookies.txt --- cookies/cookies.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 612a730dc3e5..3764e98c2b25 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -1,4 +1,3 @@ - # Netscape HTTP Cookie File # https://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. From 66b7b718dbe37fc73f0b3cdfe144a2b839ba8eb3 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 17:50:25 +0530 Subject: [PATCH 112/184] Update cookies.txt --- cookies/cookies.txt | 44 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 3764e98c2b25..59c5969e80fa 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -1,28 +1,20 @@ # Netscape HTTP Cookie File -# https://curl.haxx.se/rfc/cookie_spec.html -# This is a generated file! Do not edit. +# http://curl.haxx.se/rfc/cookie_spec.html +# This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1731927262 GPS 1 -.youtube.com TRUE / TRUE 0 YSC TYPDTKRCQXw -.youtube.com TRUE / TRUE 1747477462 VISITOR_INFO1_LIVE SfArWzaGSy4 -.youtube.com TRUE / TRUE 1747477462 VISITOR_PRIVACY_METADATA CgJJThIEGgAgFg%3D%3D -.youtube.com TRUE / TRUE 1763461692 __Secure-1PSIDTS sidts-CjIBQT4rX5WuHi8rluppo_-hnrxLW1mUTTRW5HrsHuCAg9zJCvJz407oLRj4wK8eIkoXURAA -.youtube.com TRUE / TRUE 1763461692 __Secure-3PSIDTS sidts-CjIBQT4rX5WuHi8rluppo_-hnrxLW1mUTTRW5HrsHuCAg9zJCvJz407oLRj4wK8eIkoXURAA -.youtube.com TRUE / FALSE 1766485692 HSID AfUZUhx43TaaiT2rj -.youtube.com TRUE / TRUE 1766485692 SSID AJ2EKPEn3qY5WzPuK -.youtube.com TRUE / FALSE 1766485692 APISID M0HJpVRsEj91ARX1/AyZEboHbGAkB95itz -.youtube.com TRUE / TRUE 1766485692 SAPISID x7AIPG58_IHAOO-P/AmjrGdCLfoG4EzTZB -.youtube.com TRUE / TRUE 1766485692 __Secure-1PAPISID x7AIPG58_IHAOO-P/AmjrGdCLfoG4EzTZB -.youtube.com TRUE / TRUE 1766485692 __Secure-3PAPISID x7AIPG58_IHAOO-P/AmjrGdCLfoG4EzTZB -.youtube.com TRUE / FALSE 1766485692 SID g.a000qQh3pFOijuo5pbWhJb9T492rLblLTR6EHHMhHjGw2fg4SdO7uVLar51ag5IJNCEvs5uyOAACgYKATESARESFQHGX2Mirx-BAkPr_QnnYtUzeR-mKBoVAUF8yKq6d-8KShzHIdETdr10C6t20076 -.youtube.com TRUE / TRUE 1766485692 __Secure-1PSID g.a000qQh3pFOijuo5pbWhJb9T492rLblLTR6EHHMhHjGw2fg4SdO7_iFNmfTFUA7qEPxb4wTNDQACgYKAQISARESFQHGX2MiSV19WCxyVnOP-xXqEreY6xoVAUF8yKpMW0HO3oI5WTH499023S2V0076 -.youtube.com TRUE / TRUE 1766485692 __Secure-3PSID g.a000qQh3pFOijuo5pbWhJb9T492rLblLTR6EHHMhHjGw2fg4SdO7QvyddfJyeKk7Ebt8H-92BwACgYKAUgSARESFQHGX2MiZr5ABl0W27DCIPaGYg8iVRoVAUF8yKrPNOuveDoQ5Bt2ZD0U2lAT0076 -.youtube.com TRUE / TRUE 1766485693 LOGIN_INFO AFmmF2swRQIhAMajNKTiu8j5RKB-A1A5F77lo3zrTn_s0h1HbpwQvbc4AiAHQTnSW1Oq7MEAEGVqw6AHLavdYkjG8Xcd17Tvnmgx7g:QUQ3MjNmem1VcWpJVGFFcTh3Rm4zTzgwZWRsdHJsdHlCaERzYTBsak9mZjlRRk5YbS04bDVpaWh2bW9JN0RwVGQ2LWMzZEt4TnlLbjZkSFJhODBMOUFSSERLdTdFcS1MVEZkSnA5cGFOYnQtOFdYZDNMZGRpdWZxLU9TS1lnb2NtNkhVX0trNnJERVBzWllCaGZYWnFJb0dfdHcwNFRqQ0h3 -.youtube.com TRUE / TRUE 1766485694 PREF tz=Asia.Kolkata -.youtube.com TRUE / FALSE 1731925728 ST-18d4i61 csn=j1K7wZcTzUG7guKk&itct=CJcBEKEwGAEiEwjD_JCJ1uWJAxX6jtgFHU-fImk%3D -.youtube.com TRUE / FALSE 1731925730 ST-1n9u4q0 csn=j1K7wZcTzUG7guKk&itct=CJUBEPxaGAMiEwjD_JCJ1uWJAxX6jtgFHU-fImkyBnNlYXJjaFIQY29weXJpZ2h0IG11c2ljIJoBAxD0JA%3D%3D -.youtube.com TRUE / FALSE 1731925732 ST-17ayohu csn=j1K7wZcTzUG7guKk&itct=CJYBEPxaGAIiEwjD_JCJ1uWJAxX6jtgFHU-fImkyBnNlYXJjaFIQY29weXJpZ2h0IG11c2ljIJoBAxD0JA%3D%3D -.youtube.com TRUE / FALSE 1731925734 ST-1u7pba3 csn=j1K7wZcTzUG7guKk&itct=CJMBEPxaGAUiEwjD_JCJ1uWJAxX6jtgFHU-fImkyBnNlYXJjaFIQY29weXJpZ2h0IG11c2ljIJoBAxD0JA%3D%3D -.youtube.com TRUE / FALSE 1763461860 SIDCC AKEyXzWMISjG_gNXIwjauaQ_6ndA72Yg3tsXqZKEx_Pc-2sopHeJUDQxyGm3jjPc4JEmrJ67 -.youtube.com TRUE / TRUE 1763461860 __Secure-1PSIDCC AKEyXzUU9NKsYkzaj8cChG9VvTD5ikN9GwFD3nuteKIfu9uwipPBGW95T1lAVSfPr_c26Z4r1w -.youtube.com TRUE / TRUE 1763461860 __Secure-3PSIDCC AKEyXzWe37bB-5p98wPwkhdcNhkMSxOljs097bH_ajJwk3LpcvQV-HPSR3C9KzWnua2Yapvj \ No newline at end of file +.youtube.com TRUE / TRUE 1768738797 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=20000 +.youtube.com TRUE / FALSE 1767026622 SID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJpSkIFzIqJghQ8MoIfzNaWAACgYKAb0SARYSFQHGX2MixKJJU8PxfP7s2Im2q1FxNhoVAUF8yKreeYquPFKxMF3JHNIjSzDW0076 +.youtube.com TRUE / TRUE 1767026622 __Secure-1PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJqbXZkv88VxHeFyrax1RG2AACgYKATMSARYSFQHGX2MilQh1Js3v3ONy6LFQa9AnIBoVAUF8yKq-OSARtfCvrzJnPogXD8Ss0076 +.youtube.com TRUE / TRUE 1767026622 __Secure-3PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJDGrYcjzvpb2pC5YWXa61RgACgYKAZYSARYSFQHGX2Miks0VyDEqEhFUL5liR7ZJzhoVAUF8yKowuPGUqyqI2N9hY05wlZ9M0076 +.youtube.com TRUE / FALSE 1767026622 HSID APbJbQUNG0V4lwk-R +.youtube.com TRUE / TRUE 1767026622 SSID AxN9BRCWy4p43wxSQ +.youtube.com TRUE / FALSE 1767026622 APISID EWUXhVT466K1TbU9/AdoaJWu2XXc5P0KeI +.youtube.com TRUE / TRUE 1767026622 SAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 +.youtube.com TRUE / TRUE 1767026622 __Secure-1PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 +.youtube.com TRUE / TRUE 1767026622 __Secure-3PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 +.youtube.com TRUE / TRUE 1767026623 LOGIN_INFO AFmmF2swRQIgPOUyNBezY4Cv61n1G2ph1YffgNyH38N8TFd2HSY-zyQCIQDqCzUb06OGpLYUV42aMn4xvWDY2sMkVaLOnLJ0N7Uwlg:QUQ3MjNmeVk2TU81bGxDbmNkNnhOTTZveXNFZ3RSVFVQSmRHTzRmVThRU2FZcnR6bjM4QWw0VjVwWTBzRVFMYV9DdEFCaDVHenpZMml2TWZOLU9TLTh0ZEhiSlp3M3FEZXdCVE5qT29vMjBpeVJSV2lXQV9SeDYwVkJJZFR0YlU2cmNKWGt1THkwaUNPTEh5SVRDazI4Sk1zMVB2TzZRd2lB +.youtube.com TRUE / TRUE 1764002670 __Secure-1PSIDTS sidts-CjEBQT4rX1ErYEhMoFTUwKUvTxWlmIpyI9iQ1uOXX3v7dtF5D-VeT_xG_aO8a4dNgb0xEAA +.youtube.com TRUE / TRUE 1764002670 __Secure-3PSIDTS sidts-CjEBQT4rX1ErYEhMoFTUwKUvTxWlmIpyI9iQ1uOXX3v7dtF5D-VeT_xG_aO8a4dNgb0xEAA +.youtube.com TRUE / FALSE 1765714784 SIDCC AKEyXzXfJ0hs6hJrp1DNt6-lgmlyGqmuiestGKtPaD-5jHa7WNCWSlK0cntW6S7ZV5b0_a8l +.youtube.com TRUE / TRUE 1765714784 __Secure-1PSIDCC AKEyXzWzGpgbFliB8Qk8NqEtaAeYCfUlepBymmmFSKO_x8d4WuPCCqbG7S6nRrXD4F6g4NJJ +.youtube.com TRUE / TRUE 1765714784 __Secure-3PSIDCC AKEyXzXw90TxUw7_bLK2tYDzhsG2OUa3P4_5Tcr8aTvBXklyhpX2refgrPIwpg6eGfEsJk3Mag \ No newline at end of file From c52ac0e595b1b831d3d2423d7e25ea7460c46049 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 18:02:54 +0530 Subject: [PATCH 113/184] Update speedtest.py --- TanuMusic/plugins/tools/speedtest.py | 97 +++++++++++++++------------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/TanuMusic/plugins/tools/speedtest.py b/TanuMusic/plugins/tools/speedtest.py index eb6cb99172a1..b004dda37d93 100644 --- a/TanuMusic/plugins/tools/speedtest.py +++ b/TanuMusic/plugins/tools/speedtest.py @@ -1,45 +1,52 @@ -import asyncio - -import speedtest -from pyrogram import filters -from pyrogram.types import Message - -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.decorators.language import language - - -def testspeed(m, _): - try: - test = speedtest.Speedtest() - test.get_best_server() - m = m.edit_text(_["server_12"]) - test.download() - m = m.edit_text(_["server_13"]) - test.upload() - test.results.share() - result = test.results.dict() - m = m.edit_text(_["server_14"]) - except Exception as e: - return m.edit_text(f"{e}") - return result - - -@app.on_message(filters.command(["speedtest", "spt"])) -@language -async def speedtest_function(client, message: Message, _): - m = await message.reply_text(_["server_11"]) - loop = asyncio.get_event_loop() - result = await loop.run_in_executor(None, testspeed, m, _) - output = _["server_15"].format( - result["client"]["isp"], - result["client"]["country"], - result["server"]["name"], - result["server"]["country"], - result["server"]["cc"], - result["server"]["sponsor"], - result["server"]["latency"], - result["ping"], - ) - msg = await message.reply_photo(photo=result["share"], caption=output) - await m.delete() +import asyncio +import speedtest +from pyrogram import filters +from pyrogram.types import Message +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.decorators.language import language + + +def testspeed(m, _): + try: + test = speedtest.Speedtest() + test.get_best_server() + m = m.edit_text(_["server_12"]) # Informing about selecting the best server + test.download() + m = m.edit_text(_["server_13"]) # Informing about download speed testing + test.upload() + test.results.share() + result = test.results.dict() # Fetching results as a dictionary + m = m.edit_text(_["server_14"]) # Informing about finishing the test + return result + except Exception as e: + m.edit_text(f"{e}") # Display error + return None + + +@app.on_message(filters.command(["speedtest", "spt"])) +@language +async def speedtest_function(client, message: Message, _): + # Initial response + m = await message.reply_text(_["server_11"]) # Starting speed test message + loop = asyncio.get_event_loop() + result = await loop.run_in_executor(None, testspeed, m, _) + + if result is None: + return # Exit if an error occurred and was already handled in testspeed() + + # Prepare and format output + output = _["server_15"].format( + result["client"]["isp"], + result["client"]["country"], + result["server"]["name"], + result["server"]["country"], + result["server"]["cc"], + result["server"]["sponsor"], + result["server"]["latency"], + result["ping"], + ) + + # Send result as a photo + msg = await message.reply_photo(photo=result["share"], caption=output) + await m.delete() # Remove the initial message \ No newline at end of file From 08f23a3bdeef9460d76c561b1bad284519697acb Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 18:16:15 +0530 Subject: [PATCH 114/184] Delete TanuMusic/plugins/tools/draw.py --- TanuMusic/plugins/tools/draw.py | 42 --------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 TanuMusic/plugins/tools/draw.py diff --git a/TanuMusic/plugins/tools/draw.py b/TanuMusic/plugins/tools/draw.py deleted file mode 100644 index 328918dcb73f..000000000000 --- a/TanuMusic/plugins/tools/draw.py +++ /dev/null @@ -1,42 +0,0 @@ -from pyrogram import Client, filters -import aiohttp -from TanuMusic import app - -# Generate a detailed prompt for image creation -def generate_long_query(query): - return f"{query}." - -@app.on_message(filters.command("draw")) -async def draw_image(client, message): - if len(message.command) < 2: - await message.reply_text("Please provide a query to generate an image. 😊") - return - - # Generate a long query for better image results - user_query = message.text.split(" ", 1)[1] - query = generate_long_query(user_query) - - # Send initial message - wait_message = await message.reply_text("Generating image, please wait... ⏳") - - # Asynchronous request using aiohttp - url = f"https://text2img.codesearch.workers.dev/?prompt={query}" - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - image_data = await response.json() - if "imageUrl" in image_data: - image_url = image_data["imageUrl"] - await wait_message.delete() # Delete wait message - await message.reply_photo(photo=image_url, caption=f"Generated Image for: {user_query} 🖼️") - else: - await wait_message.edit_text("No images were returned. Please try again. ❌") - else: - await wait_message.edit_text("Error: Unable to generate image at this time. Please try later. 🚫") - except Exception as e: - # Try to edit or delete the message only if it exists - try: - await wait_message.edit_text(f"An error occurred: {e} ⚠️") - except Exception: - await message.reply_text(f"An error occurred: {e} ⚠️") \ No newline at end of file From 80ec7337218f52927a264b340e06018d36e0c6e1 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 18:16:30 +0530 Subject: [PATCH 115/184] Delete TanuMusic/plugins/tools/search.py --- TanuMusic/plugins/tools/search.py | 55 ------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 TanuMusic/plugins/tools/search.py diff --git a/TanuMusic/plugins/tools/search.py b/TanuMusic/plugins/tools/search.py deleted file mode 100644 index 0cc4177dc14d..000000000000 --- a/TanuMusic/plugins/tools/search.py +++ /dev/null @@ -1,55 +0,0 @@ -from pyrogram import Client, filters -import requests -from bs4 import BeautifulSoup -from TanuMusic import app - -# Function to perform Google search -def google_search(query, max_results=5): - """Fetches the top search results from Google.""" - url = f"https://www.google.com/search?q={query}" - headers = { - "User-Agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " - "(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" - ) - } - - try: - response = requests.get(url, headers=headers) - response.raise_for_status() - - # Parse the response with BeautifulSoup - soup = BeautifulSoup(response.content, "html.parser") - links = soup.find_all("a") - - # Extract links - results = [] - for link in links: - href = link.get("href") - if href and href.startswith("/url?q="): - results.append(href[7:].split("&")[0]) - if len(results) >= max_results: - break - - return results or ["No results found."] - except requests.exceptions.RequestException as e: - return [f"Error fetching results: {e}"] - -# Command handler for "/search" -@app.on_message(filters.command("search")) -def search_handler(client, message): - """Handles the /search command.""" - # Check if query is provided - if len(message.command) > 1: - query = " ".join(message.command[1:]) - results = google_search(query) - - # Format the results for the user - response = f"Search Results for: {query}\n\n" - response += "\n".join([f"{i+1}. {url}" for i, url in enumerate(results)]) - message.reply_text(response, disable_web_page_preview=True) - else: - message.reply_text( - "Please provide a search query.\n\nUsage: /search ", - parse_mode="Markdown", - ) \ No newline at end of file From ffc524e402b9c6276eb04a836cf0c87ef66d2650 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 18:44:15 +0530 Subject: [PATCH 116/184] Update en.yml --- strings/langs/en.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index f5777a730cab..05650e850bbb 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -24,9 +24,9 @@ call_4 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ɪɴᴠɪᴛɪɴɢ {0} ᴀss call_5 : "❖ {0} ᴀssɪsᴛᴀɴᴛ ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.\n\n● ᴛʀʏɪɴɢ ᴛᴏ sᴛᴀʀᴛ sᴛʀᴇᴀᴍ..." call_6 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴡɪᴛᴄʜ sᴛʀᴇᴀᴍ, ᴘʟᴇᴀsᴇ ᴜsᴇ /skip ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴛʀᴀᴄᴋ ᴀɢᴀɪɴ." call_7 : "❖ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ǫᴜᴇᴜᴇ.\n\n● ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." -call_8 : "❖ Nᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.\n\n● Pʟᴇᴀsᴇ sᴛᴀʀᴛ ᴠɪᴅᴇᴏᴄʜᴀᴛ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." -call_9 : "❖ Assɪsᴛᴀɴᴛ ᴀʟʀᴇᴀᴅʏ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.\n\n● ɪғ ᴀssɪsᴛᴀɴᴛ ɪs ɴᴏᴛ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ, ᴘʟᴇᴀsᴇ sᴇɴᴅ /reboot ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ." -call_10 : "❖ Tᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀ ᴇʀʀᴏʀ\n\n● ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴏʀ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴏғ ʏᴏᴜʀ ɢʀᴏᴜᴘ." +call_8 : "❖ ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.\n\n● Pʟᴇᴀsᴇ sᴛᴀʀᴛ ᴠɪᴅᴇᴏᴄʜᴀᴛ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." +call_9 : "❖ ᴀssɪsᴛᴀɴᴛ ᴀʟʀᴇᴀᴅʏ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.\n\n● ɪғ ᴀssɪsᴛᴀɴᴛ ɪs ɴᴏᴛ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ, ᴘʟᴇᴀsᴇ sᴇɴᴅ /reboot ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ." +call_10 : "❖ ᴛᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀ ᴇʀʀᴏʀ\n\n● ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴏʀ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴏғ ʏᴏᴜʀ ɢʀᴏᴜᴘ." auth_1 : "❖ ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ʜᴀᴠᴇ 25 ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ." auth_2 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛᴏ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." From 71b4b45690e3deb2c57e823e0728e233286003d5 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 19:05:54 +0530 Subject: [PATCH 117/184] Update start.py --- TanuMusic/plugins/bot/start.py | 84 ++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 311bd2eccd80..ed872f48827f 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -1,5 +1,5 @@ import time -import random +import random from pyrogram import filters from pyrogram.enums import ChatType from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message @@ -23,6 +23,7 @@ from config import BANNED_USERS from strings import get_string +# List of images IMAGE = [ "https://graph.org/file/f76fd86d1936d45a63c64.jpg", "https://graph.org/file/69ba894371860cd22d92e.jpg", @@ -64,12 +65,11 @@ "https://graph.org/file/8f8516c86677a8c91bfb1.jpg", "https://graph.org/file/6603c3740378d3f7187da.jpg", "https://graph.org/file/66cb6ec40eea5c4670118.jpg", -"https://graph.org/file/2e3cf4327b169b981055e.jpg", - +"https://graph.org/file/2e3cf4327b169b981055e.jpg", ] - +# Start command in private chat @app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) @LanguageStart async def start_pm(client, message: Message, _): @@ -88,7 +88,7 @@ async def start_pm(client, message: Message, _): if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + text=f"❖ {message.from_user.mention} started the bot to check SudoList.\n\nUser ID: {message.from_user.id}\nUsername: @{message.from_user.username}", ) return if name[0:3] == "inf": @@ -126,35 +126,49 @@ async def start_pm(client, message: Message, _): if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + text=f"❖ {message.from_user.mention} started the bot to check Track Information.\n\nUser ID: {message.from_user.id}\nUsername: @{message.from_user.username}", ) else: out = private_panel(_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_2"].format(message.from_user.mention, app.mention), - reply_markup=InlineKeyboardMarkup(out), - ) + try: + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_2"].format(message.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(out), + ) + except pyrogram.errors.exceptions.forbidden_403.ChatSendPhotosForbidden: + # Fallback to text message if photo cannot be sent + await message.reply_text( + _["start_2"].format(message.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(out), + ) if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + text=f"❖ {message.from_user.mention} started the bot.\n\nUser ID: {message.from_user.id}\nUsername: @{message.from_user.username}", ) - +# Start command in group chats @app.on_message(filters.command(["start"]) & filters.group & ~BANNED_USERS) @LanguageStart async def start_gp(client, message: Message, _): out = start_panel(_) uptime = int(time.time() - _boot_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_1"].format(app.mention, get_readable_time(uptime)), - reply_markup=InlineKeyboardMarkup(out), - ) + try: + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_1"].format(app.mention, get_readable_time(uptime)), + reply_markup=InlineKeyboardMarkup(out), + ) + except pyrogram.errors.exceptions.forbidden_403.ChatSendPhotosForbidden: + # Fallback to text message if photo cannot be sent + await message.reply_text( + _["start_1"].format(app.mention, get_readable_time(uptime)), + reply_markup=InlineKeyboardMarkup(out), + ) return await add_served_chat(message.chat.id) - +# Welcome new chat members @app.on_message(filters.new_chat_members, group=-1) async def welcome(client, message: Message): for member in message.new_chat_members: @@ -182,16 +196,28 @@ async def welcome(client, message: Message): return await app.leave_chat(message.chat.id) out = start_panel(_) - await message.reply_photo( - random.choice(IMAGE), - caption=_["start_3"].format( - message.from_user.first_name, - app.mention, - message.chat.title, - app.mention, - ), - reply_markup=InlineKeyboardMarkup(out), - ) + try: + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_3"].format( + message.from_user.first_name, + app.mention, + message.chat.title, + app.mention, + ), + reply_markup=InlineKeyboardMarkup(out), + ) + except pyrogram.errors.exceptions.forbidden_403.ChatSendPhotosForbidden: + # Fallback to text message if photo cannot be sent + await message.reply_text( + _["start_3"].format( + message.from_user.first_name, + app.mention, + message.chat.title, + app.mention, + ), + reply_markup=InlineKeyboardMarkup(out), + ) await add_served_chat(message.chat.id) await message.stop_propagation() except Exception as ex: From 642f3be3cc3dda3a15f2fc9f23ed9debde2b3ea1 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 19:15:34 +0530 Subject: [PATCH 118/184] Update start.py --- TanuMusic/plugins/bot/start.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index ed872f48827f..22d2d6689313 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -88,7 +88,7 @@ async def start_pm(client, message: Message, _): if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} started the bot to check SudoList.\n\nUser ID: {message.from_user.id}\nUsername: @{message.from_user.username}", + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) return if name[0:3] == "inf": @@ -126,7 +126,7 @@ async def start_pm(client, message: Message, _): if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} started the bot to check Track Information.\n\nUser ID: {message.from_user.id}\nUsername: @{message.from_user.username}", + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) else: out = private_panel(_) @@ -145,7 +145,7 @@ async def start_pm(client, message: Message, _): if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} started the bot.\n\nUser ID: {message.from_user.id}\nUsername: @{message.from_user.username}", + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) # Start command in group chats From 17e14e25c3f61f456a3d11bdba18489f2c03f887 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 19:34:50 +0530 Subject: [PATCH 119/184] Update settings.py --- TanuMusic/plugins/bot/settings.py | 612 +++++++++++------------------- 1 file changed, 221 insertions(+), 391 deletions(-) diff --git a/TanuMusic/plugins/bot/settings.py b/TanuMusic/plugins/bot/settings.py index 05cc6ece347a..dbac7b544a29 100644 --- a/TanuMusic/plugins/bot/settings.py +++ b/TanuMusic/plugins/bot/settings.py @@ -1,391 +1,221 @@ -from pyrogram import filters -from pyrogram.enums import ChatType -from pyrogram.errors import MessageNotModified -from pyrogram.types import ( - CallbackQuery, - InlineKeyboardButton, - InlineKeyboardMarkup, - Message, -) - -from TanuMusic import app -from TanuMusic.utils.database import ( - add_nonadmin_chat, - get_authuser, - get_authuser_names, - get_playmode, - get_playtype, - get_upvote_count, - is_nonadmin_chat, - is_skipmode, - remove_nonadmin_chat, - set_playmode, - set_playtype, - set_upvotes, - skip_off, - skip_on, -) -from TanuMusic.utils.decorators.admins import ActualAdminCB -from TanuMusic.utils.decorators.language import language, languageCB -from TanuMusic.utils.inline.settings import ( - auth_users_markup, - playmode_users_markup, - setting_markup, - vote_mode_markup, -) -from TanuMusic.utils.inline.start import private_panel -from config import BANNED_USERS, OWNER_ID - - -@app.on_message( - filters.command(["settings"]) & filters.group & ~BANNED_USERS -) -@language -async def settings_mar(client, message: Message, _): - buttons = setting_markup(_) - await message.reply_text( - _["setting_1"].format(app.mention, message.chat.id, message.chat.title), - reply_markup=InlineKeyboardMarkup(buttons), - ) - - -@app.on_callback_query(filters.regex("settings_helper") & ~BANNED_USERS) -@languageCB -async def settings_cb(client, CallbackQuery, _): - try: - await CallbackQuery.answer(_["set_cb_5"]) - except: - pass - buttons = setting_markup(_) - return await CallbackQuery.edit_message_text( - _["setting_1"].format( - app.mention, - CallbackQuery.message.chat.id, - CallbackQuery.message.chat.title, - ), - reply_markup=InlineKeyboardMarkup(buttons), - ) - - -@app.on_callback_query(filters.regex("settingsback_helper") & ~BANNED_USERS) -@languageCB -async def settings_back_markup(client, CallbackQuery: CallbackQuery, _): - try: - await CallbackQuery.answer() - except: - pass - if CallbackQuery.message.chat.type == ChatType.PRIVATE: - await app.resolve_peer(OWNER_ID) - OWNER = OWNER_ID - buttons = private_panel(_) - return await CallbackQuery.edit_message_text( - _["start_2"].format(CallbackQuery.from_user.mention, app.mention), - reply_markup=InlineKeyboardMarkup(buttons), - ) - else: - buttons = setting_markup(_) - return await CallbackQuery.edit_message_reply_markup( - reply_markup=InlineKeyboardMarkup(buttons) - ) - - -@app.on_callback_query( - filters.regex( - pattern=r"^(SEARCHANSWER|PLAYMODEANSWER|PLAYTYPEANSWER|AUTHANSWER|ANSWERVOMODE|VOTEANSWER|PM|AU|VM)$" - ) - & ~BANNED_USERS -) -@languageCB -async def without_Admin_rights(client, CallbackQuery, _): - command = CallbackQuery.matches[0].group(1) - if command == "SEARCHANSWER": - try: - return await CallbackQuery.answer(_["setting_2"], show_alert=True) - except: - return - if command == "PLAYMODEANSWER": - try: - return await CallbackQuery.answer(_["setting_5"], show_alert=True) - except: - return - if command == "PLAYTYPEANSWER": - try: - return await CallbackQuery.answer(_["setting_6"], show_alert=True) - except: - return - if command == "AUTHANSWER": - try: - return await CallbackQuery.answer(_["setting_3"], show_alert=True) - except: - return - if command == "VOTEANSWER": - try: - return await CallbackQuery.answer( - _["setting_8"], - show_alert=True, - ) - except: - return - if command == "ANSWERVOMODE": - current = await get_upvote_count(CallbackQuery.message.chat.id) - try: - return await CallbackQuery.answer( - _["setting_9"].format(current), - show_alert=True, - ) - except: - return - if command == "PM": - try: - await CallbackQuery.answer(_["set_cb_2"], show_alert=True) - except: - pass - playmode = await get_playmode(CallbackQuery.message.chat.id) - if playmode == "Direct": - Direct = True - else: - Direct = None - is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - if not is_non_admin: - Group = True - else: - Group = None - playty = await get_playtype(CallbackQuery.message.chat.id) - if playty == "Everyone": - Playtype = None - else: - Playtype = True - buttons = playmode_users_markup(_, Direct, Group, Playtype) - if command == "AU": - try: - await CallbackQuery.answer(_["set_cb_1"], show_alert=True) - except: - pass - is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - if not is_non_admin: - buttons = auth_users_markup(_, True) - else: - buttons = auth_users_markup(_) - if command == "VM": - mode = await is_skipmode(CallbackQuery.message.chat.id) - current = await get_upvote_count(CallbackQuery.message.chat.id) - buttons = vote_mode_markup(_, current, mode) - try: - return await CallbackQuery.edit_message_reply_markup( - reply_markup=InlineKeyboardMarkup(buttons) - ) - except MessageNotModified: - return - - -@app.on_callback_query(filters.regex("FERRARIUDTI") & ~BANNED_USERS) -@ActualAdminCB -async def addition(client, CallbackQuery, _): - callback_data = CallbackQuery.data.strip() - mode = callback_data.split(None, 1)[1] - if not await is_skipmode(CallbackQuery.message.chat.id): - return await CallbackQuery.answer(_["setting_10"], show_alert=True) - current = await get_upvote_count(CallbackQuery.message.chat.id) - if mode == "M": - final = current - 2 - print(final) - if final == 0: - return await CallbackQuery.answer( - _["setting_11"], - show_alert=True, - ) - if final <= 2: - final = 2 - await set_upvotes(CallbackQuery.message.chat.id, final) - else: - final = current + 2 - print(final) - if final == 17: - return await CallbackQuery.answer( - _["setting_12"], - show_alert=True, - ) - if final >= 15: - final = 15 - await set_upvotes(CallbackQuery.message.chat.id, final) - buttons = vote_mode_markup(_, final, True) - try: - return await CallbackQuery.edit_message_reply_markup( - reply_markup=InlineKeyboardMarkup(buttons) - ) - except MessageNotModified: - return - - -@app.on_callback_query( - filters.regex(pattern=r"^(MODECHANGE|CHANNELMODECHANGE|PLAYTYPECHANGE)$") - & ~BANNED_USERS -) -@ActualAdminCB -async def playmode_ans(client, CallbackQuery, _): - command = CallbackQuery.matches[0].group(1) - if command == "CHANNELMODECHANGE": - is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - if not is_non_admin: - await add_nonadmin_chat(CallbackQuery.message.chat.id) - Group = None - else: - await remove_nonadmin_chat(CallbackQuery.message.chat.id) - Group = True - playmode = await get_playmode(CallbackQuery.message.chat.id) - if playmode == "Direct": - Direct = True - else: - Direct = None - playty = await get_playtype(CallbackQuery.message.chat.id) - if playty == "Everyone": - Playtype = None - else: - Playtype = True - buttons = playmode_users_markup(_, Direct, Group, Playtype) - if command == "MODECHANGE": - try: - await CallbackQuery.answer(_["set_cb_3"], show_alert=True) - except: - pass - playmode = await get_playmode(CallbackQuery.message.chat.id) - if playmode == "Direct": - await set_playmode(CallbackQuery.message.chat.id, "Inline") - Direct = None - else: - await set_playmode(CallbackQuery.message.chat.id, "Direct") - Direct = True - is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - if not is_non_admin: - Group = True - else: - Group = None - playty = await get_playtype(CallbackQuery.message.chat.id) - if playty == "Everyone": - Playtype = False - else: - Playtype = True - buttons = playmode_users_markup(_, Direct, Group, Playtype) - if command == "PLAYTYPECHANGE": - try: - await CallbackQuery.answer(_["set_cb_3"], show_alert=True) - except: - pass - playty = await get_playtype(CallbackQuery.message.chat.id) - if playty == "Everyone": - await set_playtype(CallbackQuery.message.chat.id, "Admin") - Playtype = False - else: - await set_playtype(CallbackQuery.message.chat.id, "Everyone") - Playtype = True - playmode = await get_playmode(CallbackQuery.message.chat.id) - if playmode == "Direct": - Direct = True - else: - Direct = None - is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - if not is_non_admin: - Group = True - else: - Group = None - buttons = playmode_users_markup(_, Direct, Group, Playtype) - try: - return await CallbackQuery.edit_message_reply_markup( - reply_markup=InlineKeyboardMarkup(buttons) - ) - except MessageNotModified: - return - - -@app.on_callback_query(filters.regex(pattern=r"^(AUTH|AUTHLIST)$") & ~BANNED_USERS) -@ActualAdminCB -async def authusers_mar(client, CallbackQuery, _): - command = CallbackQuery.matches[0].group(1) - if command == "AUTHLIST": - _authusers = await get_authuser_names(CallbackQuery.message.chat.id) - if not _authusers: - try: - return await CallbackQuery.answer(_["setting_4"], show_alert=True) - except: - return - else: - try: - await CallbackQuery.answer(_["set_cb_4"], show_alert=True) - except: - pass - j = 0 - await CallbackQuery.edit_message_text(_["auth_6"]) - msg = _["auth_7"].format(CallbackQuery.message.chat.title) - for note in _authusers: - _note = await get_authuser(CallbackQuery.message.chat.id, note) - user_id = _note["auth_user_id"] - admin_id = _note["admin_id"] - admin_name = _note["admin_name"] - try: - user = await app.get_users(user_id) - user = user.first_name - j += 1 - except: - continue - msg += f"● {j} ➥ {user}[{user_id}]\n" - msg += f" {_['auth_8']} {admin_name}[{admin_id}]\n\n" - upl = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text=_["BACK_BUTTON"], callback_data=f"AU" - ), - InlineKeyboardButton( - text=_["CLOSE_BUTTON"], - callback_data=f"close", - ), - ] - ] - ) - try: - return await CallbackQuery.edit_message_text(msg, reply_markup=upl) - except MessageNotModified: - return - try: - await CallbackQuery.answer(_["set_cb_3"], show_alert=True) - except: - pass - if command == "AUTH": - is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - if not is_non_admin: - await add_nonadmin_chat(CallbackQuery.message.chat.id) - buttons = auth_users_markup(_) - else: - await remove_nonadmin_chat(CallbackQuery.message.chat.id) - buttons = auth_users_markup(_, True) - try: - return await CallbackQuery.edit_message_reply_markup( - reply_markup=InlineKeyboardMarkup(buttons) - ) - except MessageNotModified: - return - - -@app.on_callback_query(filters.regex("VOMODECHANGE") & ~BANNED_USERS) -@ActualAdminCB -async def vote_change(client, CallbackQuery, _): - command = CallbackQuery.matches[0].group(1) - try: - await CallbackQuery.answer(_["set_cb_3"], show_alert=True) - except: - pass - mod = None - if await is_skipmode(CallbackQuery.message.chat.id): - await skip_off(CallbackQuery.message.chat.id) - else: - mod = True - await skip_on(CallbackQuery.message.chat.id) - current = await get_upvote_count(CallbackQuery.message.chat.id) - buttons = vote_mode_markup(_, current, mod) - - try: - return await CallbackQuery.edit_message_reply_markup( - reply_markup=InlineKeyboardMarkup(buttons) - ) - except MessageNotModified: - return +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.errors import MessageNotModified +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from TanuMusic import app +from TanuMusic.utils.database import ( + add_nonadmin_chat, + get_authuser, + get_authuser_names, + get_playmode, + get_playtype, + get_upvote_count, + is_nonadmin_chat, + is_skipmode, + remove_nonadmin_chat, + set_playmode, + set_playtype, + set_upvotes, + skip_off, + skip_on, +) +from TanuMusic.utils.decorators.admins import ActualAdminCB +from TanuMusic.utils.decorators.language import language, languageCB +from TanuMusic.utils.inline.settings import ( + auth_users_markup, + playmode_users_markup, + setting_markup, + vote_mode_markup, +) +from TanuMusic.utils.inline.start import private_panel +from config import BANNED_USERS, OWNER_ID + + +@app.on_message( + filters.command(["settings"]) & filters.group & ~BANNED_USERS +) +@language +async def settings_mar(client, message: Message, _): + buttons = setting_markup(_) + await message.reply_text( + _["setting_1"].format(app.mention, message.chat.id, message.chat.title), + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +@app.on_callback_query(filters.regex("settings_helper") & ~BANNED_USERS) +@languageCB +async def settings_cb(client, CallbackQuery, _): + try: + await CallbackQuery.answer(_["set_cb_5"]) + except: + pass + buttons = setting_markup(_) + return await CallbackQuery.edit_message_text( + _["setting_1"].format( + app.mention, + CallbackQuery.message.chat.id, + CallbackQuery.message.chat.title, + ), + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +@app.on_callback_query(filters.regex("settingsback_helper") & ~BANNED_USERS) +@languageCB +async def settings_back_markup(client, CallbackQuery: CallbackQuery, _): + try: + await CallbackQuery.answer() + except: + pass + if CallbackQuery.message.chat.type == ChatType.PRIVATE: + await app.resolve_peer(OWNER_ID) + OWNER = OWNER_ID + buttons = private_panel(_) + return await CallbackQuery.edit_message_text( + _["start_2"].format(CallbackQuery.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(buttons), + ) + else: + buttons = setting_markup(_) + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + + +@app.on_callback_query( + filters.regex( + pattern=r"^(SEARCHANSWER|PLAYMODEANSWER|PLAYTYPEANSWER|AUTHANSWER|ANSWERVOMODE|VOTEANSWER|PM|AU|VM)$" + ) + & ~BANNED_USERS +) +@languageCB +async def without_Admin_rights(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) + if command == "SEARCHANSWER": + try: + return await CallbackQuery.answer(_["setting_2"], show_alert=True) + except: + return + if command == "PLAYMODEANSWER": + try: + return await CallbackQuery.answer(_["setting_5"], show_alert=True) + except: + return + if command == "PLAYTYPEANSWER": + try: + return await CallbackQuery.answer(_["setting_6"], show_alert=True) + except: + return + if command == "AUTHANSWER": + try: + return await CallbackQuery.answer(_["setting_3"], show_alert=True) + except: + return + if command == "VOTEANSWER": + try: + return await CallbackQuery.answer( + _["setting_8"], + show_alert=True, + ) + except: + return + if command == "ANSWERVOMODE": + current = await get_upvote_count(CallbackQuery.message.chat.id) + try: + return await CallbackQuery.answer( + _["setting_9"].format(current), + show_alert=True, + ) + except: + return + if command == "PM": + try: + await CallbackQuery.answer(_["set_cb_2"], show_alert=True) + except: + pass + playmode = await get_playmode(CallbackQuery.message.chat.id) + Direct = playmode == "Direct" + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + Group = not is_non_admin + playty = await get_playtype(CallbackQuery.message.chat.id) + Playtype = playty != "Everyone" + buttons = playmode_users_markup(_, Direct, Group, Playtype) + if command == "AU": + try: + await CallbackQuery.answer(_["set_cb_1"], show_alert=True) + except: + pass + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + buttons = auth_users_markup(_, not is_non_admin) + if command == "VM": + mode = await is_skipmode(CallbackQuery.message.chat.id) + current = await get_upvote_count(CallbackQuery.message.chat.id) + buttons = vote_mode_markup(_, current, mode) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + +@app.on_callback_query(filters.regex("FERRARIUDTI") & ~BANNED_USERS) +@ActualAdminCB +async def addition(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + mode = callback_data.split(None, 1)[1] + if not await is_skipmode(CallbackQuery.message.chat.id): + return await CallbackQuery.answer(_["setting_10"], show_alert=True) + current = await get_upvote_count(CallbackQuery.message.chat.id) + if mode == "M": + final = max(2, current - 2) + if final == 2: + return await CallbackQuery.answer( + _["setting_11"], + show_alert=True, + ) + await set_upvotes(CallbackQuery.message.chat.id, final) + else: + final = min(15, current + 2) + if final == 15: + return await CallbackQuery.answer( + _["setting_12"], + show_alert=True, + ) + await set_upvotes(CallbackQuery.message.chat.id, final) + buttons = vote_mode_markup(_, final, True) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + +@app.on_callback_query(filters.regex("VOMODECHANGE") & ~BANNED_USERS) +@ActualAdminCB +async def vote_change(client, CallbackQuery, _): + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + mod = not await is_skipmode(CallbackQuery.message.chat.id) + if mod: + await skip_on(CallbackQuery.message.chat.id) + else: + await skip_off(CallbackQuery.message.chat.id) + current = await get_upvote_count(CallbackQuery.message.chat.id) + buttons = vote_mode_markup(_, current, mod) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return \ No newline at end of file From 10603b62ac0c61e72971d5cc0a5bef1f4f6dce34 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 19:53:11 +0530 Subject: [PATCH 120/184] Update settings.py --- TanuMusic/plugins/bot/settings.py | 194 ++++++++++++++++++++++++++++-- 1 file changed, 182 insertions(+), 12 deletions(-) diff --git a/TanuMusic/plugins/bot/settings.py b/TanuMusic/plugins/bot/settings.py index dbac7b544a29..bb5559dd5a8c 100644 --- a/TanuMusic/plugins/bot/settings.py +++ b/TanuMusic/plugins/bot/settings.py @@ -141,11 +141,20 @@ async def without_Admin_rights(client, CallbackQuery, _): except: pass playmode = await get_playmode(CallbackQuery.message.chat.id) - Direct = playmode == "Direct" + if playmode == "Direct": + Direct = True + else: + Direct = None is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - Group = not is_non_admin + if not is_non_admin: + Group = True + else: + Group = None playty = await get_playtype(CallbackQuery.message.chat.id) - Playtype = playty != "Everyone" + if playty == "Everyone": + Playtype = None + else: + Playtype = True buttons = playmode_users_markup(_, Direct, Group, Playtype) if command == "AU": try: @@ -153,7 +162,10 @@ async def without_Admin_rights(client, CallbackQuery, _): except: pass is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) - buttons = auth_users_markup(_, not is_non_admin) + if not is_non_admin: + buttons = auth_users_markup(_, True) + else: + buttons = auth_users_markup(_) if command == "VM": mode = await is_skipmode(CallbackQuery.message.chat.id) current = await get_upvote_count(CallbackQuery.message.chat.id) @@ -175,20 +187,26 @@ async def addition(client, CallbackQuery, _): return await CallbackQuery.answer(_["setting_10"], show_alert=True) current = await get_upvote_count(CallbackQuery.message.chat.id) if mode == "M": - final = max(2, current - 2) - if final == 2: + final = current - 2 + print(final) + if final == 0: return await CallbackQuery.answer( _["setting_11"], show_alert=True, ) + if final <= 2: + final = 2 await set_upvotes(CallbackQuery.message.chat.id, final) else: - final = min(15, current + 2) - if final == 15: + final = current + 2 + print(final) + if final == 17: return await CallbackQuery.answer( _["setting_12"], show_alert=True, ) + if final >= 15: + final = 15 await set_upvotes(CallbackQuery.message.chat.id, final) buttons = vote_mode_markup(_, final, True) try: @@ -199,20 +217,172 @@ async def addition(client, CallbackQuery, _): return +@app.on_callback_query( + filters.regex(pattern=r"^(MODECHANGE|CHANNELMODECHANGE|PLAYTYPECHANGE)$") + & ~BANNED_USERS +) +@ActualAdminCB +async def playmode_ans(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) + if command == "CHANNELMODECHANGE": + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + await add_nonadmin_chat(CallbackQuery.message.chat.id) + Group = None + else: + await remove_nonadmin_chat(CallbackQuery.message.chat.id) + Group = True + playmode = await get_playmode(CallbackQuery.message.chat.id) + if playmode == "Direct": + Direct = True + else: + Direct = None + playty = await get_playtype(CallbackQuery.message.chat.id) + if playty == "Everyone": + Playtype = None + else: + Playtype = True + buttons = playmode_users_markup(_, Direct, Group, Playtype) + if command == "MODECHANGE": + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + playmode = await get_playmode(CallbackQuery.message.chat.id) + if playmode == "Direct": + await set_playmode(CallbackQuery.message.chat.id, "Inline") + Direct = None + else: + await set_playmode(CallbackQuery.message.chat.id, "Direct") + Direct = True + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + Group = True + else: + Group = None + playty = await get_playtype(CallbackQuery.message.chat.id) + if playty == "Everyone": + Playtype = False + else: + Playtype = True + buttons = playmode_users_markup(_, Direct, Group, Playtype) + if command == "PLAYTYPECHANGE": + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + playty = await get_playtype(CallbackQuery.message.chat.id) + if playty == "Everyone": + await set_playtype(CallbackQuery.message.chat.id, "Admin") + Playtype = False + else: + await set_playtype(CallbackQuery.message.chat.id, "Everyone") + Playtype = True + playmode = await get_playmode(CallbackQuery.message.chat.id) + if playmode == "Direct": + Direct = True + else: + Direct = None + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + Group = True + else: + Group = None + buttons = playmode_users_markup(_, Direct, Group, Playtype) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + +@app.on_callback_query(filters.regex(pattern=r"^(AUTH|AUTHLIST)$") & ~BANNED_USERS) +@ActualAdminCB +async def authusers_mar(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) + if command == "AUTHLIST": + _authusers = await get_authuser_names(CallbackQuery.message.chat.id) + if not _authusers: + try: + return await CallbackQuery.answer(_["setting_4"], show_alert=True) + except: + return + else: + try: + await CallbackQuery.answer(_["set_cb_4"], show_alert=True) + except: + pass + j = 0 + await CallbackQuery.edit_message_text(_["auth_6"]) + msg = _["auth_7"].format(CallbackQuery.message.chat.title) + for note in _authusers: + _note = await get_authuser(CallbackQuery.message.chat.id, note) + user_id = _note["auth_user_id"] + admin_id = _note["admin_id"] + admin_name = _note["admin_name"] + try: + user = await app.get_users(user_id) + user = user.first_name + j += 1 + except: + continue + msg += f"● {j} ➥ {user}[{user_id}]\n" + msg += f" {_['auth_8']} {admin_name}[{admin_id}]\n\n" + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], callback_data=f"AU" + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data=f"close", + ), + ] + ] + ) + try: + return await CallbackQuery.edit_message_text(msg, reply_markup=upl) + except MessageNotModified: + return + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + if command == "AUTH": + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + await add_nonadmin_chat(CallbackQuery.message.chat.id) + buttons = auth_users_markup(_) + else: + await remove_nonadmin_chat(CallbackQuery.message.chat.id) + buttons = auth_users_markup(_, True) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + @app.on_callback_query(filters.regex("VOMODECHANGE") & ~BANNED_USERS) @ActualAdminCB async def vote_change(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) try: await CallbackQuery.answer(_["set_cb_3"], show_alert=True) except: pass - mod = not await is_skipmode(CallbackQuery.message.chat.id) - if mod: - await skip_on(CallbackQuery.message.chat.id) - else: + mod = None + if await is_skipmode(CallbackQuery.message.chat.id): await skip_off(CallbackQuery.message.chat.id) + else: + mod = True + await skip_on(CallbackQuery.message.chat.id) current = await get_upvote_count(CallbackQuery.message.chat.id) buttons = vote_mode_markup(_, current, mod) + try: return await CallbackQuery.edit_message_reply_markup( reply_markup=InlineKeyboardMarkup(buttons) From 28a1c9867a6ee78bfad588a50ceb33a023fe47ac Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 20:57:00 +0530 Subject: [PATCH 121/184] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a01c0426e881..22f4c4ec5802 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,7 +21,7 @@ psutil pytube pykeyboard unidecode -ntgcalls==1.1.2 +#ntgcalls==1.1.2 python-dotenv pyyaml requests From e1545e5bf79d497b67a61d2c2c1ca2843fbbc5bb Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 21:11:07 +0530 Subject: [PATCH 122/184] Update settings.py --- TanuMusic/utils/inline/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/utils/inline/settings.py b/TanuMusic/utils/inline/settings.py index 904a53519a27..dcf3975d677b 100644 --- a/TanuMusic/utils/inline/settings.py +++ b/TanuMusic/utils/inline/settings.py @@ -107,4 +107,4 @@ def playmode_users_markup( InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close"), ], ] - return buttons + return buttons \ No newline at end of file From 206d0cd4f367c530da86a0c7b0bbdb02bd58ae2f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:11:56 +0530 Subject: [PATCH 123/184] Update database.py --- TanuMusic/utils/database.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index a82b2903a42c..36cb80eb09e7 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -40,6 +40,19 @@ playtype = {} skipmode = {} +async def get_active_video_chats() -> list: + return activevideo + +async def get_active_chats() -> list: + return active + +async def remove_active_chat(chat_id: int): + if chat_id in active: + active.remove(chat_id) + +async def remove_active_video_chat(chat_id: int): + if chat_id in activevideo: + activevideo.remove(chat_id) async def get_assistant_number(chat_id: int) -> str: assistant = assistantdict.get(chat_id) From c5f3cf5d35c7733e9565b16c7a591631f29ffab4 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:14:16 +0530 Subject: [PATCH 124/184] Update sudo --- TanuMusic/plugins/sudo/active.py | 122 +++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 TanuMusic/plugins/sudo/active.py diff --git a/TanuMusic/plugins/sudo/active.py b/TanuMusic/plugins/sudo/active.py new file mode 100644 index 000000000000..237e1fc5c963 --- /dev/null +++ b/TanuMusic/plugins/sudo/active.py @@ -0,0 +1,122 @@ +from pyrogram import Client, filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from unidecode import unidecode + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import ( + get_active_chats, + get_active_video_chats, + remove_active_chat, + remove_active_video_chat, +) + + +async def generate_join_link(chat_id: int): + invite_link = await app.export_chat_invite_link(chat_id) + return invite_link + + +def ordinal(n): + suffix = ["th", "st", "nd", "rd", "th"][min(n % 10, 4)] + if 11 <= (n % 100) <= 13: + suffix = "th" + return str(n) + suffix + + +@app.on_message( + filters.command( + ["activevc", "activevoice"], prefixes=["/", "!", "%", ",", "", ".", "@", "#"] + ) + & SUDOERS +) +async def activevc(_, message: Message): + mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛs ʟɪsᴛ...") + served_chats = await get_active_chats() + text = "" + j = 0 + buttons = [] + for x in served_chats: + try: + chat_info = await app.get_chat(x) + title = chat_info.title + invite_link = await generate_join_link(x) + except: + await remove_active_chat(x) + continue + try: + if chat_info.username: + user = chat_info.username + text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + else: + text += ( + f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + ) + button_text = f"๏ ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ ๏" + buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) + j += 1 + except: + continue + if not text: + await mystic.edit_text(f"» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛs ᴏɴ {app.mention}.") + else: + await mystic.edit_text( + f"» ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛs :\n\n{text}", + reply_markup=InlineKeyboardMarkup(buttons), + disable_web_page_preview=True, + ) + + +@app.on_message( + filters.command( + ["activev", "activevideo"], prefixes=["/", "!", "%", ",", "", ".", "@", "#"] + ) + & SUDOERS +) +async def activevi_(_, message: Message): + mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs ʟɪsᴛ...") + served_chats = await get_active_video_chats() + text = "" + j = 0 + buttons = [] + for x in served_chats: + try: + chat_info = await app.get_chat(x) + title = chat_info.title + invite_link = await generate_join_link(x) + except: + await remove_active_video_chat(x) + continue + try: + if chat_info.username: + user = chat_info.username + text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + else: + text += ( + f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + ) + button_text = f"๏ ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ ๏" + buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) + j += 1 + except: + continue + if not text: + await mystic.edit_text(f"» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs ᴏɴ {app.mention}.") + else: + await mystic.edit_text( + f"» ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs :\n\n{text}", + reply_markup=InlineKeyboardMarkup(buttons), + disable_web_page_preview=True, + ) + + +@app.on_message(filters.command(["ac"]) & SUDOERS) +async def start(client: Client, message: Message): + ac_audio = str(len(await get_active_chats())) + ac_video = str(len(await get_active_video_chats())) + await message.reply_text( + f"✫ ᴀᴄᴛɪᴠᴇ ᴄʜᴀᴛs ɪɴғᴏ :\n\nᴠᴏɪᴄᴇ : {ac_audio}\nᴠɪᴅᴇᴏ : {ac_video}", + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton("✯ ᴄʟᴏsᴇ ✯", callback_data=f"close")]] + ), + ) \ No newline at end of file From 4e8a6d66c9ac47ddad7d8b1168dee79e48df0507 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:27:18 +0530 Subject: [PATCH 125/184] Update autoleave.py --- TanuMusic/plugins/misc/autoleave.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TanuMusic/plugins/misc/autoleave.py b/TanuMusic/plugins/misc/autoleave.py index d79750c0ca39..b6ba3066709e 100644 --- a/TanuMusic/plugins/misc/autoleave.py +++ b/TanuMusic/plugins/misc/autoleave.py @@ -26,8 +26,8 @@ async def auto_leave(): ]: if ( i.chat.id != config.LOGGER_ID - and i.chat.id != -1001686672798 - and i.chat.id != -1001549206010 + and i.chat.id != -1002342994330 + and i.chat.id != -1002296968230 ): if left == 20: continue @@ -71,4 +71,4 @@ async def auto_end(): continue -asyncio.create_task(auto_end()) +asyncio.create_task(auto_end()) \ No newline at end of file From 87c1a3cff7c36ef53135f6389642fb71bf2cd3b8 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:40:04 +0530 Subject: [PATCH 126/184] Update active.py --- TanuMusic/plugins/sudo/active.py | 96 ++++++++++++++++---------------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/TanuMusic/plugins/sudo/active.py b/TanuMusic/plugins/sudo/active.py index 237e1fc5c963..e9c92beaac39 100644 --- a/TanuMusic/plugins/sudo/active.py +++ b/TanuMusic/plugins/sudo/active.py @@ -13,8 +13,12 @@ async def generate_join_link(chat_id: int): - invite_link = await app.export_chat_invite_link(chat_id) - return invite_link + try: + invite_link = await app.export_chat_invite_link(chat_id) + return invite_link + except Exception as e: + print(f"Error generating join link for chat {chat_id}: {e}") + return None def ordinal(n): @@ -24,12 +28,7 @@ def ordinal(n): return str(n) + suffix -@app.on_message( - filters.command( - ["activevc", "activevoice"], prefixes=["/", "!", "%", ",", "", ".", "@", "#"] - ) - & SUDOERS -) +@app.on_message(filters.command(["activevc", "activevoice"]) & SUDOERS) async def activevc(_, message: Message): mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛs ʟɪsᴛ...") served_chats = await get_active_chats() @@ -39,26 +38,28 @@ async def activevc(_, message: Message): for x in served_chats: try: chat_info = await app.get_chat(x) - title = chat_info.title + title = chat_info.title or "Unknown" invite_link = await generate_join_link(x) - except: + if not invite_link: + await remove_active_chat(x) + continue + except Exception as e: + print(f"Error processing chat {x}: {e}") await remove_active_chat(x) continue - try: - if chat_info.username: - user = chat_info.username - text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" - else: - text += ( - f"{j + 1}. {unidecode(title).upper()} [{x}]\n" - ) - button_text = f"๏ ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ ๏" - buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) - j += 1 - except: - continue + + if chat_info.username: + user = chat_info.username + text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + else: + text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + + button_text = f"ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ " + buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) + j += 1 + if not text: - await mystic.edit_text(f"» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛs ᴏɴ {app.mention}.") + await mystic.edit_text("» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛs ғᴏᴜɴᴅ.") else: await mystic.edit_text( f"» ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛs :\n\n{text}", @@ -67,12 +68,7 @@ async def activevc(_, message: Message): ) -@app.on_message( - filters.command( - ["activev", "activevideo"], prefixes=["/", "!", "%", ",", "", ".", "@", "#"] - ) - & SUDOERS -) +@app.on_message(filters.command(["activevd", "activevideo"]) & SUDOERS) async def activevi_(_, message: Message): mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs ʟɪsᴛ...") served_chats = await get_active_video_chats() @@ -82,26 +78,28 @@ async def activevi_(_, message: Message): for x in served_chats: try: chat_info = await app.get_chat(x) - title = chat_info.title + title = chat_info.title or "Unknown" invite_link = await generate_join_link(x) - except: + if not invite_link: + await remove_active_video_chat(x) + continue + except Exception as e: + print(f"Error processing chat {x}: {e}") await remove_active_video_chat(x) continue - try: - if chat_info.username: - user = chat_info.username - text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" - else: - text += ( - f"{j + 1}. {unidecode(title).upper()} [{x}]\n" - ) - button_text = f"๏ ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ ๏" - buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) - j += 1 - except: - continue + + if chat_info.username: + user = chat_info.username + text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + else: + text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" + + button_text = f" ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ " + buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) + j += 1 + if not text: - await mystic.edit_text(f"» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs ᴏɴ {app.mention}.") + await mystic.edit_text("» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs ғᴏᴜɴᴅ.") else: await mystic.edit_text( f"» ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs :\n\n{text}", @@ -110,13 +108,13 @@ async def activevi_(_, message: Message): ) -@app.on_message(filters.command(["ac"]) & SUDOERS) +@app.on_message(filters.command("active") & SUDOERS) async def start(client: Client, message: Message): ac_audio = str(len(await get_active_chats())) ac_video = str(len(await get_active_video_chats())) await message.reply_text( - f"✫ ᴀᴄᴛɪᴠᴇ ᴄʜᴀᴛs ɪɴғᴏ :\n\nᴠᴏɪᴄᴇ : {ac_audio}\nᴠɪᴅᴇᴏ : {ac_video}", + f"❖ᴀᴄᴛɪᴠᴇ ᴄʜᴀᴛs ɪɴғᴏ :\n\nᴠᴏɪᴄᴇ : {ac_audio}\nᴠɪᴅᴇᴏ : {ac_video}", reply_markup=InlineKeyboardMarkup( - [[InlineKeyboardButton("✯ ᴄʟᴏsᴇ ✯", callback_data=f"close")]] + [[InlineKeyboardButton("ᴄʟᴏsᴇ", callback_data="close")]] ), ) \ No newline at end of file From b69d1987c424f3183258ac3c8341d83b686633bf Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:46:00 +0530 Subject: [PATCH 127/184] Update active.py --- TanuMusic/plugins/sudo/active.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/sudo/active.py b/TanuMusic/plugins/sudo/active.py index e9c92beaac39..04ba305eaf65 100644 --- a/TanuMusic/plugins/sudo/active.py +++ b/TanuMusic/plugins/sudo/active.py @@ -113,7 +113,7 @@ async def start(client: Client, message: Message): ac_audio = str(len(await get_active_chats())) ac_video = str(len(await get_active_video_chats())) await message.reply_text( - f"❖ᴀᴄᴛɪᴠᴇ ᴄʜᴀᴛs ɪɴғᴏ :\n\nᴠᴏɪᴄᴇ : {ac_audio}\nᴠɪᴅᴇᴏ : {ac_video}", + f"❖ ᴀᴄᴛɪᴠᴇ ᴄʜᴀᴛs ɪɴғᴏ :\n\nᴠᴏɪᴄᴇ : {ac_audio}\nᴠɪᴅᴇᴏ : {ac_video}", reply_markup=InlineKeyboardMarkup( [[InlineKeyboardButton("ᴄʟᴏsᴇ", callback_data="close")]] ), From b25c72714f90ec66f27b1048d620507c9d2ec74e Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:58:30 +0530 Subject: [PATCH 128/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 05650e850bbb..8a7bcfa1d07d 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -24,7 +24,7 @@ call_4 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ɪɴᴠɪᴛɪɴɢ {0} ᴀss call_5 : "❖ {0} ᴀssɪsᴛᴀɴᴛ ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.\n\n● ᴛʀʏɪɴɢ ᴛᴏ sᴛᴀʀᴛ sᴛʀᴇᴀᴍ..." call_6 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴡɪᴛᴄʜ sᴛʀᴇᴀᴍ, ᴘʟᴇᴀsᴇ ᴜsᴇ /skip ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴛʀᴀᴄᴋ ᴀɢᴀɪɴ." call_7 : "❖ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ǫᴜᴇᴜᴇ.\n\n● ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." -call_8 : "❖ ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.\n\n● Pʟᴇᴀsᴇ sᴛᴀʀᴛ ᴠɪᴅᴇᴏᴄʜᴀᴛ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." +call_8 : "❖ ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.\n\n● ᴘʟᴇᴀsᴇ sᴛᴀʀᴛ ᴠɪᴅᴇᴏᴄʜᴀᴛ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." call_9 : "❖ ᴀssɪsᴛᴀɴᴛ ᴀʟʀᴇᴀᴅʏ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.\n\n● ɪғ ᴀssɪsᴛᴀɴᴛ ɪs ɴᴏᴛ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ, ᴘʟᴇᴀsᴇ sᴇɴᴅ /reboot ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ." call_10 : "❖ ᴛᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀ ᴇʀʀᴏʀ\n\n● ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴏʀ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴏғ ʏᴏᴜʀ ɢʀᴏᴜᴘ." From 39b17ee12bfa8b19e550c33b45f3553349d34393 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 09:48:00 +0530 Subject: [PATCH 129/184] Update Youtube.py --- TanuMusic/platforms/Youtube.py | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/TanuMusic/platforms/Youtube.py b/TanuMusic/platforms/Youtube.py index 8a9660cf47eb..cc876283b162 100644 --- a/TanuMusic/platforms/Youtube.py +++ b/TanuMusic/platforms/Youtube.py @@ -36,39 +36,6 @@ async def shell_cmd(cmd): return errorz.decode("utf-8") return out.decode("utf-8") - -async def api_download(vidid, video=False): - API = "https://api.cobalt.tools/api/json" - headers = { - "Accept": "application/json", - "Content-Type": "application/json", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", - } - - if video: - path = os.path.join("downloads", f"{vidid}.mp4") - data = {"url": f"https://www.youtube.com/watch?v={vidid}", "vQuality": "480"} - else: - path = os.path.join("downloads", f"{vidid}.m4a") - data = { - "url": f"https://www.youtube.com/watch?v={vidid}", - "isAudioOnly": "True", - "aFormat": "opus", - } - - async with httpx.AsyncClient(http2=True) as client: - response = await client.post(API, headers=headers, json=data) - response.raise_for_status() - results = response.json()["url"] - - cmd = f"yt-dlp '{results}' -o '{path}'" - await shell_cmd(cmd) - if os.path.isfile(path): - return path - else: - return None - - class YouTubeAPI: def __init__(self): self.base = "https://www.youtube.com/watch?v=" From 2fdb095c426db46fd029b2767ea3a2f8a8df22b5 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:26:01 +0530 Subject: [PATCH 130/184] Update active.py --- TanuMusic/plugins/sudo/active.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/sudo/active.py b/TanuMusic/plugins/sudo/active.py index 04ba305eaf65..e590cd81681e 100644 --- a/TanuMusic/plugins/sudo/active.py +++ b/TanuMusic/plugins/sudo/active.py @@ -54,7 +54,7 @@ async def activevc(_, message: Message): else: text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" - button_text = f"ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ " + button_text = f"{ordinal(j + 1)} ɢʀᴏᴜᴘ " buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) j += 1 @@ -94,7 +94,7 @@ async def activevi_(_, message: Message): else: text += f"{j + 1}. {unidecode(title).upper()} [{x}]\n" - button_text = f" ᴊᴏɪɴ {ordinal(j + 1)} ɢʀᴏᴜᴘ " + button_text = f"{ordinal(j + 1)} ɢʀᴏᴜᴘ " buttons.append([InlineKeyboardButton(button_text, url=invite_link)]) j += 1 From 0e87930eaecd7b33aac780b76000c51d6c4ca99e Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:33:09 +0530 Subject: [PATCH 131/184] Update helpers.py --- strings/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/helpers.py b/strings/helpers.py index 55c43cf9dccf..45b020fab477 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -115,7 +115,7 @@ HELP_9 = """ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs ➥ -⬤ /draw ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴀɴ ɪᴍᴀɢᴇ. +⬤ /image ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ sᴄʀᴀᴘᴇ ɪᴍᴀɢᴇ ғᴏʀᴍ ɢᴏᴏɢʟᴇ. ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ From b95d4c070b0f33d9709bb67a230b266de241b34b Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:34:33 +0530 Subject: [PATCH 132/184] Update tools --- TanuMusic/plugins/tools/image.py | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 TanuMusic/plugins/tools/image.py diff --git a/TanuMusic/plugins/tools/image.py b/TanuMusic/plugins/tools/image.py new file mode 100644 index 000000000000..698972bac942 --- /dev/null +++ b/TanuMusic/plugins/tools/image.py @@ -0,0 +1,53 @@ +import os +import shutil +from re import findall +from bing_image_downloader import downloader +from pyrogram import Client, filters +from pyrogram.types import InputMediaPhoto, Message +from TanuMusic import app + +@app.on_message(filters.command("img", "image")) +async def google_img_search(client: Client, message: Message): + chat_id = message.chat.id + + try: + query = message.text.split(None, 1)[1] + except IndexError: + return await message.reply("❍ ᴘʀᴏᴠɪᴅᴇ ᴀɴ ɪᴍᴀɢᴇ ǫᴜɪᴇʀʏ ᴛᴏ sᴇᴀʀᴄʜ!") + + lim = findall(r"lim=\d+", query) + try: + lim = int(lim[0].replace("lim=", "")) + query = query.replace(f"lim={lim}", "") + except IndexError: + lim = 6 # Default limit to 6 images + + download_dir = "downloads" + + try: + downloader.download(query, limit=lim, output_dir=download_dir, adult_filter_off=True, force_replace=False, timeout=60) + images_dir = os.path.join(download_dir, query) + if not os.listdir(images_dir): + raise Exception("No images were downloaded.") + lst = [os.path.join(images_dir, img) for img in os.listdir(images_dir)][:lim] # Ensure we only take the number of images specified by lim + except Exception as e: + return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") + + msg = await message.reply("❍ ғɪɴᴅɪɴɢ ɪᴍᴀɢᴇs.....") + + count = 0 + for img in lst: + count += 1 + await msg.edit(f"❍ ғɪɴᴅ {count} ɪᴍᴀɢᴇs.....") + + try: + await app.send_media_group( + chat_id=chat_id, + media=[InputMediaPhoto(media=img) for img in lst], + reply_to_message_id=message.id + ) + shutil.rmtree(images_dir) + await msg.delete() + except Exception as e: + await msg.delete() + return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ sᴇɴᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") \ No newline at end of file From b872abe8ad3c9e565309fbcdc6d8652cbf1d8a7a Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:35:04 +0530 Subject: [PATCH 133/184] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 22f4c4ec5802..0a9568dfb83b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +bing_image_downloader deep-translator openai aiofiles From f4e6e0db7c6c59f23416d2d4f1277297e4263847 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:41:40 +0530 Subject: [PATCH 134/184] Update image.py --- TanuMusic/plugins/tools/image.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/tools/image.py b/TanuMusic/plugins/tools/image.py index 698972bac942..3c10ad2d87d9 100644 --- a/TanuMusic/plugins/tools/image.py +++ b/TanuMusic/plugins/tools/image.py @@ -13,7 +13,7 @@ async def google_img_search(client: Client, message: Message): try: query = message.text.split(None, 1)[1] except IndexError: - return await message.reply("❍ ᴘʀᴏᴠɪᴅᴇ ᴀɴ ɪᴍᴀɢᴇ ǫᴜɪᴇʀʏ ᴛᴏ sᴇᴀʀᴄʜ!") + return await message.reply("❍ ᴘʀᴏᴠɪᴅᴇ ᴀɴ ɪᴍᴀɢᴇ ǫᴜɪɴ ᴛᴏ sᴇᴀʀᴄʜ!") lim = findall(r"lim=\d+", query) try: @@ -25,11 +25,17 @@ async def google_img_search(client: Client, message: Message): download_dir = "downloads" try: + # Download images downloader.download(query, limit=lim, output_dir=download_dir, adult_filter_off=True, force_replace=False, timeout=60) images_dir = os.path.join(download_dir, query) + + # Ensure there are images to send if not os.listdir(images_dir): raise Exception("No images were downloaded.") - lst = [os.path.join(images_dir, img) for img in os.listdir(images_dir)][:lim] # Ensure we only take the number of images specified by lim + + # Get only the number of images as specified by lim + lst = [os.path.join(images_dir, img) for img in os.listdir(images_dir)][:lim] + except Exception as e: return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") @@ -41,13 +47,18 @@ async def google_img_search(client: Client, message: Message): await msg.edit(f"❍ ғɪɴᴅ {count} ɪᴍᴀɢᴇs.....") try: + # Send images as a media group await app.send_media_group( chat_id=chat_id, media=[InputMediaPhoto(media=img) for img in lst], reply_to_message_id=message.id ) + + # Cleanup the downloaded images after sending shutil.rmtree(images_dir) await msg.delete() + except Exception as e: + # Handle any errors while sending images await msg.delete() return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ sᴇɴᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") \ No newline at end of file From ab5ce5dd6aa4b4dde19e84b393d6b70eb0d679e6 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:59:36 +0530 Subject: [PATCH 135/184] Update filemanager.py --- TanuMusic/plugins/sudo/filemanager.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/TanuMusic/plugins/sudo/filemanager.py b/TanuMusic/plugins/sudo/filemanager.py index 74f050905a61..b9157e4baac5 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/TanuMusic/plugins/sudo/filemanager.py @@ -1,6 +1,7 @@ import io import os import time +import shutil from inspect import signature from os.path import exists, isdir @@ -151,11 +152,21 @@ async def lst(_, message): @capture_err async def rm_file(_, message): if len(message.command) < 2: - return await eor(message, text="Please provide a file name to delete.") + return await eor(message, text="Please provide a file name or directory to delete.") file = message.text.split(" ", 1)[1] if exists(file): - os.remove(file) - await eor(message, text=f"{file} has been deleted.") + if isdir(file): + try: + shutil.rmtree(file) # Removes a directory and its contents + await eor(message, text=f"Directory `{file}` has been deleted.") + except Exception as e: + await eor(message, text=f"Failed to delete directory `{file}`: {str(e)}") + else: + try: + os.remove(file) # Removes a file + await eor(message, text=f"File `{file}` has been deleted.") + except Exception as e: + await eor(message, text=f"Failed to delete file `{file}`: {str(e)}") else: await eor(message, text=f"{file} doesn't exist!") \ No newline at end of file From 08a580b9822f86fadbe40002715cdf644fca6673 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 16:02:57 +0530 Subject: [PATCH 136/184] Update image.py --- TanuMusic/plugins/tools/image.py | 93 ++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/TanuMusic/plugins/tools/image.py b/TanuMusic/plugins/tools/image.py index 3c10ad2d87d9..f39af5d753de 100644 --- a/TanuMusic/plugins/tools/image.py +++ b/TanuMusic/plugins/tools/image.py @@ -1,10 +1,53 @@ import os -import shutil -from re import findall -from bing_image_downloader import downloader +import requests +from bs4 import BeautifulSoup from pyrogram import Client, filters from pyrogram.types import InputMediaPhoto, Message -from TanuMusic import app +from TanuMusic import app +# Your Telegram bot + +# Function to fetch images from Google Images +def fetch_google_images(query, num_images=7): + query = '+'.join(query.split()) + url = f"https://www.google.com/search?hl=en&tbm=isch&q={query}" + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' + } + response = requests.get(url, headers=headers) + + if response.status_code == 200: + soup = BeautifulSoup(response.text, 'html.parser') + image_urls = [] + + for img_tag in soup.find_all('img', {'src': True}): + img_url = img_tag['src'] + if img_url.startswith('http'): + image_urls.append(img_url) + + if len(image_urls) >= num_images: + break + + return image_urls + else: + return [] + +# Function to download images +def download_images(image_urls, folder='images'): + if not os.path.exists(folder): + os.makedirs(folder) + + paths = [] + for i, url in enumerate(image_urls): + try: + img_data = requests.get(url).content + img_path = os.path.join(folder, f'image_{i+1}.jpg') + with open(img_path, 'wb') as img_file: + img_file.write(img_data) + paths.append(img_path) + except Exception as e: + print(f"Error downloading image {i+1}: {e}") + return paths @app.on_message(filters.command("img", "image")) async def google_img_search(client: Client, message: Message): @@ -15,50 +58,32 @@ async def google_img_search(client: Client, message: Message): except IndexError: return await message.reply("❍ ᴘʀᴏᴠɪᴅᴇ ᴀɴ ɪᴍᴀɢᴇ ǫᴜɪɴ ᴛᴏ sᴇᴀʀᴄʜ!") - lim = findall(r"lim=\d+", query) - try: - lim = int(lim[0].replace("lim=", "")) - query = query.replace(f"lim={lim}", "") - except IndexError: - lim = 6 # Default limit to 6 images + lim = 7 # Default limit to 7 images + image_urls = fetch_google_images(query, num_images=lim) - download_dir = "downloads" - - try: - # Download images - downloader.download(query, limit=lim, output_dir=download_dir, adult_filter_off=True, force_replace=False, timeout=60) - images_dir = os.path.join(download_dir, query) - - # Ensure there are images to send - if not os.listdir(images_dir): - raise Exception("No images were downloaded.") - - # Get only the number of images as specified by lim - lst = [os.path.join(images_dir, img) for img in os.listdir(images_dir)][:lim] - - except Exception as e: - return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") + if not image_urls: + return await message.reply("❍ ɴᴏ ɪᴍᴀɢᴇs ғᴏᴜɴᴅ!") msg = await message.reply("❍ ғɪɴᴅɪɴɢ ɪᴍᴀɢᴇs.....") - count = 0 - for img in lst: - count += 1 - await msg.edit(f"❍ ғɪɴᴅ {count} ɪᴍᴀɢᴇs.....") + # Download images + downloaded_images = download_images(image_urls, folder="downloads") try: # Send images as a media group await app.send_media_group( chat_id=chat_id, - media=[InputMediaPhoto(media=img) for img in lst], + media=[InputMediaPhoto(media=img) for img in downloaded_images], reply_to_message_id=message.id ) # Cleanup the downloaded images after sending - shutil.rmtree(images_dir) + for img in downloaded_images: + os.remove(img) + await msg.delete() except Exception as e: - # Handle any errors while sending images + # Handle errors while sending images await msg.delete() - return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ sᴇɴᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") \ No newline at end of file + return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ sᴇɴᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") From 19a83ebc2caed0851534d2bde60fe20fb7016249 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 16:03:11 +0530 Subject: [PATCH 137/184] Update requirements.txt --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0a9568dfb83b..22f4c4ec5802 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -bing_image_downloader deep-translator openai aiofiles From 77e7edd22e9a4c414522511cf5f3561aa5f97484 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 16:19:12 +0530 Subject: [PATCH 138/184] Update image.py --- TanuMusic/plugins/tools/image.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/TanuMusic/plugins/tools/image.py b/TanuMusic/plugins/tools/image.py index f39af5d753de..996cb24b85e0 100644 --- a/TanuMusic/plugins/tools/image.py +++ b/TanuMusic/plugins/tools/image.py @@ -3,8 +3,7 @@ from bs4 import BeautifulSoup from pyrogram import Client, filters from pyrogram.types import InputMediaPhoto, Message -from TanuMusic import app -# Your Telegram bot +from TanuMusic import app # Function to fetch images from Google Images def fetch_google_images(query, num_images=7): @@ -14,9 +13,11 @@ def fetch_google_images(query, num_images=7): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } - response = requests.get(url, headers=headers) - if response.status_code == 200: + try: + response = requests.get(url, headers=headers) + response.raise_for_status() # Will raise an HTTPError for bad responses (4xx or 5xx) + soup = BeautifulSoup(response.text, 'html.parser') image_urls = [] @@ -29,11 +30,12 @@ def fetch_google_images(query, num_images=7): break return image_urls - else: + except requests.exceptions.RequestException as e: + print(f"Error fetching images: {e}") return [] # Function to download images -def download_images(image_urls, folder='images'): +def download_images(image_urls, folder='downloads'): if not os.path.exists(folder): os.makedirs(folder) @@ -69,6 +71,9 @@ async def google_img_search(client: Client, message: Message): # Download images downloaded_images = download_images(image_urls, folder="downloads") + if not downloaded_images: + return await message.reply("❍ ɪɴsᴜғғɪᴄɪᴇɴᴛ ɪᴍᴀɢᴇs ᴛᴏ sᴇɴᴅ.") + try: # Send images as a media group await app.send_media_group( @@ -87,3 +92,6 @@ async def google_img_search(client: Client, message: Message): # Handle errors while sending images await msg.delete() return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ sᴇɴᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") + +if __name__ == "__main__": + app.run() \ No newline at end of file From 91dc2037af494c1b9bde90d16e8c33e28efeaa79 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 16:20:00 +0530 Subject: [PATCH 139/184] Update image.py --- TanuMusic/plugins/tools/image.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/TanuMusic/plugins/tools/image.py b/TanuMusic/plugins/tools/image.py index 996cb24b85e0..a4c851ae634a 100644 --- a/TanuMusic/plugins/tools/image.py +++ b/TanuMusic/plugins/tools/image.py @@ -93,5 +93,3 @@ async def google_img_search(client: Client, message: Message): await msg.delete() return await message.reply(f"❍ ᴇʀʀᴏʀ ɪɴ sᴇɴᴅɪɴɢ ɪᴍᴀɢᴇs: {e}") -if __name__ == "__main__": - app.run() \ No newline at end of file From fd391419744d0d8527873ba12e9663ee02ac5b2a Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sun, 15 Dec 2024 18:23:38 +0530 Subject: [PATCH 140/184] Update active.py --- TanuMusic/plugins/sudo/active.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/sudo/active.py b/TanuMusic/plugins/sudo/active.py index e590cd81681e..8098e115030b 100644 --- a/TanuMusic/plugins/sudo/active.py +++ b/TanuMusic/plugins/sudo/active.py @@ -113,7 +113,7 @@ async def start(client: Client, message: Message): ac_audio = str(len(await get_active_chats())) ac_video = str(len(await get_active_video_chats())) await message.reply_text( - f"❖ ᴀᴄᴛɪᴠᴇ ᴄʜᴀᴛs ɪɴғᴏ :\n\nᴠᴏɪᴄᴇ : {ac_audio}\nᴠɪᴅᴇᴏ : {ac_video}", + f"❖ ᴀᴄᴛɪᴠᴇ ᴄʜᴀᴛs ɪɴғᴏ :\n\nᴠᴏɪᴄᴇ : {ac_audio}\nᴠɪᴅᴇᴏ : {ac_video}", reply_markup=InlineKeyboardMarkup( [[InlineKeyboardButton("ᴄʟᴏsᴇ", callback_data="close")]] ), From 3ae0a1a222514c04b0e872c3a44cedc9fd915b4c Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 16:47:33 +0530 Subject: [PATCH 141/184] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 22f4c4ec5802..0891e4b0d266 100644 --- a/requirements.txt +++ b/requirements.txt @@ -51,7 +51,7 @@ apscheduler gtts py-tgcalls==0.9.7 lexica-api==1.5.7 -git+https://github.com/KurimuzonAkuma/pyrogram@dev + git+https://github.com/yt-dlp/yt-dlp git+https://github.com/alexmercerind/youtube-search-python@main git+https://github.com/joetats/youtube_search@master From f76bdecbb4716826cb20a5118a7b2029daab067b Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 16:58:18 +0530 Subject: [PATCH 142/184] Update requirements.txt --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0891e4b0d266..2161c5ffcb4e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,6 @@ pyshorteners gunicorn==22.0.0 youtube-search youtube-search-python -pornhub-api==0.3.0 async_pymongo gpytranslate search_engine_parser @@ -50,7 +49,7 @@ pydub apscheduler gtts py-tgcalls==0.9.7 -lexica-api==1.5.7 + git+https://github.com/yt-dlp/yt-dlp git+https://github.com/alexmercerind/youtube-search-python@main From b9a7c878ae94448738c4959e5f2f670f5b739b2a Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:04:32 +0530 Subject: [PATCH 143/184] Update requirements.txt --- requirements.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2161c5ffcb4e..4e665b948cf9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,19 +9,14 @@ ffmpeg-python gitpython hachoir heroku3 -#httpx[http2] -httpx==0.27.2 lyricsgenius motor wget pycountry -pillow==11.0.0 -pymongo==4.9.1 psutil pytube pykeyboard unidecode -#ntgcalls==1.1.2 python-dotenv pyyaml requests @@ -31,7 +26,6 @@ tgcrypto urllib3 flask pyshorteners -gunicorn==22.0.0 youtube-search youtube-search-python async_pymongo @@ -48,10 +42,15 @@ pytz pydub apscheduler gtts + +httpx==0.27.2 +gunicorn==22.0.0 +pillow==11.0.0 +pymongo==4.9.1 py-tgcalls==0.9.7 +lexica-api==1.5.7 git+https://github.com/yt-dlp/yt-dlp git+https://github.com/alexmercerind/youtube-search-python@main -git+https://github.com/joetats/youtube_search@master - +git+https://github.com/joetats/youtube_search@master \ No newline at end of file From 3955d00f81c59afb6462bf3fec5dc0b9be1df540 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:01:10 +0530 Subject: [PATCH 144/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index 3ea82610ad99..c8d381cfeba7 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -11,7 +11,7 @@ async def privacy(client, message: Message): keyboard = InlineKeyboardMarkup( [[InlineKeyboardButton("ᴠɪᴇᴡ ᴘʀɪᴠᴀᴄʏ ᴘᴏʟɪᴄʏ", url=config.PRIVACY_LINK)]] ) - TEXT = f""" + TEXT = f"""> 🔒 **Privacy Policy for {client.me.mention} !** Your privacy is important to us. To learn more about how we collect, use, and protect your data, please review our Privacy Policy here: [Privacy Policy]({config.PRIVACY_LINK}). From 64368274b518667ea85d8afb75ae3256daa28221 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:47:24 +0530 Subject: [PATCH 145/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index c8d381cfeba7..641858850781 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -11,8 +11,8 @@ async def privacy(client, message: Message): keyboard = InlineKeyboardMarkup( [[InlineKeyboardButton("ᴠɪᴇᴡ ᴘʀɪᴠᴀᴄʏ ᴘᴏʟɪᴄʏ", url=config.PRIVACY_LINK)]] ) - TEXT = f"""> -🔒 **Privacy Policy for {client.me.mention} !** + TEXT = f"""
+🔒 **Privacy Policy for {client.me.mention} !
** Your privacy is important to us. To learn more about how we collect, use, and protect your data, please review our Privacy Policy here: [Privacy Policy]({config.PRIVACY_LINK}). From 841cb9c765dbbf1ddfe915dfaa5697249114731e Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:49:26 +0530 Subject: [PATCH 146/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index 641858850781..12f8e64a21d5 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -12,7 +12,7 @@ async def privacy(client, message: Message): [[InlineKeyboardButton("ᴠɪᴇᴡ ᴘʀɪᴠᴀᴄʏ ᴘᴏʟɪᴄʏ", url=config.PRIVACY_LINK)]] ) TEXT = f"""
-🔒 **Privacy Policy for {client.me.mention} !
** +🔒 Privacy Policy for {client.me.mention} !
Your privacy is important to us. To learn more about how we collect, use, and protect your data, please review our Privacy Policy here: [Privacy Policy]({config.PRIVACY_LINK}). From a559793c8a2c86f7a4e49d6305cec9b53fafb92a Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:59:23 +0530 Subject: [PATCH 147/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index 12f8e64a21d5..eb4dcd2af525 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -12,7 +12,7 @@ async def privacy(client, message: Message): [[InlineKeyboardButton("ᴠɪᴇᴡ ᴘʀɪᴠᴀᴄʏ ᴘᴏʟɪᴄʏ", url=config.PRIVACY_LINK)]] ) TEXT = f"""
-🔒 Privacy Policy for {client.me.mention} !
+🔒 Privacy Policy for {client.me.mention} !
Your privacy is important to us. To learn more about how we collect, use, and protect your data, please review our Privacy Policy here: [Privacy Policy]({config.PRIVACY_LINK}). From 50d1782ddd49a4ac133bf400dc2abf09754c5004 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Tue, 17 Dec 2024 21:18:02 +0530 Subject: [PATCH 148/184] Update privacy.py --- TanuMusic/plugins/bot/privacy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TanuMusic/plugins/bot/privacy.py b/TanuMusic/plugins/bot/privacy.py index eb4dcd2af525..8c0cad12c542 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/TanuMusic/plugins/bot/privacy.py @@ -11,8 +11,8 @@ async def privacy(client, message: Message): keyboard = InlineKeyboardMarkup( [[InlineKeyboardButton("ᴠɪᴇᴡ ᴘʀɪᴠᴀᴄʏ ᴘᴏʟɪᴄʏ", url=config.PRIVACY_LINK)]] ) - TEXT = f"""
-🔒 Privacy Policy for {client.me.mention} !
+ TEXT = f"""** +🔒 Privacy Policy for {client.me.mention}.** Your privacy is important to us. To learn more about how we collect, use, and protect your data, please review our Privacy Policy here: [Privacy Policy]({config.PRIVACY_LINK}). From a4ac9f9f937079598ba39e53e28c5e0c804417cc Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 20:07:23 +0530 Subject: [PATCH 149/184] Update tools --- TanuMusic/plugins/tools/language.py | 74 +++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 TanuMusic/plugins/tools/language.py diff --git a/TanuMusic/plugins/tools/language.py b/TanuMusic/plugins/tools/language.py new file mode 100644 index 000000000000..b7742b75a298 --- /dev/null +++ b/TanuMusic/plugins/tools/language.py @@ -0,0 +1,74 @@ +from pykeyboard import InlineKeyboard +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, Message + +from TanuMusic import app +from TanuMusic.utils.database import get_lang, set_lang +from TanuMusic.utils.decorators import ActualAdminCB, language, languageCB +from config import BANNED_USERS +from strings import get_string, languages_present + + +def lanuages_keyboard(_): + keyboard = InlineKeyboard(row_width=2) + keyboard.add( + *[ + ( + InlineKeyboardButton( + text=languages_present[i], + callback_data=f"languages:{i}", + ) + ) + for i in languages_present + ] + ) + keyboard.row( + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data=f"settingsback_helper", + ), + InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data=f"close"), + ) + return keyboard + + +@app.on_message(filters.command(["lang", "setlang", "language"]) & ~BANNED_USERS) +@language +async def langs_command(client, message: Message, _): + keyboard = lanuages_keyboard(_) + await message.reply_text( + _["lang_1"], + reply_markup=keyboard, + ) + + +@app.on_callback_query(filters.regex("LG") & ~BANNED_USERS) +@languageCB +async def lanuagecb(client, CallbackQuery, _): + try: + await CallbackQuery.answer() + except: + pass + keyboard = lanuages_keyboard(_) + return await CallbackQuery.edit_message_reply_markup(reply_markup=keyboard) + + +@app.on_callback_query(filters.regex(r"languages:(.*?)") & ~BANNED_USERS) +@ActualAdminCB +async def language_markup(client, CallbackQuery, _): + langauge = (CallbackQuery.data).split(":")[1] + old = await get_lang(CallbackQuery.message.chat.id) + if str(old) == str(langauge): + return await CallbackQuery.answer(_["lang_4"], show_alert=True) + try: + _ = get_string(langauge) + await CallbackQuery.answer(_["lang_2"], show_alert=True) + except: + _ = get_string(old) + return await CallbackQuery.answer( + _["lang_3"], + show_alert=True, + ) + await set_lang(CallbackQuery.message.chat.id, langauge) + keyboard = lanuages_keyboard(_) + return await CallbackQuery.edit_message_reply_markup(reply_markup=keyboard) \ No newline at end of file From 4e037c927e398e8986d7b6b67ea97f884fba6fce Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 20:51:02 +0530 Subject: [PATCH 150/184] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 4e665b948cf9..28260d855437 100644 --- a/requirements.txt +++ b/requirements.txt @@ -42,6 +42,7 @@ pytz pydub apscheduler gtts +bson httpx==0.27.2 gunicorn==22.0.0 From 27cc0e21b8c58ce44a056a560e17bbe0ef209e7b Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:03:37 +0530 Subject: [PATCH 151/184] Update database.py --- TanuMusic/utils/database.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index 36cb80eb09e7..21c5f7be8a1c 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -1,5 +1,9 @@ -import random -from typing import Dict, List, Union +import random +import json +from typing import Dict, List, Union +from datetime import datetime +from bson import ObjectId + from TanuMusic import userbot from TanuMusic.core.mongo import mongodb From bdb2e3d6a209774c3a39025a80ed7f3e0e0df4ad Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:05:07 +0530 Subject: [PATCH 152/184] Update database.py --- TanuMusic/utils/database.py | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index 21c5f7be8a1c..081b27b84633 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -44,6 +44,66 @@ playtype = {} skipmode = {} +def json_serializer(obj): + if isinstance(obj, (datetime,)): + return obj.isoformat() + if isinstance(obj, ObjectId): + return str(obj) + raise TypeError("Type not serializable") + + +def delete_collection(client, db_name, col_name): + db = client[db_name] + db.drop_collection(col_name) + + +def delete_database(client, db_name): + client.drop_database(db_name) + + +def list_databases(client): + numbered_list = [] + counter = 1 + for db_name in client.list_database_names(): + if db_name not in ["admin", "local"]: + numbered_list.append((counter, db_name, None)) + counter += 1 + db = client[db_name] + for col_name in db.list_collection_names(): + numbered_list.append((counter, db_name, col_name)) + counter += 1 + return numbered_list + + +def delete_all_databases(client): + for db_name in client.list_database_names(): + if db_name not in ["admin", "local"]: + db = client[db_name] + for col_name in db.list_collection_names(): + db.drop_collection(col_name) + client.drop_database(db_name) + + +def backup_database(old_client): + backup_data = {} + for db_name in old_client.list_database_names(): + db = old_client[db_name] + backup_data[db_name] = {} + for col_name in db.list_collection_names(): + collection = db[col_name] + backup_data[db_name][col_name] = list(collection.find()) + return backup_data + + +def restore_data(new_client, backup_data): + for db_name, collections in backup_data.items(): + db = new_client[db_name] + for col_name, documents in collections.items(): + collection = db[col_name] + if documents: + collection.insert_many(documents) + + async def get_active_video_chats() -> list: return activevideo From 2ac0074709efaa926d7ecfcc81ff1c9da889a450 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:05:51 +0530 Subject: [PATCH 153/184] Update tools --- TanuMusic/plugins/tools/mongo.py | 101 +++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 TanuMusic/plugins/tools/mongo.py diff --git a/TanuMusic/plugins/tools/mongo.py b/TanuMusic/plugins/tools/mongo.py new file mode 100644 index 000000000000..bea68c1f51f9 --- /dev/null +++ b/TanuMusic/plugins/tools/mongo.py @@ -0,0 +1,101 @@ +import re +import json +import io +from pyrogram import filters +from pyrogram.types import Message +from TanuMusic import app +from config import OWNER_ID, MONGO_DB_URI +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.pastebin import Bin +from TanuMusic.utils.database import ( + delete_collection, + delete_database, + list_databases, + delete_all_databases, + backup_database, + restore_data, +) + + +# Helper Function for Mongo URL +def get_mongo_url(message): + if len(message.command) > 1: + return message.command[1] + return MONGO_DB_URI + + +# Commands +@app.on_message(filters.command(["mongochk"])) +async def mongo_check_command(client, message: Message): + if len(message.command) < 2: + await message.reply("Please provide your MongoDB URL with the command: `/mongochk your_mongo_url`") + return + ok = await message.reply_text("**Please wait, I am checking your MongoDB...**") + mongo_url = message.command[1] + + try: + with MongoClient(mongo_url, serverSelectionTimeoutMS=5000) as mongo_client: + databases = mongo_client.list_database_names() + result = f"**MongoDB URL** `{mongo_url}` **is valid**.\n\n**Available Databases:**\n" + for db_name in databases: + if db_name not in ["admin", "local"]: + result += f"\n`{db_name}`:\n" + db = mongo_client[db_name] + for col_name in db.list_collection_names(): + result += f" `{col_name}` ({db[col_name].count_documents({})} documents)\n" + + if len(result) > 4096: + paste_url = await Bin(result) + await ok.delete() + await message.reply(f"**The database list is too long to send here. You can view it at:** {paste_url}") + else: + await ok.delete() + await message.reply(result) + + except Exception as e: + await ok.delete() + await message.reply(f"**Failed to connect to MongoDB**\n\n**Your MongoDB is dead ❌**\n\n**Error:** `{e}`") + + +@app.on_message(filters.command(["deletedb", "deldb"]) & filters.user(OWNER_ID)) +async def delete_db_command(client, message: Message): + if len(message.command) < 2: + await message.reply("Please provide the database or collection to delete.") + return + + try: + mongo_url = get_mongo_url(message) + with MongoClient(mongo_url, serverSelectionTimeoutMS=5000) as mongo_client: + databases_and_collections = list_databases(mongo_client) + + if message.command[1].lower() == "all": + delete_all_databases(mongo_client) + await message.reply("**All databases and collections have been deleted successfully. 🧹**") + else: + await message.reply("Invalid command format.") + except Exception as e: + await message.reply(f"**Failed to delete databases:** {e}") + + +@app.on_message(filters.command(["transferdb"]) & filters.user(OWNER_ID)) +async def transfer_db_command(client, message: Message): + if len(message.command) < 3: + await message.reply("Please provide both source and target MongoDB URLs.") + return + + main_mongo_url = message.command[1] + target_mongo_url = message.command[2] + + if not re.match(r"mongodb(?:\+srv)?:\/\/[^\s]+", target_mongo_url): + await message.reply("**The target MongoDB URL format is invalid! ❌**") + return + + try: + with MongoClient(main_mongo_url, serverSelectionTimeoutMS=5000) as main_client: + backup_data = backup_database(main_client) + with MongoClient(target_mongo_url, serverSelectionTimeoutMS=5000) as target_client: + restore_data(target_client, backup_data) + + await message.reply("**Data transfer to the new MongoDB is successful! 🎉**") + except Exception as e: + await message.reply(f"**Data transfer failed:** {e}") \ No newline at end of file From a279f455d969ef87a1a2f4f8e7a6febb7144a98f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:16:23 +0530 Subject: [PATCH 154/184] Update database.py --- TanuMusic/utils/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index 081b27b84633..69041fd1bc30 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -3,7 +3,7 @@ from typing import Dict, List, Union from datetime import datetime from bson import ObjectId - +from bson import SON from TanuMusic import userbot from TanuMusic.core.mongo import mongodb From 2961c6d86c50b5010e621e9f404dcb1f1735f099 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:16:41 +0530 Subject: [PATCH 155/184] Update database.py --- TanuMusic/utils/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index 69041fd1bc30..4eccaeb972d6 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -3,7 +3,7 @@ from typing import Dict, List, Union from datetime import datetime from bson import ObjectId -from bson import SON +from bson.son import SON from TanuMusic import userbot from TanuMusic.core.mongo import mongodb From 808d81f6be27a0c19fd36855f24613a06d0dae33 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:35:00 +0530 Subject: [PATCH 156/184] Update mongo.py --- TanuMusic/core/mongo.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/TanuMusic/core/mongo.py b/TanuMusic/core/mongo.py index 3896fd5c6bca..121a4bb3ab89 100644 --- a/TanuMusic/core/mongo.py +++ b/TanuMusic/core/mongo.py @@ -4,17 +4,17 @@ import config from ..logging import LOGGER -# Public MongoDB URL (consider keeping credentials secure in real applications) +# Public MongoDB URL (ensure credentials are secure in production) TEMP_MONGODB = "mongodb+srv://kuldiprathod2003:kuldiprathod2003@cluster0.wxqpikp.mongodb.net/?retryWrites=true&w=majority" try: # Check if a custom MongoDB URI is provided in the config if config.MONGO_DB_URI is None: LOGGER(__name__).warning( - "❖ No mongodb found, defaulting to public MongoDB...💚" + "❖ No MongoDB URI provided. Using temporary public MongoDB...💚" ) - # Initialize a temporary Pyrogram client to retrieve bot's username + # Initialize a temporary Pyrogram client to get bot's username with Client( "TannuMusic", bot_token=config.BOT_TOKEN, @@ -24,7 +24,7 @@ info = temp_client.get_me() username = info.username - # Connect to MongoDB with the bot's username as the database name + # Connect to MongoDB with bot's username as the database name _mongo_async_ = _mongo_client_(TEMP_MONGODB) _mongo_sync_ = MongoClient(TEMP_MONGODB) mongodb = _mongo_async_[username] @@ -33,17 +33,16 @@ LOGGER(__name__).info(f"❖ Connected to public MongoDB with username: {username}...💛") else: - LOGGER(__name__).info("❖ Connecting to your custom Mongo Database...💛") + LOGGER(__name__).info("❖ Connecting to your custom MongoDB...💛") # Use custom MongoDB URI from config _mongo_async_ = _mongo_client_(config.MONGO_DB_URI) _mongo_sync_ = MongoClient(config.MONGO_DB_URI) - mongodb = _mongo_async_.Tannu - pymongodb = _mongo_sync_.Tannu + mongodb = _mongo_async_["Tannu"] + pymongodb = _mongo_sync_["Tannu"] - LOGGER(__name__).info("❖ Connected to your Mongo Database...❤️") + LOGGER(__name__).info("❖ Successfully connected to your MongoDB...❤️") except Exception as e: - # Log any exceptions that occur during connection - LOGGER(__name__).error(f"❖ Failed to connect to your Mongo Database: {str(e)}...💚") + LOGGER(__name__).error(f"❖ Failed to connect to MongoDB: {str(e)}...💚") exit() \ No newline at end of file From 520f8cce71403ca4774e8678f87806f5461c81c5 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:38:10 +0530 Subject: [PATCH 157/184] Update database.py --- TanuMusic/utils/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index 4eccaeb972d6..cf4cbac348f4 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -2,7 +2,7 @@ import json from typing import Dict, List, Union from datetime import datetime -from bson import ObjectId +#from bson import ObjectId from bson.son import SON from TanuMusic import userbot From 59215f50d89f33ef633ab658fea41a094ca74746 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:44:24 +0530 Subject: [PATCH 158/184] Update requirements.txt --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 28260d855437..dc3439d4b183 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,10 +47,10 @@ bson httpx==0.27.2 gunicorn==22.0.0 pillow==11.0.0 -pymongo==4.9.1 +#pymongo==4.9.1 py-tgcalls==0.9.7 lexica-api==1.5.7 - +pymongo==3.12.0 git+https://github.com/yt-dlp/yt-dlp git+https://github.com/alexmercerind/youtube-search-python@main From 5788409fef2be683fcb2af619d4458bf49d09165 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:50:18 +0530 Subject: [PATCH 159/184] Update requirements.txt --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index dc3439d4b183..03c452b0ceda 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,10 +47,10 @@ bson httpx==0.27.2 gunicorn==22.0.0 pillow==11.0.0 -#pymongo==4.9.1 +pymongo==4.9.1 py-tgcalls==0.9.7 lexica-api==1.5.7 -pymongo==3.12.0 +#pymongo==3.12.0 git+https://github.com/yt-dlp/yt-dlp git+https://github.com/alexmercerind/youtube-search-python@main From 0cf48e8c89abb058057044a980191e64e38f35eb Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:52:39 +0530 Subject: [PATCH 160/184] Rename mongo.py to mongo.py# --- TanuMusic/plugins/tools/{mongo.py => mongo.py#} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename TanuMusic/plugins/tools/{mongo.py => mongo.py#} (98%) diff --git a/TanuMusic/plugins/tools/mongo.py b/TanuMusic/plugins/tools/mongo.py# similarity index 98% rename from TanuMusic/plugins/tools/mongo.py rename to TanuMusic/plugins/tools/mongo.py# index bea68c1f51f9..ec476d188409 100644 --- a/TanuMusic/plugins/tools/mongo.py +++ b/TanuMusic/plugins/tools/mongo.py# @@ -98,4 +98,4 @@ async def transfer_db_command(client, message: Message): await message.reply("**Data transfer to the new MongoDB is successful! 🎉**") except Exception as e: - await message.reply(f"**Data transfer failed:** {e}") \ No newline at end of file + await message.reply(f"**Data transfer failed:** {e}") From bfe0b33a97942327ce5e52031655ff0c22fdcc9a Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:54:35 +0530 Subject: [PATCH 161/184] Update database.py --- TanuMusic/utils/database.py | 64 ------------------------------------- 1 file changed, 64 deletions(-) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index cf4cbac348f4..4e05c295dd70 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -1,9 +1,4 @@ import random -import json -from typing import Dict, List, Union -from datetime import datetime -#from bson import ObjectId -from bson.son import SON from TanuMusic import userbot from TanuMusic.core.mongo import mongodb @@ -44,65 +39,6 @@ playtype = {} skipmode = {} -def json_serializer(obj): - if isinstance(obj, (datetime,)): - return obj.isoformat() - if isinstance(obj, ObjectId): - return str(obj) - raise TypeError("Type not serializable") - - -def delete_collection(client, db_name, col_name): - db = client[db_name] - db.drop_collection(col_name) - - -def delete_database(client, db_name): - client.drop_database(db_name) - - -def list_databases(client): - numbered_list = [] - counter = 1 - for db_name in client.list_database_names(): - if db_name not in ["admin", "local"]: - numbered_list.append((counter, db_name, None)) - counter += 1 - db = client[db_name] - for col_name in db.list_collection_names(): - numbered_list.append((counter, db_name, col_name)) - counter += 1 - return numbered_list - - -def delete_all_databases(client): - for db_name in client.list_database_names(): - if db_name not in ["admin", "local"]: - db = client[db_name] - for col_name in db.list_collection_names(): - db.drop_collection(col_name) - client.drop_database(db_name) - - -def backup_database(old_client): - backup_data = {} - for db_name in old_client.list_database_names(): - db = old_client[db_name] - backup_data[db_name] = {} - for col_name in db.list_collection_names(): - collection = db[col_name] - backup_data[db_name][col_name] = list(collection.find()) - return backup_data - - -def restore_data(new_client, backup_data): - for db_name, collections in backup_data.items(): - db = new_client[db_name] - for col_name, documents in collections.items(): - collection = db[col_name] - if documents: - collection.insert_many(documents) - async def get_active_video_chats() -> list: return activevideo From 092f6ff852c1814399f9f1d2ea52f4c4e40927bd Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:58:34 +0530 Subject: [PATCH 162/184] Update requirements.txt --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 03c452b0ceda..dba91a4e2977 100644 --- a/requirements.txt +++ b/requirements.txt @@ -42,7 +42,6 @@ pytz pydub apscheduler gtts -bson httpx==0.27.2 gunicorn==22.0.0 From 381cc784ac770d232569551dd6875313ac623dbe Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 22:03:35 +0530 Subject: [PATCH 163/184] Update database.py --- TanuMusic/utils/database.py | 1 + 1 file changed, 1 insertion(+) diff --git a/TanuMusic/utils/database.py b/TanuMusic/utils/database.py index 4e05c295dd70..ed1808be1956 100644 --- a/TanuMusic/utils/database.py +++ b/TanuMusic/utils/database.py @@ -1,4 +1,5 @@ import random +from typing import Dict, List, Union from TanuMusic import userbot from TanuMusic.core.mongo import mongodb From 58c12e7839e718c2cf9c533795f0722774922c13 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Wed, 18 Dec 2024 23:32:10 +0530 Subject: [PATCH 164/184] Update mongo.py# --- TanuMusic/plugins/tools/mongo.py# | 73 ++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/TanuMusic/plugins/tools/mongo.py# b/TanuMusic/plugins/tools/mongo.py# index ec476d188409..3a25631a918a 100644 --- a/TanuMusic/plugins/tools/mongo.py# +++ b/TanuMusic/plugins/tools/mongo.py# @@ -1,3 +1,74 @@ +import json +from datetime import datetime +from bson import ObjectId +from pymongo import MongoClient + + +# Helper Functions +def json_serializer(obj): + if isinstance(obj, (datetime,)): + return obj.isoformat() + if isinstance(obj, ObjectId): + return str(obj) + raise TypeError("Type not serializable") + + +def delete_collection(client, db_name, col_name): + db = client[db_name] + db.drop_collection(col_name) + + +def delete_database(client, db_name): + client.drop_database(db_name) + + +def list_databases(client): + numbered_list = [] + counter = 1 + for db_name in client.list_database_names(): + if db_name not in ["admin", "local"]: + numbered_list.append((counter, db_name, None)) + counter += 1 + db = client[db_name] + for col_name in db.list_collection_names(): + numbered_list.append((counter, db_name, col_name)) + counter += 1 + return numbered_list + + +def delete_all_databases(client): + for db_name in client.list_database_names(): + if db_name not in ["admin", "local"]: + db = client[db_name] + for col_name in db.list_collection_names(): + db.drop_collection(col_name) + client.drop_database(db_name) + + +def backup_database(old_client): + backup_data = {} + for db_name in old_client.list_database_names(): + db = old_client[db_name] + backup_data[db_name] = {} + for col_name in db.list_collection_names(): + collection = db[col_name] + backup_data[db_name][col_name] = list(collection.find()) + return backup_data + + +def restore_data(new_client, backup_data): + for db_name, collections in backup_data.items(): + db = new_client[db_name] + for col_name, documents in collections.items(): + collection = db[col_name] + if documents: + collection.insert_many(documents) + + + + + + import re import json import io @@ -98,4 +169,4 @@ async def transfer_db_command(client, message: Message): await message.reply("**Data transfer to the new MongoDB is successful! 🎉**") except Exception as e: - await message.reply(f"**Data transfer failed:** {e}") + await message.reply(f"**Data transfer failed:** {e}") \ No newline at end of file From e82dd92625680635c83c9d80215ad6ea07bd44b2 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:43:19 +0530 Subject: [PATCH 165/184] Update cookies.txt --- cookies/cookies.txt | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 59c5969e80fa..802a6554e894 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -2,19 +2,19 @@ # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1768738797 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=20000 -.youtube.com TRUE / FALSE 1767026622 SID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJpSkIFzIqJghQ8MoIfzNaWAACgYKAb0SARYSFQHGX2MixKJJU8PxfP7s2Im2q1FxNhoVAUF8yKreeYquPFKxMF3JHNIjSzDW0076 -.youtube.com TRUE / TRUE 1767026622 __Secure-1PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJqbXZkv88VxHeFyrax1RG2AACgYKATMSARYSFQHGX2MilQh1Js3v3ONy6LFQa9AnIBoVAUF8yKq-OSARtfCvrzJnPogXD8Ss0076 -.youtube.com TRUE / TRUE 1767026622 __Secure-3PSID g.a000qgg1469JdDXOMPqqQvtnGx-4C7K4u84akUEcr4oh8qEmypgJDGrYcjzvpb2pC5YWXa61RgACgYKAZYSARYSFQHGX2Miks0VyDEqEhFUL5liR7ZJzhoVAUF8yKowuPGUqyqI2N9hY05wlZ9M0076 -.youtube.com TRUE / FALSE 1767026622 HSID APbJbQUNG0V4lwk-R -.youtube.com TRUE / TRUE 1767026622 SSID AxN9BRCWy4p43wxSQ -.youtube.com TRUE / FALSE 1767026622 APISID EWUXhVT466K1TbU9/AdoaJWu2XXc5P0KeI -.youtube.com TRUE / TRUE 1767026622 SAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 -.youtube.com TRUE / TRUE 1767026622 __Secure-1PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 -.youtube.com TRUE / TRUE 1767026622 __Secure-3PAPISID 0Y9x5pSg1PiF4JW7/AVV4npLRvkRLgEDG3 .youtube.com TRUE / TRUE 1767026623 LOGIN_INFO AFmmF2swRQIgPOUyNBezY4Cv61n1G2ph1YffgNyH38N8TFd2HSY-zyQCIQDqCzUb06OGpLYUV42aMn4xvWDY2sMkVaLOnLJ0N7Uwlg:QUQ3MjNmeVk2TU81bGxDbmNkNnhOTTZveXNFZ3RSVFVQSmRHTzRmVThRU2FZcnR6bjM4QWw0VjVwWTBzRVFMYV9DdEFCaDVHenpZMml2TWZOLU9TLTh0ZEhiSlp3M3FEZXdCVE5qT29vMjBpeVJSV2lXQV9SeDYwVkJJZFR0YlU2cmNKWGt1THkwaUNPTEh5SVRDazI4Sk1zMVB2TzZRd2lB -.youtube.com TRUE / TRUE 1764002670 __Secure-1PSIDTS sidts-CjEBQT4rX1ErYEhMoFTUwKUvTxWlmIpyI9iQ1uOXX3v7dtF5D-VeT_xG_aO8a4dNgb0xEAA -.youtube.com TRUE / TRUE 1764002670 __Secure-3PSIDTS sidts-CjEBQT4rX1ErYEhMoFTUwKUvTxWlmIpyI9iQ1uOXX3v7dtF5D-VeT_xG_aO8a4dNgb0xEAA -.youtube.com TRUE / FALSE 1765714784 SIDCC AKEyXzXfJ0hs6hJrp1DNt6-lgmlyGqmuiestGKtPaD-5jHa7WNCWSlK0cntW6S7ZV5b0_a8l -.youtube.com TRUE / TRUE 1765714784 __Secure-1PSIDCC AKEyXzWzGpgbFliB8Qk8NqEtaAeYCfUlepBymmmFSKO_x8d4WuPCCqbG7S6nRrXD4F6g4NJJ -.youtube.com TRUE / TRUE 1765714784 __Secure-3PSIDCC AKEyXzXw90TxUw7_bLK2tYDzhsG2OUa3P4_5Tcr8aTvBXklyhpX2refgrPIwpg6eGfEsJk3Mag \ No newline at end of file +.youtube.com TRUE / FALSE 1769166672 SID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pJEFA56dlXbtGDkDr2FwrAwACgYKAZYSARYSFQHGX2Mi2mHCEsjrIoK2axVR7GehQRoVAUF8yKqji4eiBTGOs-OY7LeRe0EA0076 +.youtube.com TRUE / TRUE 1766142672 __Secure-1PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA +.youtube.com TRUE / TRUE 1766142672 __Secure-3PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA +.youtube.com TRUE / TRUE 1769166672 __Secure-1PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pDqHd2OI_IWNQ65bQuksY6AACgYKAaUSARYSFQHGX2Mi_Kr7FuzXAHVqUIFp60ldcRoVAUF8yKrlQGCkAq473BbQsO35u5W_0076 +.youtube.com TRUE / TRUE 1769166672 __Secure-3PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9phVIZwcVPv0_4Gjum4N5cEQACgYKAfUSARYSFQHGX2MildEXXqmnBcUyM4R5HWUqFRoVAUF8yKo30ukssU8hOuXCpwY92gFT0076 +.youtube.com TRUE / FALSE 1769166672 HSID AsXbK6LjWMoyXaBuW +.youtube.com TRUE / TRUE 1769166672 SSID Amt0P9jyicmh3ip74 +.youtube.com TRUE / FALSE 1769166672 APISID 5K1EVtpMXTPeAJfD/AVRkfa6UhWnh8qZ0H +.youtube.com TRUE / TRUE 1769166672 SAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 +.youtube.com TRUE / TRUE 1769166672 __Secure-1PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 +.youtube.com TRUE / TRUE 1769166672 __Secure-3PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 +.youtube.com TRUE / TRUE 1769166719 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 +.youtube.com TRUE / FALSE 1766142726 SIDCC AKEyXzUuIeocSmEEiYqhtTfEMJ9gCqnibOnklBeNezad1pIg2X-50giCY1Md7CP2V5_Slio5 +.youtube.com TRUE / TRUE 1766142726 __Secure-1PSIDCC AKEyXzVkkDbwoCJXAnitITrltJmzUiC9oK3fTHUMgAyayFFWZIZIp8SyJr02K98eeL4H99KM +.youtube.com TRUE / TRUE 1766142726 __Secure-3PSIDCC AKEyXzWybZwKYI92ZzC5yzbcfGcSqWjkF6rvqps9QORaO1hqeNS6oZYIUWoi1ZSJ_7EUAuulIQ \ No newline at end of file From 6f48ad392b46ee84d295d872458a6c07c1ad6f4d Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 21:56:24 +0530 Subject: [PATCH 166/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 8a7bcfa1d07d..39e584f1bbd4 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -85,7 +85,7 @@ admin_39 : "❖ ʀᴇᴍᴏᴠᴇᴅ 1 ᴜᴘᴠᴏᴛᴇ." admin_40 : "❖ ᴜᴘᴠᴏᴛᴇᴅ." start_1 : "❖ {0} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ.\n\n❖ ᴜᴘᴛɪᴍᴇ ➥ {1}" -start_2 : "❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n● ɪ ᴀᴍ {1} ʙᴏᴛ.\n\n● ᴘʏᴛʜᴏɴ ➥ 3.10.11\n● ᴘʏʀᴏɢʀᴀᴍ ➥ 2.0.106\n● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ 0.9.7\n\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴠᴄ." +start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !\n● ɪ ᴀᴍ {1} ʙᴏᴛ.
\n\n● ᴘʏᴛʜᴏɴ ➥ 3.10.11\n● ᴘʏʀᴏɢʀᴀᴍ ➥ 2.0.106\n● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ 0.9.7\n\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴠᴄ." start_3 : "❖ ʜᴇʏ {0},\n● ᴛʜɪs ɪs {1}\n\n● ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ ɪɴ {2}, {3} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." start_4 : "❖ sᴜᴘᴇʀɢʀᴏᴜᴘ ɴᴇᴇᴅᴇᴅ ❖\n\n● ᴘʟᴇᴀsᴇ ᴄᴏɴᴠᴇʀᴛ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴛᴏ sᴜᴘᴇʀɢʀᴏᴜᴘ ᴀɴᴅ ᴛʜᴇɴ ᴀᴅᴅ ᴍᴇ ᴀɢᴀɪɴ.\n\n● ʜᴏᴡ ᴛᴏ ᴍᴀᴋᴇ sᴜᴘᴇʀɢʀᴏᴜᴘ ?\n● ᴍᴀᴋᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ's ᴄʜᴀᴛ ʜɪsᴛᴏʀʏ ᴠɪsɪʙʟᴇ ᴏɴᴄᴇ." start_5 : "❖ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ ❖\n\n● ᴛʜɪs ᴄʜᴀᴛ ɪs ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴏɴ {0} ᴅᴀᴛᴀʙᴀsᴇ.\n● ʀᴇǫᴜᴇsᴛ ᴀ sᴜᴅᴏ ᴜsᴇʀ ᴛᴏ ᴜɴʙʟᴀᴄᴋʟɪsᴛ ʏᴏᴜʀ ᴄʜᴀᴛ ᴏʀ ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ." From b1261004f8139f8e57385c80c9e694600fa37420 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:08:18 +0530 Subject: [PATCH 167/184] Update en.yml --- strings/langs/en.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 39e584f1bbd4..d22f15307f5a 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -85,10 +85,15 @@ admin_39 : "❖ ʀᴇᴍᴏᴠᴇᴅ 1 ᴜᴘᴠᴏᴛᴇ." admin_40 : "❖ ᴜᴘᴠᴏᴛᴇᴅ." start_1 : "❖ {0} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ.\n\n❖ ᴜᴘᴛɪᴍᴇ ➥ {1}" -start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !\n● ɪ ᴀᴍ {1} ʙᴏᴛ.
\n\n● ᴘʏᴛʜᴏɴ ➥ 3.10.11\n● ᴘʏʀᴏɢʀᴀᴍ ➥ 2.0.106\n● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ 0.9.7\n\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴠᴄ." + +start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴠᴄ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." + start_3 : "❖ ʜᴇʏ {0},\n● ᴛʜɪs ɪs {1}\n\n● ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ ɪɴ {2}, {3} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." + start_4 : "❖ sᴜᴘᴇʀɢʀᴏᴜᴘ ɴᴇᴇᴅᴇᴅ ❖\n\n● ᴘʟᴇᴀsᴇ ᴄᴏɴᴠᴇʀᴛ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴛᴏ sᴜᴘᴇʀɢʀᴏᴜᴘ ᴀɴᴅ ᴛʜᴇɴ ᴀᴅᴅ ᴍᴇ ᴀɢᴀɪɴ.\n\n● ʜᴏᴡ ᴛᴏ ᴍᴀᴋᴇ sᴜᴘᴇʀɢʀᴏᴜᴘ ?\n● ᴍᴀᴋᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ's ᴄʜᴀᴛ ʜɪsᴛᴏʀʏ ᴠɪsɪʙʟᴇ ᴏɴᴄᴇ." + start_5 : "❖ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ ❖\n\n● ᴛʜɪs ᴄʜᴀᴛ ɪs ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴏɴ {0} ᴅᴀᴛᴀʙᴀsᴇ.\n● ʀᴇǫᴜᴇsᴛ ᴀ sᴜᴅᴏ ᴜsᴇʀ ᴛᴏ ᴜɴʙʟᴀᴄᴋʟɪsᴛ ʏᴏᴜʀ ᴄʜᴀᴛ ᴏʀ ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ." + start_6 : "❖ 🥀ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ❖\n\n● 📌ᴛɪᴛʟᴇ ➥ {0}\n\n● ⏳ᴅᴜʀᴀᴛɪᴏɴ ➥ {1} ᴍɪɴᴜᴛᴇs\n● 👀ᴠɪᴇᴡs ➥ {2}\n● ⏰ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ ➥ {3}\n● ᴄʜᴀɴɴᴇʟ ➥ {5}\n\n● sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ ➥ {6}" help_1 : "❖ ᴄʜᴏᴏsᴇ ᴛʜᴇ ᴄᴀᴛᴇɢᴏʀʏ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴩ.\n\n● ᴀsᴋ ʏᴏᴜʀ ᴅᴏᴜʙᴛs ᴀᴛ ➥ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ\n\n● ᴀʟʟ ᴄᴏᴍᴍᴀɴᴅs ᴄᴀɴ ʙᴇ ᴜsᴇᴅ ᴡɪᴛʜ ➥ /" From 8770c3ba2e86e256282fc606387e5f54fc8a54e5 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:20:21 +0530 Subject: [PATCH 168/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index d22f15307f5a..26868cbe291a 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -86,7 +86,7 @@ admin_40 : "❖ ᴜᴘᴠᴏᴛᴇᴅ." start_1 : "❖ {0} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ.\n\n❖ ᴜᴘᴛɪᴍᴇ ➥ {1}" -start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴠᴄ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." +start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." start_3 : "❖ ʜᴇʏ {0},\n● ᴛʜɪs ɪs {1}\n\n● ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ ɪɴ {2}, {3} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." From a87ba0dba43606ac8e03e30376d54eec0184e2be Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:22:03 +0530 Subject: [PATCH 169/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 26868cbe291a..f3114f32115f 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -96,7 +96,7 @@ start_5 : "❖ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ ❖\n\n● ᴛʜɪ start_6 : "❖ 🥀ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ❖\n\n● 📌ᴛɪᴛʟᴇ ➥ {0}\n\n● ⏳ᴅᴜʀᴀᴛɪᴏɴ ➥ {1} ᴍɪɴᴜᴛᴇs\n● 👀ᴠɪᴇᴡs ➥ {2}\n● ⏰ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ ➥ {3}\n● ᴄʜᴀɴɴᴇʟ ➥ {5}\n\n● sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ ➥ {6}" -help_1 : "❖ ᴄʜᴏᴏsᴇ ᴛʜᴇ ᴄᴀᴛᴇɢᴏʀʏ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴩ.\n\n● ᴀsᴋ ʏᴏᴜʀ ᴅᴏᴜʙᴛs ᴀᴛ ➥ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ\n\n● ᴀʟʟ ᴄᴏᴍᴍᴀɴᴅs ᴄᴀɴ ʙᴇ ᴜsᴇᴅ ᴡɪᴛʜ ➥ /" +help_1 : "
❖ ᴄʜᴏᴏsᴇ ᴛʜᴇ ᴄᴀᴛᴇɢᴏʀʏ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴩ.
\n\n● ᴀsᴋ ʏᴏᴜʀ ᴅᴏᴜʙᴛs ᴀᴛ ➥ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ" help_2 : "❖ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ᴍʏ ʜᴇʟᴘ ᴍᴇɴᴜ ɪɴ ʏᴏᴜʀ ᴘᴍ." lang_1 : "❖ ᴘʟᴇᴀsᴇ ᴄʜᴏᴏsᴇ ᴛʜᴇ ʟᴀɴɢᴜᴀɢᴇ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ sᴇᴛ ᴀs ᴛʜɪs ɢʀᴏᴜᴘ's ᴅᴇғᴀᴜʟᴛ ʟᴀɴɢᴜᴀɢᴇ" From 5eed2393580e6c5e3901545bd9de201fa2847951 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:27:11 +0530 Subject: [PATCH 170/184] Update cookies.txt --- cookies/cookies.txt | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 802a6554e894..98af33de97e2 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -2,19 +2,20 @@ # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1767026623 LOGIN_INFO AFmmF2swRQIgPOUyNBezY4Cv61n1G2ph1YffgNyH38N8TFd2HSY-zyQCIQDqCzUb06OGpLYUV42aMn4xvWDY2sMkVaLOnLJ0N7Uwlg:QUQ3MjNmeVk2TU81bGxDbmNkNnhOTTZveXNFZ3RSVFVQSmRHTzRmVThRU2FZcnR6bjM4QWw0VjVwWTBzRVFMYV9DdEFCaDVHenpZMml2TWZOLU9TLTh0ZEhiSlp3M3FEZXdCVE5qT29vMjBpeVJSV2lXQV9SeDYwVkJJZFR0YlU2cmNKWGt1THkwaUNPTEh5SVRDazI4Sk1zMVB2TzZRd2lB -.youtube.com TRUE / FALSE 1769166672 SID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pJEFA56dlXbtGDkDr2FwrAwACgYKAZYSARYSFQHGX2Mi2mHCEsjrIoK2axVR7GehQRoVAUF8yKqji4eiBTGOs-OY7LeRe0EA0076 -.youtube.com TRUE / TRUE 1766142672 __Secure-1PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA -.youtube.com TRUE / TRUE 1766142672 __Secure-3PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA -.youtube.com TRUE / TRUE 1769166672 __Secure-1PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pDqHd2OI_IWNQ65bQuksY6AACgYKAaUSARYSFQHGX2Mi_Kr7FuzXAHVqUIFp60ldcRoVAUF8yKrlQGCkAq473BbQsO35u5W_0076 -.youtube.com TRUE / TRUE 1769166672 __Secure-3PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9phVIZwcVPv0_4Gjum4N5cEQACgYKAfUSARYSFQHGX2MildEXXqmnBcUyM4R5HWUqFRoVAUF8yKo30ukssU8hOuXCpwY92gFT0076 -.youtube.com TRUE / FALSE 1769166672 HSID AsXbK6LjWMoyXaBuW -.youtube.com TRUE / TRUE 1769166672 SSID Amt0P9jyicmh3ip74 -.youtube.com TRUE / FALSE 1769166672 APISID 5K1EVtpMXTPeAJfD/AVRkfa6UhWnh8qZ0H -.youtube.com TRUE / TRUE 1769166672 SAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 -.youtube.com TRUE / TRUE 1769166672 __Secure-1PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 -.youtube.com TRUE / TRUE 1769166672 __Secure-3PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 -.youtube.com TRUE / TRUE 1769166719 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 -.youtube.com TRUE / FALSE 1766142726 SIDCC AKEyXzUuIeocSmEEiYqhtTfEMJ9gCqnibOnklBeNezad1pIg2X-50giCY1Md7CP2V5_Slio5 -.youtube.com TRUE / TRUE 1766142726 __Secure-1PSIDCC AKEyXzVkkDbwoCJXAnitITrltJmzUiC9oK3fTHUMgAyayFFWZIZIp8SyJr02K98eeL4H99KM -.youtube.com TRUE / TRUE 1766142726 __Secure-3PSIDCC AKEyXzWybZwKYI92ZzC5yzbcfGcSqWjkF6rvqps9QORaO1hqeNS6oZYIUWoi1ZSJ_7EUAuulIQ \ No newline at end of file +.youtube.com TRUE / TRUE 1768945135 PREF f6=40000000&tz=Asia.Calcutta&f7=100 +.youtube.com TRUE / TRUE 1734386713 GPS 1 +.youtube.com TRUE / TRUE 1765921084 __Secure-1PSIDTS sidts-CjEB7wV3sVB6ZjpXTr-MamZrRAKYEq5Xb7AqpVF6JctZZIp1HrfUcpM2EjL08C0R1dSKEAA +.youtube.com TRUE / TRUE 1765921084 __Secure-3PSIDTS sidts-CjEB7wV3sVB6ZjpXTr-MamZrRAKYEq5Xb7AqpVF6JctZZIp1HrfUcpM2EjL08C0R1dSKEAA +.youtube.com TRUE / FALSE 1768945117 HSID A8V9e0jrijIDLHB0p +.youtube.com TRUE / TRUE 1768945117 SSID AkDs3E0v7KWEWLQqK +.youtube.com TRUE / FALSE 1768945117 APISID ZEkVMyS21uO3MBHJ/Akmw9s0ugMOMmTaDC +.youtube.com TRUE / TRUE 1768945117 SAPISID XVRpXrMO3apRNXs3/A_dECeGSPJtpgTV4y +.youtube.com TRUE / TRUE 1768945117 __Secure-1PAPISID XVRpXrMO3apRNXs3/A_dECeGSPJtpgTV4y +.youtube.com TRUE / TRUE 1768945117 __Secure-3PAPISID XVRpXrMO3apRNXs3/A_dECeGSPJtpgTV4y +.youtube.com TRUE / FALSE 1768945117 SID g.a000rQhK8piXytHsoLBIOvHsJaATsd0kF79C_q3py_1bcSRLO_VKNS_qEC-tOPFHTXfAeXL-SQACgYKAd0SARISFQHGX2MiY5ehv2PwyJgXAipkBDcl2hoVAUF8yKpgwcu4x3DgLW6wZgvhT2iX0076 +.youtube.com TRUE / TRUE 1768945117 __Secure-1PSID g.a000rQhK8piXytHsoLBIOvHsJaATsd0kF79C_q3py_1bcSRLO_VKCw4Xu2qH-XU0IhedmbBiYAACgYKAYYSARISFQHGX2MiGvI2mlvICRgxSyV1GQhIPRoVAUF8yKp1imcd_Z1U74MQLbCNQWxG0076 +.youtube.com TRUE / TRUE 1768945117 __Secure-3PSID g.a000rQhK8piXytHsoLBIOvHsJaATsd0kF79C_q3py_1bcSRLO_VKwCAcKnNdDhjB4ykVzpI7hAACgYKAS4SARISFQHGX2MilvfR0UMGLkrD1XZhuoY7IBoVAUF8yKpe3TglIYdauIoYrUKTt0vx0076 +.youtube.com TRUE / TRUE 1768945122 LOGIN_INFO AFmmF2swRAIgU4JIMlriZJDGjCtw97mXhJQA68N_EdZhPGz9oh-jtUECIBmzvgR3m1e3-ozSDWioFmEt9_qllSTS2D9PdnZksaid:QUQ3MjNmemVESEpFekZQNVVRM3ExcTZDZU9heTI3dHJ2UDlLZFFGSnRmNnMzblZIRDNfZ3RLbkNlcmtySUpsX2NGeWJUOHRWRW9MM1NfaWN3V3RDQ0JpYkNGZS04a3VLcExra09PQWJFaGE2VGZlS3V1cmJSbENUQWlZVktHZjFDT0NiZzBVWXV4RjVVU3R0ck50ZGRRYXFlOE1Xcy1aX01B +.youtube.com TRUE / FALSE 1765921183 SIDCC AKEyXzVY0rR0SerNSm1vZA7p0UxHirquPQ6b2yxNhcTa6Yykbl5RzT2h93hfC26N-JDS2TPOFg +.youtube.com TRUE / TRUE 1765921183 __Secure-1PSIDCC AKEyXzWaAg8fkuO731AX2offfOF85n3FI3oCoe_m51vzx0O2lFPnbEPZbM9bEwPmsxwjVszw +.youtube.com TRUE / TRUE 1765921183 __Secure-3PSIDCC AKEyXzUPlGep6bjspA3bYCNyCIXwKhManwhE5vdCwL-4VFDPEiBhJRcchxbOk47-_qUqMqt_zA \ No newline at end of file From aa6bf427bb0695d0e61fa0b216c7a7b13523d180 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:33:12 +0530 Subject: [PATCH 171/184] Update helpers.py --- strings/helpers.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/strings/helpers.py b/strings/helpers.py index 45b020fab477..bc66e0efc7f9 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -1,5 +1,5 @@ HELP_1 = """ -❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ➥ +
❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs
➥ ● /pause ➥ ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. ● /resume ➥ ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. ● /skip ➥ sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. @@ -9,15 +9,15 @@ ● /speed or /playback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ɢʀᴏᴜᴘ. ● /cspeed or /cplayback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ᴄʜᴀɴɴᴇʟ. -❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ ➥ +
❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ
➥ ● /loop [enable/disable] ➥ ᴇɴᴀʙʟᴇs/ᴅɪsᴀʙʟᴇs ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ● /loop [1, 2, 3, ...] ➥ ᴇɴᴀʙʟᴇs ᴛʜᴇ ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ɢɪᴠᴇɴ ᴠᴀʟᴜᴇ. -❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ ➥ +
 ❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ 
➥ ● /shuffle ➥ sʜᴜғғʟᴇ's ᴛʜᴇ ᴏ̨ᴜᴇᴜᴇ. ● /queue ➥ sʜᴏᴡs ᴛʜᴇ sʜᴜғғʟᴇᴅ ᴏ̨ᴜᴇᴜᴇ. -❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ ➥ +
 ❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ 
➥ ● /seek [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. ● /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ ʙᴀᴄᴋᴡᴀʀᴅ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. @@ -25,7 +25,7 @@ """ HELP_2 = """ -❖ ᴀᴜᴛʜ ᴜsᴇʀs ➥ +
 ❖ ᴀᴜᴛʜ ᴜsᴇʀs 
➥ ● /auth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ᴀᴅᴅ ᴀ ᴜsᴇʀ ᴛᴏ ᴀᴜᴛʜ ʟɪsᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /unauth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ʀᴇᴍᴏᴠᴇ ᴀ ᴀᴜᴛʜ ᴜsᴇʀs ғʀᴏᴍ ᴛʜᴇ ᴀᴜᴛʜ ᴜsᴇʀs ʟɪsᴛ. ● /authusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴜᴛʜ ᴜsᴇʀs ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. @@ -34,7 +34,7 @@ """ HELP_3 = """ -❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ ➥ +
❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ 
➥ ● /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] ➥ ʙʀᴏᴀᴅᴄᴀsᴛ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. @@ -50,22 +50,22 @@ """ HELP_4 = """ -❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ ➥ +
 ❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ
➥ ● /blacklistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ʙʟᴀᴄᴋʟɪsᴛ ᴀ ᴄʜᴀᴛ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /whitelistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ᴡʜɪᴛᴇʟɪsᴛ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ. ● /blacklistedchat ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs. -❖ ʙʟᴏᴄᴋ ᴜsᴇʀs ➥ +
 ❖ ʙʟᴏᴄᴋ ᴜsᴇʀs
➥ ● /block [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ʙʟᴏᴄᴋ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ ᴏᴜʀ ʙᴏᴛ. ● /unblock [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ᴜɴʙʟᴏᴄᴋs ᴛʜᴇ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀ. ● /blockedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs. -❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ ➥ +
 ❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ
➥ ● /gban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ʙᴀɴs ᴛʜᴇ ᴄʜᴜᴛɪʏᴀ ғʀᴏᴍ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ ʙʟᴀᴄᴋʟɪsᴛ ʜɪᴍ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /ungban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ᴜɴʙᴀɴs ᴛʜᴇ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀ. ● /gbannedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs. -❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ➥ +
 ❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ
➥ ● /logs ➥ ɢᴇᴛ ʟᴏɢs ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /logger [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ʙᴏᴛ ᴡɪʟʟ sᴛᴀʀᴛ ʟᴏɢɢɪɴɢ ᴛʜᴇ ᴀᴄᴛɪᴠɪᴛɪᴇs ʜᴀᴩᴩᴇɴ ᴏɴ ʙᴏᴛ. ● /maintenance [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ᴇɴᴀʙʟᴇ ᴏʀ ᴅɪsᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ʏᴏᴜʀ ʙᴏᴛ. @@ -74,13 +74,13 @@ """ HELP_5 = """ -❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥ +
 ❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs 
➥ ● v ➥ sᴛᴀɴᴅs ғᴏʀ ᴠɪᴅᴇᴏ ᴩʟᴀʏ. ● force ➥ sᴛᴀɴᴅs ғᴏʀ ғᴏʀᴄᴇ ᴩʟᴀʏ. ● /play ᴏʀ /vplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /playforce ᴏʀ /vplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. -❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥ +
 ❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs
➥ ● /cplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴀᴜᴅɪᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cvplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴠɪᴅᴇᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cplayforce or /cvplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. @@ -90,7 +90,7 @@ """ HELP_6 = """ -● sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ ➥ +
❖ sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ 
➥ ● /song [sᴏɴɢ ɴᴀᴍᴇ] ➥ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴʏ ᴛʀᴀᴄᴋ ғʀᴏᴍ sᴘᴏᴛɪғʏ ɪɴ ᴍᴘ4 ғᴏʀᴍᴀᴛs. @@ -98,14 +98,14 @@ """ HELP_7 = """ - ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ ➥ +
❖ ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ 
➥ ⬤ /q ➥ ᴄʀᴇᴀᴛᴇ ᴀ ǫᴜᴏᴛᴇ ғʀᴏᴍ ᴛʜᴇ ᴍᴇssᴀɢᴇ. ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_8 = """ - sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs ➥ +
❖ sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs 
➥ ⬤ /stickerid ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴍᴇ ᴛᴏ ᴛᴇʟʟ ʏᴏᴜ ɪᴛs ғɪʟᴇ ɪᴅ. ⬤ /kang ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴀᴅᴅ ɪᴛ ᴛᴏ ʏᴏᴜʀ ᴘᴀᴄᴋ. @@ -113,7 +113,7 @@ ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_9 = """ - ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs ➥ +
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs 
➥ ⬤ /image ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ sᴄʀᴀᴘᴇ ɪᴍᴀɢᴇ ғᴏʀᴍ ɢᴏᴏɢʟᴇ. From ae7c6fbb216a61e285ffa67560043167bfb15940 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:33:33 +0530 Subject: [PATCH 172/184] Update helpers.py --- strings/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/helpers.py b/strings/helpers.py index bc66e0efc7f9..037b30d1cab0 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -113,7 +113,7 @@ ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_9 = """ -
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs 
➥ +
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs 
➥ ⬤ /image ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ sᴄʀᴀᴘᴇ ɪᴍᴀɢᴇ ғᴏʀᴍ ɢᴏᴏɢʟᴇ. From 87e5e893bef387dc5f05c4c7b7bb458cde988d93 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:35:18 +0530 Subject: [PATCH 173/184] Update cookies.txt --- cookies/cookies.txt | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 98af33de97e2..802a6554e894 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -2,20 +2,19 @@ # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1768945135 PREF f6=40000000&tz=Asia.Calcutta&f7=100 -.youtube.com TRUE / TRUE 1734386713 GPS 1 -.youtube.com TRUE / TRUE 1765921084 __Secure-1PSIDTS sidts-CjEB7wV3sVB6ZjpXTr-MamZrRAKYEq5Xb7AqpVF6JctZZIp1HrfUcpM2EjL08C0R1dSKEAA -.youtube.com TRUE / TRUE 1765921084 __Secure-3PSIDTS sidts-CjEB7wV3sVB6ZjpXTr-MamZrRAKYEq5Xb7AqpVF6JctZZIp1HrfUcpM2EjL08C0R1dSKEAA -.youtube.com TRUE / FALSE 1768945117 HSID A8V9e0jrijIDLHB0p -.youtube.com TRUE / TRUE 1768945117 SSID AkDs3E0v7KWEWLQqK -.youtube.com TRUE / FALSE 1768945117 APISID ZEkVMyS21uO3MBHJ/Akmw9s0ugMOMmTaDC -.youtube.com TRUE / TRUE 1768945117 SAPISID XVRpXrMO3apRNXs3/A_dECeGSPJtpgTV4y -.youtube.com TRUE / TRUE 1768945117 __Secure-1PAPISID XVRpXrMO3apRNXs3/A_dECeGSPJtpgTV4y -.youtube.com TRUE / TRUE 1768945117 __Secure-3PAPISID XVRpXrMO3apRNXs3/A_dECeGSPJtpgTV4y -.youtube.com TRUE / FALSE 1768945117 SID g.a000rQhK8piXytHsoLBIOvHsJaATsd0kF79C_q3py_1bcSRLO_VKNS_qEC-tOPFHTXfAeXL-SQACgYKAd0SARISFQHGX2MiY5ehv2PwyJgXAipkBDcl2hoVAUF8yKpgwcu4x3DgLW6wZgvhT2iX0076 -.youtube.com TRUE / TRUE 1768945117 __Secure-1PSID g.a000rQhK8piXytHsoLBIOvHsJaATsd0kF79C_q3py_1bcSRLO_VKCw4Xu2qH-XU0IhedmbBiYAACgYKAYYSARISFQHGX2MiGvI2mlvICRgxSyV1GQhIPRoVAUF8yKp1imcd_Z1U74MQLbCNQWxG0076 -.youtube.com TRUE / TRUE 1768945117 __Secure-3PSID g.a000rQhK8piXytHsoLBIOvHsJaATsd0kF79C_q3py_1bcSRLO_VKwCAcKnNdDhjB4ykVzpI7hAACgYKAS4SARISFQHGX2MilvfR0UMGLkrD1XZhuoY7IBoVAUF8yKpe3TglIYdauIoYrUKTt0vx0076 -.youtube.com TRUE / TRUE 1768945122 LOGIN_INFO AFmmF2swRAIgU4JIMlriZJDGjCtw97mXhJQA68N_EdZhPGz9oh-jtUECIBmzvgR3m1e3-ozSDWioFmEt9_qllSTS2D9PdnZksaid:QUQ3MjNmemVESEpFekZQNVVRM3ExcTZDZU9heTI3dHJ2UDlLZFFGSnRmNnMzblZIRDNfZ3RLbkNlcmtySUpsX2NGeWJUOHRWRW9MM1NfaWN3V3RDQ0JpYkNGZS04a3VLcExra09PQWJFaGE2VGZlS3V1cmJSbENUQWlZVktHZjFDT0NiZzBVWXV4RjVVU3R0ck50ZGRRYXFlOE1Xcy1aX01B -.youtube.com TRUE / FALSE 1765921183 SIDCC AKEyXzVY0rR0SerNSm1vZA7p0UxHirquPQ6b2yxNhcTa6Yykbl5RzT2h93hfC26N-JDS2TPOFg -.youtube.com TRUE / TRUE 1765921183 __Secure-1PSIDCC AKEyXzWaAg8fkuO731AX2offfOF85n3FI3oCoe_m51vzx0O2lFPnbEPZbM9bEwPmsxwjVszw -.youtube.com TRUE / TRUE 1765921183 __Secure-3PSIDCC AKEyXzUPlGep6bjspA3bYCNyCIXwKhManwhE5vdCwL-4VFDPEiBhJRcchxbOk47-_qUqMqt_zA \ No newline at end of file +.youtube.com TRUE / TRUE 1767026623 LOGIN_INFO AFmmF2swRQIgPOUyNBezY4Cv61n1G2ph1YffgNyH38N8TFd2HSY-zyQCIQDqCzUb06OGpLYUV42aMn4xvWDY2sMkVaLOnLJ0N7Uwlg:QUQ3MjNmeVk2TU81bGxDbmNkNnhOTTZveXNFZ3RSVFVQSmRHTzRmVThRU2FZcnR6bjM4QWw0VjVwWTBzRVFMYV9DdEFCaDVHenpZMml2TWZOLU9TLTh0ZEhiSlp3M3FEZXdCVE5qT29vMjBpeVJSV2lXQV9SeDYwVkJJZFR0YlU2cmNKWGt1THkwaUNPTEh5SVRDazI4Sk1zMVB2TzZRd2lB +.youtube.com TRUE / FALSE 1769166672 SID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pJEFA56dlXbtGDkDr2FwrAwACgYKAZYSARYSFQHGX2Mi2mHCEsjrIoK2axVR7GehQRoVAUF8yKqji4eiBTGOs-OY7LeRe0EA0076 +.youtube.com TRUE / TRUE 1766142672 __Secure-1PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA +.youtube.com TRUE / TRUE 1766142672 __Secure-3PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA +.youtube.com TRUE / TRUE 1769166672 __Secure-1PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pDqHd2OI_IWNQ65bQuksY6AACgYKAaUSARYSFQHGX2Mi_Kr7FuzXAHVqUIFp60ldcRoVAUF8yKrlQGCkAq473BbQsO35u5W_0076 +.youtube.com TRUE / TRUE 1769166672 __Secure-3PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9phVIZwcVPv0_4Gjum4N5cEQACgYKAfUSARYSFQHGX2MildEXXqmnBcUyM4R5HWUqFRoVAUF8yKo30ukssU8hOuXCpwY92gFT0076 +.youtube.com TRUE / FALSE 1769166672 HSID AsXbK6LjWMoyXaBuW +.youtube.com TRUE / TRUE 1769166672 SSID Amt0P9jyicmh3ip74 +.youtube.com TRUE / FALSE 1769166672 APISID 5K1EVtpMXTPeAJfD/AVRkfa6UhWnh8qZ0H +.youtube.com TRUE / TRUE 1769166672 SAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 +.youtube.com TRUE / TRUE 1769166672 __Secure-1PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 +.youtube.com TRUE / TRUE 1769166672 __Secure-3PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 +.youtube.com TRUE / TRUE 1769166719 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 +.youtube.com TRUE / FALSE 1766142726 SIDCC AKEyXzUuIeocSmEEiYqhtTfEMJ9gCqnibOnklBeNezad1pIg2X-50giCY1Md7CP2V5_Slio5 +.youtube.com TRUE / TRUE 1766142726 __Secure-1PSIDCC AKEyXzVkkDbwoCJXAnitITrltJmzUiC9oK3fTHUMgAyayFFWZIZIp8SyJr02K98eeL4H99KM +.youtube.com TRUE / TRUE 1766142726 __Secure-3PSIDCC AKEyXzWybZwKYI92ZzC5yzbcfGcSqWjkF6rvqps9QORaO1hqeNS6oZYIUWoi1ZSJ_7EUAuulIQ \ No newline at end of file From 71098da8725821979a2e78518ff207f3d5dae012 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:46:50 +0530 Subject: [PATCH 174/184] Update helpers.py --- strings/helpers.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/strings/helpers.py b/strings/helpers.py index 037b30d1cab0..5e539439dd09 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -1,5 +1,5 @@ HELP_1 = """ -
❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs
➥ +
❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs
● /pause ➥ ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. ● /resume ➥ ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. ● /skip ➥ sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. @@ -9,15 +9,15 @@ ● /speed or /playback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ɢʀᴏᴜᴘ. ● /cspeed or /cplayback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ᴄʜᴀɴɴᴇʟ. -
❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ
➥ +
❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ
● /loop [enable/disable] ➥ ᴇɴᴀʙʟᴇs/ᴅɪsᴀʙʟᴇs ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ● /loop [1, 2, 3, ...] ➥ ᴇɴᴀʙʟᴇs ᴛʜᴇ ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ɢɪᴠᴇɴ ᴠᴀʟᴜᴇ. -
 ❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ 
➥ +
 ❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ 
● /shuffle ➥ sʜᴜғғʟᴇ's ᴛʜᴇ ᴏ̨ᴜᴇᴜᴇ. ● /queue ➥ sʜᴏᴡs ᴛʜᴇ sʜᴜғғʟᴇᴅ ᴏ̨ᴜᴇᴜᴇ. -
 ❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ 
➥ +
 ❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ 
● /seek [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. ● /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ ʙᴀᴄᴋᴡᴀʀᴅ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. @@ -25,7 +25,7 @@ """ HELP_2 = """ -
 ❖ ᴀᴜᴛʜ ᴜsᴇʀs 
➥ +
 ❖ ᴀᴜᴛʜ ᴜsᴇʀs 
● /auth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ᴀᴅᴅ ᴀ ᴜsᴇʀ ᴛᴏ ᴀᴜᴛʜ ʟɪsᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /unauth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ʀᴇᴍᴏᴠᴇ ᴀ ᴀᴜᴛʜ ᴜsᴇʀs ғʀᴏᴍ ᴛʜᴇ ᴀᴜᴛʜ ᴜsᴇʀs ʟɪsᴛ. ● /authusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴜᴛʜ ᴜsᴇʀs ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. @@ -34,7 +34,7 @@ """ HELP_3 = """ -
❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ 
➥ +
❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ
● /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] ➥ ʙʀᴏᴀᴅᴄᴀsᴛ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. @@ -50,22 +50,22 @@ """ HELP_4 = """ -
 ❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ
➥ +
 ❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ
● /blacklistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ʙʟᴀᴄᴋʟɪsᴛ ᴀ ᴄʜᴀᴛ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /whitelistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ᴡʜɪᴛᴇʟɪsᴛ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ. ● /blacklistedchat ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs. -
 ❖ ʙʟᴏᴄᴋ ᴜsᴇʀs
➥ +
 ❖ ʙʟᴏᴄᴋ ᴜsᴇʀs
● /block [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ʙʟᴏᴄᴋ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ ᴏᴜʀ ʙᴏᴛ. ● /unblock [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ᴜɴʙʟᴏᴄᴋs ᴛʜᴇ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀ. ● /blockedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs. -
 ❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ
➥ +
 ❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ
● /gban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ʙᴀɴs ᴛʜᴇ ᴄʜᴜᴛɪʏᴀ ғʀᴏᴍ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ ʙʟᴀᴄᴋʟɪsᴛ ʜɪᴍ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /ungban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ᴜɴʙᴀɴs ᴛʜᴇ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀ. ● /gbannedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs. -
 ❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ
➥ +
 ❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ
● /logs ➥ ɢᴇᴛ ʟᴏɢs ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /logger [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ʙᴏᴛ ᴡɪʟʟ sᴛᴀʀᴛ ʟᴏɢɢɪɴɢ ᴛʜᴇ ᴀᴄᴛɪᴠɪᴛɪᴇs ʜᴀᴩᴩᴇɴ ᴏɴ ʙᴏᴛ. ● /maintenance [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ᴇɴᴀʙʟᴇ ᴏʀ ᴅɪsᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ʏᴏᴜʀ ʙᴏᴛ. @@ -74,13 +74,13 @@ """ HELP_5 = """ -
 ❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs 
➥ +
 ❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs 
v ➥ sᴛᴀɴᴅs ғᴏʀ ᴠɪᴅᴇᴏ ᴩʟᴀʏ. ● force ➥ sᴛᴀɴᴅs ғᴏʀ ғᴏʀᴄᴇ ᴩʟᴀʏ. ● /play ᴏʀ /vplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /playforce ᴏʀ /vplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. -
 ❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs
➥ +
 ❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs
● /cplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴀᴜᴅɪᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cvplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴠɪᴅᴇᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cplayforce or /cvplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. @@ -90,7 +90,7 @@ """ HELP_6 = """ -
❖ sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ 
➥ +
❖ sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ
● /song [sᴏɴɢ ɴᴀᴍᴇ] ➥ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴʏ ᴛʀᴀᴄᴋ ғʀᴏᴍ sᴘᴏᴛɪғʏ ɪɴ ᴍᴘ4 ғᴏʀᴍᴀᴛs. @@ -98,14 +98,14 @@ """ HELP_7 = """ -
❖ ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ 
➥ +
❖ ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ 
⬤ /q ➥ ᴄʀᴇᴀᴛᴇ ᴀ ǫᴜᴏᴛᴇ ғʀᴏᴍ ᴛʜᴇ ᴍᴇssᴀɢᴇ. ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_8 = """ -
❖ sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs 
➥ +
❖ sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs 
⬤ /stickerid ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴍᴇ ᴛᴏ ᴛᴇʟʟ ʏᴏᴜ ɪᴛs ғɪʟᴇ ɪᴅ. ⬤ /kang ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴀᴅᴅ ɪᴛ ᴛᴏ ʏᴏᴜʀ ᴘᴀᴄᴋ. @@ -113,7 +113,7 @@ ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_9 = """ -
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs 
➥ +
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs 
⬤ /image ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ sᴄʀᴀᴘᴇ ɪᴍᴀɢᴇ ғᴏʀᴍ ɢᴏᴏɢʟᴇ. From 1f2af3c3e18f256262a899981cc80205b7d09462 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:54:07 +0530 Subject: [PATCH 175/184] Update helpers.py --- strings/helpers.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/strings/helpers.py b/strings/helpers.py index 5e539439dd09..2dce5bde93b5 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -1,5 +1,5 @@ HELP_1 = """ -
❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs
+
❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ➥
● /pause ➥ ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. ● /resume ➥ ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. ● /skip ➥ sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. @@ -9,15 +9,15 @@ ● /speed or /playback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ɢʀᴏᴜᴘ. ● /cspeed or /cplayback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ᴄʜᴀɴɴᴇʟ. -
❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ
+
❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ ➥
● /loop [enable/disable] ➥ ᴇɴᴀʙʟᴇs/ᴅɪsᴀʙʟᴇs ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ● /loop [1, 2, 3, ...] ➥ ᴇɴᴀʙʟᴇs ᴛʜᴇ ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ɢɪᴠᴇɴ ᴠᴀʟᴜᴇ. -
 ❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ 
+
 ❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ ➥
● /shuffle ➥ sʜᴜғғʟᴇ's ᴛʜᴇ ᴏ̨ᴜᴇᴜᴇ. ● /queue ➥ sʜᴏᴡs ᴛʜᴇ sʜᴜғғʟᴇᴅ ᴏ̨ᴜᴇᴜᴇ. -
 ❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ 
+
 ❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ ➥
● /seek [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. ● /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ ʙᴀᴄᴋᴡᴀʀᴅ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. @@ -25,7 +25,7 @@ """ HELP_2 = """ -
 ❖ ᴀᴜᴛʜ ᴜsᴇʀs 
+
 ❖ ᴀᴜᴛʜ ᴜsᴇʀs ➥
● /auth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ᴀᴅᴅ ᴀ ᴜsᴇʀ ᴛᴏ ᴀᴜᴛʜ ʟɪsᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /unauth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ʀᴇᴍᴏᴠᴇ ᴀ ᴀᴜᴛʜ ᴜsᴇʀs ғʀᴏᴍ ᴛʜᴇ ᴀᴜᴛʜ ᴜsᴇʀs ʟɪsᴛ. ● /authusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴜᴛʜ ᴜsᴇʀs ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. @@ -34,7 +34,7 @@ """ HELP_3 = """ -
❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ
+
❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ ➥
● /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] ➥ ʙʀᴏᴀᴅᴄᴀsᴛ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. @@ -50,22 +50,22 @@ """ HELP_4 = """ -
 ❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ
+
 ❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ ➥
● /blacklistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ʙʟᴀᴄᴋʟɪsᴛ ᴀ ᴄʜᴀᴛ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /whitelistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ᴡʜɪᴛᴇʟɪsᴛ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ. ● /blacklistedchat ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs. -
 ❖ ʙʟᴏᴄᴋ ᴜsᴇʀs
+
 ❖ ʙʟᴏᴄᴋ ᴜsᴇʀs ➥
● /block [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ʙʟᴏᴄᴋ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ ᴏᴜʀ ʙᴏᴛ. ● /unblock [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ᴜɴʙʟᴏᴄᴋs ᴛʜᴇ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀ. ● /blockedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs. -
 ❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ
+
 ❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ ➥
● /gban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ʙᴀɴs ᴛʜᴇ ᴄʜᴜᴛɪʏᴀ ғʀᴏᴍ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ ʙʟᴀᴄᴋʟɪsᴛ ʜɪᴍ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /ungban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ᴜɴʙᴀɴs ᴛʜᴇ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀ. ● /gbannedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs. -
 ❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ
+
 ❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ➥
● /logs ➥ ɢᴇᴛ ʟᴏɢs ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /logger [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ʙᴏᴛ ᴡɪʟʟ sᴛᴀʀᴛ ʟᴏɢɢɪɴɢ ᴛʜᴇ ᴀᴄᴛɪᴠɪᴛɪᴇs ʜᴀᴩᴩᴇɴ ᴏɴ ʙᴏᴛ. ● /maintenance [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ᴇɴᴀʙʟᴇ ᴏʀ ᴅɪsᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ʏᴏᴜʀ ʙᴏᴛ. @@ -74,13 +74,13 @@ """ HELP_5 = """ -
 ❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs 
+
 ❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
v ➥ sᴛᴀɴᴅs ғᴏʀ ᴠɪᴅᴇᴏ ᴩʟᴀʏ. ● force ➥ sᴛᴀɴᴅs ғᴏʀ ғᴏʀᴄᴇ ᴩʟᴀʏ. ● /play ᴏʀ /vplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /playforce ᴏʀ /vplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. -
 ❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs
+
 ❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
● /cplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴀᴜᴅɪᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cvplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴠɪᴅᴇᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cplayforce or /cvplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. @@ -90,7 +90,7 @@ """ HELP_6 = """ -
❖ sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ
+
❖ sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ ➥
● /song [sᴏɴɢ ɴᴀᴍᴇ] ➥ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴʏ ᴛʀᴀᴄᴋ ғʀᴏᴍ sᴘᴏᴛɪғʏ ɪɴ ᴍᴘ4 ғᴏʀᴍᴀᴛs. @@ -98,14 +98,14 @@ """ HELP_7 = """ -
❖ ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ 
+
❖ ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ ➥
⬤ /q ➥ ᴄʀᴇᴀᴛᴇ ᴀ ǫᴜᴏᴛᴇ ғʀᴏᴍ ᴛʜᴇ ᴍᴇssᴀɢᴇ. ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_8 = """ -
❖ sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs 
+
❖ sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs ➥
⬤ /stickerid ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴍᴇ ᴛᴏ ᴛᴇʟʟ ʏᴏᴜ ɪᴛs ғɪʟᴇ ɪᴅ. ⬤ /kang ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴀᴅᴅ ɪᴛ ᴛᴏ ʏᴏᴜʀ ᴘᴀᴄᴋ. @@ -113,9 +113,9 @@ ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ """ HELP_9 = """ -
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs 
+
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs ➥
⬤ /image ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ sᴄʀᴀᴘᴇ ɪᴍᴀɢᴇ ғᴏʀᴍ ɢᴏᴏɢʟᴇ. ❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ -""" +""" \ No newline at end of file From 9400ef7c048fe404b801ae6b2ade4e802044f6d5 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Thu, 19 Dec 2024 23:03:42 +0530 Subject: [PATCH 176/184] Update helpers.py --- strings/helpers.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/strings/helpers.py b/strings/helpers.py index 2dce5bde93b5..2d5c2abb0613 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -13,11 +13,11 @@ ● /loop [enable/disable] ➥ ᴇɴᴀʙʟᴇs/ᴅɪsᴀʙʟᴇs ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ● /loop [1, 2, 3, ...] ➥ ᴇɴᴀʙʟᴇs ᴛʜᴇ ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ɢɪᴠᴇɴ ᴠᴀʟᴜᴇ. -
 ❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ ➥
+
❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ ➥
● /shuffle ➥ sʜᴜғғʟᴇ's ᴛʜᴇ ᴏ̨ᴜᴇᴜᴇ. ● /queue ➥ sʜᴏᴡs ᴛʜᴇ sʜᴜғғʟᴇᴅ ᴏ̨ᴜᴇᴜᴇ. -
 ❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ ➥
+
❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ ➥
● /seek [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. ● /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ ʙᴀᴄᴋᴡᴀʀᴅ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. @@ -25,7 +25,7 @@ """ HELP_2 = """ -
 ❖ ᴀᴜᴛʜ ᴜsᴇʀs ➥
+
❖ ᴀᴜᴛʜ ᴜsᴇʀs ➥
● /auth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ᴀᴅᴅ ᴀ ᴜsᴇʀ ᴛᴏ ᴀᴜᴛʜ ʟɪsᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /unauth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ʀᴇᴍᴏᴠᴇ ᴀ ᴀᴜᴛʜ ᴜsᴇʀs ғʀᴏᴍ ᴛʜᴇ ᴀᴜᴛʜ ᴜsᴇʀs ʟɪsᴛ. ● /authusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴜᴛʜ ᴜsᴇʀs ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. @@ -50,22 +50,22 @@ """ HELP_4 = """ -
 ❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ ➥
+
❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ ➥
● /blacklistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ʙʟᴀᴄᴋʟɪsᴛ ᴀ ᴄʜᴀᴛ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /whitelistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ᴡʜɪᴛᴇʟɪsᴛ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ. ● /blacklistedchat ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs. -
 ❖ ʙʟᴏᴄᴋ ᴜsᴇʀs ➥
+
❖ ʙʟᴏᴄᴋ ᴜsᴇʀs ➥
● /block [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ʙʟᴏᴄᴋ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ ᴏᴜʀ ʙᴏᴛ. ● /unblock [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ᴜɴʙʟᴏᴄᴋs ᴛʜᴇ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀ. ● /blockedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs. -
 ❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ ➥
+
❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ ➥
● /gban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ʙᴀɴs ᴛʜᴇ ᴄʜᴜᴛɪʏᴀ ғʀᴏᴍ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ ʙʟᴀᴄᴋʟɪsᴛ ʜɪᴍ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. ● /ungban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ᴜɴʙᴀɴs ᴛʜᴇ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀ. ● /gbannedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs. -
 ❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ➥
+
❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ➥
● /logs ➥ ɢᴇᴛ ʟᴏɢs ᴏғ ᴛʜᴇ ʙᴏᴛ. ● /logger [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ʙᴏᴛ ᴡɪʟʟ sᴛᴀʀᴛ ʟᴏɢɢɪɴɢ ᴛʜᴇ ᴀᴄᴛɪᴠɪᴛɪᴇs ʜᴀᴩᴩᴇɴ ᴏɴ ʙᴏᴛ. ● /maintenance [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ᴇɴᴀʙʟᴇ ᴏʀ ᴅɪsᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ʏᴏᴜʀ ʙᴏᴛ. @@ -74,13 +74,13 @@ """ HELP_5 = """ -
 ❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
+
❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
v ➥ sᴛᴀɴᴅs ғᴏʀ ᴠɪᴅᴇᴏ ᴩʟᴀʏ. ● force ➥ sᴛᴀɴᴅs ғᴏʀ ғᴏʀᴄᴇ ᴩʟᴀʏ. ● /play ᴏʀ /vplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /playforce ᴏʀ /vplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. -
 ❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
+
❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
● /cplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴀᴜᴅɪᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cvplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴠɪᴅᴇᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. ● /cplayforce or /cvplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. From d8d186db66981839bdcfc78d121a93f7689d9e2f Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:48:18 +0530 Subject: [PATCH 177/184] Update start.py --- TanuMusic/plugins/bot/start.py | 1 + 1 file changed, 1 insertion(+) diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py index 22d2d6689313..d7953d116f15 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/TanuMusic/plugins/bot/start.py @@ -1,5 +1,6 @@ import time import random +import pyrogram from pyrogram import filters from pyrogram.enums import ChatType from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message From 835d4ab6590733171cdb72affdd499fed16aca18 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:02:54 +0530 Subject: [PATCH 178/184] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index dba91a4e2977..9a70b8caa04a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -51,6 +51,7 @@ py-tgcalls==0.9.7 lexica-api==1.5.7 #pymongo==3.12.0 +git+https://github.com/Mayuri-Chan/pyrofork git+https://github.com/yt-dlp/yt-dlp git+https://github.com/alexmercerind/youtube-search-python@main git+https://github.com/joetats/youtube_search@master \ No newline at end of file From 92de803bdbe37a2dae6791e37a817d756c6eb6cd Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:10:32 +0530 Subject: [PATCH 179/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index f3114f32115f..ba120346e366 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -86,7 +86,7 @@ admin_40 : "❖ ᴜᴘᴠᴏᴛᴇᴅ." start_1 : "❖ {0} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ.\n\n❖ ᴜᴘᴛɪᴍᴇ ➥ {1}" -start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.\n❖ ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." +start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.
\n
● ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." start_3 : "❖ ʜᴇʏ {0},\n● ᴛʜɪs ɪs {1}\n\n● ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ ɪɴ {2}, {3} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." From adf53cd66b539783ef7028c4307ca4d696f3dd5c Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 21 Dec 2024 05:17:48 +0530 Subject: [PATCH 180/184] Update thumbnails.py --- TanuMusic/utils/thumbnails.py | 229 ++++++++++++++++------------------ 1 file changed, 109 insertions(+), 120 deletions(-) diff --git a/TanuMusic/utils/thumbnails.py b/TanuMusic/utils/thumbnails.py index c55d13d316cb..1c5747183de3 100644 --- a/TanuMusic/utils/thumbnails.py +++ b/TanuMusic/utils/thumbnails.py @@ -2,11 +2,9 @@ import re import aiofiles import aiohttp -from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont, ImageOps -from unidecode import unidecode +from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont from youtubesearchpython.__future__ import VideosSearch -from TanuMusic import app -from config import YOUTUBE_IMG_URL + def changeImageSize(maxWidth, maxHeight, image): widthRatio = maxWidth / image.size[0] @@ -16,54 +14,52 @@ def changeImageSize(maxWidth, maxHeight, image): newImage = image.resize((newWidth, newHeight)) return newImage + def truncate(text): - list = text.split(" ") + words = text.split(" ") text1 = "" - text2 = "" - for i in list: - if len(text1) + len(i) < 30: - text1 += " " + i - elif len(text2) + len(i) < 30: - text2 += " " + i + text2 = "" + for word in words: + if len(text1) + len(word) < 30: + text1 += " " + word + elif len(text2) + len(word) < 30: + text2 += " " + word text1 = text1.strip() - text2 = text2.strip() - return [text1,text2] + text2 = text2.strip() + return [text1, text2] + def crop_center_circle(img, output_size, border, crop_scale=1.5): - half_the_width = img.size[0] / 2 - half_the_height = img.size[1] / 2 + half_width = img.size[0] / 2 + half_height = img.size[1] / 2 larger_size = int(output_size * crop_scale) img = img.crop( ( - half_the_width - larger_size/2, - half_the_height - larger_size/2, - half_the_width + larger_size/2, - half_the_height + larger_size/2 + half_width - larger_size / 2, + half_height - larger_size / 2, + half_width + larger_size / 2, + half_height + larger_size / 2, ) ) - - img = img.resize((output_size - 2*border, output_size - 2*border)) - - + + img = img.resize((output_size - 2 * border, output_size - 2 * border)) + final_img = Image.new("RGBA", (output_size, output_size), "pink") - - - mask_main = Image.new("L", (output_size - 2*border, output_size - 2*border), 0) + + mask_main = Image.new("L", (output_size - 2 * border, output_size - 2 * border), 0) draw_main = ImageDraw.Draw(mask_main) - draw_main.ellipse((0, 0, output_size - 2*border, output_size - 2*border), fill=255) - + draw_main.ellipse((0, 0, output_size - 2 * border, output_size - 2 * border), fill=255) + final_img.paste(img, (border, border), mask_main) - - + mask_border = Image.new("L", (output_size, output_size), 0) draw_border = ImageDraw.Draw(mask_border) draw_border.ellipse((0, 0, output_size, output_size), fill=255) - + result = Image.composite(final_img, Image.new("RGBA", final_img.size, (0, 0, 0, 0)), mask_border) - - return result + return result async def get_thumb(videoid): @@ -72,92 +68,85 @@ async def get_thumb(videoid): url = f"https://www.youtube.com/watch?v={videoid}" results = VideosSearch(url, limit=1) - for result in (await results.next())["result"]: - try: - title = result["title"] - title = re.sub("\W+", " ", title) - title = title.title() - except: - title = "Unsupported Title" - try: - duration = result["duration"] - except: - duration = "Unknown Mins" - thumbnail = result["thumbnails"][0]["url"].split("?")[0] - try: - views = result["viewCount"]["short"] - except: - views = "Unknown Views" - try: - channel = result["channel"]["name"] - except: - channel = "Unknown Channel" - - async with aiohttp.ClientSession() as session: - async with session.get(thumbnail) as resp: - if resp.status == 200: - f = await aiofiles.open(f"cache/thumb{videoid}.png", mode="wb") - await f.write(await resp.read()) - await f.close() - - youtube = Image.open(f"cache/thumb{videoid}.png") - image1 = changeImageSize(1280, 720, youtube) - image2 = image1.convert("RGBA") - background = image2.filter(filter=ImageFilter.BoxBlur(20)) - enhancer = ImageEnhance.Brightness(background) - background = enhancer.enhance(0.6) - draw = ImageDraw.Draw(background) - arial = ImageFont.truetype("TanuMusic/assets/font2.ttf", 30) - font = ImageFont.truetype("TanuMusic/assets/font.ttf", 30) - title_font = ImageFont.truetype("TanuMusic/assets/font3.ttf", 45) - - - circle_thumbnail = crop_center_circle(youtube, 400, 20) - circle_thumbnail = circle_thumbnail.resize((400, 400)) - circle_position = (120, 160) - background.paste(circle_thumbnail, circle_position, circle_thumbnail) - - text_x_position = 565 - - title1 = truncate(title) - draw.text((text_x_position, 180), title1[0], fill=(255, 255, 255), font=title_font) - draw.text((text_x_position, 230), title1[1], fill=(255, 255, 255), font=title_font) - draw.text((text_x_position, 320), f"{channel} | {views[:23]}", (255, 255, 255), font=arial) - draw.text((10, 10), f"TANU MUSIC", fill="yellow", font=font) - - - line_length = 580 - - - red_length = int(line_length * 0.6) - white_length = line_length - red_length - - - start_point_red = (text_x_position, 380) - end_point_red = (text_x_position + red_length, 380) - draw.line([start_point_red, end_point_red], fill="red", width=9) - - - start_point_white = (text_x_position + red_length, 380) - end_point_white = (text_x_position + line_length, 380) - draw.line([start_point_white, end_point_white], fill="white", width=8) - - - circle_radius = 10 - circle_position = (end_point_red[0], end_point_red[1]) - draw.ellipse([circle_position[0] - circle_radius, circle_position[1] - circle_radius, - circle_position[0] + circle_radius, circle_position[1] + circle_radius], fill="red") - draw.text((text_x_position, 400), "00:00", (255, 255, 255), font=arial) - draw.text((1080, 400), duration, (255, 255, 255), font=arial) - - play_icons = Image.open("TanuMusic/assets/play_icons.png") - play_icons = play_icons.resize((580, 62)) - background.paste(play_icons, (text_x_position, 450), play_icons) try: - os.remove(f"cache/thumb{videoid}.png") - except: - pass - background.save(f"cache/{videoid}_v4.png") - return f"cache/{videoid}_v4.png" - + for result in (await results.next())["result"]: + try: + title = result.get("title", "Unsupported Title") + title = re.sub("\W+", " ", title) + title = title.title() + except: + title = "Unsupported Title" + + duration = result.get("duration", "Unknown Mins") + views = result.get("viewCount", {}).get("short", "Unknown Views") + channel = result.get("channel", {}).get("name", "Unknown Channel") + + if "thumbnails" in result and len(result["thumbnails"]) > 0: + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + else: + raise ValueError("Thumbnail not found in search results") + + async with aiohttp.ClientSession() as session: + async with session.get(thumbnail) as resp: + if resp.status == 200: + async with aiofiles.open(f"cache/thumb{videoid}.png", mode="wb") as f: + await f.write(await resp.read()) + + youtube = Image.open(f"cache/thumb{videoid}.png") + image1 = changeImageSize(1280, 720, youtube) + image2 = image1.convert("RGBA") + background = image2.filter(filter=ImageFilter.BoxBlur(20)) + enhancer = ImageEnhance.Brightness(background) + background = enhancer.enhance(0.6) + draw = ImageDraw.Draw(background) + arial = ImageFont.truetype("TanuMusic/assets/font2.ttf", 30) + font = ImageFont.truetype("TanuMusic/assets/font.ttf", 30) + title_font = ImageFont.truetype("TanuMusic/assets/font3.ttf", 45) + + circle_thumbnail = crop_center_circle(youtube, 400, 20) + circle_thumbnail = circle_thumbnail.resize((400, 400)) + circle_position = (120, 160) + background.paste(circle_thumbnail, circle_position, circle_thumbnail) + + text_x_position = 565 + + title1 = truncate(title) + draw.text((text_x_position, 180), title1[0], fill=(255, 255, 255), font=title_font) + draw.text((text_x_position, 230), title1[1], fill=(255, 255, 255), font=title_font) + draw.text((text_x_position, 320), f"{channel} | {views[:23]}", (255, 255, 255), font=arial) + draw.text((10, 10), f"TANU MUSIC", fill="yellow", font=font) + + line_length = 580 + red_length = int(line_length * 0.6) + white_length = line_length - red_length + + start_point_red = (text_x_position, 380) + end_point_red = (text_x_position + red_length, 380) + draw.line([start_point_red, end_point_red], fill="red", width=9) + + start_point_white = (text_x_position + red_length, 380) + end_point_white = (text_x_position + line_length, 380) + draw.line([start_point_white, end_point_white], fill="white", width=8) + + circle_radius = 10 + circle_position = (end_point_red[0], end_point_red[1]) + draw.ellipse([circle_position[0] - circle_radius, circle_position[1] - circle_radius, + circle_position[0] + circle_radius, circle_position[1] + circle_radius], fill="red") + draw.text((text_x_position, 400), "00:00", (255, 255, 255), font=arial) + draw.text((1080, 400), duration, (255, 255, 255), font=arial) + + play_icons = Image.open("TanuMusic/assets/play_icons.png") + play_icons = play_icons.resize((580, 62)) + background.paste(play_icons, (text_x_position, 450), play_icons) + + try: + os.remove(f"cache/thumb{videoid}.png") + except: + pass + background.save(f"cache/{videoid}_v4.png") + return f"cache/{videoid}_v4.png" + + except Exception as e: + print(f"Error in get_thumb: {e}") + raise \ No newline at end of file From 4329456895e74bcb358cf36f6204787af3eb2382 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 21 Dec 2024 16:32:02 +0530 Subject: [PATCH 181/184] Update mustjoin.py --- TanuMusic/plugins/bot/mustjoin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TanuMusic/plugins/bot/mustjoin.py b/TanuMusic/plugins/bot/mustjoin.py index f989bcbf78b8..2cee8913d1d2 100644 --- a/TanuMusic/plugins/bot/mustjoin.py +++ b/TanuMusic/plugins/bot/mustjoin.py @@ -43,7 +43,7 @@ async def must_join_channel(app: Client, msg: Message): chat_info = await app.get_chat(MUST_JOIN) link = chat_info.invite_link try: - await msg.reply_photo(random.choice(IMAGE), caption=f"❖ ʜᴇʏ ᴛʜᴇʀᴇ, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ᴜʜʜ !\n\n● ɪғ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴜsᴇ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙, ᴛʜᴇɴ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴇʟᴏᴡ ʙᴜᴛᴛᴏɴ ᴀɴᴅ ʏᴏᴜ ᴊᴏɪɴᴇᴅ, ᴛʜᴇɴ ʏᴏᴜ ᴄᴀɴ ᴜsᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs ", + await msg.reply_photo(random.choice(IMAGE), caption=f"
❖ ʜᴇʏ ᴛʜᴇʀᴇ, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ᴜʜʜ !\n\n● ɪғ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴜsᴇ  ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙, ᴛʜᴇɴ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴇʟᴏᴡ ʙᴜᴛᴛᴏɴ ᴀɴᴅ ʏᴏᴜ ᴊᴏɪɴᴇᴅ, ᴛʜᴇɴ ʏᴏᴜ ᴄᴀɴ ᴜsᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs.
", reply_markup=InlineKeyboardMarkup( [ [ From 1385a0c69e1a139d901149461e090f6a8a1c3660 Mon Sep 17 00:00:00 2001 From: CODE SEARCH <150044321+CodeSearchDev@users.noreply.github.com> Date: Sat, 21 Dec 2024 19:34:22 +0530 Subject: [PATCH 182/184] Update en.yml --- strings/langs/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/langs/en.yml b/strings/langs/en.yml index ba120346e366..647a691dc22d 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -86,7 +86,7 @@ admin_40 : "❖ ᴜᴘᴠᴏᴛᴇᴅ." start_1 : "❖ {0} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ.\n\n❖ ᴜᴘᴛɪᴍᴇ ➥ {1}" -start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ !
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.
\n
● ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." +start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ.
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.
\n
● ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." start_3 : "❖ ʜᴇʏ {0},\n● ᴛʜɪs ɪs {1}\n\n● ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ ɪɴ {2}, {3} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." From 059d7211aaf4f1c42ae4efbf77a38639ad8acfc4 Mon Sep 17 00:00:00 2001 From: Antakara <86642530+Mister-Man7@users.noreply.github.com> Date: Sun, 22 Dec 2024 13:58:13 +0000 Subject: [PATCH 183/184] v2 --- {TanuMusic => SprotifyMusic}/__init__.py | 12 +- {TanuMusic => SprotifyMusic}/__main__.py | 32 +- {TanuMusic => SprotifyMusic}/assets/empty.png | Bin {TanuMusic => SprotifyMusic}/assets/font.ttf | Bin {TanuMusic => SprotifyMusic}/assets/font2.ttf | Bin {TanuMusic => SprotifyMusic}/assets/font3.ttf | Bin .../assets/play_icons.png | Bin {TanuMusic => SprotifyMusic}/assets/thum.png | Bin {TanuMusic => SprotifyMusic}/core/bot.py | 4 +- {TanuMusic => SprotifyMusic}/core/call.py | 28 +- {TanuMusic => SprotifyMusic}/core/dir.py | 2 +- {TanuMusic => SprotifyMusic}/core/git.py | 2 +- {TanuMusic => SprotifyMusic}/core/mongo.py | 18 +- {TanuMusic => SprotifyMusic}/core/userbot.py | 52 +- {TanuMusic => SprotifyMusic}/logging.py | 0 {TanuMusic => SprotifyMusic}/misc.py | 2 +- .../platforms/Apple.py | 0 .../platforms/Carbon.py | 0 .../platforms/Resso.py | 0 .../platforms/Soundcloud.py | 2 +- .../platforms/Spotify.py | 0 .../platforms/Telegram.py | 4 +- .../platforms/Youtube.py | 4 +- .../platforms/__init__.py | 0 .../plugins/__init__.py | 0 .../plugins/admins/auth.py | 10 +- .../plugins/admins/callback.py | 36 +- .../plugins/admins/loop.py | 8 +- .../plugins/admins/pause.py | 12 +- .../plugins/admins/resume.py | 12 +- .../plugins/admins/seek.py | 12 +- .../plugins/admins/shuffle.py | 8 +- .../plugins/admins/skip.py | 30 +- .../plugins/admins/speed.py | 16 +- .../plugins/admins/stop.py | 12 +- .../plugins/bot/help.py | 10 +- .../plugins/bot/inline.py | 14 +- .../plugins/bot/mustjoin.py | 2 +- .../plugins/bot/privacy.py | 2 +- .../plugins/bot/repo.py | 8 +- .../plugins/bot/settings.py | 12 +- .../plugins/bot/start.py | 62 +- .../plugins/bot/ytsearch.py | 2 +- .../plugins/misc/autoleave.py | 10 +- .../plugins/misc/broadcast.py | 12 +- .../plugins/misc/cstates.py | 2 +- .../plugins/misc/seeker.py | 4 +- .../plugins/misc/watcher.py | 6 +- .../plugins/play/channel.py | 6 +- .../plugins/play/live.py | 8 +- .../plugins/play/play.py | 22 +- .../plugins/play/playmode.py | 8 +- .../plugins/sudo/active.py | 6 +- .../plugins/sudo/autoend.py | 6 +- .../plugins/sudo/blchat.py | 8 +- .../plugins/sudo/block.py | 10 +- .../plugins/sudo/dev.py | 6 +- .../plugins/sudo/filemanager.py | 4 +- .../plugins/sudo/gban.py | 12 +- .../plugins/sudo/logger.py | 8 +- .../plugins/sudo/maintenance.py | 6 +- .../plugins/sudo/restart.py | 10 +- .../plugins/sudo/sudoers.py | 12 +- .../plugins/tools/afk.py | 6 +- .../plugins/tools/carbon.py | 2 +- .../plugins/tools/clean.py | 4 +- .../plugins/tools/fonts.py | 4 +- .../plugins/tools/image.py | 2 +- .../plugins/tools/language.py | 6 +- .../plugins/tools/mongo.py# | 0 .../plugins/tools/ping.py | 19 +- .../plugins/tools/pypi.py | 2 +- .../plugins/tools/queue.py | 12 +- .../plugins/tools/quoto.py | 2 +- .../plugins/tools/reload.py | 16 +- .../plugins/tools/sangmata.py# | 0 .../plugins/tools/song.py | 2 +- .../plugins/tools/speedtest.py | 6 +- .../plugins/tools/stats.py | 14 +- .../plugins/tools/stickers.py | 2 +- .../plugins/tools/translate.py | 2 +- .../utils/__init__.py | 0 .../utils/channelplay.py | 4 +- .../utils/cleanmode.py | 2 +- .../utils/database.py | 112 ++-- .../utils/decorators/__init__.py | 0 .../utils/decorators/admins.py | 6 +- .../utils/decorators/language.py | 6 +- .../utils/decorators/play.py | 8 +- {TanuMusic => SprotifyMusic}/utils/error.py | 2 +- .../utils/exceptions.py | 0 .../utils/extraction.py | 2 +- {TanuMusic => SprotifyMusic}/utils/fonts.py | 0 .../utils/formatters.py | 0 .../utils/inline/__init__.py | 0 .../utils/inline/extras.py | 0 .../utils/inline/help.py | 2 +- .../utils/inline/play.py | 2 +- .../utils/inline/queue.py | 0 .../utils/inline/settings.py | 0 .../utils/inline/speed.py | 0 .../utils/inline/start.py | 2 +- .../utils/inline/stats.py | 0 .../utils/inlinequery.py | 0 {TanuMusic => SprotifyMusic}/utils/logger.py | 4 +- {TanuMusic => SprotifyMusic}/utils/mongo.py | 0 .../utils/pastebin.py | 0 .../utils/stream/autoclear.py | 0 .../utils/stream/queue.py | 4 +- .../utils/stream/stream.py | 32 +- {TanuMusic => SprotifyMusic}/utils/sys.py | 4 +- .../utils/thumbnails.py | 0 config/config.py | 46 +- cookies/cookies.txt | 36 +- setup | 6 +- start | 2 +- strings/helpers.py | 173 ++--- strings/langs/en.yml | 613 +++++++++--------- unknown_errors.txt | 3 + 119 files changed, 871 insertions(+), 897 deletions(-) rename {TanuMusic => SprotifyMusic}/__init__.py (52%) rename {TanuMusic => SprotifyMusic}/__main__.py (50%) rename {TanuMusic => SprotifyMusic}/assets/empty.png (100%) rename {TanuMusic => SprotifyMusic}/assets/font.ttf (100%) rename {TanuMusic => SprotifyMusic}/assets/font2.ttf (100%) rename {TanuMusic => SprotifyMusic}/assets/font3.ttf (100%) rename {TanuMusic => SprotifyMusic}/assets/play_icons.png (100%) rename {TanuMusic => SprotifyMusic}/assets/thum.png (100%) rename {TanuMusic => SprotifyMusic}/core/bot.py (96%) rename {TanuMusic => SprotifyMusic}/core/call.py (97%) rename {TanuMusic => SprotifyMusic}/core/dir.py (87%) rename {TanuMusic => SprotifyMusic}/core/git.py (97%) rename {TanuMusic => SprotifyMusic}/core/mongo.py (63%) rename {TanuMusic => SprotifyMusic}/core/userbot.py (76%) rename {TanuMusic => SprotifyMusic}/logging.py (100%) rename {TanuMusic => SprotifyMusic}/misc.py (97%) rename {TanuMusic => SprotifyMusic}/platforms/Apple.py (100%) rename {TanuMusic => SprotifyMusic}/platforms/Carbon.py (100%) rename {TanuMusic => SprotifyMusic}/platforms/Resso.py (100%) rename {TanuMusic => SprotifyMusic}/platforms/Soundcloud.py (94%) rename {TanuMusic => SprotifyMusic}/platforms/Spotify.py (100%) rename {TanuMusic => SprotifyMusic}/platforms/Telegram.py (98%) rename {TanuMusic => SprotifyMusic}/platforms/Youtube.py (99%) rename {TanuMusic => SprotifyMusic}/platforms/__init__.py (100%) rename {TanuMusic => SprotifyMusic}/plugins/__init__.py (100%) rename {TanuMusic => SprotifyMusic}/plugins/admins/auth.py (89%) rename {TanuMusic => SprotifyMusic}/plugins/admins/callback.py (93%) rename {TanuMusic => SprotifyMusic}/plugins/admins/loop.py (85%) rename {TanuMusic => SprotifyMusic}/plugins/admins/pause.py (61%) rename {TanuMusic => SprotifyMusic}/plugins/admins/resume.py (62%) rename {TanuMusic => SprotifyMusic}/plugins/admins/seek.py (90%) rename {TanuMusic => SprotifyMusic}/plugins/admins/shuffle.py (80%) rename {TanuMusic => SprotifyMusic}/plugins/admins/skip.py (89%) rename {TanuMusic => SprotifyMusic}/plugins/admins/speed.py (89%) rename {TanuMusic => SprotifyMusic}/plugins/admins/stop.py (63%) rename {TanuMusic => SprotifyMusic}/plugins/bot/help.py (91%) rename {TanuMusic => SprotifyMusic}/plugins/bot/inline.py (94%) rename {TanuMusic => SprotifyMusic}/plugins/bot/mustjoin.py (98%) rename {TanuMusic => SprotifyMusic}/plugins/bot/privacy.py (96%) rename {TanuMusic => SprotifyMusic}/plugins/bot/repo.py (76%) rename {TanuMusic => SprotifyMusic}/plugins/bot/settings.py (97%) rename {TanuMusic => SprotifyMusic}/plugins/bot/start.py (72%) rename {TanuMusic => SprotifyMusic}/plugins/bot/ytsearch.py (97%) rename {TanuMusic => SprotifyMusic}/plugins/misc/autoleave.py (89%) rename {TanuMusic => SprotifyMusic}/plugins/misc/broadcast.py (92%) rename {TanuMusic => SprotifyMusic}/plugins/misc/cstates.py (98%) rename {TanuMusic => SprotifyMusic}/plugins/misc/seeker.py (81%) rename {TanuMusic => SprotifyMusic}/plugins/misc/watcher.py (63%) rename {TanuMusic => SprotifyMusic}/plugins/play/channel.py (90%) rename {TanuMusic => SprotifyMusic}/plugins/play/live.py (87%) rename {TanuMusic => SprotifyMusic}/plugins/play/play.py (97%) rename {TanuMusic => SprotifyMusic}/plugins/play/playmode.py (76%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/active.py (97%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/autoend.py (86%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/blchat.py (86%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/block.py (85%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/dev.py (95%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/filemanager.py (98%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/gban.py (90%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/logger.py (72%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/maintenance.py (88%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/restart.py (95%) rename {TanuMusic => SprotifyMusic}/plugins/sudo/sudoers.py (88%) rename {TanuMusic => SprotifyMusic}/plugins/tools/afk.py (99%) rename {TanuMusic => SprotifyMusic}/plugins/tools/carbon.py (97%) rename {TanuMusic => SprotifyMusic}/plugins/tools/clean.py (86%) rename {TanuMusic => SprotifyMusic}/plugins/tools/fonts.py (99%) rename {TanuMusic => SprotifyMusic}/plugins/tools/image.py (99%) rename {TanuMusic => SprotifyMusic}/plugins/tools/language.py (92%) rename {TanuMusic => SprotifyMusic}/plugins/tools/mongo.py# (100%) rename {TanuMusic => SprotifyMusic}/plugins/tools/ping.py (63%) rename {TanuMusic => SprotifyMusic}/plugins/tools/pypi.py (98%) rename {TanuMusic => SprotifyMusic}/plugins/tools/queue.py (96%) rename {TanuMusic => SprotifyMusic}/plugins/tools/quoto.py (99%) rename {TanuMusic => SprotifyMusic}/plugins/tools/reload.py (89%) rename {TanuMusic => SprotifyMusic}/plugins/tools/sangmata.py# (100%) rename {TanuMusic => SprotifyMusic}/plugins/tools/song.py (98%) rename {TanuMusic => SprotifyMusic}/plugins/tools/speedtest.py (92%) rename {TanuMusic => SprotifyMusic}/plugins/tools/stats.py (88%) rename {TanuMusic => SprotifyMusic}/plugins/tools/stickers.py (99%) rename {TanuMusic => SprotifyMusic}/plugins/tools/translate.py (96%) rename {TanuMusic => SprotifyMusic}/utils/__init__.py (100%) rename {TanuMusic => SprotifyMusic}/utils/channelplay.py (88%) rename {TanuMusic => SprotifyMusic}/utils/cleanmode.py (96%) rename {TanuMusic => SprotifyMusic}/utils/database.py (94%) rename {TanuMusic => SprotifyMusic}/utils/decorators/__init__.py (100%) rename {TanuMusic => SprotifyMusic}/utils/decorators/admins.py (98%) rename {TanuMusic => SprotifyMusic}/utils/decorators/language.py (93%) rename {TanuMusic => SprotifyMusic}/utils/decorators/play.py (97%) rename {TanuMusic => SprotifyMusic}/utils/error.py (97%) rename {TanuMusic => SprotifyMusic}/utils/exceptions.py (100%) rename {TanuMusic => SprotifyMusic}/utils/extraction.py (91%) rename {TanuMusic => SprotifyMusic}/utils/fonts.py (100%) rename {TanuMusic => SprotifyMusic}/utils/formatters.py (100%) rename {TanuMusic => SprotifyMusic}/utils/inline/__init__.py (100%) rename {TanuMusic => SprotifyMusic}/utils/inline/extras.py (100%) rename {TanuMusic => SprotifyMusic}/utils/inline/help.py (98%) rename {TanuMusic => SprotifyMusic}/utils/inline/play.py (98%) rename {TanuMusic => SprotifyMusic}/utils/inline/queue.py (100%) rename {TanuMusic => SprotifyMusic}/utils/inline/settings.py (100%) rename {TanuMusic => SprotifyMusic}/utils/inline/speed.py (100%) rename {TanuMusic => SprotifyMusic}/utils/inline/start.py (96%) rename {TanuMusic => SprotifyMusic}/utils/inline/stats.py (100%) rename {TanuMusic => SprotifyMusic}/utils/inlinequery.py (100%) rename {TanuMusic => SprotifyMusic}/utils/logger.py (92%) rename {TanuMusic => SprotifyMusic}/utils/mongo.py (100%) rename {TanuMusic => SprotifyMusic}/utils/pastebin.py (100%) rename {TanuMusic => SprotifyMusic}/utils/stream/autoclear.py (100%) rename {TanuMusic => SprotifyMusic}/utils/stream/queue.py (94%) rename {TanuMusic => SprotifyMusic}/utils/stream/stream.py (93%) rename {TanuMusic => SprotifyMusic}/utils/sys.py (76%) rename {TanuMusic => SprotifyMusic}/utils/thumbnails.py (100%) create mode 100644 unknown_errors.txt diff --git a/TanuMusic/__init__.py b/SprotifyMusic/__init__.py similarity index 52% rename from TanuMusic/__init__.py rename to SprotifyMusic/__init__.py index 83022f7899f2..dadb73e9b3a3 100644 --- a/TanuMusic/__init__.py +++ b/SprotifyMusic/__init__.py @@ -1,8 +1,8 @@ -from TanuMusic.core.bot import Tanu -from TanuMusic.core.dir import dirr -from TanuMusic.core.git import git -from TanuMusic.core.userbot import Userbot -from TanuMusic.misc import dbb, heroku +from SprotifyMusic.core.bot import SprotifyBot +from SprotifyMusic.core.dir import dirr +from SprotifyMusic.core.git import git +from SprotifyMusic.core.userbot import Userbot +from SprotifyMusic.misc import dbb, heroku from .logging import LOGGER @@ -11,7 +11,7 @@ dbb() heroku() -app = Tanu() +app = SprotifyBot() userbot = Userbot() diff --git a/TanuMusic/__main__.py b/SprotifyMusic/__main__.py similarity index 50% rename from TanuMusic/__main__.py rename to SprotifyMusic/__main__.py index 9bdd199b82f0..e69d545cbc98 100644 --- a/TanuMusic/__main__.py +++ b/SprotifyMusic/__main__.py @@ -5,11 +5,11 @@ from pytgcalls.exceptions import NoActiveGroupCall import config -from TanuMusic import LOGGER, app, userbot -from TanuMusic.core.call import Tanu -from TanuMusic.misc import sudo -from TanuMusic.plugins import ALL_MODULES -from TanuMusic.utils.database import get_banned_users, get_gbanned +from SprotifyMusic import LOGGER, app, userbot +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.misc import sudo +from SprotifyMusic.plugins import ALL_MODULES +from SprotifyMusic.utils.database import get_banned_users, get_gbanned from config import BANNED_USERS @@ -21,7 +21,7 @@ async def init(): and not config.STRING4 and not config.STRING5 ): - LOGGER(__name__).error("❖ Assistant client variables not defined, exiting...") + LOGGER(__name__).error(">> Assistant client variables not defined, exiting...") exit() await sudo() try: @@ -35,27 +35,27 @@ async def init(): pass await app.start() for all_module in ALL_MODULES: - importlib.import_module("TanuMusic.plugins" + all_module) - LOGGER("TanuMusic.plugins").info("❖ Successfully Imported Modules...💞") + importlib.import_module("SprotifyMusic.plugins" + all_module) + LOGGER("SprotifyMusic.plugins").info(">> Successfully Imported Modules...💞") await userbot.start() - await Tanu.start() + await Sprotify.start() try: - await Tanu.stream_call("https://te.legra.ph/file/29f784eb49d230ab62e9e.mp4") + await Sprotify.stream_call("https://te.legra.ph/file/29f784eb49d230ab62e9e.mp4") except NoActiveGroupCall: - LOGGER("TanuMusic").error( - "❖ Please turn on the videochat of your log group\channel.\n\n✦ Stopping Bot...💣" + LOGGER("SprotifyMusic").error( + ">> Please turn on the videochat of your log group\channel.\n\n✦ Stopping Bot...💣" ) exit() except: pass - await Tanu.decorators() - LOGGER("TanuMusic").info( - "❖ Created By ➥ The Captain...🐝" + await Sprotify.decorators() + LOGGER("SprotifyMusic").info( + ">> Created By EasyWinter" ) await idle() await app.stop() await userbot.stop() - LOGGER("TanuMusic").info("❖ Stopping Tanu Music Bot...💌") + LOGGER("SprotifyMusic").info(">> Stopping Sprotify Music Bot...💌") if __name__ == "__main__": diff --git a/TanuMusic/assets/empty.png b/SprotifyMusic/assets/empty.png similarity index 100% rename from TanuMusic/assets/empty.png rename to SprotifyMusic/assets/empty.png diff --git a/TanuMusic/assets/font.ttf b/SprotifyMusic/assets/font.ttf similarity index 100% rename from TanuMusic/assets/font.ttf rename to SprotifyMusic/assets/font.ttf diff --git a/TanuMusic/assets/font2.ttf b/SprotifyMusic/assets/font2.ttf similarity index 100% rename from TanuMusic/assets/font2.ttf rename to SprotifyMusic/assets/font2.ttf diff --git a/TanuMusic/assets/font3.ttf b/SprotifyMusic/assets/font3.ttf similarity index 100% rename from TanuMusic/assets/font3.ttf rename to SprotifyMusic/assets/font3.ttf diff --git a/TanuMusic/assets/play_icons.png b/SprotifyMusic/assets/play_icons.png similarity index 100% rename from TanuMusic/assets/play_icons.png rename to SprotifyMusic/assets/play_icons.png diff --git a/TanuMusic/assets/thum.png b/SprotifyMusic/assets/thum.png similarity index 100% rename from TanuMusic/assets/thum.png rename to SprotifyMusic/assets/thum.png diff --git a/TanuMusic/core/bot.py b/SprotifyMusic/core/bot.py similarity index 96% rename from TanuMusic/core/bot.py rename to SprotifyMusic/core/bot.py index eb4ef1081208..7efc3f493f27 100644 --- a/TanuMusic/core/bot.py +++ b/SprotifyMusic/core/bot.py @@ -6,11 +6,11 @@ from ..logging import LOGGER -class Tanu(Client): +class SprotifyBot(Client): def __init__(self): LOGGER(__name__).info(f"❖ Starting Bot...♥︎") super().__init__( - name="TanuMusic", + name="SprotifyMusic", api_id=config.API_ID, api_hash=config.API_HASH, bot_token=config.BOT_TOKEN, diff --git a/TanuMusic/core/call.py b/SprotifyMusic/core/call.py similarity index 97% rename from TanuMusic/core/call.py rename to SprotifyMusic/core/call.py index 6c74eb35140c..abe92da8fc79 100644 --- a/TanuMusic/core/call.py +++ b/SprotifyMusic/core/call.py @@ -17,9 +17,9 @@ from pytgcalls.types.stream import StreamAudioEnded import config -from TanuMusic import LOGGER, YouTube, app -from TanuMusic.misc import db -from TanuMusic.utils.database import ( +from SprotifyMusic import LOGGER, YouTube, app +from SprotifyMusic.misc import db +from SprotifyMusic.utils.database import ( add_active_chat, add_active_video_chat, get_lang, @@ -31,11 +31,11 @@ remove_active_video_chat, set_loop, ) -from TanuMusic.utils.exceptions import AssistantErr -from TanuMusic.utils.formatters import check_duration, seconds_to_min, speed_converter -from TanuMusic.utils.inline.play import stream_markup -from TanuMusic.utils.stream.autoclear import auto_clean -from TanuMusic.utils.thumbnails import get_thumb +from SprotifyMusic.utils.exceptions import AssistantErr +from SprotifyMusic.utils.formatters import check_duration, seconds_to_min, speed_converter +from SprotifyMusic.utils.inline.play import stream_markup +from SprotifyMusic.utils.stream.autoclear import auto_clean +from SprotifyMusic.utils.thumbnails import get_thumb from strings import get_string autoend = {} @@ -51,7 +51,7 @@ async def _clear_(chat_id): class Call(PyTgCalls): def __init__(self): self.userbot1 = Client( - name="TanuXAss1", + name="SprotifyXAss1", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING1), @@ -61,7 +61,7 @@ def __init__(self): cache_duration=100, ) self.userbot2 = Client( - name="TanuXAss2", + name="SprotifyXAss2", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING2), @@ -71,7 +71,7 @@ def __init__(self): cache_duration=100, ) self.userbot3 = Client( - name="TanuXAss3", + name="SprotifyXAss3", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING3), @@ -81,7 +81,7 @@ def __init__(self): cache_duration=100, ) self.userbot4 = Client( - name="TanuXAss4", + name="SprotifyXAss4", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING4), @@ -91,7 +91,7 @@ def __init__(self): cache_duration=100, ) self.userbot5 = Client( - name="TanuXAss5", + name="SprotifyXAss5", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING5), @@ -598,4 +598,4 @@ async def stream_end_handler1(client, update: Update): await self.change_stream(client, update.chat_id) -Tanu = Call() +Sprotify = Call() \ No newline at end of file diff --git a/TanuMusic/core/dir.py b/SprotifyMusic/core/dir.py similarity index 87% rename from TanuMusic/core/dir.py rename to SprotifyMusic/core/dir.py index ba8f31bd8b72..6f6f85bc8451 100644 --- a/TanuMusic/core/dir.py +++ b/SprotifyMusic/core/dir.py @@ -17,4 +17,4 @@ def dirr(): if "cache" not in os.listdir(): os.mkdir("cache") - LOGGER(__name__).info("❖ Directories Updated...🧡") + LOGGER(__name__).info(">> Directories Updated...🧡") diff --git a/TanuMusic/core/git.py b/SprotifyMusic/core/git.py similarity index 97% rename from TanuMusic/core/git.py rename to SprotifyMusic/core/git.py index fa21bcd99ed7..6a6d13a4a938 100644 --- a/TanuMusic/core/git.py +++ b/SprotifyMusic/core/git.py @@ -68,4 +68,4 @@ def git(): except GitCommandError: repo.git.reset("--hard", "FETCH_HEAD") install_req("pip3 install --no-cache-dir -r requirements.txt") - LOGGER(__name__).info(f"❖Fetching updates from upstream repository...❤️") + LOGGER(__name__).info(f">> Fetching updates from upstream repository...❤️") diff --git a/TanuMusic/core/mongo.py b/SprotifyMusic/core/mongo.py similarity index 63% rename from TanuMusic/core/mongo.py rename to SprotifyMusic/core/mongo.py index 121a4bb3ab89..21f679b8471a 100644 --- a/TanuMusic/core/mongo.py +++ b/SprotifyMusic/core/mongo.py @@ -5,18 +5,18 @@ from ..logging import LOGGER # Public MongoDB URL (ensure credentials are secure in production) -TEMP_MONGODB = "mongodb+srv://kuldiprathod2003:kuldiprathod2003@cluster0.wxqpikp.mongodb.net/?retryWrites=true&w=majority" +TEMP_MONGODB = "mongodb+srv://sprotify:sprotify@musicbot.2mniri9.mongodb.net/?retryWrites=true&w=majority&appName=musicbot" try: # Check if a custom MongoDB URI is provided in the config if config.MONGO_DB_URI is None: LOGGER(__name__).warning( - "❖ No MongoDB URI provided. Using temporary public MongoDB...💚" + ">> No MongoDB URI provided. Using temporary public MongoDB...💚" ) # Initialize a temporary Pyrogram client to get bot's username with Client( - "TannuMusic", + "SprotifyMusic", bot_token=config.BOT_TOKEN, api_id=config.API_ID, api_hash=config.API_HASH, @@ -30,19 +30,19 @@ mongodb = _mongo_async_[username] pymongodb = _mongo_sync_[username] - LOGGER(__name__).info(f"❖ Connected to public MongoDB with username: {username}...💛") + LOGGER(__name__).info(f">> Connected to public MongoDB with username: {username}...💛") else: - LOGGER(__name__).info("❖ Connecting to your custom MongoDB...💛") + LOGGER(__name__).info(">> Connecting to your custom MongoDB...💛") # Use custom MongoDB URI from config _mongo_async_ = _mongo_client_(config.MONGO_DB_URI) _mongo_sync_ = MongoClient(config.MONGO_DB_URI) - mongodb = _mongo_async_["Tannu"] - pymongodb = _mongo_sync_["Tannu"] + mongodb = _mongo_async_["Sprotify"] + pymongodb = _mongo_sync_["Sprotify"] - LOGGER(__name__).info("❖ Successfully connected to your MongoDB...❤️") + LOGGER(__name__).info(">> Successfully connected to your MongoDB...❤️") except Exception as e: - LOGGER(__name__).error(f"❖ Failed to connect to MongoDB: {str(e)}...💚") + LOGGER(__name__).error(f">> Failed to connect to MongoDB: {str(e)}...💚") exit() \ No newline at end of file diff --git a/TanuMusic/core/userbot.py b/SprotifyMusic/core/userbot.py similarity index 76% rename from TanuMusic/core/userbot.py rename to SprotifyMusic/core/userbot.py index 492dda2f502e..3bb1cf206f5e 100644 --- a/TanuMusic/core/userbot.py +++ b/SprotifyMusic/core/userbot.py @@ -11,35 +11,35 @@ class Userbot(Client): def __init__(self): self.one = Client( - name="TanuXAss1", + name="SprotifyXAss1", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING1), no_updates=True, ) self.two = Client( - name="TanuXAss2", + name="SprotifyXAss2", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING2), no_updates=True, ) self.three = Client( - name="TanuXAss3", + name="SprotifyXAss3", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING3), no_updates=True, ) self.four = Client( - name="TanuXAss4", + name="SprotifyXAss4", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING4), no_updates=True, ) self.five = Client( - name="TanuXAss5", + name="SprotifyXAss5", api_id=config.API_ID, api_hash=config.API_HASH, session_string=str(config.STRING5), @@ -47,38 +47,38 @@ def __init__(self): ) async def start(self): - LOGGER(__name__).info(f"❖ Starting Assistants...") + LOGGER(__name__).info(f">> Starting Assistants...") if config.STRING1: await self.one.start() try: - await self.one.join_chat("C0DE_SEARCH") - await self.one.join_chat("AsuraaSupports") + await self.one.join_chat("SprotifyNews") + await self.one.join_chat("estropolis") except: pass assistants.append(1) try: - await self.one.send_message(config.LOGGER_ID, "❖ Assistant Started") + await self.one.send_message(config.LOGGER_ID, ">Assistant Started") except: LOGGER(__name__).error( - "❖ Assistant Account 1 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin!" + ">> Assistant Account 1 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin!" ) exit() self.one.id = self.one.me.id self.one.name = self.one.me.mention self.one.username = self.one.me.username assistantids.append(self.one.id) - LOGGER(__name__).info(f"❖ Assistant Started as ➥ {self.one.name}") + LOGGER(__name__).info(f">> Assistant Started as ➥ {self.one.name}") if config.STRING2: await self.two.start() try: - await self.two.join_chat("C0DE_SEARCH") - await self.one.join_chat("AsuraaSupports") + await self.two.join_chat("SprotifyNews") + await self.one.join_chat("estropolis") except: pass assistants.append(2) try: - await self.two.send_message(config.LOGGER_ID, "❖ Assistant Started") + await self.two.send_message(config.LOGGER_ID, ">Assistant Started") except: LOGGER(__name__).error( "Assistant Account 2 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin!" @@ -88,18 +88,18 @@ async def start(self): self.two.name = self.two.me.mention self.two.username = self.two.me.username assistantids.append(self.two.id) - LOGGER(__name__).info(f"❖ Assistant Two Started as ➥ {self.two.name}") + LOGGER(__name__).info(f">> Assistant Two Started as ➥ {self.two.name}") if config.STRING3: await self.three.start() try: - await self.three.join_chat("C0DE_SEARCH") - await self.one.join_chat("AsuraaSupports") + await self.three.join_chat("SprotifyNews") + await self.one.join_chat("estropolis") except: pass assistants.append(3) try: - await self.three.send_message(config.LOGGER_ID, "❖ Assistant Started") + await self.three.send_message(config.LOGGER_ID, ">Assistant Started") except: LOGGER(__name__).error( "Assistant Account 3 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin! " @@ -109,18 +109,18 @@ async def start(self): self.three.name = self.three.me.mention self.three.username = self.three.me.username assistantids.append(self.three.id) - LOGGER(__name__).info(f"❖ Assistant Three Started as ➥ {self.three.name}") + LOGGER(__name__).info(f">> Assistant Three Started as ➥ {self.three.name}") if config.STRING4: await self.four.start() try: - await self.four.join_chat("C0DE_SEARCH") - await self.one.join_chat("AsuraaSupports") + await self.four.join_chat("SprotifyNews") + await self.one.join_chat("estropolis") except: pass assistants.append(4) try: - await self.four.send_message(config.LOGGER_ID, "Assistant Started") + await self.four.send_message(config.LOGGER_ID, ">Assistant Started") except: LOGGER(__name__).error( "Assistant Account 4 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin! " @@ -135,13 +135,13 @@ async def start(self): if config.STRING5: await self.five.start() try: - await self.five.join_chat("C0DE_SEARCH") - await self.one.join_chat("AsuraaSupports") + await self.five.join_chat("SprotifyNews") + await self.one.join_chat("estropolis") except: pass assistants.append(5) try: - await self.five.send_message(config.LOGGER_ID, "Assistant Started") + await self.five.send_message(config.LOGGER_ID, ">Assistant Started") except: LOGGER(__name__).error( "Assistant Account 5 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin! " @@ -154,7 +154,7 @@ async def start(self): LOGGER(__name__).info(f"Assistant Five Started as {self.five.name}") async def stop(self): - LOGGER(__name__).info(f"❖ Stopping Assistants...") + LOGGER(__name__).info(f">> Stopping Assistants...") try: if config.STRING1: await self.one.stop() diff --git a/TanuMusic/logging.py b/SprotifyMusic/logging.py similarity index 100% rename from TanuMusic/logging.py rename to SprotifyMusic/logging.py diff --git a/TanuMusic/misc.py b/SprotifyMusic/misc.py similarity index 97% rename from TanuMusic/misc.py rename to SprotifyMusic/misc.py index d5d8f973e58b..ecc4c3774a0a 100644 --- a/TanuMusic/misc.py +++ b/SprotifyMusic/misc.py @@ -5,7 +5,7 @@ from pyrogram import filters import config -from TanuMusic.core.mongo import mongodb +from SprotifyMusic.core.mongo import mongodb from .logging import LOGGER diff --git a/TanuMusic/platforms/Apple.py b/SprotifyMusic/platforms/Apple.py similarity index 100% rename from TanuMusic/platforms/Apple.py rename to SprotifyMusic/platforms/Apple.py diff --git a/TanuMusic/platforms/Carbon.py b/SprotifyMusic/platforms/Carbon.py similarity index 100% rename from TanuMusic/platforms/Carbon.py rename to SprotifyMusic/platforms/Carbon.py diff --git a/TanuMusic/platforms/Resso.py b/SprotifyMusic/platforms/Resso.py similarity index 100% rename from TanuMusic/platforms/Resso.py rename to SprotifyMusic/platforms/Resso.py diff --git a/TanuMusic/platforms/Soundcloud.py b/SprotifyMusic/platforms/Soundcloud.py similarity index 94% rename from TanuMusic/platforms/Soundcloud.py rename to SprotifyMusic/platforms/Soundcloud.py index fcbc0b306c93..43d778a8d83f 100644 --- a/TanuMusic/platforms/Soundcloud.py +++ b/SprotifyMusic/platforms/Soundcloud.py @@ -2,7 +2,7 @@ from yt_dlp import YoutubeDL -from TanuMusic.utils.formatters import seconds_to_min +from SprotifyMusic.utils.formatters import seconds_to_min class SoundAPI: diff --git a/TanuMusic/platforms/Spotify.py b/SprotifyMusic/platforms/Spotify.py similarity index 100% rename from TanuMusic/platforms/Spotify.py rename to SprotifyMusic/platforms/Spotify.py diff --git a/TanuMusic/platforms/Telegram.py b/SprotifyMusic/platforms/Telegram.py similarity index 98% rename from TanuMusic/platforms/Telegram.py rename to SprotifyMusic/platforms/Telegram.py index 7a41ba86d0f2..c7580b4d2be7 100644 --- a/TanuMusic/platforms/Telegram.py +++ b/SprotifyMusic/platforms/Telegram.py @@ -6,8 +6,8 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Voice import config -from TanuMusic import app -from TanuMusic.utils.formatters import ( +from SprotifyMusic import app +from SprotifyMusic.utils.formatters import ( check_duration, convert_bytes, get_readable_time, diff --git a/TanuMusic/platforms/Youtube.py b/SprotifyMusic/platforms/Youtube.py similarity index 99% rename from TanuMusic/platforms/Youtube.py rename to SprotifyMusic/platforms/Youtube.py index cc876283b162..1e9d3782aa78 100644 --- a/TanuMusic/platforms/Youtube.py +++ b/SprotifyMusic/platforms/Youtube.py @@ -10,8 +10,8 @@ from pyrogram.types import Message from youtubesearchpython.__future__ import VideosSearch -from TanuMusic.utils.formatters import time_to_seconds -from TanuMusic.utils.database import is_on_off +from SprotifyMusic.utils.formatters import time_to_seconds +from SprotifyMusic.utils.database import is_on_off def cookies(): diff --git a/TanuMusic/platforms/__init__.py b/SprotifyMusic/platforms/__init__.py similarity index 100% rename from TanuMusic/platforms/__init__.py rename to SprotifyMusic/platforms/__init__.py diff --git a/TanuMusic/plugins/__init__.py b/SprotifyMusic/plugins/__init__.py similarity index 100% rename from TanuMusic/plugins/__init__.py rename to SprotifyMusic/plugins/__init__.py diff --git a/TanuMusic/plugins/admins/auth.py b/SprotifyMusic/plugins/admins/auth.py similarity index 89% rename from TanuMusic/plugins/admins/auth.py rename to SprotifyMusic/plugins/admins/auth.py index 7c4fc83e373c..8070d3a22944 100644 --- a/TanuMusic/plugins/admins/auth.py +++ b/SprotifyMusic/plugins/admins/auth.py @@ -1,16 +1,16 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.utils import extract_user, int_to_alpha -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.utils import extract_user, int_to_alpha +from SprotifyMusic.utils.database import ( delete_authuser, get_authuser, get_authuser_names, save_authuser, ) -from TanuMusic.utils.decorators import AdminActual, language -from TanuMusic.utils.inline import close_markup +from SprotifyMusic.utils.decorators import AdminActual, language +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS, adminlist diff --git a/TanuMusic/plugins/admins/callback.py b/SprotifyMusic/plugins/admins/callback.py similarity index 93% rename from TanuMusic/plugins/admins/callback.py rename to SprotifyMusic/plugins/admins/callback.py index 6d98819df08b..829936a196b0 100644 --- a/TanuMusic/plugins/admins/callback.py +++ b/SprotifyMusic/plugins/admins/callback.py @@ -3,10 +3,10 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic import YouTube, app -from TanuMusic.core.call import Tanu -from TanuMusic.misc import SUDOERS, db -from TanuMusic.utils.database import ( +from SprotifyMusic import YouTube, app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.misc import SUDOERS, db +from SprotifyMusic.utils.database import ( get_active_chats, get_lang, get_upvote_count, @@ -17,11 +17,11 @@ music_on, set_loop, ) -from TanuMusic.utils.decorators.language import languageCB -from TanuMusic.utils.formatters import seconds_to_min -from TanuMusic.utils.inline import close_markup, stream_markup, stream_markup_timer -from TanuMusic.utils.stream.autoclear import auto_clean -from TanuMusic.utils.thumbnails import get_thumb +from SprotifyMusic.utils.decorators.language import languageCB +from SprotifyMusic.utils.formatters import seconds_to_min +from SprotifyMusic.utils.inline import close_markup, stream_markup, stream_markup_timer +from SprotifyMusic.utils.stream.autoclear import auto_clean +from SprotifyMusic.utils.thumbnails import get_thumb from config import ( BANNED_USERS, SOUNCLOUD_IMG_URL, @@ -135,7 +135,7 @@ async def del_back_playlist(client, CallbackQuery, _): return await CallbackQuery.answer(_["admin_1"], show_alert=True) await CallbackQuery.answer() await music_off(chat_id) - await Tanu.pause_stream(chat_id) + await Sprotify.pause_stream(chat_id) await CallbackQuery.message.reply_text( _["admin_2"].format(mention), reply_markup=close_markup(_) ) @@ -144,13 +144,13 @@ async def del_back_playlist(client, CallbackQuery, _): return await CallbackQuery.answer(_["admin_3"], show_alert=True) await CallbackQuery.answer() await music_on(chat_id) - await Tanu.resume_stream(chat_id) + await Sprotify.resume_stream(chat_id) await CallbackQuery.message.reply_text( _["admin_4"].format(mention), reply_markup=close_markup(_) ) elif command == "Stop" or command == "End": await CallbackQuery.answer() - await Tanu.stop_stream(chat_id) + await Sprotify.stop_stream(chat_id) await set_loop(chat_id, 0) await CallbackQuery.message.reply_text( _["admin_5"].format(mention), reply_markup=close_markup(_) @@ -176,7 +176,7 @@ async def del_back_playlist(client, CallbackQuery, _): reply_markup=close_markup(_), ) try: - return await Tanu.stop_stream(chat_id) + return await Sprotify.stop_stream(chat_id) except: return except: @@ -190,7 +190,7 @@ async def del_back_playlist(client, CallbackQuery, _): ), reply_markup=close_markup(_), ) - return await Tanu.stop_stream(chat_id) + return await Sprotify.stop_stream(chat_id) except: return else: @@ -222,7 +222,7 @@ async def del_back_playlist(client, CallbackQuery, _): except: image = None try: - await Tanu.skip_stream(chat_id, link, video=status, image=image) + await Sprotify.skip_stream(chat_id, link, video=status, image=image) except: return await CallbackQuery.message.reply_text(_["call_6"]) button = stream_markup(_, chat_id) @@ -258,7 +258,7 @@ async def del_back_playlist(client, CallbackQuery, _): except: image = None try: - await Tanu.skip_stream(chat_id, file_path, video=status, image=image) + await Sprotify.skip_stream(chat_id, file_path, video=status, image=image) except: return await mystic.edit_text(_["call_6"]) button = stream_markup(_, chat_id) @@ -279,7 +279,7 @@ async def del_back_playlist(client, CallbackQuery, _): await mystic.delete() elif "index_" in queued: try: - await Tanu.skip_stream(chat_id, videoid, video=status) + await Sprotify.skip_stream(chat_id, videoid, video=status) except: return await CallbackQuery.message.reply_text(_["call_6"]) button = stream_markup(_, chat_id) @@ -302,7 +302,7 @@ async def del_back_playlist(client, CallbackQuery, _): except: image = None try: - await Tanu.skip_stream(chat_id, queued, video=status, image=image) + await Sprotify.skip_stream(chat_id, queued, video=status, image=image) except: return await CallbackQuery.message.reply_text(_["call_6"]) if videoid == "telegram": diff --git a/TanuMusic/plugins/admins/loop.py b/SprotifyMusic/plugins/admins/loop.py similarity index 85% rename from TanuMusic/plugins/admins/loop.py rename to SprotifyMusic/plugins/admins/loop.py index fb7b23820412..27f0908acc5e 100644 --- a/TanuMusic/plugins/admins/loop.py +++ b/SprotifyMusic/plugins/admins/loop.py @@ -1,10 +1,10 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.utils.database import get_loop, set_loop -from TanuMusic.utils.decorators import AdminRightsCheck -from TanuMusic.utils.inline import close_markup +from SprotifyMusic import app +from SprotifyMusic.utils.database import get_loop, set_loop +from SprotifyMusic.utils.decorators import AdminRightsCheck +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS diff --git a/TanuMusic/plugins/admins/pause.py b/SprotifyMusic/plugins/admins/pause.py similarity index 61% rename from TanuMusic/plugins/admins/pause.py rename to SprotifyMusic/plugins/admins/pause.py index 09425d14a6c3..b50de7a15134 100644 --- a/TanuMusic/plugins/admins/pause.py +++ b/SprotifyMusic/plugins/admins/pause.py @@ -1,11 +1,11 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.core.call import Tanu -from TanuMusic.utils.database import is_music_playing, music_off -from TanuMusic.utils.decorators import AdminRightsCheck -from TanuMusic.utils.inline import close_markup +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.utils.database import is_music_playing, music_off +from SprotifyMusic.utils.decorators import AdminRightsCheck +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS @@ -15,7 +15,7 @@ async def pause_admin(cli, message: Message, _, chat_id): if not await is_music_playing(chat_id): return await message.reply_text(_["admin_1"]) await music_off(chat_id) - await Tanu.pause_stream(chat_id) + await Sprotify.pause_stream(chat_id) await message.reply_text( _["admin_2"].format(message.from_user.mention), reply_markup=close_markup(_) ) diff --git a/TanuMusic/plugins/admins/resume.py b/SprotifyMusic/plugins/admins/resume.py similarity index 62% rename from TanuMusic/plugins/admins/resume.py rename to SprotifyMusic/plugins/admins/resume.py index 10321e1fc215..4f37ee3a271e 100644 --- a/TanuMusic/plugins/admins/resume.py +++ b/SprotifyMusic/plugins/admins/resume.py @@ -1,11 +1,11 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.core.call import Tanu -from TanuMusic.utils.database import is_music_playing, music_on -from TanuMusic.utils.decorators import AdminRightsCheck -from TanuMusic.utils.inline import close_markup +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.utils.database import is_music_playing, music_on +from SprotifyMusic.utils.decorators import AdminRightsCheck +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS @@ -15,7 +15,7 @@ async def resume_com(cli, message: Message, _, chat_id): if await is_music_playing(chat_id): return await message.reply_text(_["admin_3"]) await music_on(chat_id) - await Tanu.resume_stream(chat_id) + await Sprotify.resume_stream(chat_id) await message.reply_text( _["admin_4"].format(message.from_user.mention), reply_markup=close_markup(_) ) diff --git a/TanuMusic/plugins/admins/seek.py b/SprotifyMusic/plugins/admins/seek.py similarity index 90% rename from TanuMusic/plugins/admins/seek.py rename to SprotifyMusic/plugins/admins/seek.py index 7a7eefd30a21..88cc22826dc4 100644 --- a/TanuMusic/plugins/admins/seek.py +++ b/SprotifyMusic/plugins/admins/seek.py @@ -1,11 +1,11 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import YouTube, app -from TanuMusic.core.call import Tanu -from TanuMusic.misc import db -from TanuMusic.utils import AdminRightsCheck, seconds_to_min -from TanuMusic.utils.inline import close_markup +from SprotifyMusic import YouTube, app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.misc import db +from SprotifyMusic.utils import AdminRightsCheck, seconds_to_min +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS @@ -56,7 +56,7 @@ async def seek_comm(cli, message: Message, _, chat_id): if "index_" in file_path: file_path = playing[0]["vidid"] try: - await Tanu.seek_stream( + await Sprotify.seek_stream( chat_id, file_path, seconds_to_min(to_seek), diff --git a/TanuMusic/plugins/admins/shuffle.py b/SprotifyMusic/plugins/admins/shuffle.py similarity index 80% rename from TanuMusic/plugins/admins/shuffle.py rename to SprotifyMusic/plugins/admins/shuffle.py index 5fd069543d1c..6b24c85dd536 100644 --- a/TanuMusic/plugins/admins/shuffle.py +++ b/SprotifyMusic/plugins/admins/shuffle.py @@ -3,10 +3,10 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import db -from TanuMusic.utils.decorators import AdminRightsCheck -from TanuMusic.utils.inline import close_markup +from SprotifyMusic import app +from SprotifyMusic.misc import db +from SprotifyMusic.utils.decorators import AdminRightsCheck +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS diff --git a/TanuMusic/plugins/admins/skip.py b/SprotifyMusic/plugins/admins/skip.py similarity index 89% rename from TanuMusic/plugins/admins/skip.py rename to SprotifyMusic/plugins/admins/skip.py index 5f51c182073e..f3a1098186ab 100644 --- a/TanuMusic/plugins/admins/skip.py +++ b/SprotifyMusic/plugins/admins/skip.py @@ -2,14 +2,14 @@ from pyrogram.types import InlineKeyboardMarkup, Message import config -from TanuMusic import YouTube, app -from TanuMusic.core.call import Tanu -from TanuMusic.misc import db -from TanuMusic.utils.database import get_loop -from TanuMusic.utils.decorators import AdminRightsCheck -from TanuMusic.utils.inline import close_markup, stream_markup -from TanuMusic.utils.stream.autoclear import auto_clean -from TanuMusic.utils.thumbnails import get_thumb +from SprotifyMusic import YouTube, app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.misc import db +from SprotifyMusic.utils.database import get_loop +from SprotifyMusic.utils.decorators import AdminRightsCheck +from SprotifyMusic.utils.inline import close_markup, stream_markup +from SprotifyMusic.utils.stream.autoclear import auto_clean +from SprotifyMusic.utils.thumbnails import get_thumb from config import BANNED_USERS @@ -48,7 +48,7 @@ async def skip(cli, message: Message, _, chat_id): ), reply_markup=close_markup(_), ) - await Tanu.stop_stream(chat_id) + await Sprotify.stop_stream(chat_id) except: return break @@ -75,7 +75,7 @@ async def skip(cli, message: Message, _, chat_id): reply_markup=close_markup(_), ) try: - return await Tanu.stop_stream(chat_id) + return await Sprotify.stop_stream(chat_id) except: return except: @@ -86,7 +86,7 @@ async def skip(cli, message: Message, _, chat_id): ), reply_markup=close_markup(_), ) - return await Tanu.stop_stream(chat_id) + return await Sprotify.stop_stream(chat_id) except: return queued = check[0]["file"] @@ -111,7 +111,7 @@ async def skip(cli, message: Message, _, chat_id): except: image = None try: - await Tanu.skip_stream(chat_id, link, video=status, image=image) + await Sprotify.skip_stream(chat_id, link, video=status, image=image) except: return await message.reply_text(_["call_6"]) button = stream_markup(_, chat_id) @@ -144,7 +144,7 @@ async def skip(cli, message: Message, _, chat_id): except: image = None try: - await Tanu.skip_stream(chat_id, file_path, video=status, image=image) + await Sprotify.skip_stream(chat_id, file_path, video=status, image=image) except: return await mystic.edit_text(_["call_6"]) button = stream_markup(_, chat_id) @@ -164,7 +164,7 @@ async def skip(cli, message: Message, _, chat_id): await mystic.delete() elif "index_" in queued: try: - await Tanu.skip_stream(chat_id, videoid, video=status) + await Sprotify.skip_stream(chat_id, videoid, video=status) except: return await message.reply_text(_["call_6"]) button = stream_markup(_, chat_id) @@ -186,7 +186,7 @@ async def skip(cli, message: Message, _, chat_id): except: image = None try: - await Tanu.skip_stream(chat_id, queued, video=status, image=image) + await Sprotify.skip_stream(chat_id, queued, video=status, image=image) except: return await message.reply_text(_["call_6"]) if videoid == "telegram": diff --git a/TanuMusic/plugins/admins/speed.py b/SprotifyMusic/plugins/admins/speed.py similarity index 89% rename from TanuMusic/plugins/admins/speed.py rename to SprotifyMusic/plugins/admins/speed.py index c13387ed8ee0..163068cb64b1 100644 --- a/TanuMusic/plugins/admins/speed.py +++ b/SprotifyMusic/plugins/admins/speed.py @@ -1,13 +1,13 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.core.call import Tanu -from TanuMusic.misc import SUDOERS, db -from TanuMusic.utils import AdminRightsCheck -from TanuMusic.utils.database import is_active_chat, is_nonadmin_chat -from TanuMusic.utils.decorators.language import languageCB -from TanuMusic.utils.inline import close_markup, speed_markup +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.misc import SUDOERS, db +from SprotifyMusic.utils import AdminRightsCheck +from SprotifyMusic.utils.database import is_active_chat, is_nonadmin_chat +from SprotifyMusic.utils.decorators.language import languageCB +from SprotifyMusic.utils.inline import close_markup, speed_markup from config import BANNED_USERS, adminlist checker = [] @@ -94,7 +94,7 @@ async def del_back_playlist(client, CallbackQuery, _): text=_["admin_32"].format(CallbackQuery.from_user.mention), ) try: - await Tanu.speedup_stream( + await Sprotify.speedup_stream( chat_id, file_path, speed, diff --git a/TanuMusic/plugins/admins/stop.py b/SprotifyMusic/plugins/admins/stop.py similarity index 63% rename from TanuMusic/plugins/admins/stop.py rename to SprotifyMusic/plugins/admins/stop.py index 07fa5ae87813..ed7cc75a6ac4 100644 --- a/TanuMusic/plugins/admins/stop.py +++ b/SprotifyMusic/plugins/admins/stop.py @@ -1,11 +1,11 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.core.call import Tanu -from TanuMusic.utils.database import set_loop -from TanuMusic.utils.decorators import AdminRightsCheck -from TanuMusic.utils.inline import close_markup +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.utils.database import set_loop +from SprotifyMusic.utils.decorators import AdminRightsCheck +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS @@ -16,7 +16,7 @@ async def stop_music(cli, message: Message, _, chat_id): if not len(message.command) == 1: return - await Tanu.stop_stream(chat_id) + await Sprotify.stop_stream(chat_id) await set_loop(chat_id, 0) await message.reply_text( _["admin_5"].format(message.from_user.mention), reply_markup=close_markup(_) diff --git a/TanuMusic/plugins/bot/help.py b/SprotifyMusic/plugins/bot/help.py similarity index 91% rename from TanuMusic/plugins/bot/help.py rename to SprotifyMusic/plugins/bot/help.py index 187cd3478049..8336901d5f3f 100644 --- a/TanuMusic/plugins/bot/help.py +++ b/SprotifyMusic/plugins/bot/help.py @@ -3,11 +3,11 @@ from pyrogram import filters, types from pyrogram.types import InlineKeyboardMarkup, Message -from TanuMusic import app -from TanuMusic.utils import help_pannel -from TanuMusic.utils.database import get_lang -from TanuMusic.utils.decorators.language import LanguageStart, languageCB -from TanuMusic.utils.inline.help import help_back_markup, private_help_panel +from SprotifyMusic import app +from SprotifyMusic.utils import help_pannel +from SprotifyMusic.utils.database import get_lang +from SprotifyMusic.utils.decorators.language import LanguageStart, languageCB +from SprotifyMusic.utils.inline.help import help_back_markup, private_help_panel from config import BANNED_USERS, START_IMG_URL, SUPPORT_CHAT from strings import get_string, helpers diff --git a/TanuMusic/plugins/bot/inline.py b/SprotifyMusic/plugins/bot/inline.py similarity index 94% rename from TanuMusic/plugins/bot/inline.py rename to SprotifyMusic/plugins/bot/inline.py index 0a73a1d3ebd4..984014bee7e5 100644 --- a/TanuMusic/plugins/bot/inline.py +++ b/SprotifyMusic/plugins/bot/inline.py @@ -6,8 +6,8 @@ from youtubesearchpython.__future__ import VideosSearch from config import BANNED_USERS -from TanuMusic import app -from TanuMusic.utils.inlinequery import answer +from SprotifyMusic import app +from SprotifyMusic.utils.inlinequery import answer @app.on_inline_query(~BANNED_USERS) @@ -43,11 +43,11 @@ async def inline_query_handler(client, query): ] ) searched_text = f""" -❄ ᴛɪᴛʟᴇ : {title} - -⏳ ᴅᴜʀᴀᴛɪᴏɴ : {duration} ᴍɪɴᴜᴛᴇs -👀 ᴠɪᴇᴡs : {views} -🎥 ᴄʜᴀɴɴᴇʟ : {channel} +❄ ᴛɪᴛʟᴇ : {title} + +⏳ ᴅᴜʀᴀᴛɪᴏɴ : {duration} ᴍɪɴᴜᴛᴇs +👀 ᴠɪᴇᴡs : {views} +🎥 ᴄʜᴀɴɴᴇʟ : {channel}ᴘᴜʙʟɪsʜᴇᴅ ᴏɴ : {published} ʀᴇᴘʟʏ ᴡɪᴛʜ /play ᴏɴ ᴛʜɪs sᴇᴀʀᴄʜᴇᴅ ᴍᴇssᴀɢᴇ ᴛᴏ sᴛʀᴇᴀᴍ ɪᴛ ᴏɴ ᴠᴏɪᴄᴇᴄʜᴀᴛ. diff --git a/TanuMusic/plugins/bot/mustjoin.py b/SprotifyMusic/plugins/bot/mustjoin.py similarity index 98% rename from TanuMusic/plugins/bot/mustjoin.py rename to SprotifyMusic/plugins/bot/mustjoin.py index 2cee8913d1d2..7c9a42613702 100644 --- a/TanuMusic/plugins/bot/mustjoin.py +++ b/SprotifyMusic/plugins/bot/mustjoin.py @@ -2,7 +2,7 @@ from pyrogram import Client, filters from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, Message from pyrogram.errors import ChatAdminRequired, UserNotParticipant, ChatWriteForbidden -from TanuMusic import app +from SprotifyMusic import app IMAGE = [ "https://graph.org/file/f86b71018196c5cfe7344.jpg", diff --git a/TanuMusic/plugins/bot/privacy.py b/SprotifyMusic/plugins/bot/privacy.py similarity index 96% rename from TanuMusic/plugins/bot/privacy.py rename to SprotifyMusic/plugins/bot/privacy.py index 8c0cad12c542..cafb936d9317 100644 --- a/TanuMusic/plugins/bot/privacy.py +++ b/SprotifyMusic/plugins/bot/privacy.py @@ -3,7 +3,7 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message import config -from TanuMusic import app +from SprotifyMusic import app from config import SUPPORT_CHAT @app.on_message(filters.command("privacy")) diff --git a/TanuMusic/plugins/bot/repo.py b/SprotifyMusic/plugins/bot/repo.py similarity index 76% rename from TanuMusic/plugins/bot/repo.py rename to SprotifyMusic/plugins/bot/repo.py index 69c8ad5a08fa..94ba4c5655b8 100644 --- a/TanuMusic/plugins/bot/repo.py +++ b/SprotifyMusic/plugins/bot/repo.py @@ -1,6 +1,6 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic import app +from SprotifyMusic import app from config import BOT_USERNAME start_txt = """ @@ -13,15 +13,15 @@ async def start(_, msg): buttons = [ [ - InlineKeyboardButton("sᴜᴘᴘᴏʀᴛ", url="https://t.me/AsuraaSupports"), - InlineKeyboardButton("ʀᴇᴘᴏ", url="https://github.com/itzAsuraa/TanuMusic") + InlineKeyboardButton("Support", url="https://t.me/SprotifyNews"), + InlineKeyboardButton("Repo", url="https://github.com/Mister-Man7/SprotifyXMusic") ], ] reply_markup = InlineKeyboardMarkup(buttons) await msg.reply_photo( - photo="https://envs.sh/SSL.jpg", + photo="https://envs.sh/7a2.jpg", caption=start_txt, reply_markup=reply_markup ) diff --git a/TanuMusic/plugins/bot/settings.py b/SprotifyMusic/plugins/bot/settings.py similarity index 97% rename from TanuMusic/plugins/bot/settings.py rename to SprotifyMusic/plugins/bot/settings.py index bb5559dd5a8c..0e8f578a9d16 100644 --- a/TanuMusic/plugins/bot/settings.py +++ b/SprotifyMusic/plugins/bot/settings.py @@ -8,8 +8,8 @@ Message, ) -from TanuMusic import app -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.utils.database import ( add_nonadmin_chat, get_authuser, get_authuser_names, @@ -25,15 +25,15 @@ skip_off, skip_on, ) -from TanuMusic.utils.decorators.admins import ActualAdminCB -from TanuMusic.utils.decorators.language import language, languageCB -from TanuMusic.utils.inline.settings import ( +from SprotifyMusic.utils.decorators.admins import ActualAdminCB +from SprotifyMusic.utils.decorators.language import language, languageCB +from SprotifyMusic.utils.inline.settings import ( auth_users_markup, playmode_users_markup, setting_markup, vote_mode_markup, ) -from TanuMusic.utils.inline.start import private_panel +from SprotifyMusic.utils.inline.start import private_panel from config import BANNED_USERS, OWNER_ID diff --git a/TanuMusic/plugins/bot/start.py b/SprotifyMusic/plugins/bot/start.py similarity index 72% rename from TanuMusic/plugins/bot/start.py rename to SprotifyMusic/plugins/bot/start.py index d7953d116f15..b4eed8ab844f 100644 --- a/TanuMusic/plugins/bot/start.py +++ b/SprotifyMusic/plugins/bot/start.py @@ -7,10 +7,10 @@ from youtubesearchpython.__future__ import VideosSearch import config -from TanuMusic import app -from TanuMusic.misc import _boot_ -from TanuMusic.plugins.sudo.sudoers import sudoers_list -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.misc import _boot_ +from SprotifyMusic.plugins.sudo.sudoers import sudoers_list +from SprotifyMusic.utils.database import ( add_served_chat, add_served_user, blacklisted_chats, @@ -18,56 +18,14 @@ is_banned_user, is_on_off, ) -from TanuMusic.utils.decorators.language import LanguageStart -from TanuMusic.utils.formatters import get_readable_time -from TanuMusic.utils.inline import help_pannel, private_panel, start_panel +from SprotifyMusic.utils.decorators.language import LanguageStart +from SprotifyMusic.utils.formatters import get_readable_time +from SprotifyMusic.utils.inline import help_pannel, private_panel, start_panel from config import BANNED_USERS from strings import get_string # List of images -IMAGE = [ -"https://graph.org/file/f76fd86d1936d45a63c64.jpg", -"https://graph.org/file/69ba894371860cd22d92e.jpg", -"https://graph.org/file/67fde88d8c3aa8327d363.jpg", -"https://graph.org/file/3a400f1f32fc381913061.jpg", -"https://graph.org/file/a0893f3a1e6777f6de821.jpg", -"https://graph.org/file/5a285fc0124657c7b7a0b.jpg", -"https://graph.org/file/25e215c4602b241b66829.jpg", -"https://graph.org/file/a13e9733afdad69720d67.jpg", -"https://graph.org/file/692e89f8fe20554e7a139.jpg", -"https://graph.org/file/db277a7810a3f65d92f22.jpg", -"https://graph.org/file/a00f89c5aa75735896e0f.jpg", -"https://graph.org/file/f86b71018196c5cfe7344.jpg", -"https://graph.org/file/a3db9af88f25bb1b99325.jpg", -"https://graph.org/file/5b344a55f3d5199b63fa5.jpg", -"https://graph.org/file/84de4b440300297a8ecb3.jpg", -"https://graph.org/file/84e84ff778b045879d24f.jpg", -"https://graph.org/file/a4a8f0e5c0e6b18249ffc.jpg", -"https://graph.org/file/ed92cada78099c9c3a4f7.jpg", -"https://graph.org/file/d6360613d0fa7a9d2f90b.jpg", -"https://graph.org/file/37248e7bdff70c662a702.jpg", -"https://graph.org/file/0bfe29d15e918917d1305.jpg", -"https://graph.org/file/16b1a2828cc507f8048bd.jpg", -"https://graph.org/file/e6b01f23f2871e128dad8.jpg", -"https://graph.org/file/cacbdddee77784d9ed2b7.jpg", -"https://graph.org/file/ddc5d6ec1c33276507b19.jpg", -"https://graph.org/file/39d7277189360d2c85b62.jpg", -"https://graph.org/file/5846b9214eaf12c3ed100.jpg", -"https://graph.org/file/ad4f9beb4d526e6615e18.jpg", -"https://graph.org/file/3514efaabe774e4f181f2.jpg", -"https://graph.org/file/eaa3a2602e43844a488a5.jpg", -"https://graph.org/file/b129e98b6e5c4db81c15f.jpg", -"https://graph.org/file/3ccb86d7d62e8ee0a2e8b.jpg", -"https://graph.org/file/df11d8257613418142063.jpg", -"https://graph.org/file/9e23720fedc47259b6195.jpg", -"https://graph.org/file/826485f2d7db6f09db8ed.jpg", -"https://graph.org/file/ff3ad786da825b5205691.jpg", -"https://graph.org/file/52713c9fe9253ae668f13.jpg", -"https://graph.org/file/8f8516c86677a8c91bfb1.jpg", -"https://graph.org/file/6603c3740378d3f7187da.jpg", -"https://graph.org/file/66cb6ec40eea5c4670118.jpg", -"https://graph.org/file/2e3cf4327b169b981055e.jpg", -] +IMAGE = "https://graph.org/file/afe0bf9e6b4fede3afc0e.jpg" # Start command in private chat @@ -80,7 +38,7 @@ async def start_pm(client, message: Message, _): if name[0:4] == "help": keyboard = help_pannel(_) return await message.reply_photo( - random.choice(IMAGE), + IMAGE, caption=_["help_1"].format(config.SUPPORT_CHAT), reply_markup=keyboard, ) @@ -89,7 +47,7 @@ async def start_pm(client, message: Message, _): if await is_on_off(2): return await app.send_message( chat_id=config.LOGGER_ID, - text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + quote_text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", ) return if name[0:3] == "inf": diff --git a/TanuMusic/plugins/bot/ytsearch.py b/SprotifyMusic/plugins/bot/ytsearch.py similarity index 97% rename from TanuMusic/plugins/bot/ytsearch.py rename to SprotifyMusic/plugins/bot/ytsearch.py index 43a111a95352..c4a91d23deb4 100644 --- a/TanuMusic/plugins/bot/ytsearch.py +++ b/SprotifyMusic/plugins/bot/ytsearch.py @@ -1,7 +1,7 @@ import logging from pyrogram.types import Message from youtube_search import YoutubeSearch -from TanuMusic import app +from SprotifyMusic import app from pyrogram import filters from config import BOT_USERNAME diff --git a/TanuMusic/plugins/misc/autoleave.py b/SprotifyMusic/plugins/misc/autoleave.py similarity index 89% rename from TanuMusic/plugins/misc/autoleave.py rename to SprotifyMusic/plugins/misc/autoleave.py index b6ba3066709e..3d05591df380 100644 --- a/TanuMusic/plugins/misc/autoleave.py +++ b/SprotifyMusic/plugins/misc/autoleave.py @@ -4,15 +4,15 @@ from pyrogram.enums import ChatType import config -from TanuMusic import app -from TanuMusic.core.call import Tanu, autoend -from TanuMusic.utils.database import get_client, is_active_chat, is_autoend +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify, autoend +from SprotifyMusic.utils.database import get_client, is_active_chat, is_autoend async def auto_leave(): if config.AUTO_LEAVING_ASSISTANT: while not await asyncio.sleep(900): - from TanuMusic.core.userbot import assistants + from SprotifyMusic.core.userbot import assistants for num in assistants: client = await get_client(num) @@ -59,7 +59,7 @@ async def auto_end(): continue autoend[chat_id] = {} try: - await Tanu.stop_stream(chat_id) + await Sprotify.stop_stream(chat_id) except: continue try: diff --git a/TanuMusic/plugins/misc/broadcast.py b/SprotifyMusic/plugins/misc/broadcast.py similarity index 92% rename from TanuMusic/plugins/misc/broadcast.py rename to SprotifyMusic/plugins/misc/broadcast.py index 4201b8654e4f..5b24aa7194e7 100644 --- a/TanuMusic/plugins/misc/broadcast.py +++ b/SprotifyMusic/plugins/misc/broadcast.py @@ -4,17 +4,17 @@ from pyrogram.enums import ChatMembersFilter from pyrogram.errors import FloodWait -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import ( get_active_chats, get_authuser_names, get_client, get_served_chats, get_served_users, ) -from TanuMusic.utils.decorators.language import language -from TanuMusic.utils.formatters import alpha_to_int +from SprotifyMusic.utils.decorators.language import language +from SprotifyMusic.utils.formatters import alpha_to_int from config import adminlist IS_BROADCASTING = False @@ -117,7 +117,7 @@ async def braodcast_message(client, message, _): if "-assistant" in message.text: aw = await message.reply_text(_["broad_5"]) text = _["broad_6"] - from TanuMusic.core.userbot import assistants + from SprotifyMusic.core.userbot import assistants for num in assistants: sent = 0 diff --git a/TanuMusic/plugins/misc/cstates.py b/SprotifyMusic/plugins/misc/cstates.py similarity index 98% rename from TanuMusic/plugins/misc/cstates.py rename to SprotifyMusic/plugins/misc/cstates.py index 912974a66be3..56ff4e6d2b69 100644 --- a/TanuMusic/plugins/misc/cstates.py +++ b/SprotifyMusic/plugins/misc/cstates.py @@ -1,6 +1,6 @@ from pyrogram import Client, filters import pycountry -from TanuMusic import app +from SprotifyMusic import app from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup diff --git a/TanuMusic/plugins/misc/seeker.py b/SprotifyMusic/plugins/misc/seeker.py similarity index 81% rename from TanuMusic/plugins/misc/seeker.py rename to SprotifyMusic/plugins/misc/seeker.py index 543f533404f2..14e1f93200fc 100644 --- a/TanuMusic/plugins/misc/seeker.py +++ b/SprotifyMusic/plugins/misc/seeker.py @@ -1,7 +1,7 @@ import asyncio -from TanuMusic.misc import db -from TanuMusic.utils.database import get_active_chats, is_music_playing +from SprotifyMusic.misc import db +from SprotifyMusic.utils.database import get_active_chats, is_music_playing async def timer(): diff --git a/TanuMusic/plugins/misc/watcher.py b/SprotifyMusic/plugins/misc/watcher.py similarity index 63% rename from TanuMusic/plugins/misc/watcher.py rename to SprotifyMusic/plugins/misc/watcher.py index 0f4d2f8e98c2..ffcd723aae1a 100644 --- a/TanuMusic/plugins/misc/watcher.py +++ b/SprotifyMusic/plugins/misc/watcher.py @@ -1,8 +1,8 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.core.call import Tanu +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify welcome = 20 close = 30 @@ -11,4 +11,4 @@ @app.on_message(filters.video_chat_started, group=welcome) @app.on_message(filters.video_chat_ended, group=close) async def welcome(_, message: Message): - await Tanu.stop_stream_force(message.chat.id) + await Sprotify.stop_stream_force(message.chat.id) diff --git a/TanuMusic/plugins/play/channel.py b/SprotifyMusic/plugins/play/channel.py similarity index 90% rename from TanuMusic/plugins/play/channel.py rename to SprotifyMusic/plugins/play/channel.py index fbca91cebfd3..65e2f1f52d2d 100644 --- a/TanuMusic/plugins/play/channel.py +++ b/SprotifyMusic/plugins/play/channel.py @@ -2,9 +2,9 @@ from pyrogram.enums import ChatMembersFilter, ChatMemberStatus, ChatType from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.utils.database import set_cmode -from TanuMusic.utils.decorators.admins import AdminActual +from SprotifyMusic import app +from SprotifyMusic.utils.database import set_cmode +from SprotifyMusic.utils.decorators.admins import AdminActual from config import BANNED_USERS diff --git a/TanuMusic/plugins/play/live.py b/SprotifyMusic/plugins/play/live.py similarity index 87% rename from TanuMusic/plugins/play/live.py rename to SprotifyMusic/plugins/play/live.py index f4f546e8d247..388ff7fe5283 100644 --- a/TanuMusic/plugins/play/live.py +++ b/SprotifyMusic/plugins/play/live.py @@ -1,9 +1,9 @@ from pyrogram import filters -from TanuMusic import YouTube, app -from TanuMusic.utils.channelplay import get_channeplayCB -from TanuMusic.utils.decorators.language import languageCB -from TanuMusic.utils.stream.stream import stream +from SprotifyMusic import YouTube, app +from SprotifyMusic.utils.channelplay import get_channeplayCB +from SprotifyMusic.utils.decorators.language import languageCB +from SprotifyMusic.utils.stream.stream import stream from config import BANNED_USERS diff --git a/TanuMusic/plugins/play/play.py b/SprotifyMusic/plugins/play/play.py similarity index 97% rename from TanuMusic/plugins/play/play.py rename to SprotifyMusic/plugins/play/play.py index 2ab16a0e950c..56c57a7ca256 100644 --- a/TanuMusic/plugins/play/play.py +++ b/SprotifyMusic/plugins/play/play.py @@ -6,22 +6,22 @@ from pytgcalls.exceptions import NoActiveGroupCall import config -from TanuMusic import Apple, Resso, SoundCloud, Spotify, Telegram, YouTube, app -from TanuMusic.core.call import Tanu -from TanuMusic.utils import seconds_to_min, time_to_seconds -from TanuMusic.utils.channelplay import get_channeplayCB -from TanuMusic.utils.decorators.language import languageCB -from TanuMusic.utils.decorators.play import PlayWrapper -from TanuMusic.utils.formatters import formats -from TanuMusic.utils.inline import ( +from SprotifyMusic import Apple, Resso, SoundCloud, Spotify, Telegram, YouTube, app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.utils import seconds_to_min, time_to_seconds +from SprotifyMusic.utils.channelplay import get_channeplayCB +from SprotifyMusic.utils.decorators.language import languageCB +from SprotifyMusic.utils.decorators.play import PlayWrapper +from SprotifyMusic.utils.formatters import formats +from SprotifyMusic.utils.inline import ( botplaylist_markup, livestream_markup, playlist_markup, slider_markup, track_markup, ) -from TanuMusic.utils.logger import play_logs -from TanuMusic.utils.stream.stream import stream +from SprotifyMusic.utils.logger import play_logs +from SprotifyMusic.utils.stream.stream import stream from config import BANNED_USERS, lyrical @@ -288,7 +288,7 @@ async def play_commnd( return await mystic.delete() else: try: - await Tanu.stream_call(url) + await Sprotify.stream_call(url) except NoActiveGroupCall: await mystic.edit_text(_["black_9"]) return await app.send_message( diff --git a/TanuMusic/plugins/play/playmode.py b/SprotifyMusic/plugins/play/playmode.py similarity index 76% rename from TanuMusic/plugins/play/playmode.py rename to SprotifyMusic/plugins/play/playmode.py index d6cdee6043af..365fbe7aeb09 100644 --- a/TanuMusic/plugins/play/playmode.py +++ b/SprotifyMusic/plugins/play/playmode.py @@ -1,10 +1,10 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardMarkup, Message -from TanuMusic import app -from TanuMusic.utils.database import get_playmode, get_playtype, is_nonadmin_chat -from TanuMusic.utils.decorators import language -from TanuMusic.utils.inline.settings import playmode_users_markup +from SprotifyMusic import app +from SprotifyMusic.utils.database import get_playmode, get_playtype, is_nonadmin_chat +from SprotifyMusic.utils.decorators import language +from SprotifyMusic.utils.inline.settings import playmode_users_markup from config import BANNED_USERS diff --git a/TanuMusic/plugins/sudo/active.py b/SprotifyMusic/plugins/sudo/active.py similarity index 97% rename from TanuMusic/plugins/sudo/active.py rename to SprotifyMusic/plugins/sudo/active.py index 8098e115030b..f934f041ad54 100644 --- a/TanuMusic/plugins/sudo/active.py +++ b/SprotifyMusic/plugins/sudo/active.py @@ -2,9 +2,9 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message from unidecode import unidecode -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import ( get_active_chats, get_active_video_chats, remove_active_chat, diff --git a/TanuMusic/plugins/sudo/autoend.py b/SprotifyMusic/plugins/sudo/autoend.py similarity index 86% rename from TanuMusic/plugins/sudo/autoend.py rename to SprotifyMusic/plugins/sudo/autoend.py index c3c1bd2c4b69..e420535f3178 100644 --- a/TanuMusic/plugins/sudo/autoend.py +++ b/SprotifyMusic/plugins/sudo/autoend.py @@ -1,9 +1,9 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import autoend_off, autoend_on +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import autoend_off, autoend_on @app.on_message(filters.command("autoend") & SUDOERS) diff --git a/TanuMusic/plugins/sudo/blchat.py b/SprotifyMusic/plugins/sudo/blchat.py similarity index 86% rename from TanuMusic/plugins/sudo/blchat.py rename to SprotifyMusic/plugins/sudo/blchat.py index 13e09db14518..f3f058d10173 100644 --- a/TanuMusic/plugins/sudo/blchat.py +++ b/SprotifyMusic/plugins/sudo/blchat.py @@ -1,10 +1,10 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import blacklist_chat, blacklisted_chats, whitelist_chat -from TanuMusic.utils.decorators.language import language +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import blacklist_chat, blacklisted_chats, whitelist_chat +from SprotifyMusic.utils.decorators.language import language from config import BANNED_USERS diff --git a/TanuMusic/plugins/sudo/block.py b/SprotifyMusic/plugins/sudo/block.py similarity index 85% rename from TanuMusic/plugins/sudo/block.py rename to SprotifyMusic/plugins/sudo/block.py index 60b25e8a0474..d0081901f517 100644 --- a/TanuMusic/plugins/sudo/block.py +++ b/SprotifyMusic/plugins/sudo/block.py @@ -1,11 +1,11 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import add_gban_user, remove_gban_user -from TanuMusic.utils.decorators.language import language -from TanuMusic.utils.extraction import extract_user +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import add_gban_user, remove_gban_user +from SprotifyMusic.utils.decorators.language import language +from SprotifyMusic.utils.extraction import extract_user from config import BANNED_USERS diff --git a/TanuMusic/plugins/sudo/dev.py b/SprotifyMusic/plugins/sudo/dev.py similarity index 95% rename from TanuMusic/plugins/sudo/dev.py rename to SprotifyMusic/plugins/sudo/dev.py index 3ebde250145c..d8a336c6abe9 100644 --- a/TanuMusic/plugins/sudo/dev.py +++ b/SprotifyMusic/plugins/sudo/dev.py @@ -10,9 +10,9 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.cleanmode import protect_message +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.cleanmode import protect_message async def aexec(code, client, message): diff --git a/TanuMusic/plugins/sudo/filemanager.py b/SprotifyMusic/plugins/sudo/filemanager.py similarity index 98% rename from TanuMusic/plugins/sudo/filemanager.py rename to SprotifyMusic/plugins/sudo/filemanager.py index b9157e4baac5..d64e90a86ce9 100644 --- a/TanuMusic/plugins/sudo/filemanager.py +++ b/SprotifyMusic/plugins/sudo/filemanager.py @@ -8,8 +8,8 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS MAX_MESSAGE_SIZE_LIMIT = 4095 diff --git a/TanuMusic/plugins/sudo/gban.py b/SprotifyMusic/plugins/sudo/gban.py similarity index 90% rename from TanuMusic/plugins/sudo/gban.py rename to SprotifyMusic/plugins/sudo/gban.py index b3ce64b3d4c7..eb814a0ec533 100644 --- a/TanuMusic/plugins/sudo/gban.py +++ b/SprotifyMusic/plugins/sudo/gban.py @@ -4,10 +4,10 @@ from pyrogram.errors import FloodWait from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils import get_readable_time -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils import get_readable_time +from SprotifyMusic.utils.database import ( add_banned_user, get_banned_count, get_banned_users, @@ -15,8 +15,8 @@ is_banned_user, remove_banned_user, ) -from TanuMusic.utils.decorators.language import language -from TanuMusic.utils.extraction import extract_user +from SprotifyMusic.utils.decorators.language import language +from SprotifyMusic.utils.extraction import extract_user from config import BANNED_USERS diff --git a/TanuMusic/plugins/sudo/logger.py b/SprotifyMusic/plugins/sudo/logger.py similarity index 72% rename from TanuMusic/plugins/sudo/logger.py rename to SprotifyMusic/plugins/sudo/logger.py index 858970935dfb..0d2309c10ee5 100644 --- a/TanuMusic/plugins/sudo/logger.py +++ b/SprotifyMusic/plugins/sudo/logger.py @@ -1,9 +1,9 @@ from pyrogram import filters -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import add_off, add_on -from TanuMusic.utils.decorators.language import language +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import add_off, add_on +from SprotifyMusic.utils.decorators.language import language @app.on_message(filters.command(["logger"]) & SUDOERS) diff --git a/TanuMusic/plugins/sudo/maintenance.py b/SprotifyMusic/plugins/sudo/maintenance.py similarity index 88% rename from TanuMusic/plugins/sudo/maintenance.py rename to SprotifyMusic/plugins/sudo/maintenance.py index 8860cc0e9953..56a985eba4e8 100644 --- a/TanuMusic/plugins/sudo/maintenance.py +++ b/SprotifyMusic/plugins/sudo/maintenance.py @@ -1,9 +1,9 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import ( get_lang, is_maintenance, maintenance_off, diff --git a/TanuMusic/plugins/sudo/restart.py b/SprotifyMusic/plugins/sudo/restart.py similarity index 95% rename from TanuMusic/plugins/sudo/restart.py rename to SprotifyMusic/plugins/sudo/restart.py index bc3ec3d6eadb..ea93c74df25c 100644 --- a/TanuMusic/plugins/sudo/restart.py +++ b/SprotifyMusic/plugins/sudo/restart.py @@ -10,15 +10,15 @@ from pyrogram import filters import config -from TanuMusic import app -from TanuMusic.misc import HAPP, SUDOERS, XCB -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.misc import HAPP, SUDOERS, XCB +from SprotifyMusic.utils.database import ( get_active_chats, remove_active_chat, remove_active_video_chat, ) -from TanuMusic.utils.decorators.language import language -from TanuMusic.utils.pastebin import Bin +from SprotifyMusic.utils.decorators.language import language +from SprotifyMusic.utils.pastebin import Bin urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) diff --git a/TanuMusic/plugins/sudo/sudoers.py b/SprotifyMusic/plugins/sudo/sudoers.py similarity index 88% rename from TanuMusic/plugins/sudo/sudoers.py rename to SprotifyMusic/plugins/sudo/sudoers.py index 8c986de5a566..ffc7c8730a5c 100644 --- a/TanuMusic/plugins/sudo/sudoers.py +++ b/SprotifyMusic/plugins/sudo/sudoers.py @@ -1,12 +1,12 @@ from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import add_sudo, remove_sudo -from TanuMusic.utils.decorators.language import language -from TanuMusic.utils.extraction import extract_user -from TanuMusic.utils.inline import close_markup +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import add_sudo, remove_sudo +from SprotifyMusic.utils.decorators.language import language +from SprotifyMusic.utils.extraction import extract_user +from SprotifyMusic.utils.inline import close_markup from config import BANNED_USERS, OWNER_ID diff --git a/TanuMusic/plugins/tools/afk.py b/SprotifyMusic/plugins/tools/afk.py similarity index 99% rename from TanuMusic/plugins/tools/afk.py rename to SprotifyMusic/plugins/tools/afk.py index 089448a2dae5..7b1632128632 100644 --- a/TanuMusic/plugins/tools/afk.py +++ b/SprotifyMusic/plugins/tools/afk.py @@ -3,9 +3,9 @@ from pyrogram.enums import MessageEntityType from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.utils.formatters import get_readable_time -from TanuMusic.utils.database import add_afk, is_afk, remove_afk +from SprotifyMusic import app +from SprotifyMusic.utils.formatters import get_readable_time +from SprotifyMusic.utils.database import add_afk, is_afk, remove_afk @app.on_message(filters.command(["afk", "brb"], prefixes=["/", "!"])) diff --git a/TanuMusic/plugins/tools/carbon.py b/SprotifyMusic/plugins/tools/carbon.py similarity index 97% rename from TanuMusic/plugins/tools/carbon.py rename to SprotifyMusic/plugins/tools/carbon.py index e99153bfbf34..2eb31db57289 100644 --- a/TanuMusic/plugins/tools/carbon.py +++ b/SprotifyMusic/plugins/tools/carbon.py @@ -1,6 +1,6 @@ import aiohttp from io import BytesIO -from TanuMusic import app +from SprotifyMusic import app from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup diff --git a/TanuMusic/plugins/tools/clean.py b/SprotifyMusic/plugins/tools/clean.py similarity index 86% rename from TanuMusic/plugins/tools/clean.py rename to SprotifyMusic/plugins/tools/clean.py index a7d680f15a08..e23f011ba67c 100644 --- a/TanuMusic/plugins/tools/clean.py +++ b/SprotifyMusic/plugins/tools/clean.py @@ -3,8 +3,8 @@ from pyrogram import filters -from TanuMusic import app -from TanuMusic.misc import SUDOERS +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS @app.on_message(filters.command("clean") & SUDOERS) diff --git a/TanuMusic/plugins/tools/fonts.py b/SprotifyMusic/plugins/tools/fonts.py similarity index 99% rename from TanuMusic/plugins/tools/fonts.py rename to SprotifyMusic/plugins/tools/fonts.py index 5f5c66029933..8dcefd5ee478 100644 --- a/TanuMusic/plugins/tools/fonts.py +++ b/SprotifyMusic/plugins/tools/fonts.py @@ -1,8 +1,8 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic.utils.fonts import Fonts -from TanuMusic import app +from SprotifyMusic.utils.fonts import Fonts +from SprotifyMusic import app @app.on_message(filters.command(["font", "fonts"])) async def style_buttons(c, m, cb=False): diff --git a/TanuMusic/plugins/tools/image.py b/SprotifyMusic/plugins/tools/image.py similarity index 99% rename from TanuMusic/plugins/tools/image.py rename to SprotifyMusic/plugins/tools/image.py index a4c851ae634a..dd2b09eb2fc9 100644 --- a/TanuMusic/plugins/tools/image.py +++ b/SprotifyMusic/plugins/tools/image.py @@ -3,7 +3,7 @@ from bs4 import BeautifulSoup from pyrogram import Client, filters from pyrogram.types import InputMediaPhoto, Message -from TanuMusic import app +from SprotifyMusic import app # Function to fetch images from Google Images def fetch_google_images(query, num_images=7): diff --git a/TanuMusic/plugins/tools/language.py b/SprotifyMusic/plugins/tools/language.py similarity index 92% rename from TanuMusic/plugins/tools/language.py rename to SprotifyMusic/plugins/tools/language.py index b7742b75a298..10cfa5a23704 100644 --- a/TanuMusic/plugins/tools/language.py +++ b/SprotifyMusic/plugins/tools/language.py @@ -2,9 +2,9 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardButton, Message -from TanuMusic import app -from TanuMusic.utils.database import get_lang, set_lang -from TanuMusic.utils.decorators import ActualAdminCB, language, languageCB +from SprotifyMusic import app +from SprotifyMusic.utils.database import get_lang, set_lang +from SprotifyMusic.utils.decorators import ActualAdminCB, language, languageCB from config import BANNED_USERS from strings import get_string, languages_present diff --git a/TanuMusic/plugins/tools/mongo.py# b/SprotifyMusic/plugins/tools/mongo.py# similarity index 100% rename from TanuMusic/plugins/tools/mongo.py# rename to SprotifyMusic/plugins/tools/mongo.py# diff --git a/TanuMusic/plugins/tools/ping.py b/SprotifyMusic/plugins/tools/ping.py similarity index 63% rename from TanuMusic/plugins/tools/ping.py rename to SprotifyMusic/plugins/tools/ping.py index 2967c2bfa0e4..2635efd0d5f8 100644 --- a/TanuMusic/plugins/tools/ping.py +++ b/SprotifyMusic/plugins/tools/ping.py @@ -1,13 +1,15 @@ +import time from datetime import datetime from pyrogram import filters from pyrogram.types import Message +from pyrogram.enums import ParseMode -from TanuMusic import app -from TanuMusic.core.call import Tanu -from TanuMusic.utils import bot_sys_stats -from TanuMusic.utils.decorators.language import language -from TanuMusic.utils.inline import supp_markup +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.utils import bot_sys_stats +from SprotifyMusic.utils.decorators.language import language +from SprotifyMusic.utils.inline import supp_markup from config import BANNED_USERS, PING_IMG_URL @@ -18,11 +20,14 @@ async def ping_com(client, message: Message, _): response = await message.reply_photo( photo=PING_IMG_URL, caption=_["ping_1"].format(app.mention), + quote=True, ) - pytgping = await Tanu.ping() + pytgping = await Sprotify.ping() UP, CPU, RAM, DISK = await bot_sys_stats() resp = (datetime.now() - start).microseconds / 1000 await response.edit_text( _["ping_2"].format(resp, app.mention, UP, RAM, CPU, DISK, pytgping), reply_markup=supp_markup(_), - ) \ No newline at end of file + parse_mode=ParseMode.MARKDOWN, + ) + \ No newline at end of file diff --git a/TanuMusic/plugins/tools/pypi.py b/SprotifyMusic/plugins/tools/pypi.py similarity index 98% rename from TanuMusic/plugins/tools/pypi.py rename to SprotifyMusic/plugins/tools/pypi.py index 00f041cb026c..93079ec9a985 100644 --- a/TanuMusic/plugins/tools/pypi.py +++ b/SprotifyMusic/plugins/tools/pypi.py @@ -2,7 +2,7 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic import app +from SprotifyMusic import app def get_pypi_info(package_name): diff --git a/TanuMusic/plugins/tools/queue.py b/SprotifyMusic/plugins/tools/queue.py similarity index 96% rename from TanuMusic/plugins/tools/queue.py rename to SprotifyMusic/plugins/tools/queue.py index e3bdff5e4fdb..04b19163818f 100644 --- a/TanuMusic/plugins/tools/queue.py +++ b/SprotifyMusic/plugins/tools/queue.py @@ -6,12 +6,12 @@ from pyrogram.types import CallbackQuery, InputMediaPhoto, Message import config -from TanuMusic import app -from TanuMusic.misc import db -from TanuMusic.utils import Bin, get_channeplayCB, seconds_to_min -from TanuMusic.utils.database import get_cmode, is_active_chat, is_music_playing -from TanuMusic.utils.decorators.language import language, languageCB -from TanuMusic.utils.inline import queue_back_markup, queue_markup +from SprotifyMusic import app +from SprotifyMusic.misc import db +from SprotifyMusic.utils import Bin, get_channeplayCB, seconds_to_min +from SprotifyMusic.utils.database import get_cmode, is_active_chat, is_music_playing +from SprotifyMusic.utils.decorators.language import language, languageCB +from SprotifyMusic.utils.inline import queue_back_markup, queue_markup from config import BANNED_USERS basic = {} diff --git a/TanuMusic/plugins/tools/quoto.py b/SprotifyMusic/plugins/tools/quoto.py similarity index 99% rename from TanuMusic/plugins/tools/quoto.py rename to SprotifyMusic/plugins/tools/quoto.py index c3c5904cb140..67d498c10889 100644 --- a/TanuMusic/plugins/tools/quoto.py +++ b/SprotifyMusic/plugins/tools/quoto.py @@ -1,7 +1,7 @@ from io import BytesIO from pyrogram import Client, filters from pyrogram.types import Message -from TanuMusic import app +from SprotifyMusic import app from httpx import AsyncClient, Timeout diff --git a/TanuMusic/plugins/tools/reload.py b/SprotifyMusic/plugins/tools/reload.py similarity index 89% rename from TanuMusic/plugins/tools/reload.py rename to SprotifyMusic/plugins/tools/reload.py index 560586bba828..42750ae75a85 100644 --- a/TanuMusic/plugins/tools/reload.py +++ b/SprotifyMusic/plugins/tools/reload.py @@ -5,12 +5,12 @@ from pyrogram.enums import ChatMembersFilter from pyrogram.types import CallbackQuery, Message -from TanuMusic import app -from TanuMusic.core.call import Tanu -from TanuMusic.misc import db -from TanuMusic.utils.database import get_assistant, get_authuser_names, get_cmode -from TanuMusic.utils.decorators import ActualAdminCB, AdminActual, language -from TanuMusic.utils.formatters import alpha_to_int, get_readable_time +from SprotifyMusic import app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.misc import db +from SprotifyMusic.utils.database import get_assistant, get_authuser_names, get_cmode +from SprotifyMusic.utils.decorators import ActualAdminCB, AdminActual, language +from SprotifyMusic.utils.formatters import alpha_to_int, get_readable_time from config import BANNED_USERS, adminlist, lyrical rel = {} @@ -53,7 +53,7 @@ async def restartbot(client, message: Message, _): await asyncio.sleep(1) try: db[message.chat.id] = [] - await Tanu.stop_stream_force(message.chat.id) + await Sprotify.stop_stream_force(message.chat.id) except: pass userbot = await get_assistant(message.chat.id) @@ -80,7 +80,7 @@ async def restartbot(client, message: Message, _): pass try: db[chat_id] = [] - await Tanu.stop_stream_force(chat_id) + await Sprotify.stop_stream_force(chat_id) except: pass return await mystic.edit_text(_["reload_5"].format(app.mention)) diff --git a/TanuMusic/plugins/tools/sangmata.py# b/SprotifyMusic/plugins/tools/sangmata.py# similarity index 100% rename from TanuMusic/plugins/tools/sangmata.py# rename to SprotifyMusic/plugins/tools/sangmata.py# diff --git a/TanuMusic/plugins/tools/song.py b/SprotifyMusic/plugins/tools/song.py similarity index 98% rename from TanuMusic/plugins/tools/song.py rename to SprotifyMusic/plugins/tools/song.py index 8e81497fa169..e831d5af1d63 100644 --- a/TanuMusic/plugins/tools/song.py +++ b/SprotifyMusic/plugins/tools/song.py @@ -1,7 +1,7 @@ import os import requests from pyrogram import Client, filters -from TanuMusic import app +from SprotifyMusic import app def fetch_song(song_name): url = f"https://song-teleservice.vercel.app/song?songName={song_name.replace(' ', '%20')}" diff --git a/TanuMusic/plugins/tools/speedtest.py b/SprotifyMusic/plugins/tools/speedtest.py similarity index 92% rename from TanuMusic/plugins/tools/speedtest.py rename to SprotifyMusic/plugins/tools/speedtest.py index b004dda37d93..171f9f57867f 100644 --- a/TanuMusic/plugins/tools/speedtest.py +++ b/SprotifyMusic/plugins/tools/speedtest.py @@ -2,9 +2,9 @@ import speedtest from pyrogram import filters from pyrogram.types import Message -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.decorators.language import language +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.decorators.language import language def testspeed(m, _): diff --git a/TanuMusic/plugins/tools/stats.py b/SprotifyMusic/plugins/tools/stats.py similarity index 88% rename from TanuMusic/plugins/tools/stats.py rename to SprotifyMusic/plugins/tools/stats.py index 181d10d7de7c..9ece4692c87e 100644 --- a/TanuMusic/plugins/tools/stats.py +++ b/SprotifyMusic/plugins/tools/stats.py @@ -9,13 +9,13 @@ from pytgcalls.__version__ import __version__ as pytgver import config -from TanuMusic import app -from TanuMusic.core.userbot import assistants -from TanuMusic.misc import SUDOERS, mongodb -from TanuMusic.plugins import ALL_MODULES -from TanuMusic.utils.database import get_served_chats, get_served_users, get_sudoers -from TanuMusic.utils.decorators.language import language, languageCB -from TanuMusic.utils.inline.stats import back_stats_buttons, stats_buttons +from SprotifyMusic import app +from SprotifyMusic.core.userbot import assistants +from SprotifyMusic.misc import SUDOERS, mongodb +from SprotifyMusic.plugins import ALL_MODULES +from SprotifyMusic.utils.database import get_served_chats, get_served_users, get_sudoers +from SprotifyMusic.utils.decorators.language import language, languageCB +from SprotifyMusic.utils.inline.stats import back_stats_buttons, stats_buttons from config import BANNED_USERS diff --git a/TanuMusic/plugins/tools/stickers.py b/SprotifyMusic/plugins/tools/stickers.py similarity index 99% rename from TanuMusic/plugins/tools/stickers.py rename to SprotifyMusic/plugins/tools/stickers.py index f815a41d88d6..fdaf4eb6a49c 100644 --- a/TanuMusic/plugins/tools/stickers.py +++ b/SprotifyMusic/plugins/tools/stickers.py @@ -3,7 +3,7 @@ import os from pyrogram import filters from config import BOT_USERNAME -from TanuMusic import app +from SprotifyMusic import app from pyrogram import filters import pyrogram from uuid import uuid4 diff --git a/TanuMusic/plugins/tools/translate.py b/SprotifyMusic/plugins/tools/translate.py similarity index 96% rename from TanuMusic/plugins/tools/translate.py rename to SprotifyMusic/plugins/tools/translate.py index a4db1ecef080..bf09dbf85afb 100644 --- a/TanuMusic/plugins/tools/translate.py +++ b/SprotifyMusic/plugins/tools/translate.py @@ -1,4 +1,4 @@ -from TanuMusic import app +from SprotifyMusic import app from pyrogram import filters from deep_translator import GoogleTranslator diff --git a/TanuMusic/utils/__init__.py b/SprotifyMusic/utils/__init__.py similarity index 100% rename from TanuMusic/utils/__init__.py rename to SprotifyMusic/utils/__init__.py diff --git a/TanuMusic/utils/channelplay.py b/SprotifyMusic/utils/channelplay.py similarity index 88% rename from TanuMusic/utils/channelplay.py rename to SprotifyMusic/utils/channelplay.py index 84d772945fb0..9c2916ebbcca 100644 --- a/TanuMusic/utils/channelplay.py +++ b/SprotifyMusic/utils/channelplay.py @@ -1,5 +1,5 @@ -from TanuMusic import app -from TanuMusic.utils.database import get_cmode +from SprotifyMusic import app +from SprotifyMusic.utils.database import get_cmode async def get_channeplayCB(_, command, CallbackQuery): diff --git a/TanuMusic/utils/cleanmode.py b/SprotifyMusic/utils/cleanmode.py similarity index 96% rename from TanuMusic/utils/cleanmode.py rename to SprotifyMusic/utils/cleanmode.py index c9d727dcb39e..3f4f40afd0c2 100644 --- a/TanuMusic/utils/cleanmode.py +++ b/SprotifyMusic/utils/cleanmode.py @@ -1,5 +1,5 @@ from config import LOGGER_ID -from TanuMusic import app +from SprotifyMusic import app protected_messages = {} diff --git a/TanuMusic/utils/database.py b/SprotifyMusic/utils/database.py similarity index 94% rename from TanuMusic/utils/database.py rename to SprotifyMusic/utils/database.py index ed1808be1956..d833bdb6a2db 100644 --- a/TanuMusic/utils/database.py +++ b/SprotifyMusic/utils/database.py @@ -1,10 +1,10 @@ -import random -from typing import Dict, List, Union +import random +from typing import Dict, List, Union + +from SprotifyMusic import userbot +from SprotifyMusic.core.mongo import mongodb +from SprotifyMusic.utils.mongo import db -from TanuMusic import userbot -from TanuMusic.core.mongo import mongodb -from TanuMusic.utils.mongo import db - afkdb = db.afk authdb = mongodb.adminauth authuserdb = mongodb.authuser @@ -38,22 +38,22 @@ pause = {} playmode = {} playtype = {} -skipmode = {} - - -async def get_active_video_chats() -> list: - return activevideo - -async def get_active_chats() -> list: - return active - -async def remove_active_chat(chat_id: int): - if chat_id in active: - active.remove(chat_id) - -async def remove_active_video_chat(chat_id: int): - if chat_id in activevideo: - activevideo.remove(chat_id) +skipmode = {} + + +async def get_active_video_chats() -> list: + return activevideo + +async def get_active_chats() -> list: + return active + +async def remove_active_chat(chat_id: int): + if chat_id in active: + active.remove(chat_id) + +async def remove_active_video_chat(chat_id: int): + if chat_id in activevideo: + activevideo.remove(chat_id) async def get_assistant_number(chat_id: int) -> str: assistant = assistantdict.get(chat_id) @@ -82,7 +82,7 @@ async def set_assistant_new(chat_id, number): async def set_assistant(chat_id): - from TanuMusic.core.userbot import assistants + from SprotifyMusic.core.userbot import assistants ran_assistant = random.choice(assistants) assistantdict[chat_id] = ran_assistant @@ -96,7 +96,7 @@ async def set_assistant(chat_id): async def get_assistant(chat_id: int) -> str: - from TanuMusic.core.userbot import assistants + from SprotifyMusic.core.userbot import assistants assistant = assistantdict.get(chat_id) if not assistant: @@ -119,39 +119,39 @@ async def get_assistant(chat_id: int) -> str: return userbot else: userbot = await set_assistant(chat_id) - return userbot - -async def is_afk(user_id: int) -> bool: - user = await afkdb.find_one({"user_id": user_id}) - if not user: - return False, {} - return True, user["reason"] - - -async def add_afk(user_id: int, mode): - await afkdb.update_one( - {"user_id": user_id}, {"$set": {"reason": mode}}, upsert=True - ) - - -async def remove_afk(user_id: int): - user = await afkdb.find_one({"user_id": user_id}) - if user: - return await afkdb.delete_one({"user_id": user_id}) - - -async def get_afk_users() -> list: - users = afkdb.find({"user_id": {"$gt": 0}}) - if not users: - return [] - users_list = [] - for user in await users.to_list(length=1000000000): - users_list.append(user) - return users_list - + return userbot + +async def is_afk(user_id: int) -> bool: + user = await afkdb.find_one({"user_id": user_id}) + if not user: + return False, {} + return True, user["reason"] + + +async def add_afk(user_id: int, mode): + await afkdb.update_one( + {"user_id": user_id}, {"$set": {"reason": mode}}, upsert=True + ) + + +async def remove_afk(user_id: int): + user = await afkdb.find_one({"user_id": user_id}) + if user: + return await afkdb.delete_one({"user_id": user_id}) + + +async def get_afk_users() -> list: + users = afkdb.find({"user_id": {"$gt": 0}}) + if not users: + return [] + users_list = [] + for user in await users.to_list(length=1000000000): + users_list.append(user) + return users_list + async def set_calls_assistant(chat_id): - from TanuMusic.core.userbot import assistants + from SprotifyMusic.core.userbot import assistants ran_assistant = random.choice(assistants) assistantdict[chat_id] = ran_assistant @@ -164,7 +164,7 @@ async def set_calls_assistant(chat_id): async def group_assistant(self, chat_id: int) -> int: - from TanuMusic.core.userbot import assistants + from SprotifyMusic.core.userbot import assistants assistant = assistantdict.get(chat_id) if not assistant: diff --git a/TanuMusic/utils/decorators/__init__.py b/SprotifyMusic/utils/decorators/__init__.py similarity index 100% rename from TanuMusic/utils/decorators/__init__.py rename to SprotifyMusic/utils/decorators/__init__.py diff --git a/TanuMusic/utils/decorators/admins.py b/SprotifyMusic/utils/decorators/admins.py similarity index 98% rename from TanuMusic/utils/decorators/admins.py rename to SprotifyMusic/utils/decorators/admins.py index a9a35d576376..1c300f5ab5ac 100644 --- a/TanuMusic/utils/decorators/admins.py +++ b/SprotifyMusic/utils/decorators/admins.py @@ -1,9 +1,9 @@ from pyrogram.enums import ChatType from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic import app -from TanuMusic.misc import SUDOERS, db -from TanuMusic.utils.database import ( +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS, db +from SprotifyMusic.utils.database import ( get_authuser_names, get_cmode, get_lang, diff --git a/TanuMusic/utils/decorators/language.py b/SprotifyMusic/utils/decorators/language.py similarity index 93% rename from TanuMusic/utils/decorators/language.py rename to SprotifyMusic/utils/decorators/language.py index f33ff1e0979b..e675aeb394e6 100644 --- a/TanuMusic/utils/decorators/language.py +++ b/SprotifyMusic/utils/decorators/language.py @@ -1,8 +1,8 @@ from strings import get_string -from TanuMusic import app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import get_lang, is_maintenance +from SprotifyMusic import app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import get_lang, is_maintenance from config import SUPPORT_CHAT def language(mystic): diff --git a/TanuMusic/utils/decorators/play.py b/SprotifyMusic/utils/decorators/play.py similarity index 97% rename from TanuMusic/utils/decorators/play.py rename to SprotifyMusic/utils/decorators/play.py index e44c11028a41..8bca2ea82d5c 100644 --- a/TanuMusic/utils/decorators/play.py +++ b/SprotifyMusic/utils/decorators/play.py @@ -9,9 +9,9 @@ ) from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic import YouTube, app -from TanuMusic.misc import SUDOERS -from TanuMusic.utils.database import ( +from SprotifyMusic import YouTube, app +from SprotifyMusic.misc import SUDOERS +from SprotifyMusic.utils.database import ( get_assistant, get_cmode, get_lang, @@ -20,7 +20,7 @@ is_active_chat, is_maintenance, ) -from TanuMusic.utils.inline import botplaylist_markup +from SprotifyMusic.utils.inline import botplaylist_markup from config import PLAYLIST_IMG_URL, SUPPORT_CHAT, adminlist from strings import get_string diff --git a/TanuMusic/utils/error.py b/SprotifyMusic/utils/error.py similarity index 97% rename from TanuMusic/utils/error.py rename to SprotifyMusic/utils/error.py index a7fd73d0392f..54732a0800e9 100644 --- a/TanuMusic/utils/error.py +++ b/SprotifyMusic/utils/error.py @@ -4,7 +4,7 @@ from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden from config import LOGGER_ID -from TanuMusic import app +from SprotifyMusic import app def capture_err(func): @wraps(func) diff --git a/TanuMusic/utils/exceptions.py b/SprotifyMusic/utils/exceptions.py similarity index 100% rename from TanuMusic/utils/exceptions.py rename to SprotifyMusic/utils/exceptions.py diff --git a/TanuMusic/utils/extraction.py b/SprotifyMusic/utils/extraction.py similarity index 91% rename from TanuMusic/utils/extraction.py rename to SprotifyMusic/utils/extraction.py index 370af6690d16..eeb60bc22f37 100644 --- a/TanuMusic/utils/extraction.py +++ b/SprotifyMusic/utils/extraction.py @@ -1,7 +1,7 @@ from pyrogram.enums import MessageEntityType from pyrogram.types import Message, User -from TanuMusic import app +from SprotifyMusic import app async def extract_user(m: Message) -> User: diff --git a/TanuMusic/utils/fonts.py b/SprotifyMusic/utils/fonts.py similarity index 100% rename from TanuMusic/utils/fonts.py rename to SprotifyMusic/utils/fonts.py diff --git a/TanuMusic/utils/formatters.py b/SprotifyMusic/utils/formatters.py similarity index 100% rename from TanuMusic/utils/formatters.py rename to SprotifyMusic/utils/formatters.py diff --git a/TanuMusic/utils/inline/__init__.py b/SprotifyMusic/utils/inline/__init__.py similarity index 100% rename from TanuMusic/utils/inline/__init__.py rename to SprotifyMusic/utils/inline/__init__.py diff --git a/TanuMusic/utils/inline/extras.py b/SprotifyMusic/utils/inline/extras.py similarity index 100% rename from TanuMusic/utils/inline/extras.py rename to SprotifyMusic/utils/inline/extras.py diff --git a/TanuMusic/utils/inline/help.py b/SprotifyMusic/utils/inline/help.py similarity index 98% rename from TanuMusic/utils/inline/help.py rename to SprotifyMusic/utils/inline/help.py index 08b1bbee6c54..075860bb4dbd 100644 --- a/TanuMusic/utils/inline/help.py +++ b/SprotifyMusic/utils/inline/help.py @@ -2,7 +2,7 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from TanuMusic import app +from SprotifyMusic import app def help_pannel(_, START: Union[bool, int] = None): diff --git a/TanuMusic/utils/inline/play.py b/SprotifyMusic/utils/inline/play.py similarity index 98% rename from TanuMusic/utils/inline/play.py rename to SprotifyMusic/utils/inline/play.py index fa6b551f15e9..d83f0d09e85d 100644 --- a/TanuMusic/utils/inline/play.py +++ b/SprotifyMusic/utils/inline/play.py @@ -1,7 +1,7 @@ import math from config import SUPPORT_CHAT, OWNER_USERNAME from pyrogram.types import InlineKeyboardButton -from TanuMusic.utils.formatters import time_to_seconds +from SprotifyMusic.utils.formatters import time_to_seconds def track_markup(_, videoid, user_id, channel, fplay): diff --git a/TanuMusic/utils/inline/queue.py b/SprotifyMusic/utils/inline/queue.py similarity index 100% rename from TanuMusic/utils/inline/queue.py rename to SprotifyMusic/utils/inline/queue.py diff --git a/TanuMusic/utils/inline/settings.py b/SprotifyMusic/utils/inline/settings.py similarity index 100% rename from TanuMusic/utils/inline/settings.py rename to SprotifyMusic/utils/inline/settings.py diff --git a/TanuMusic/utils/inline/speed.py b/SprotifyMusic/utils/inline/speed.py similarity index 100% rename from TanuMusic/utils/inline/speed.py rename to SprotifyMusic/utils/inline/speed.py diff --git a/TanuMusic/utils/inline/start.py b/SprotifyMusic/utils/inline/start.py similarity index 96% rename from TanuMusic/utils/inline/start.py rename to SprotifyMusic/utils/inline/start.py index 08f254cf322c..36c323c9c4c0 100644 --- a/TanuMusic/utils/inline/start.py +++ b/SprotifyMusic/utils/inline/start.py @@ -1,7 +1,7 @@ from pyrogram.types import InlineKeyboardButton import config -from TanuMusic import app +from SprotifyMusic import app def start_panel(_): diff --git a/TanuMusic/utils/inline/stats.py b/SprotifyMusic/utils/inline/stats.py similarity index 100% rename from TanuMusic/utils/inline/stats.py rename to SprotifyMusic/utils/inline/stats.py diff --git a/TanuMusic/utils/inlinequery.py b/SprotifyMusic/utils/inlinequery.py similarity index 100% rename from TanuMusic/utils/inlinequery.py rename to SprotifyMusic/utils/inlinequery.py diff --git a/TanuMusic/utils/logger.py b/SprotifyMusic/utils/logger.py similarity index 92% rename from TanuMusic/utils/logger.py rename to SprotifyMusic/utils/logger.py index 06ce91c8de01..9b57990b1774 100644 --- a/TanuMusic/utils/logger.py +++ b/SprotifyMusic/utils/logger.py @@ -1,7 +1,7 @@ from pyrogram.enums import ParseMode -from TanuMusic import app -from TanuMusic.utils.database import is_on_off +from SprotifyMusic import app +from SprotifyMusic.utils.database import is_on_off from config import LOGGER_ID diff --git a/TanuMusic/utils/mongo.py b/SprotifyMusic/utils/mongo.py similarity index 100% rename from TanuMusic/utils/mongo.py rename to SprotifyMusic/utils/mongo.py diff --git a/TanuMusic/utils/pastebin.py b/SprotifyMusic/utils/pastebin.py similarity index 100% rename from TanuMusic/utils/pastebin.py rename to SprotifyMusic/utils/pastebin.py diff --git a/TanuMusic/utils/stream/autoclear.py b/SprotifyMusic/utils/stream/autoclear.py similarity index 100% rename from TanuMusic/utils/stream/autoclear.py rename to SprotifyMusic/utils/stream/autoclear.py diff --git a/TanuMusic/utils/stream/queue.py b/SprotifyMusic/utils/stream/queue.py similarity index 94% rename from TanuMusic/utils/stream/queue.py rename to SprotifyMusic/utils/stream/queue.py index 82d41e9d88d7..e1e52e8bf579 100644 --- a/TanuMusic/utils/stream/queue.py +++ b/SprotifyMusic/utils/stream/queue.py @@ -1,8 +1,8 @@ import asyncio from typing import Union -from TanuMusic.misc import db -from TanuMusic.utils.formatters import check_duration, seconds_to_min +from SprotifyMusic.misc import db +from SprotifyMusic.utils.formatters import check_duration, seconds_to_min from config import autoclean, time_to_seconds diff --git a/TanuMusic/utils/stream/stream.py b/SprotifyMusic/utils/stream/stream.py similarity index 93% rename from TanuMusic/utils/stream/stream.py rename to SprotifyMusic/utils/stream/stream.py index 0734b372aeb5..3af162c8ad50 100644 --- a/TanuMusic/utils/stream/stream.py +++ b/SprotifyMusic/utils/stream/stream.py @@ -5,15 +5,15 @@ from pyrogram.types import InlineKeyboardMarkup import config -from TanuMusic import Carbon, YouTube, app -from TanuMusic.core.call import Tanu -from TanuMusic.misc import db -from TanuMusic.utils.database import add_active_video_chat, is_active_chat -from TanuMusic.utils.exceptions import AssistantErr -from TanuMusic.utils.inline import aq_markup, close_markup, stream_markup -from TanuMusic.utils.pastebin import Bin -from TanuMusic.utils.stream.queue import put_queue, put_queue_index -from TanuMusic.utils.thumbnails import get_thumb +from SprotifyMusic import Carbon, YouTube, app +from SprotifyMusic.core.call import Sprotify +from SprotifyMusic.misc import db +from SprotifyMusic.utils.database import add_active_video_chat, is_active_chat +from SprotifyMusic.utils.exceptions import AssistantErr +from SprotifyMusic.utils.inline import aq_markup, close_markup, stream_markup +from SprotifyMusic.utils.pastebin import Bin +from SprotifyMusic.utils.stream.queue import put_queue, put_queue_index +from SprotifyMusic.utils.thumbnails import get_thumb async def stream( @@ -32,7 +32,7 @@ async def stream( if not result: return if forceplay: - await Tanu.force_stop_stream(chat_id) + await Sprotify.force_stop_stream(chat_id) if streamtype == "playlist": msg = f"{_['play_19']}\n\n" count = 0 @@ -79,7 +79,7 @@ async def stream( ) except: raise AssistantErr(_["play_14"]) - await Tanu.join_call( + await Sprotify.join_call( chat_id, original_chat_id, file_path, @@ -165,7 +165,7 @@ async def stream( else: if not forceplay: db[chat_id] = [] - await Tanu.join_call( + await Sprotify.join_call( chat_id, original_chat_id, file_path, @@ -225,7 +225,7 @@ async def stream( else: if not forceplay: db[chat_id] = [] - await Tanu.join_call(chat_id, original_chat_id, file_path, video=None) + await Sprotify.join_call(chat_id, original_chat_id, file_path, video=None) await put_queue( chat_id, original_chat_id, @@ -277,7 +277,7 @@ async def stream( else: if not forceplay: db[chat_id] = [] - await Tanu.join_call(chat_id, original_chat_id, file_path, video=status) + await Sprotify.join_call(chat_id, original_chat_id, file_path, video=status) await put_queue( chat_id, original_chat_id, @@ -333,7 +333,7 @@ async def stream( n, file_path = await YouTube.video(link) if n == 0: raise AssistantErr(_["str_3"]) - await Tanu.join_call( + await Sprotify.join_call( chat_id, original_chat_id, file_path, @@ -391,7 +391,7 @@ async def stream( else: if not forceplay: db[chat_id] = [] - await Tanu.join_call( + await Sprotify.join_call( chat_id, original_chat_id, link, diff --git a/TanuMusic/utils/sys.py b/SprotifyMusic/utils/sys.py similarity index 76% rename from TanuMusic/utils/sys.py rename to SprotifyMusic/utils/sys.py index 0ffcfe608c03..eaa976e461cf 100644 --- a/TanuMusic/utils/sys.py +++ b/SprotifyMusic/utils/sys.py @@ -2,8 +2,8 @@ import psutil -from TanuMusic.misc import _boot_ -from TanuMusic.utils.formatters import get_readable_time +from SprotifyMusic.misc import _boot_ +from SprotifyMusic.utils.formatters import get_readable_time async def bot_sys_stats(): diff --git a/TanuMusic/utils/thumbnails.py b/SprotifyMusic/utils/thumbnails.py similarity index 100% rename from TanuMusic/utils/thumbnails.py rename to SprotifyMusic/utils/thumbnails.py diff --git a/config/config.py b/config/config.py index e951c4215116..b1c59a19d1ac 100644 --- a/config/config.py +++ b/config/config.py @@ -11,16 +11,16 @@ API_HASH = getenv("API_HASH", None) #❖ Add Owner Username without @ -OWNER_USERNAME = getenv("OWNER_USERNAME", "itzAsuraa") +OWNER_USERNAME = getenv("OWNER_USERNAME", "EasyWinter") #❖ Get Your bot username -BOT_USERNAME = getenv("BOT_USERNAME", "TanuMusicxBot") +BOT_USERNAME = getenv("BOT_USERNAME", "SprotifyMusicBot") #❖ Don't Add style font -BOT_NAME = getenv("BOT_NAME", "TANU MUSIC") +BOT_NAME = getenv("BOT_NAME", "Sprotify Music") #❖ get Your Assistant User name -ASSUSERNAME = getenv("ASSUSERNAME", "TANU_ASS") +ASSUSERNAME = getenv("ASSUSERNAME", "Nanosauruss") #❖ Get your token from @BotFather on Telegram. BOT_TOKEN = getenv("BOT_TOKEN") @@ -31,10 +31,10 @@ DURATION_LIMIT_MIN = int(getenv("DURATION_LIMIT", 600000)) #❖ Chat id of a group for logging bot's activities -LOGGER_ID = int(getenv("LOGGER_ID", "-1002100219353")) +LOGGER_ID = int(getenv("LOGGER_ID", "-1001589206452")) #❖ Get this value from @MissRose_bot on Telegram by /id -OWNER_ID = getenv("OWNER_ID", "7453278496") +OWNER_ID = getenv("OWNER_ID", "1854441420") #❖ Your heroku app name HEROKU_APP_NAME = getenv("HEROKU_APP_NAME", None) @@ -44,10 +44,10 @@ UPSTREAM_REPO = getenv( "UPSTREAM_REPO", - "https://github.com/CodeSearchDev/TanuMusic", + "https://github.com/Mister-Man7/SprotifyXMusic", ) -UPSTREAM_BRANCH = getenv("UPSTREAM_BRANCH", "master") +UPSTREAM_BRANCH = getenv("UPSTREAM_BRANCH", "v2") GIT_TOKEN = getenv( "GIT_TOKEN", None @@ -55,11 +55,11 @@ #❖ Make your bots privacy from telegra.ph and put your url here PRIVACY_LINK = getenv( - "PRIVACY_LINK", "https://graph.org/Privacy-Policy-for-Tanu-Music-11-26" + "PRIVACY_LINK", "https://telegra.ph/Privacy-Policy-for-SprotifyXMusic-11-29" ) -SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/C0DE_SEARCH") -SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/AsuraaSupports") +SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/SprotifyNews") +SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/datarantinggi") #❖ Set this to True if you want the assistant to automatically leave chats after an interval AUTO_LEAVING_ASSISTANT = bool(getenv("AUTO_LEAVING_ASSISTANT", False)) @@ -97,21 +97,21 @@ START_IMG_URL = getenv( - "START_IMG_URL", "https://envs.sh/SSL.jpg" + "START_IMG_URL", "https://graph.org/file/afe0bf9e6b4fede3afc0e.jpg" ) PING_IMG_URL = getenv( - "PING_IMG_URL", "https://envs.sh/qEB.jpg" + "PING_IMG_URL", "https://graph.org/file/8f6de108a54be6506b693.jpg" ) -PLAYLIST_IMG_URL = "https://envs.sh/nOh.jpg" -STATS_IMG_URL = "https://envs.sh/SSk.jpg" -TELEGRAM_AUDIO_URL = "https://telegra.ph/file/d2081243af7c1d7578b7b.jpg" -TELEGRAM_VIDEO_URL = "https://telegra.ph/file/d2081243af7c1d7578b7b.jpg" -STREAM_IMG_URL = "https://telegra.ph/file/982b01ba53c3d69b0d0ce.jpg" -SOUNCLOUD_IMG_URL = "https://telegra.ph/file/982b01ba53c3d69b0d0ce.jpg" -YOUTUBE_IMG_URL = "https://telegra.ph/file/d2081243af7c1d7578b7b.jpg" -SPOTIFY_ARTIST_IMG_URL = "https://telegra.ph/file/61024698bfc926e95d57a.jpg" -SPOTIFY_ALBUM_IMG_URL = "https://telegra.ph/file/61024698bfc926e95d57a.jpg" -SPOTIFY_PLAYLIST_IMG_URL = "https://telegra.ph/file/61024698bfc926e95d57a.jpg" +PLAYLIST_IMG_URL = "https://graph.org/file/94074fd8f348807833802.jpg" +STATS_IMG_URL = "https://graph.org/file/c9266ed41c1a9b8121185.jpg" +TELEGRAM_AUDIO_URL = "https://graph.org/file/f626eb194b025672eea28.jpg" +TELEGRAM_VIDEO_URL = "https://graph.org/file/f6e977e0046a5b8d17904.jpg" +STREAM_IMG_URL = "https://graph.org/file/7247dcb0ae280ba3b8492.jpg" +SOUNCLOUD_IMG_URL = "https://graph.org/file/199a1bd803d3e8c8d0e43.jpg" +YOUTUBE_IMG_URL = "https://graph.org/file/d902a638d7bcb6653d36f.jpg" +SPOTIFY_ARTIST_IMG_URL = "https://graph.org/file/dc9eb455f86f845f400f8.jpg" +SPOTIFY_ALBUM_IMG_URL = "https://graph.org/file/aacfa8762c016077b7ee9.jpg" +SPOTIFY_PLAYLIST_IMG_URL = "https://graph.org/file/480dbdc265670e833d763.jpg" diff --git a/cookies/cookies.txt b/cookies/cookies.txt index 802a6554e894..51cdaca4bafb 100644 --- a/cookies/cookies.txt +++ b/cookies/cookies.txt @@ -2,19 +2,23 @@ # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. -.youtube.com TRUE / TRUE 1767026623 LOGIN_INFO AFmmF2swRQIgPOUyNBezY4Cv61n1G2ph1YffgNyH38N8TFd2HSY-zyQCIQDqCzUb06OGpLYUV42aMn4xvWDY2sMkVaLOnLJ0N7Uwlg:QUQ3MjNmeVk2TU81bGxDbmNkNnhOTTZveXNFZ3RSVFVQSmRHTzRmVThRU2FZcnR6bjM4QWw0VjVwWTBzRVFMYV9DdEFCaDVHenpZMml2TWZOLU9TLTh0ZEhiSlp3M3FEZXdCVE5qT29vMjBpeVJSV2lXQV9SeDYwVkJJZFR0YlU2cmNKWGt1THkwaUNPTEh5SVRDazI4Sk1zMVB2TzZRd2lB -.youtube.com TRUE / FALSE 1769166672 SID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pJEFA56dlXbtGDkDr2FwrAwACgYKAZYSARYSFQHGX2Mi2mHCEsjrIoK2axVR7GehQRoVAUF8yKqji4eiBTGOs-OY7LeRe0EA0076 -.youtube.com TRUE / TRUE 1766142672 __Secure-1PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA -.youtube.com TRUE / TRUE 1766142672 __Secure-3PSIDTS sidts-CjEB7wV3sdajJ3pQWdbUkRlkPFRv4O85gRlaLu8azCCaYd8lIdvsLlc8bxUAQGVcwbRXEAA -.youtube.com TRUE / TRUE 1769166672 __Secure-1PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9pDqHd2OI_IWNQ65bQuksY6AACgYKAaUSARYSFQHGX2Mi_Kr7FuzXAHVqUIFp60ldcRoVAUF8yKrlQGCkAq473BbQsO35u5W_0076 -.youtube.com TRUE / TRUE 1769166672 __Secure-3PSID g.a000rQg14xEhkR1Qacw_LDO5QbeF29RAsJXJRR1C3X0jfC6D3g9phVIZwcVPv0_4Gjum4N5cEQACgYKAfUSARYSFQHGX2MildEXXqmnBcUyM4R5HWUqFRoVAUF8yKo30ukssU8hOuXCpwY92gFT0076 -.youtube.com TRUE / FALSE 1769166672 HSID AsXbK6LjWMoyXaBuW -.youtube.com TRUE / TRUE 1769166672 SSID Amt0P9jyicmh3ip74 -.youtube.com TRUE / FALSE 1769166672 APISID 5K1EVtpMXTPeAJfD/AVRkfa6UhWnh8qZ0H -.youtube.com TRUE / TRUE 1769166672 SAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 -.youtube.com TRUE / TRUE 1769166672 __Secure-1PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 -.youtube.com TRUE / TRUE 1769166672 __Secure-3PAPISID FZb_Ob-BuejiKvaX/Aq5JZE6jaB0R0sj96 -.youtube.com TRUE / TRUE 1769166719 PREF f6=40000000&tz=Asia.Calcutta&f4=4000000&f7=100&f5=30000 -.youtube.com TRUE / FALSE 1766142726 SIDCC AKEyXzUuIeocSmEEiYqhtTfEMJ9gCqnibOnklBeNezad1pIg2X-50giCY1Md7CP2V5_Slio5 -.youtube.com TRUE / TRUE 1766142726 __Secure-1PSIDCC AKEyXzVkkDbwoCJXAnitITrltJmzUiC9oK3fTHUMgAyayFFWZIZIp8SyJr02K98eeL4H99KM -.youtube.com TRUE / TRUE 1766142726 __Secure-3PSIDCC AKEyXzWybZwKYI92ZzC5yzbcfGcSqWjkF6rvqps9QORaO1hqeNS6oZYIUWoi1ZSJ_7EUAuulIQ \ No newline at end of file +.youtube.com TRUE / FALSE 1767354772 SID g.a000qggpRHoB7G5WAYuKHnOChwwr2djFnop8cw0_2_nfCF8vbx77nJC9WQ5FH-4-7izAHlosiQACgYKAcwSARISFQHGX2MiEaarPciQ4zgKKp-g-ZT_-hoVAUF8yKpx0c0wNFl8hcprkPx28oFx0076 +.youtube.com TRUE / TRUE 1767354772 __Secure-1PSID g.a000qggpRHoB7G5WAYuKHnOChwwr2djFnop8cw0_2_nfCF8vbx77xX2AlP7B_6_raUgLSJMIVAACgYKAfwSARISFQHGX2Mi-RSYZYW96NKszfYqdeNchRoVAUF8yKrzrg_Kt1BiS7lY80bsrz8Y0076 +.youtube.com TRUE / TRUE 1767354772 __Secure-3PSID g.a000qggpRHoB7G5WAYuKHnOChwwr2djFnop8cw0_2_nfCF8vbx77tPE_LT5FPyaRnKMwkBxtjgACgYKAUUSARISFQHGX2MiF6xJ93Hm0cpceCC34c2tEBoVAUF8yKrslR0SL49rsVQmf5ffxqj40076 +.youtube.com TRUE / FALSE 1767354772 HSID A86WDM3L_0nAqFvcP +.youtube.com TRUE / TRUE 1767354772 SSID AQRd0DoXZWbIRcxo- +.youtube.com TRUE / FALSE 1767354772 APISID zNM2Br_otKyVj-4g/AIB9K8PubIra0HcQC +.youtube.com TRUE / TRUE 1767354772 SAPISID AKvKG-fNhLd-zOaH/A334ItCv4xUKGjcNu +.youtube.com TRUE / TRUE 1767354772 __Secure-1PAPISID AKvKG-fNhLd-zOaH/A334ItCv4xUKGjcNu +.youtube.com TRUE / TRUE 1767354772 __Secure-3PAPISID AKvKG-fNhLd-zOaH/A334ItCv4xUKGjcNu +.youtube.com TRUE / TRUE 1767355048 LOGIN_INFO AFmmF2swRQIhALHJAgjRY1UiDzNhdHz2acO4WQ4yFr3KAiid56aZFMOvAiBgcqtUc-9mqACMPoSusVzIbL2Dh7rdhDDKxBh5BnItog:QUQ3MjNmekJpTnJoanJVUVdTeHJwNEtsMmtlMUcyYU42MnlQSlhZRksxWFZKa3VhTDFVQ2FRMkFmOXRHNFN0V0NvQVdUSVZwbjQwMHFPX2lzUk1rQkRfZlBxZkZfQ1dDZVZVYVgzeW5OR0JobTJrUnBWQ243bExpNUllYmc5VVZ1VmJ3WkZTQzFkcWF5NTFkS1l5QVFtMFM0N0k2dVhyazlB +.youtube.com TRUE / TRUE 1769400437 PREF f6=40000000&tz=Asia.Jakarta&f7=100 +.youtube.com TRUE / TRUE 1766376485 __Secure-1PSIDTS sidts-CjEB7wV3sYY2Ctv7d7f10SKraCNQ_RA4mpyZIkqAfX4vhxqISeogBlT-pEH83NrpsicdEAA +.youtube.com TRUE / TRUE 1766376485 __Secure-3PSIDTS sidts-CjEB7wV3sYY2Ctv7d7f10SKraCNQ_RA4mpyZIkqAfX4vhxqISeogBlT-pEH83NrpsicdEAA +.youtube.com TRUE / FALSE 1766376485 SIDCC AKEyXzUTvj7yeE38uXM-tp2cKGgwXajEtkxb_mXpfg0i_LdiJWxwCClx1jSzPIAVdWyWAaHUog +.youtube.com TRUE / TRUE 1766376485 __Secure-1PSIDCC AKEyXzVjSXfGVniXeRgp_d6xuMAsjgQ_nqfP5L_93ckZHMLJtHt3E5r3ZwDUHBAC-g1YWTuW1g +.youtube.com TRUE / TRUE 1766376485 __Secure-3PSIDCC AKEyXzUzNHrrhdQLx_MxzkvC1YHaWehk9E7CvpEpwpMr6V-cx829Vg3VZJd9KyLTYXkRC7smag +.youtube.com TRUE / TRUE 1750392405 VISITOR_INFO1_LIVE hsQnEvaoH2c +.youtube.com TRUE / TRUE 1750392405 VISITOR_PRIVACY_METADATA CgJJRBIEGgAgGQ%3D%3D +.youtube.com TRUE / TRUE 0 YSC uVxahClT7Xk +.youtube.com TRUE / TRUE 1750392405 __Secure-ROLLOUT_TOKEN CJnL-J7WkPXOYhCZhcHf2IaKAxjx5-iDwLqKAw%3D%3D diff --git a/setup b/setup index 9c2f71747233..601c729b0eba 100644 --- a/setup +++ b/setup @@ -51,7 +51,7 @@ packages(){ pprint "SUCCESS.\n\n" "cgreen" else pprint "FAIL.\n\n" "cred" - pprint "You need to install ffmpeg manually in order to deploy TanuMusic, exiting...\n" "cblue" + pprint "You need to install ffmpeg manually in order to deploy SprotifyMusic, exiting...\n" "cblue" exit 1 fi fi @@ -82,7 +82,7 @@ installation(){ } clear -pprint "Welcome to TanuMusic Setup Installer\n\n" +pprint "Welcome to SprotifyMusic Setup Installer\n\n" pprint "If you see any error during Installation Process, Please refer to these files for logs: " pprint "\nFor node js errors , Checkout nodelog.txt" pprint "\nFor pypi packages errors , Checkout pypilog.txt" @@ -122,5 +122,5 @@ STRING_SESSION = $string_session OWNER_ID = $ownid""" > .env clear -pprint "\n\n\nThanks for using TanuMusic installer, your vars have been saved successfully ! \nIf you wanna add more variables add them in your env by : vi .env" +pprint "\n\n\nThanks for using SprotifyMusic installer, your vars have been saved successfully ! \nIf you wanna add more variables add them in your env by : vi .env" pprint "\n\nNow you can start the bot by : bash start\n\n" diff --git a/start b/start index a4d32186c186..6cb8c39d8f37 100644 --- a/start +++ b/start @@ -1 +1 @@ -python3 -m TanuMusic +python3 -m SprotifyMusic diff --git a/strings/helpers.py b/strings/helpers.py index 2d5c2abb0613..3020aa1abc35 100644 --- a/strings/helpers.py +++ b/strings/helpers.py @@ -1,121 +1,122 @@ HELP_1 = """ -
❖ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ➥
-● /pause ➥ ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. -● /resume ➥ ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. -● /skip ➥ sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. -● /end ᴏʀ /stop ➥ ᴄʟᴇᴀʀs ᴛʜᴇ ǫᴜᴇᴜᴇ ᴀɴᴅ ᴇɴᴅ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. -● /player ➥ ɢᴇᴛ ᴀ ɪɴᴛᴇʀᴀᴄᴛɪᴠᴇ ᴩʟᴀʏᴇʀ ᴩᴀɴᴇʟ. -● /queue ➥ sʜᴏᴡs ᴛʜᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ʟɪsᴛ. -● /speed or /playback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ɢʀᴏᴜᴘ. -● /cspeed or /cplayback ➥ ғᴏʀ ᴀᴅᴊᴜsᴛɪɴɢ ᴛʜᴇ ᴀᴜᴅɪᴏ ᴘʟᴀʏʙᴀᴄᴋ sᴘᴇᴇᴅ ɪɴ ᴄʜᴀɴɴᴇʟ. - -
❖ ʟᴏᴏᴘ sᴛʀᴇᴀᴍ ➥
-● /loop [enable/disable] ➥ ᴇɴᴀʙʟᴇs/ᴅɪsᴀʙʟᴇs ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ -● /loop [1, 2, 3, ...] ➥ ᴇɴᴀʙʟᴇs ᴛʜᴇ ʟᴏᴏᴘ ғᴏʀ ᴛʜᴇ ɢɪᴠᴇɴ ᴠᴀʟᴜᴇ. - -
❖ sʜᴜғғʟᴇ ᴏ̨ᴜᴇᴜᴇ ➥
-● /shuffle ➥ sʜᴜғғʟᴇ's ᴛʜᴇ ᴏ̨ᴜᴇᴜᴇ. -● /queue ➥ sʜᴏᴡs ᴛʜᴇ sʜᴜғғʟᴇᴅ ᴏ̨ᴜᴇᴜᴇ. - -
❖ sᴇᴇᴋ sᴛʀᴇᴀᴍ ➥
-● /seek [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. -● /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs] ➥ ʙᴀᴄᴋᴡᴀʀᴅ sᴇᴇᴋ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴛᴏ ᴛʜᴇ ᴛʜᴇ ɢɪᴠᴇɴ ᴅᴜʀᴀᴛɪᴏɴ. - -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +>> Admin Commands +┌ pause - Pause the current **playing** stream. +├ resume - Resume the **paused** stream. +├ skip - Skip the current playing stream and start streaming the next track in queue. +├ end or stop - Clears the queue and ends the current playing stream. +├ player - Get an interactive player panel. +├ queue - Shows the queued tracks list. +├ speed or /playback - Adjust the audio playback speed in the group. +└ cspeed or /cplayback - Adjust the audio playback speed in the channel. + +>> Loop Stream +┌ /loop [enable/disable] - Enables/disables loop for the ongoing stream. +└ /loop [1, 2, 3, ...] - Enables the loop for the given value. + +>> Shuffle Queue +┌ /shuffle - Shuffle the queue. +└ /queue - Shows the shuffled queue. + +>> Seek Stream +┌ /seek [duration in seconds] - Seek the stream to the given duration. +└ /seekback [duration in seconds] - Backward seek the stream to the given duration. + +>> Powered by Sprotify Music """ HELP_2 = """ -
❖ ᴀᴜᴛʜ ᴜsᴇʀs ➥
-● /auth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ᴀᴅᴅ ᴀ ᴜsᴇʀ ᴛᴏ ᴀᴜᴛʜ ʟɪsᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. -● /unauth [ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ_ɪᴅ] ➥ ʀᴇᴍᴏᴠᴇ ᴀ ᴀᴜᴛʜ ᴜsᴇʀs ғʀᴏᴍ ᴛʜᴇ ᴀᴜᴛʜ ᴜsᴇʀs ʟɪsᴛ. -● /authusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴜᴛʜ ᴜsᴇʀs ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. +>> Auth Users +┌ /auth [username/user_id] - Add a user to the bot's auth list. +├ /unauth [username/user_id] - Remove a user from the bot's auth list. +└ /authusers - Show the list of authorized users. -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +>> Powered by Sprotify Music """ HELP_3 = """ -
❖ ʙʀᴏᴀᴅᴄᴀsᴛ ғᴇᴀᴛᴜʀᴇ ➥
+>> Broadcast Feature +┌ /broadcast [message or reply to a message] - Broadcast a message to the served chats of the bot. +├ -pin - Pins your broadcasted messages in served chats. +├ -pinloud - Pins your broadcasted message in served chats and sends notifications to members. +├ -user - Broadcasts the message to the users who have started your bot. +├ -assistant - Broadcast your message from the assistant account of the bot. +└ -nobot - Forces the bot not to broadcast the message. -● /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] ➥ ʙʀᴏᴀᴅᴄᴀsᴛ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. +Example: /broadcast -user -assistant -pin Testing Broadcast -● -pin ➥ ᴩɪɴs ʏᴏᴜʀ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇs ɪɴ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs. -● -pinloud ➥ ᴩɪɴs ʏᴏᴜʀ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ sᴇɴᴅ ɴᴏᴛɪғɪᴄᴀᴛɪᴏɴ ᴛᴏ ᴛʜᴇ ᴍᴇᴍʙᴇʀs. -● -user ➥ ʙʀᴏᴀᴅᴄᴀsᴛs ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴛᴏ ᴛʜᴇ ᴜsᴇʀs ᴡʜᴏ ʜᴀᴠᴇ sᴛᴀʀᴛᴇᴅ ʏᴏᴜʀ ʙᴏᴛ. -● -assistant ➥ ʙʀᴏᴀᴅᴄᴀsᴛ ʏᴏᴜʀ ᴍᴇssᴀɢᴇ ғʀᴏᴍ ᴛʜᴇ ᴀssɪᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ᴏғ ᴛʜᴇ ʙᴏᴛ. -● -nobot ➥ ғᴏʀᴄᴇs ᴛʜᴇ ʙᴏᴛ ᴛᴏ ɴᴏᴛ ʙʀᴏᴀᴅᴄᴀsᴛ ᴛʜᴇ ᴍᴇssᴀɢᴇ.. - -● ᴇxᴀᴍᴩʟᴇ ➥ /broadcast -user -assistant -pin ᴛᴇsᴛɪɴɢ ʙʀᴏᴀᴅᴄᴀsᴛ - -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +>> Powered by Sprotify Music """ HELP_4 = """ -
❖ ᴄʜᴀᴛ ʙʟᴀᴄᴋʟɪsᴛ ғᴇᴀᴛᴜʀᴇ ➥
-● /blacklistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ʙʟᴀᴄᴋʟɪsᴛ ᴀ ᴄʜᴀᴛ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. -● /whitelistchat [ᴄʜᴀᴛ ɪᴅ] ➥ ᴡʜɪᴛᴇʟɪsᴛ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ. -● /blacklistedchat ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs. - -
❖ ʙʟᴏᴄᴋ ᴜsᴇʀs ➥
-● /block [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ʙʟᴏᴄᴋ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ ᴏᴜʀ ʙᴏᴛ. -● /unblock [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ● ᴜɴʙʟᴏᴄᴋs ᴛʜᴇ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀ. -● /blockedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs. - -
❖ ɢʟᴏʙᴀʟ ʙᴀɴ ғᴇᴀᴛᴜʀᴇ ➥
-● /gban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ʙᴀɴs ᴛʜᴇ ᴄʜᴜᴛɪʏᴀ ғʀᴏᴍ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴀɴᴅ ʙʟᴀᴄᴋʟɪsᴛ ʜɪᴍ ғʀᴏᴍ ᴜsɪɴɢ ᴛʜᴇ ʙᴏᴛ. -● /ungban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] ➥ ɢʟᴏʙᴀʟʟʏ ᴜɴʙᴀɴs ᴛʜᴇ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀ. -● /gbannedusers ➥ sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs. - -
❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ➥
-● /logs ➥ ɢᴇᴛ ʟᴏɢs ᴏғ ᴛʜᴇ ʙᴏᴛ. -● /logger [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ʙᴏᴛ ᴡɪʟʟ sᴛᴀʀᴛ ʟᴏɢɢɪɴɢ ᴛʜᴇ ᴀᴄᴛɪᴠɪᴛɪᴇs ʜᴀᴩᴩᴇɴ ᴏɴ ʙᴏᴛ. -● /maintenance [ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ] ➥ ᴇɴᴀʙʟᴇ ᴏʀ ᴅɪsᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ʏᴏᴜʀ ʙᴏᴛ. - -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +>> Chat Blacklist Feature +┌ /blacklistchat [chat_id] - Blacklist a chat from using the bot. +├ /whitelistchat [chat_id] - Whitelist a blacklisted chat. +└ /blacklistedchat - Shows the list of blacklisted chats. + +>> Block Users +┌ /block [username or reply to a user] - Block the user from the bot. +├ /unblock [username or reply to a user] - Unblock the user. +└ /blockedusers - Shows the list of blocked users. + +>> Global Ban Feature +┌ /gban [username or reply to a user] - Globally ban a user from all served chats. +├ /ungban [username or reply to a user] - Globally unban a user. +└ /gbannedusers - Shows the list of globally banned users. + +>> Maintenance Mode +┌ /logs - Get logs of the bot. +├ /logger [enable/disable] - Enable or disable logging of the bot activities. +└ /maintenance [enable/disable] - Enable or disable maintenance mode of the bot + +>> Powered by Sprotify Music """ HELP_5 = """ -
❖ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
-● v ➥ sᴛᴀɴᴅs ғᴏʀ ᴠɪᴅᴇᴏ ᴩʟᴀʏ. -● force ➥ sᴛᴀɴᴅs ғᴏʀ ғᴏʀᴄᴇ ᴩʟᴀʏ. -● /play ᴏʀ /vplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. -● /playforce ᴏʀ /vplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. - -
❖ ᴄʜᴀɴɴᴇʟ ᴩʟᴀʏ ᴄᴏᴍᴍᴀɴᴅs ➥
-● /cplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴀᴜᴅɪᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. -● /cvplay ➥ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴠɪᴅᴇᴏ ᴛʀᴀᴄᴋ ᴏɴ ᴄʜᴀɴɴᴇʟ's ᴠɪᴅᴇᴏᴄʜᴀᴛ. -● /cplayforce or /cvplayforce ➥ sᴛᴏᴩs ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ. -● /channelplay [ᴄʜᴀᴛ ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ɪᴅ] ᴏʀ [ᴅɪsᴀʙʟᴇ] ➥ ᴄᴏɴɴᴇᴄᴛ ᴄʜᴀɴɴᴇʟ ᴛᴏ ᴀ ɢʀᴏᴜᴩ ᴀɴᴅ sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʀᴀᴄᴋs ʙʏ ᴛʜᴇ ʜᴇʟᴩ ᴏғ ᴄᴏᴍᴍᴀɴᴅs sᴇɴᴛ ɪɴ ɢʀᴏᴜᴩ. - -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +>> Play Commands +┌ v - Stands for video play. +├ force - Stands for force play. +├ /play or /vplay - Starts streaming the requested track on video chat. +└ /playforce or /vplayforce - Stops the ongoing stream and starts streaming the requested track. + +>> Channel Play Commands +┌ /cplay - Starts streaming the requested track in the linked channel. +├ /cplayforce or /cvplayforce - Stops the ongoing stream and starts streaming the requested track. +└ /channelplay [chat username or ID] or [disable] - Connect a channel to a group and start streaming tracks by commands sent in the group. + +Powered by Sprotify Music """ HELP_6 = """ -
❖ sᴏɴɢ ᴅᴏᴡɴʟᴏᴀᴅ ➥
+>> Song Download -● /song [sᴏɴɢ ɴᴀᴍᴇ] ➥ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴʏ ᴛʀᴀᴄᴋ ғʀᴏᴍ sᴘᴏᴛɪғʏ ɪɴ ᴍᴘ4 ғᴏʀᴍᴀᴛs. +┌ /song [song name] - Download any track from Spotify in MP4 format /song [song name] - Download any track from Spotify in MP4 format +└ Note: This Plugin's still bug, dev too lazy to fix it. -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +Powered by Sprotify Music """ HELP_7 = """ -
❖ ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛʟʏ ➥
+>> Create Quotly -⬤ /q ➥ ᴄʀᴇᴀᴛᴇ ᴀ ǫᴜᴏᴛᴇ ғʀᴏᴍ ᴛʜᴇ ᴍᴇssᴀɢᴇ. +┌ /q - Create a quote from the message. +└ add r to quote reply message -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +Powered by Sprotify Music """ + HELP_8 = """ -
❖ sᴛɪᴄᴋᴇʀ ғᴇᴀᴛᴜʀᴇs ➥
+>> Sticker Features -⬤ /stickerid ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴍᴇ ᴛᴏ ᴛᴇʟʟ ʏᴏᴜ ɪᴛs ғɪʟᴇ ɪᴅ. -⬤ /kang ➥ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ ᴛᴏ ᴀᴅᴅ ɪᴛ ᴛᴏ ʏᴏᴜʀ ᴘᴀᴄᴋ. +┌ /stickerid - Reply to a sticker to get its file ID. +└ /kang - Reply to a sticker to add it to your pack. -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +Powered by Sprotify Music """ + HELP_9 = """ -
❖ ɪᴍᴀɢᴇ ғᴇᴀᴛᴜʀᴇs ➥
+>> Image Features -⬤ /image ➥ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ǫᴜᴇʀʏ ᴛᴏ sᴄʀᴀᴘᴇ ɪᴍᴀɢᴇ ғᴏʀᴍ ɢᴏᴏɢʟᴇ. +⬤ /image - Provide a query to scrape an image from Google. -❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙ +Powered by Sprotify Music """ \ No newline at end of file diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 647a691dc22d..6b53dd652373 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -1,309 +1,312 @@ -name : 🇺🇸 English - - -general_1 : "❖ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." -general_2 : "❖ sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ ᴡʜɪʟᴇ ᴘʀᴏᴄᴇssɪɴɢ ʏᴏᴜʀ ǫᴜᴇʀʏ.\n\n● ᴇxᴄᴇᴘᴛɪᴏɴ ➥ {0}" -general_3 : "❖ ʏᴏᴜ'ʀᴇ ᴀɴ ᴀɴᴏɴʏᴍᴏᴜs ᴀᴅᴍɪɴ ɪɴ ᴛʜɪs ᴄʜᴀᴛ, ʀᴇᴠᴇʀᴛ ʙᴀᴄᴋ ᴛᴏ ᴜsᴇʀ ᴀᴄᴄᴏᴜɴᴛ ғᴏʀ ᴜsɪɴɢ ᴍᴇ." -general_4 : "❖ ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs.\n\n● ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴠɪᴀ /reload" -general_5 : "❖ ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ." - -tg_1 : "❖ {0} ᴅᴏᴡɴʟᴏᴀᴅᴇʀ ⏤͟͟͞͞★\n\n● ғɪʟᴇ sɪᴢᴇ ➥ {1}\n● ᴄᴏᴍᴘʟᴇᴛᴇᴅ ➥ {2}\n● ᴘᴇʀᴄᴇɴᴛᴀɢᴇ ➥ {3}%\n\n● sᴘᴇᴇᴅ ➥ {4}/s\n● ᴇᴛᴀ ➥ {5}" -tg_2 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ᴅᴏᴡɴʟᴏᴀᴅᴇᴅ, ᴘʀᴏᴄᴇssɪɴɢ ғɪʟᴇ...\n\n● ᴛɪᴍᴇ ᴇʟᴀᴘsᴇᴅ ➥ {0}" -tg_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴅᴏᴡɴʟᴏᴀᴅ ᴍᴇᴅɪᴀ ғʀᴏᴍ ᴛᴇʟᴇɢʀᴀᴍ, ᴘʟᴇᴀsᴇ ᴛʀʏ ᴀɢᴀɪɴ..." -tg_4 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴀʟʀᴇᴀᴅʏ ᴄᴏᴍᴘʟᴇᴛᴇᴅ." -tg_5 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴀʟʀᴇᴀᴅʏ ᴄᴏᴍᴘʟᴇᴛᴇᴅ ᴏʀ ᴄᴀɴᴄᴇʟʟᴇᴅ." -tg_6 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴄᴀɴᴄᴇʟʟᴇᴅ." -tg_7 : "❖ ᴅᴏᴡɴʟᴏᴀᴅ ᴄᴀɴᴄᴇʟʟᴇᴅ ʙʏ ➥ {0}" -tg_8 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴛᴏᴘ ᴛʜᴇ ᴅᴏᴡɴʟᴏᴀᴅ." -tg_9 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɢᴇᴛ ᴛʜᴇ ᴏɴɢᴏɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ ᴛᴀsᴋ..." - -call_1 : "❖ ʙᴏᴛ ʀᴇǫᴜɪʀᴇs ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ ɪɴᴠɪᴛᴇ ᴀssɪsᴛᴀɴᴛ ᴛᴏ ʏᴏᴜʀ ᴄʜᴀᴛ." -call_2 : "❖ {0} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.\n\n● ɪᴅ ➥ {1}\n● ɴᴀᴍᴇ ➥ {2}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{3}\n\n● ᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." -call_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {0} ᴀssɪsᴛᴀɴᴛ ᴛᴏ ʏᴏᴜʀ ᴄʜᴀᴛ.\n\n● ʀᴇᴀsᴏɴ ➥ {1}" -call_4 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ɪɴᴠɪᴛɪɴɢ {0} ᴀssɪsᴛᴀɴᴛ ᴛᴏ ʏᴏᴜʀ ᴄʜᴀᴛ..." -call_5 : "❖ {0} ᴀssɪsᴛᴀɴᴛ ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.\n\n● ᴛʀʏɪɴɢ ᴛᴏ sᴛᴀʀᴛ sᴛʀᴇᴀᴍ..." -call_6 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴡɪᴛᴄʜ sᴛʀᴇᴀᴍ, ᴘʟᴇᴀsᴇ ᴜsᴇ /skip ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴛʀᴀᴄᴋ ᴀɢᴀɪɴ." -call_7 : "❖ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ǫᴜᴇᴜᴇ.\n\n● ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." -call_8 : "❖ ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.\n\n● ᴘʟᴇᴀsᴇ sᴛᴀʀᴛ ᴠɪᴅᴇᴏᴄʜᴀᴛ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." -call_9 : "❖ ᴀssɪsᴛᴀɴᴛ ᴀʟʀᴇᴀᴅʏ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.\n\n● ɪғ ᴀssɪsᴛᴀɴᴛ ɪs ɴᴏᴛ ɪɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ, ᴘʟᴇᴀsᴇ sᴇɴᴅ /reboot ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ." -call_10 : "❖ ᴛᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀ ᴇʀʀᴏʀ\n\n● ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴏʀ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴏғ ʏᴏᴜʀ ɢʀᴏᴜᴘ." - -auth_1 : "❖ ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ʜᴀᴠᴇ 25 ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ." -auth_2 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛᴏ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." -auth_3 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ɪɴ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." -auth_4 : "❖ ʀᴇᴍᴏᴠᴇᴅ {0} ғʀᴏᴍ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." -auth_5 : "❖ {0} ɪs ɴᴏᴛ ɪɴ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ." -auth_6 : "❖ ғᴇᴛᴄʜɪɴɢ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." -auth_7 : "❖ ʟɪsᴛ ᴏғ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ɪɴ {0} ⏤͟͟͞͞★\n\n" -auth_8 : "❖ ᴀᴅᴅᴇᴅ ʙʏ ⏤͟͟͞͞★" - -reload_1 : "❖ ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ʀᴇғʀᴇsʜ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴏɴᴄᴇ ɪɴ 3 ᴍɪɴᴜᴛᴇs.\n\n● ᴘʟᴇᴀsᴇ ᴛʀʏ ᴀғᴛᴇʀ {0}." -reload_2 : "❖ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ʀᴇғʀᴇsʜᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." -reload_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ, ᴍᴀᴋᴇ sᴜʀᴇ ᴛʜᴀᴛ ᴛʜᴇ ʙᴏᴛ ɪs ᴀᴅᴍɪɴ ɪɴ ʏᴏᴜʀ ᴄʜᴀᴛ." -reload_4 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ʀᴇʙᴏᴏᴛɪɴɢ {0} ғᴏʀ ʏᴏᴜʀ ᴄʜᴀᴛ." -reload_5 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ʀᴇʙᴏᴏᴛᴇᴅ {0} ғᴏʀ ʏᴏᴜʀ ᴄʜᴀᴛ.\n\n● sᴛᴀʀᴛ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ..." - -admin_1 : "❖ ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ'ᴠᴇ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" -admin_2 : "❖ sᴛʀᴇᴀᴍ ᴘᴀᴜsᴇᴅ \n│ \n└ʙʏ ➥ {0}" -admin_3 : "❖ ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ'ᴠᴇ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" -admin_4 : "❖ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ \n│ \n└ʙʏ ➥ {0}" -admin_5 : "❖ sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ \n│ \n└ʙʏ ➥ {0}" -admin_6 : "❖ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ \n│ \n└ʙʏ ➥ {0}\n\n● ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ {1}, ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ." -admin_7 : "❖ ᴇʀʀᴏʀ ᴡʜɪʟᴇ ᴄʜᴀɴɢɪɴɢ sᴛʀᴇᴀᴍ ᴛᴏ {0}." -admin_8 : "❖ ᴘʟᴇᴀsᴇ ᴅɪsᴀʙʟᴇ ʟᴏᴏᴘ ᴘʟᴀʏ ᴠɪᴀ /loop disable ᴀɴᴅ ᴛʜᴇɴ ᴛʀʏ ᴛᴏ sᴋɪᴘ ᴀɢᴀɪɴ." -admin_9 : "❖ ᴘʟᴇᴀsᴇ ᴜsᴇ sᴘᴇᴄɪғɪᴄ ɴᴜᴍʙᴇʀs ғᴏʀ sᴋɪᴘ, ʟɪᴋᴇ 1, 2, 4..." -admin_10 : "❖ ᴀᴛʟᴇᴀsᴛ 2 ᴛʀᴀᴄᴋs ɴᴇᴇᴅᴇᴅ ɪɴ ǫᴜᴇᴜᴇ ғᴏʀ sᴘᴇᴄɪғɪᴄ sᴋɪᴘ.\n\n● ᴄʜᴇᴄᴋ ᴛʜᴇ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" -admin_11 : "❖ ɴᴏᴛ ᴇɴᴏᴜɢʜ ᴛʀᴀᴄᴋs ɪɴ ǫᴜᴇᴜᴇ ғᴏʀ sᴘᴇᴄɪғɪᴄ sᴋɪᴘ.\n\n● ᴘʟᴇᴀsᴇ sᴋɪᴘ ʙᴇᴛᴡᴇᴇɴ 1 ᴀɴᴅ {0}" -admin_12 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴋɪᴘ ᴛᴏ sᴘᴇᴄɪғɪᴄ ᴛʀᴀᴄᴋ.\n\n● ᴄʜᴇᴄᴋ ʟᴇғᴛ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" -admin_13 : "❖ ᴘʟᴇᴀsᴇ ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴠɪᴀ ➥ /reload" -admin_14 : "❖ ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏ ᴄʜᴀᴛs.\n\n● ʀᴇʟᴏᴀᴅ ᴀᴅᴍɪɴ ᴄᴀᴄʜᴇ ᴠɪᴀ ➥ /reload" -admin_15 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sʜᴜғғʟᴇ.\n\n● ᴄʜᴇᴄᴋ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" -admin_16 : "❖ ǫᴜᴇᴜᴇ sʜᴜғғʟᴇᴅ ʙʏ {0}.\n\n● ᴄʜᴇᴄᴋ sʜᴜғғʟᴇᴅ ǫᴜᴇᴜᴇ ʙʏ ➥ /queue" -admin_17 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /loop enable/disable\n● /loop 10/9/8/7" -admin_18 : "❖ ʟᴏᴏᴘ ᴇɴᴀʙʟᴇᴅ ғᴏʀ {0} ᴛɪᴍᴇs ʙʏ ➥ {1}." -admin_19 : "❖ ʟᴏᴏᴘ ᴘʟᴀʏ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ʙʏ ➥ {0}." -admin_20 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /seek ᴏʀ /seekback [ᴅᴜʀᴀᴛɪᴏɴ ɪɴ sᴇᴄᴏɴᴅs]" -admin_21 : "❖ ᴘʟᴇᴀsᴇ ᴜsᴇ ɴᴜᴍᴇʀɪᴄ ᴅɪɢɪᴛs ғᴏʀ sᴇᴇᴋɪɴɢ ɪɴ sᴇᴄᴏɴᴅs." -admin_22 : "❖ ʟɪᴠᴇ sᴛʀᴇᴀᴍs ᴄᴀɴ'ᴛ ʙᴇ sᴇᴇᴋᴇᴅ." -admin_23 : "❖ ᴛʀʏ sᴇᴇᴋɪɴɢ ᴡɪᴛʜ ᴀ ʟᴏᴡᴇʀ ᴅᴜʀᴀᴛɪᴏɴ.\n\n● ᴘʟᴀʏᴇᴅ {0} ᴏᴜᴛ ᴏғ {1} ᴍɪɴᴜᴛᴇs." -admin_24 : "❖ sᴇᴇᴋɪɴɢ...\n\n● ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." -admin_25 : "❖ sᴛʀᴇᴀᴍ sᴜᴄᴄᴇssғᴜʟʟʏ sᴇᴇᴋᴇᴅ.\n\n● ᴅᴜʀᴀᴛɪᴏɴ ➥ {0} ᴍɪɴᴜᴛᴇs\n● ʙʏ ➥ {1}" -admin_26 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴇᴇᴋ." -admin_27 : "❖ ᴏɴʟʏ ʏᴏᴜᴛᴜʙᴇ sᴛʀᴇᴀᴍ's sᴘᴇᴇᴅ ᴄᴀɴ ʙᴇ ᴄᴏɴᴛʀᴏʟʟᴇᴅ ᴄᴜʀʀᴇɴᴛʟʏ." -admin_28 : "❖ {0} sᴘᴇᴇᴅ ᴄᴏɴᴛʀᴏʟ ᴘᴀɴᴇʟ\n\n● ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ʙᴇʟᴏᴡ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴘʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ." -admin_29 : "❖ ʙᴏᴛ ɪs ᴀʟʀᴇᴀᴅʏ ᴘʟᴀʏɪɴɢ ᴏɴ ɴᴏʀᴍᴀʟ sᴘᴇᴇᴅ." -admin_30 : "❖ ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● sᴏᴍᴇᴏɴᴇ ᴇʟsᴇ ɪs ᴛʀʏɪɴɢ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ sᴛʀᴇᴀᴍ." -admin_31 : "❖ ᴄʜᴀɴɢɪɴɢ sᴘᴇᴇᴅ..." -admin_32 : "❖ ᴛʀʏɪɴɢ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ...\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {0}" -admin_33 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ." -admin_34 : "❖ ᴄʜᴀɴɢᴇᴅ ᴛʜᴇ sᴘᴇᴇᴅ ᴏғ ᴛʜᴇ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ ᴛᴏ {0}x\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {1}" -admin_35 : "❖ ᴛʜᴇ ᴠᴏᴛɪɴɢ ʜᴀs ᴇɴᴅᴇᴅ ʙᴇᴄᴀᴜsᴇ ᴛʜᴇ ᴛʀᴀᴄᴋ ʜᴀs ᴇɴᴅᴇᴅ ғᴏʀ ᴡʜɪᴄʜ ᴛʜᴇ ᴠᴏᴛɪɴɢ ᴡᴀs ᴘʀᴏᴠɪᴅᴇᴅ." -admin_36 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘᴇʀғᴏʀᴍ ᴛʜɪs ᴀᴄᴛɪᴏɴ ʙᴇᴄᴀᴜsᴇ ғᴏʀ ᴡʜɪᴄʜ ᴛʀᴀᴄᴋ ᴛʜᴇ ᴠᴏᴛɪɴɢ ᴡᴀs ᴘʀᴏᴠɪᴅᴇᴅ ɪs ᴇɪᴛʜᴇʀ ᴇɴᴅᴇᴅ ᴏʀ sᴛᴏᴘᴘᴇᴅ." -admin_37 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ɢᴏᴛ {0} ᴜᴘᴠᴏᴛᴇs." -admin_38 : "❖ ᴀᴅᴅᴇᴅ 1 ᴜᴘᴠᴏᴛᴇ." -admin_39 : "❖ ʀᴇᴍᴏᴠᴇᴅ 1 ᴜᴘᴠᴏᴛᴇ." -admin_40 : "❖ ᴜᴘᴠᴏᴛᴇᴅ." - -start_1 : "❖ {0} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ.\n\n❖ ᴜᴘᴛɪᴍᴇ ➥ {1}" - -start_2 : "
❖ нᴇʏ {0}, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ.
\n\n
● ɪ ᴀᴍ {1} ʙᴏᴛ.
\n
● ᴛʜɪs ɪs ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ʙᴏᴛ, ғᴏʀ ʏᴏᴜʀ ɢʀᴏᴜᴘ/ᴄʜᴀɴɴᴇʟ.
\n\n❖ ᴛᴀᴘ ᴏɴ ʜᴇʟᴘ ʙᴜᴛᴛᴏɴ ᴛᴏ sᴇᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs." - -start_3 : "❖ ʜᴇʏ {0},\n● ᴛʜɪs ɪs {1}\n\n● ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ ɪɴ {2}, {3} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." - -start_4 : "❖ sᴜᴘᴇʀɢʀᴏᴜᴘ ɴᴇᴇᴅᴇᴅ ❖\n\n● ᴘʟᴇᴀsᴇ ᴄᴏɴᴠᴇʀᴛ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴛᴏ sᴜᴘᴇʀɢʀᴏᴜᴘ ᴀɴᴅ ᴛʜᴇɴ ᴀᴅᴅ ᴍᴇ ᴀɢᴀɪɴ.\n\n● ʜᴏᴡ ᴛᴏ ᴍᴀᴋᴇ sᴜᴘᴇʀɢʀᴏᴜᴘ ?\n● ᴍᴀᴋᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ's ᴄʜᴀᴛ ʜɪsᴛᴏʀʏ ᴠɪsɪʙʟᴇ ᴏɴᴄᴇ." - -start_5 : "❖ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛ ❖\n\n● ᴛʜɪs ᴄʜᴀᴛ ɪs ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴏɴ {0} ᴅᴀᴛᴀʙᴀsᴇ.\n● ʀᴇǫᴜᴇsᴛ ᴀ sᴜᴅᴏ ᴜsᴇʀ ᴛᴏ ᴜɴʙʟᴀᴄᴋʟɪsᴛ ʏᴏᴜʀ ᴄʜᴀᴛ ᴏʀ ᴠɪsɪᴛ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ." - -start_6 : "❖ 🥀ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ❖\n\n● 📌ᴛɪᴛʟᴇ ➥ {0}\n\n● ⏳ᴅᴜʀᴀᴛɪᴏɴ ➥ {1} ᴍɪɴᴜᴛᴇs\n● 👀ᴠɪᴇᴡs ➥ {2}\n● ⏰ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ ➥ {3}\n● ᴄʜᴀɴɴᴇʟ ➥ {5}\n\n● sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ ➥ {6}" - -help_1 : "
❖ ᴄʜᴏᴏsᴇ ᴛʜᴇ ᴄᴀᴛᴇɢᴏʀʏ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴩ.
\n\n● ᴀsᴋ ʏᴏᴜʀ ᴅᴏᴜʙᴛs ᴀᴛ ➥ sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ" -help_2 : "❖ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ᴍʏ ʜᴇʟᴘ ᴍᴇɴᴜ ɪɴ ʏᴏᴜʀ ᴘᴍ." - -lang_1 : "❖ ᴘʟᴇᴀsᴇ ᴄʜᴏᴏsᴇ ᴛʜᴇ ʟᴀɴɢᴜᴀɢᴇ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ sᴇᴛ ᴀs ᴛʜɪs ɢʀᴏᴜᴘ's ᴅᴇғᴀᴜʟᴛ ʟᴀɴɢᴜᴀɢᴇ" -lang_2 : "❖ ʟᴀɴɢᴜᴀɢᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." -lang_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ʟᴀɴɢᴜᴀɢᴇ." -lang_4 : "❖ Yᴏᴜ'ʀᴇ ᴀʟʀᴇᴀᴅʏ ᴏɴ ᴛʜᴇ sᴀᴍᴇ ʟᴀɴɢᴜᴀɢᴇ." - -setting_1 : "❖ {0} sᴇᴛᴛɪɴɢs ᴘᴀɴᴇʟ\n\n● ᴄʜᴀᴛ ɪᴅ ➥ {1}\n● ᴄʜᴀᴛ ᴛɪᴛʟᴇ ➥ {2}\n\n● ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ʙᴇʟᴏᴡ ғᴏʀ ᴄʜᴀɴɢɪɴɢ sᴇᴛᴛɪɴɢs." -setting_2 : "❖ ᴅɪʀᴇᴄᴛ ➥ ᴘʟᴀʏs sᴇᴀʀᴄʜ ǫᴜᴇʀɪᴇs ᴅɪʀᴇᴄᴛʟʏ.\n\n● ɪɴʟɪɴᴇ ➥ ʀᴇᴛᴜʀɴs ɪɴʟɪɴᴇ ʙᴜᴛᴛᴏɴs ꜰᴏʀ ᴄʜᴏᴏsɪɴɢ ʙᴇᴛᴡᴇᴇɴ ᴠɪᴅᴇᴏ & ᴀᴜᴅɪᴏ." -setting_3 : "❖ ᴇᴠᴇʀʏᴏɴᴇ ➥ ᴀɴʏᴏɴᴇ ᴄᴀɴ ᴜsᴇ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs [sᴋɪᴘ, ᴘᴀᴜsᴇ, ʀᴇsᴜᴍᴇ ᴇᴛᴄ.] ᴘʀᴇsᴇɴᴛ ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ.\n\n● ᴀᴅᴍɪɴ ᴏɴʟʏ ➥ ᴏɴʟʏ ᴀᴅᴍɪɴs ᴀɴᴅ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ᴄᴀɴ ᴜsᴇ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs." -setting_4 : "❖ ɴᴏ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ꜰᴏᴜɴᴅ." -setting_5 : "❖ ɢʀᴏᴜᴘ ➥ ᴘʟᴀʏs ᴍᴜsɪᴄ ɪɴ ᴛʜᴇ ɢʀᴏᴜᴘ ᴡʜᴇʀᴇ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ ɪs ɢɪᴠᴇɴ.\n\n● ᴄʜᴀɴɴᴇʟ ➥ ᴘʟᴀʏs ᴍᴜsɪᴄ ɪɴ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ ʏᴏᴜ ᴡᴀɴᴛ. sᴇᴛ ᴄʜᴀɴɴᴇʟ ɪᴅ ᴠɪᴀ ➥ /channelplay" -setting_6 : "❖ ᴇᴠᴇʀʏᴏɴᴇ ➥ ᴀɴʏᴏɴᴇ ᴘʀᴇsᴇɴᴛ ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ ᴄᴀɴ ᴘʟᴀʏ ᴍᴜsɪᴄ ʜᴇʀᴇ.\n\n● ᴀᴅᴍɪɴ ᴏɴʟʏ ➥ ᴏɴʟʏ ᴀᴅᴍɪɴs ᴄᴀɴ ᴘʟᴀʏ ᴛʜᴇ ᴍᴜsɪᴄ ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ." -setting_7 : "❖ ᴘʟᴇᴀsᴇ ᴅᴇғɪɴᴇ ᴄʜᴀɴɴᴇʟ ɪᴅ ᴠɪᴀ ➥ /channelplay" -setting_8 : "❖ ᴡʜᴇɴ ᴛʜɪs ᴍᴏᴅᴇ ɪs ᴇɴᴀʙʟᴇᴅ, ᴘᴇᴏᴘʟᴇ ᴡɪᴛʜᴏᴜᴛ ᴀᴅᴍɪɴ ʀɪɢʜᴛs ᴄᴀɴ ᴜsᴇ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ᴀғᴛᴇʀ ᴀ ᴄᴇʀᴛᴀɪɴ ᴀᴍᴏᴜɴᴛ ᴏғ ᴠᴏᴛᴇs." -setting_9 : "❖ ᴄᴜʀʀᴇɴᴛ ᴜᴘᴠᴏᴛᴇs ʀᴇǫᴜɪʀᴇᴅ ғᴏʀ ᴜsɪɴɢ ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ➥ {0}" -setting_10 : "❖ ᴠᴏᴛɪɴɢ ᴍᴏᴅᴇ ɪs ᴅɪsᴀʙʟᴇᴅ." -setting_11 : "❖ ʟᴏᴡᴇsᴛ ᴜᴘᴠᴏᴛᴇs ᴄᴏᴜɴᴛ ᴄᴀɴ ʙᴇ 2. ʏᴏᴜ ᴄᴀɴ'ᴛ sᴇᴛ ʙᴇʟᴏᴡ 2" -setting_12 : "❖ ʜɪɢʜᴇsᴛ ᴜᴘᴠᴏᴛᴇs ᴄᴏᴜɴᴛ ᴄᴀɴ ʙᴇ 15. ʏᴏᴜ ᴄᴀɴ'ᴛ sᴇᴛ ᴀʙᴏᴠᴇ 15" - -set_cb_1 : "❖ ɢᴇᴛᴛɪɴɢ ᴀᴜᴛʜ ᴜsᴇʀs ᴩᴀɴᴇʟ..." -set_cb_2 : "❖ ɢᴇᴛᴛɪɴɢ ᴩʟᴀʏ ᴍᴏᴅᴇ ᴩᴀɴᴇʟ..." -set_cb_3 : "❖ sᴇᴛᴛɪɴɢ ᴜᴩ ᴄʜᴀɴɢᴇs..." -set_cb_4 : "❖ ғᴇᴛᴄʜɪɴɢ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." -set_cb_5 : "❖ ɢᴇᴛᴛɪɴɢ ʙᴀᴄᴋ..." - -gstats_1 : "❖ ɢᴇᴛᴛɪɴɢ {0} sᴛᴀᴛs ᴀɴᴅ ɪɴғᴏʀᴍᴀᴛɪᴏɴ...\n\n● ɪᴛ ᴍᴀʏ ᴛᴀᴋᴇ ᴀ ᴡʜɪʟᴇ, ᴘʟᴇᴀsᴇ ʜᴏʟᴅ ᴏɴ..." -gstats_2 : "❖ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ʙᴇʟᴏᴡ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʜᴇ sᴛᴀᴛs ᴏғ ➥ {0}." -gstats_3 : "❖ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙゙ ʙᴏᴛ sᴛᴀᴛɪsᴛɪᴄs ❖\n\n╭✠──────⊱◈◈◈⊰──────✠╮\n│● ᴀssɪsᴛᴀɴᴛs ➥ {1}\n│● ʙʟᴏᴄᴋᴇᴅ ➥ {2}\n│● ᴄʜᴀᴛs ➥ {3}\n│● ᴜsᴇʀs ➥ {4}\n│● ᴍᴏᴅᴜʟᴇs ➥ {5}\n│● sᴜᴅᴏᴇʀs ➥ {6}\n╰✠──────⊱◈◈◈⊰──────✠╯\n\n● ᴀᴜᴛᴏ ʟᴇᴀᴠɪɴɢ ᴀssɪsᴛᴀɴᴛ ➥ {7}\n● ᴘʟᴀʏ ᴅᴜʀᴀᴛɪᴏɴ ʟɪᴍɪᴛ ➥ {8} ᴍɪɴᴜᴛᴇs\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" -gstats_4 : "❖ ᴛʜɪs ʙᴜᴛᴛᴏɴ ɪs ᴏɴʟʏ ғᴏʀ sᴜᴅᴏᴇʀs." -gstats_5 : "❖ {0} sᴛᴀᴛs ᴀɴᴅ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ⏤͟͟͞͞★\n\n● ᴍᴏᴅᴜʟᴇs ➥ {1}\n● ᴘʟᴀᴛғᴏʀᴍ ➥ {2}\n● ʀᴀᴍ ➥ {3}\n● ᴘʜʏsɪᴄᴀʟ ᴄᴏʀᴇs ➥ {4}\n● ᴛᴏᴛᴀʟ ᴄᴏʀᴇs ➥ {5}\n● ᴄᴘᴜ ➥ {6}\n\n● ᴘʏᴛʜᴏɴ ➥ {7}\n● ᴘʏʀᴏɢʀᴀᴍ ➥ {8}\n● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ {9}\n\n● sᴛᴏʀᴀɢᴇ ᴀᴠᴀɪʟᴀʙʟᴇ ➥ {10} ɢɪʙ\n● sᴛᴏʀᴀɢᴇ ᴜsᴇᴅ ➥ {11} ɢɪʙ\n● sᴛᴏʀᴀɢᴇ ʟᴇғᴛ ➥ {12} ɢɪʙ\n\n● sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ➥ {13}\n● sᴇʀᴠᴇᴅ ᴜsᴇʀs ➥ {14}\n● ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ➥ {15}\n● sᴜᴅᴏ ᴜsᴇʀs ➥ {16}\n\n● ᴛᴏᴛᴀʟ ᴅʙ sɪᴢᴇ ➥ {17} ᴍʙ\n● ᴛᴏᴛᴀʟ ᴅʙ sᴛᴏʀᴀɢᴇ ➥ {18} ᴍʙ\n● ᴛᴏᴛᴀʟ ᴅʙ ᴄᴏʟʟᴇᴄᴛɪᴏɴs ➥ {19}\n● ᴛᴏᴛᴀʟ ᴅʙ ᴋᴇʏs ➥ {20}" - -playcb_1 : "❖ ᴀᴡᴡ, ᴛʜɪs ɪs ɴᴏᴛ ғᴏʀ ʏᴏᴜ ʙᴀʙʏ." -playcb_2 : "❖ ɢᴇᴛᴛɪɴɢ ɴᴇxᴛ ʀᴇsᴜʟᴛ,\n\n● ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ..." - -cplay_1 : "❖ ʏᴏᴜ ᴄᴀɴ ᴘʟᴀʏ ᴍᴜsɪᴄ ɪɴ ᴄʜᴀɴɴᴇʟs ғʀᴏᴍ {0} ᴛᴏ ᴀɴʏ ᴄʜᴀɴɴᴇʟ ᴏʀ ʏᴏᴜʀ ᴄʜᴀᴛ's ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ.\n\n● ғᴏʀ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ➥\n● /channelplay linked\n\n● ғᴏʀ ᴀɴʏ ᴏᴛʜᴇʀ ᴄʜᴀɴɴᴇʟ ➥\n/channelplay [ᴄʜᴀɴɴᴇʟ ɪᴅ]" -cplay_2 : "❖ ᴛʜɪs ᴄʜᴀᴛ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴀɴʏ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ." -cplay_3 : "❖ ᴄʜᴀɴɴᴇʟ ᴅᴇғɪɴᴇᴅ ᴛᴏ {0}.\n● ᴄʜᴀɴɴᴇʟ ɪᴅ ➥ {1}" -cplay_4 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɢᴇᴛ ᴄʜᴀɴɴᴇʟ.\n\n● ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ'ᴠᴇ ᴀᴅᴅᴇᴅ ᴛʜᴇ ʙᴏᴛ ɪɴ ʏᴏᴜʀ ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴘʀᴏᴍᴏᴛᴇᴅ ᴀs ᴀᴅᴍɪɴ." -cplay_5 : "❖ ᴏɴʟʏ ᴄʜᴀɴɴᴇʟs ᴀʀᴇ sᴜᴘᴘᴏʀᴛᴇᴅ." -cplay_6 : "❖ ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ʙᴇ ᴛʜᴇ ᴏᴡɴᴇʀ ᴏғ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ {0} ᴛᴏ ᴄᴏɴɴᴇᴄᴛ ɪᴛ ᴡɪᴛʜ ᴛʜɪs ɢʀᴏᴜᴘ.\n● ᴄʜᴀɴɴᴇʟ's ᴏᴡɴᴇʀ ➥ @{1}\n\n● ᴀʟᴛᴇʀɴᴀᴛɪᴠᴇʟʏ ʏᴏᴜ ᴄᴀɴ ʟɪɴᴋ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴛᴏ ᴛʜᴀᴛ ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴛʜᴇɴ ᴛʀʏ ᴄᴏɴɴɴᴇᴄᴛɪɴɢ ᴡɪᴛʜ /channelplay linked" -cplay_7 : "❖ ᴄʜᴀɴɴᴇʟ ᴘʟᴀʏ ᴅɪsᴀʙʟᴇᴅ." +name: 🇺🇸 English + +general_1: ">> Reply to a user's message or give username/user ID." +general_2: ">> Something went wrong while processing your query.\n\n● Exception: {0}" +general_3: ">> You're an anonymous admin in this chat, revert back to user account for using me." +general_4: ">> You don't have permissions to manage video chats.\n\n● Reload admin cache via /reload" +general_5: ">> Bot isn't streaming on video chat." + +tg_1: ">> {0} Downloader ⏤͟͟͞͞★\n\n● File size: {1}\n● Completed: {2}\n● Percentage: {3}%\n\n● Speed: {4}/s\n● ETA: {5}" +tg_2: ">> Successfully downloaded, processing file...\n\n● Time elapsed: {0}" +tg_3: ">> Failed to download media from Telegram, please try again..." +tg_4: ">> Download already completed." +tg_5: ">> Download already completed or canceled." +tg_6: ">> Download canceled." +tg_7: ">> Download canceled by: {0}" +tg_8: ">> Failed to stop the download." +tg_9: ">> Failed to get the ongoing download task..." + +call_1: ">> Bot requires invite users via link permission to invite assistant to your chat." +call_2: ">> {0} assistant is banned in your group/channel.\n\n● ID: {1}\n● Name: {2}\n● Username: @{3}\n\n● Please unban the assistant and try again." +call_3: ">> Failed to invite {0} assistant to your chat.\n\n● Reason: {1}" +call_4: ">> Please wait...\n\n● Inviting {0} assistant to your chat..." +call_5: ">> {0} assistant joined successfully.\n\n● Trying to start stream..." +call_6: ">> Failed to switch stream, please use /skip to change the track again." +call_7: ">> Downloading next track from queue.\n\n● Please hold on..." +call_8: ">> No active videochat found.\n\n● Please start videochat in your group/channel and try again." +call_9: ">> Assistant already in videochat.\n\n● If assistant is not in videochat, please send /reboot and play again." +call_10: ">> Telegram server error\n\n● Telegram is having some internal problems, please try playing again or restart the videochat of your group." + +auth_1: ">> You can only have 25 authorized users in your group." +auth_2: ">> Added {0} to authorized users list." +auth_3: ">> {0} is already in authorized users list." +auth_4: ">> Removed {0} from authorized users list." +auth_5: ">> {0} is not in authorized users list." +auth_6: ">> Fetching authorized users list..." +auth_7: ">> List of authorized users in {0} ⏤͟͟͞͞★\n\n" +auth_8: ">> Added by ⏤͟͟͞͞★" + +reload_1: ">> You can only refresh admin cache once in 3 minutes.\n\n● Please try after {0}." +reload_2: ">> Admin cache refreshed successfully." +reload_3: ">> Failed to reload admin cache, make sure the bot is admin in your chat." +reload_4: ">> Please wait...\n\n● Rebooting {0} for your chat." +reload_5: ">> Successfully rebooted {0} for your chat.\n\n● Start playing again..." + +admin_1: ">> Did you remember that you've resumed the stream?" +admin_2: ">> Stream paused\n│\n└by: {0}" +admin_3: ">> Did you remember that you've paused the stream?" +admin_4: ">> Stream resumed\n│\n└by: {0}" +admin_5: ">> Stream ended/stopped\n│\n└by: {0}" +admin_6: ">> Stream skipped\n│\n└by: {0}\n\n● No more queued tracks in {1}, leaving videochat." +admin_7: ">> Error while changing stream to {0}." +admin_8: ">> Please disable loop play via /loop disable and then try to skip again." +admin_9: ">> Please use specific numbers for skip, like 1, 2, 4..." +admin_10: ">> At least 2 tracks needed in queue for specific skip.\n\n● Check the queue by: /queue" +admin_11: ">> Not enough tracks in queue for specific skip..." + +admin_12: ">> Failed to skip to specific track.\n\n● Check left queue by: /queue" +admin_13: ">> Please reload admin cache via: /reload" +admin_14: ">> You don't have permissions to manage video chats.\n\n● Reload admin cache via: /reload" +admin_15: ">> Failed to shuffle.\n\n● Check queued shuffle by: /queue" +admin_16: ">> Queue shuffled by {0}.\n\n● Check shuffled queue by: /queue" +admin_17: ">> Example:\n\n● /loop enable/disable\n● /loop 10/9/8/7" +admin_18: ">> Loop enabled for {0} times by: {1}." +admin_19: ">> Loop play has been disabled by: {0}." +admin_20: ">> Example:\n\n● /seek or /seekback [duration in seconds]" +admin_21: ">> Please use numeric digits for seeking in seconds." +admin_22: ">> Live streams can't be seeked." +admin_23: ">> Try seeking with a lower duration.\n\n● Played {0} out of {1} minutes." +admin_24: ">> Seeking...\n\n● Please hold on..." +admin_25: ">> Stream successfully seeked.\n\n● Duration: {0} minutes\n● By: {1}" +admin_26: ">> Failed to seek." +admin_27: ">> Only YouTube stream's speed can be controlled currently." +admin_28: ">> {0} Speed Control Panel\n\n● Click on the buttons below to change the speed of currently playing stream on video chat." +admin_29: ">> Bot is already playing on normal speed." +admin_30: ">> Please wait...\n\n● Someone else is trying to change the speed of the stream." +admin_31: ">> Changing speed..." +admin_32: ">> Trying to change the speed of the ongoing stream...\n\n● Requested by: {0}" +admin_33: ">> Failed to change the speed of the ongoing stream." +admin_34: ">> Changed the speed of the ongoing stream to {0}x\n\n● Requested by: {1}" +admin_35: ">> The voting has ended because the track has ended for which the voting was provided." +admin_36: ">> Failed to perform this action because for which track the voting was provided is either ended or stopped." +admin_37: ">> Successfully got {0} upvotes." +admin_38: ">> Added 1 upvote." +admin_39: ">> Removed 1 upvote." +admin_40: ">> Upvoted." + +start_1 : ">> {0} is alive baby.\n\n>> Uptime: {1}" + +start_2 : "
>> Hey {0}, Nice to meet you.
\n\n
● I am {1} bot.
\n
● This is powerful music bot, For your group/channel.
\n\n>> Tap on help button to see all my commands." + +start_3 : ">> Hey {0},\n● This is {1}\n\n● Thanks for adding me in {2}, {3} Can now play songs in this chat." + +start_4 : ">> Supergroup Needed >>\n\n● Please convert your Group to Supergroup and then add me again.\n\n● How to make Supergroup ?\n● Make your Group's chat history Visible once." + +start_5 : ">> Blacklisted Chat >>\n\n● This chat is blacklisted on {0} database.\n● Request a Sudo User to unblacklist your chat or visit Support Chat." + +start_6 : ">> 🥀Track Information >>\n\n● 📌Title: {0}\n\n● ⏳Duration: {1} minutes\n● 👀Views: {2}\n● ⏰Published on: {3}\n● Channel: {5}\n\n● Search Powered by: {6}" + +help_1 : "
>> Choose the category for which you wanna get help.
\n\n● Ask your doubts at: Support Chat" +help_2 : ">> Click on the button below to get my help menu in your PM." + +lang_1 : ">> Please choose the language which you wanna set as this group's default language" +lang_2 : ">> Language changed successfully." +lang_3 : ">> Failed to change language." +lang_4 : ">> You're already on the same language." + +setting_1 : ">> {0} Settings Panel\n\n● Chat ID: {1}\n● Chat Title: {2}\n\n● Click on the buttons below for changing settings." +setting_2 : ">> Direct: Plays search queries directly.\n\n● Inline: Returns inline buttons for choosing between video & audio." +setting_3 : ">> Everyone: Anyone can use admin commands [skip, pause, resume etc.] present." +setting_4 : ">> Only Owner: Only owner of chat can control admin commands." +setting_5 : ">> Clear Content: Clear all content of chat." +setting_6 : ">> Timeout Oops. The error occurs in the command." +setting_7 : ">> Configurecommands Configurecommands or create your own." +setting_8 : ">> Do not try overdoot the error." +setting_9 : ">> Current upvotes required for using admin commands are: {0}" +setting_10 : ">> Voting mode is disabled." +setting_11 : ">> Lowest upvotes count can be 2. You can't set below 2" +setting_12 : ">> Highest upvotes count can be 15. You can't set above 15" + +set_cb_1 : ">> Getting auth users panel..." +set_cb_2 : ">> Getting play mode panel..." +set_cb_3 : ">> Setting up changes..." +set_cb_4 : ">> Fetching authorized users list..." +set_cb_5 : ">> Getting back..." + +gstats_1 : ">> Getting {0} stats and information...\n\n● It may take a while, please hold on..." +gstats_2 : ">> Click on the buttons below to check the stats of: {0}." +gstats_3 : ">> ˹ Tanu ꭙ Music™ ♡゙ Bot Statistics >>\n\n╭✠──────⊱◈◈◈⊰──────✠╮\n│● Assistants: {1}\n│● Blocked: {2}\n│● Chats: {3}\n│● Users: {4}\n│● Modules: {5}\n│● Sudoers: {6}\n╰✠──────⊱◈◈◈⊰──────✠╯\n\n● Auto leaving assistant: {7}\n● Play duration limit: {8} minutes\n\n>> " +gstats_4 : ">> This button is only for sudoers." +gstats_5 : ">> {0} Stats and Information ⏤͟͟͞͞★\n\n● Modules: {1}\n● Platform: {2}\n● RAM: {3}\n● Physical Cores: {4}\n● Total Cores: {5}\n● CPU: {6}\n\n● Python: {7}\n● Pyrogram: {8}\n● Py-TgCalls: {9}\n\n● Storage Available: {10} GiB\n● Storage Used: {11} GiB\n● Storage Left: {12} GiB\n\n● Served Chats: {13}\n● Served Users: {14}\n● Blocked Users: {15}\n● Sudo Users: {16}\n\n● Total DB Size: {17} MB\n● Total DB Storage Used: {18} MB" + +playcb_1 : ">> Aww, this is not for you baby." +playcb_2 : ">> Getting next result,\n\n● Please wait..." + +cplay_1 : ">> You can play music in channels from {0} to any channel or your chat's linked channel.\n\n● For linked channel:\n● /channelplay linked\n\n● For any other channel:\n/channelplay [channel id]" +cplay_2 : ">> This chat doesn't have any linked channel." +cplay_3 : ">> Channel defined to {0}.\n● Channel ID: {1}" +cplay_4 : ">> Failed to get channel.\n\n● Make sure you've added the bot in your channel and promoted as admin." +cplay_5 : ">> Only channels are supported." +cplay_6 : ">> You need to be the owner of the channel {0} to connect it with this group.\n● Channel's owner: @{1}\n\n● Alternatively you can link your group to that channel and then try connecting with /channelplay linked" +cplay_7 : ">> Channel play disabled." play_1 : "🔎" -play_2 : "❖ ᴄʜᴀɴɴᴇʟ ᴘʟᴀʏ ᴍᴏᴅᴇ\n\n● ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\n● ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ➥ {0}" -play_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ǫᴜᴇʀʏ." -play_4 : "❖ ᴀᴅᴍɪɴs ᴏɴʟʏ ᴘʟᴀʏ\n● ᴏɴʟʏ ᴀᴅᴍɪɴs ᴏғ ᴛʜɪs ᴄʜᴀᴛ ᴀʀᴇ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ\n\n● ᴄʜᴀɴɢᴇ ᴘʟᴀʏ ᴍᴏᴅᴇ ᴠɪᴀ ➥ /playmode" -play_5 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴀᴜᴅɪᴏ ғɪʟᴇ.\n\n● ᴀᴜᴅɪᴏ ғɪʟᴇ sɪᴢᴇ ɪs ʟᴀʀɢᴇʀ ᴛʜᴀɴ ᴛʜᴇ ᴅᴇғɪɴᴇᴅ ʟɪᴍɪᴛ." -play_6 : "❖ sᴛʀᴇᴀᴍ's ʟᴏɴɢᴇʀ ᴛʜᴀɴ {0} ᴀʀᴇɴ'ᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {1}" -play_7 : "❖ ɴᴏᴛ ᴀ ᴠᴀʟɪᴅ ᴠɪᴅᴇᴏ ғɪʟᴇ ᴇxᴛᴇɴsɪᴏɴ.\n\n● sᴜᴘᴘᴏʀᴛᴇᴅ ᴇxᴛᴇɴsɪᴏɴs ➥ {0}" -play_8 : "❖ ᴠɪᴅᴇᴏ ғɪʟᴇ sɪᴢᴇ sʜᴏᴜʟᴅ ʙᴇ ʟᴇss ᴛʜᴀɴ 1ɢɪʙ." -play_9 : "❖ ʏᴏᴜᴛᴜʙᴇ ᴘʟᴀʏʟɪsᴛ ғᴇᴀᴛᴜʀᴇ\n\n● sᴇʟᴇᴄᴛ ᴛʜᴇ ᴍᴏᴅᴇ ɪɴ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴘʟᴀʏ ᴡʜᴏʟᴇ ʏᴏᴜᴛᴜʙᴇ ᴘʟᴀʏʟɪsᴛ." -play_10 : "❖ ᴛɪᴛʟᴇ ➥ {0}\n● ᴅᴜʀᴀᴛɪᴏɴ ➥ {1} ᴍɪɴᴜᴛᴇs" -play_11 : "❖ {0} sᴘᴏᴛɪғʏ ᴘʟᴀʏᴇʀ\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {1}" -play_12 : "❖ {0} ᴀᴘᴘʟᴇ ᴘʟᴀʏᴇʀ\n\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {1}" -play_13 : "❖ ʟɪᴠᴇ sᴛʀᴇᴀᴍ ᴅᴇᴛᴇᴄᴛᴇᴅ.\n\n● ᴀʀᴇ ʏᴏᴜ sᴜʀᴇ ᴛʜᴀᴛ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ᴛʜɪs ʟɪᴠᴇ sᴛʀᴇᴀᴍ ?" -play_14 : "❖ ꜰᴀɪʟᴇᴅ ᴛᴏ ꜰᴇᴛᴄʜ ᴛʀᴀᴄᴋ ᴅᴇᴛᴀɪʟs.\n\n● ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɴʏ ᴏᴛʜᴇʀ." -play_15 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ǫᴜᴇʀʏ.\n\n● ɪ ᴄᴀɴ ᴏɴʟʏ ᴘʟᴀʏ sᴘᴏᴛɪғʏ ᴛʀᴀᴄᴋs, ᴀʟʙᴜᴍs, ᴀʀᴛɪsᴛs ᴀɴᴅ ᴘʟᴀʏʟɪsᴛs." -play_16 : "❖ ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇ ᴄʜᴀᴛ.\n\n● ᴛᴏ ᴜsᴇ ғᴏʀᴄᴇ ᴩʟᴀʏ, ᴛʜᴇʀᴇ ᴍᴜsᴛ ʙᴇ ᴀɴ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛ." -play_17 : "❖ ᴘʟᴇᴀsᴇ ᴛᴜʀɴ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ, ɪ'ᴍ ᴜɴᴀʙʟᴇ ᴛᴏ sᴛʀᴇᴀᴍ ᴜʀʟs." -play_18 : "❖ ᴜsᴀɢᴇ ➥ /play [sᴏɴɢ ɴᴀᴍᴇ/ʏᴏᴜᴛᴜʙᴇ ᴜʀʟ/ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴀᴜᴅɪᴏ/ᴠɪᴅᴇᴏ ғɪʟᴇ]" -play_19 : "❖ Queued Playlist :" -play_20 : "❖ Queued Position-" -play_21 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛʀᴀᴄᴋs ᴛᴏ ǫᴜᴇᴜᴇ.\n\n● ᴄʜᴇᴄᴋ ➥ ᴄʟɪᴄᴋ ʜᴇʀᴇ" -play_22 : "❖ sᴇʟᴇᴄᴛ ᴛʜᴇ ᴍᴏᴅᴇ ɪɴ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴘʟᴀʏ ᴛʜᴇ ǫᴜᴇʀɪᴇs ɪɴsɪᴅᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ ➥ {0}" - -str_1 : "❖ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴍ3ᴜ8 ᴏʀ ɪɴᴅᴇx ʟɪɴᴋs." -str_2 : "❖ ᴠᴀʟɪᴅ sᴛʀᴇᴀᴍ ᴠᴇʀɪғɪᴇᴅ.\n\n● ᴘʀᴏᴄᴇssɪɴɢ..." -str_3 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ sᴛʀᴇᴀᴍ ʏᴏᴜᴛᴜʙᴇ ʟɪᴠᴇ sᴛʀᴇᴀᴍ, ɴᴏ ʟɪᴠᴇ ꜰᴏʀᴍᴀᴛ ꜰᴏᴜɴᴅ." - -ping_1 : "❖ {0} ɪs ᴘɪɴɢɪɴɢ..." -ping_2 : "❖ 🏓 ᴛᴀɴᴜ ᴍᴜsɪᴄ ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ ⏤‌★\n\n╭✠──────⊱◈◈◈⊰──────✠╮\n│● ᴘɪɴɢ ➥ {0}ᴍs\n│● ᴜᴘᴛɪᴍᴇ ➥ {2}\n│● ʀᴀᴍ ➥ {3}\n│● ᴄᴘᴜ ➥ {4}\n│● ᴅɪsᴋ ➥ {5}\n│● ᴘʏ-ᴛɢᴄᴀʟʟs ➥ {6}ᴍs\n╰✠──────⊱◈◈◈⊰──────✠╯\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" - -queue_1 : "❖ ғᴇᴛᴄʜɪɴɢ ǫᴜᴇᴜᴇ...\n\nᴘʟᴇᴀsᴇ ᴡᴀɪᴛ..." -queue_2 : "❖ ǫᴜᴇᴜᴇ ᴇᴍᴘᴛʏ." -queue_3 : "❖ ᴄʟɪᴄᴋ ʜᴇʀᴇ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʜᴇ ʟɪsᴛ ᴏғ ᴛʜᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ➥ ʜᴇʀᴇ" -queue_4 : "❖ ɴᴇxᴛ sᴏɴɢ ᴀᴅᴅᴇᴅ ɪɴ ǫᴜᴇᴜᴇ ➥ #{0}\n\n⬤ ᴛɪᴛʟᴇ ➥ {1}\n⬤ ᴅᴜʀᴀᴛɪᴏɴ ➥ {2} ᴍɪɴᴜᴛᴇs\n⬤ ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {3}\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" -queue_5 : "❖ ᴛʜᴇʀᴇ's ᴏɴʟʏ ᴏɴᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋ ɪɴ ᴘʟᴀʏʟɪsᴛ.\n\n● ᴀᴅᴅ ᴍᴏʀᴇ ᴛʀᴀᴄᴋs ᴛᴏ ᴄʜᴇᴄᴋ ʟɪsᴛ." -queue_6 : "❖ ᴅᴜʀᴀᴛɪᴏɴ ➥ ᴜɴᴋɴᴏᴡɴ ᴅᴜʀᴀᴛɪᴏɴ sᴛʀᴇᴀᴍ\n\n● ᴄʟɪᴄᴋ ᴏɴ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ᴡʜᴏʟᴇ ǫᴜᴇᴜᴇᴅ ʟɪsᴛ." -queue_7 : "\n❖ ᴄʟɪᴄᴋ ᴏɴ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ᴡʜᴏʟᴇ ǫᴜᴇᴜᴇᴅ ʟɪsᴛ." -queue_8 : "❖ {0} ᴘʟᴀʏᴇʀ ❖\n\n● sᴛʀᴇᴀᴍɪɴɢ ➥ {1}\n\n● sᴛʀᴇᴀᴍ ᴛʏᴘᴇ ➥ {2}\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {3}\n{4}" - -stream_1 : "❖ ᴛᴀɴᴜ ᴍᴜsɪᴄ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ ⏤͟͟͞͞★\n\n⬤ ᴛɪᴛʟᴇ ➥ {1}\n⬤ ᴅᴜʀᴀᴛɪᴏɴ ➥ {2} ᴍɪɴᴜᴛᴇs\n⬤ ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {3}\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" -stream_2 : "❖ ᴛᴀɴᴜ ᴍᴜsɪᴄ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ ⏤͟͟͞͞★\n\n⬤ sᴛʀᴇᴀᴍ ᴛʏᴘᴇ ➥ ʟɪᴠᴇ sᴛʀᴇᴀᴍ [ᴜʀʟ]\n● ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ ➥ {0}\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙" - - -CLOSE_BUTTON : "ᴄʟᴏsᴇ" -BACK_BUTTON : "ʙᴀᴄᴋ" - -S_B_1 : "ᴀᴅᴅ ᴍᴇ" -S_B_2 : "sᴜᴘᴘᴏʀᴛ" -S_B_3 : "ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ" -S_B_4 : "ʜᴇʟᴘ ᴄᴏᴍᴍᴀɴᴅs" -S_B_5 : "ᴏᴡɴᴇʀ" -S_B_6 : "ᴜᴘᴅᴀᴛᴇ" -S_B_7 : "ʀᴇᴘᴏ" -S_B_8 : "ʏᴏᴜᴛᴜʙᴇ" -S_B_9 : "sᴜᴩᴩᴏʀᴛ" - -H_B_1 : "ᴀᴅᴍɪɴ" -H_B_2 : "ᴀᴜᴛʜ" -H_B_3 : "ʙʀᴏᴀᴅᴄᴀsᴛ" -H_B_4 : "sᴜᴅᴏ" -H_B_5 : "ᴜsᴇʀ" -H_B_6 : "sᴏɴɢ" -H_B_7 : "ǫᴜᴏᴛʟʏ" -H_B_8 : "sᴛɪᴄᴋᴇʀ" -H_B_9 : "ɪᴍᴀɢᴇ" - -P_B_1 : "ᴀᴜᴅɪᴏ" -P_B_2 : "ᴠɪᴅᴇᴏ" -P_B_3 : "ʟɪᴠᴇ sᴛʀᴇᴀᴍ" -P_B_4 : "ɴᴏʀᴍᴀʟ" - -ST_B_1 : "ᴀᴜᴛʜ ᴜsᴇʀs" -ST_B_2 : "ᴘʟᴀʏ ᴍᴏᴅᴇ" -ST_B_3 : "ʟᴀɴɢᴜᴀɢᴇ" -ST_B_4 : "ᴠᴏᴛɪɴɢ ᴍᴏᴅᴇ" -ST_B_5 : "ᴏɴ" -ST_B_6 : "ᴏғғ" -ST_B_7 : "ᴀᴜᴛʜ ᴜsᴇʀs ➤" -ST_B_8 : "ᴀᴅᴍɪɴs" -ST_B_9 : "ᴇᴠᴇʀʏᴏɴᴇ" -ST_B_10 : "sᴇᴀʀᴄʜ ᴍᴏᴅᴇ ➤" -ST_B_11 : "ᴅɪʀᴇᴄᴛ" -ST_B_12 : "ɪɴʟɪɴᴇ" -ST_B_13 : "ᴀᴅᴍɪɴ ᴄᴍᴅs ➤" -ST_B_14 : "ᴘʟᴀʏ ᴛʏᴘᴇ ➤" - -SA_B_1 : "ᴏᴠᴇʀᴀʟʟ sᴛᴀᴛs" -SA_B_2 : "ɢᴇɴᴇʀᴀʟ" -SA_B_3 : "ᴏᴠᴇʀᴀʟʟ" - -QU_B_1 : "ǫᴜᴇᴜᴇ" +play_2 : ">> Channel play mode\n\n● Processing, please wait...\n\n● Linked channel: {0}" +play_3 : ">> Failed to process query." +play_4 : ">> Admins only play\n● Only admins of this chat are allowed to play\n\n● Change play mode via: /playmode" +play_5 : ">> Failed to process audio file.\n\n● Audio file size is larger than the defined limit." +play_6 : ">> Stream's longer than {0} aren't allowed to play on {1}" +play_7 : ">> Not a valid video file extension.\n\n● Supported extensions: {0}" +play_8 : ">> Video file size should be less than 1GiB." +play_9 : ">> YouTube playlist feature\n\n● Select the mode in which you want to play whole YouTube playlist." +play_10 : ">> Title: {0}\n● Duration: {1} minutes" +play_11 : ">> {0} Spotify player\n\n● Requested by: {1}" +play_12 : ">> {0} Apple player\n\n● Requested by: {1}" +play_13 : ">> Live stream detected.\n\n● Are you sure that you wanna play this live stream?" +play_14 : ">> Failed to fetch track details.\n\n● Try playing any other." +play_15 : ">> Failed to process query.\n\n● I can only play Spotify tracks, albums, artists and playlists." +play_16 : ">> No active voice chat.\n\n● To use force play, there must be an active voicechat." +play_17 : ">> Please turn on videochat, I'm unable to stream URLs." +play_18 : ">> Usage: /play [song name/youtube url/reply to an audio/video file]" +play_19 : ">> Queued Playlist :" +play_20 : ">> Queued Position-" +play_21 : ">> Added {0} tracks to queue.\n\n● Check: Click here" +play_22 : ">> Select the mode in which you want to play the queries inside your group: {0}" + +str_1 : ">> Please provide m3u8 or index links." +str_2 : ">> Valid stream verified.\n\n● Processing..." +str_3 : ">> Failed to stream YouTube live stream, no live format found." + +ping_1 : "{0} is pinging..." +ping_2 : "**Sprotify Music System Stats**\n\n✘ Ping: `{0} ms`\n✘ Uptime: {2}\n✘ RAM: {3}\n✘ CPU: {4}\n✘ Disk: {5}\n✘ Py-Tgcalls: `{6} ms`\n\n " + +queue_1 : ">> Fetching queue...\n\nPlease wait..." +queue_2 : ">> Queue empty." +queue_3 : ">> Click here to check the list of the queued tracks: here" +queue_4 : ">> Next song added in queue: #{0}\n\n⬤ Title: {1}\n⬤ Duration: {2} minutes\n⬤ Requested by: {3}\n\n" +queue_5 : ">> There's only one queued track in playlist.\n\n● Add more tracks to check list." +queue_6 : ">> Duration: Unknown duration stream\n\n● Click on button below to get whole queued list." +queue_7 : "\n>> Click on button below to get whole queued list." +queue_8 : ">> {0} Player >>\n\n● Streaming: {1}\n\n● Stream type: {2}\n● Requested by: {3}\n{4}" + +stream_1 : ">> Sprotify Music started streaming ⏤͟͟͞͞★\n\n⬤ Title: {1}\n⬤ Duration: {2} minutes\n⬤ Requested by: {3}\n\n>> " +stream_2 : ">> Sprotify Music started streaming ⏤͟͟͞͞★\n\n⬤ Stream type: Live stream [URL]\n● Requested by: {0}\n\n>> " + + +CLOSE_BUTTON : "Close" +BACK_BUTTON : "Back" + +S_B_1 : "Add me" +S_B_2 : "Support" +S_B_3 : "Add me baby" +S_B_4 : "Help commands" +S_B_5 : "Owner" +S_B_6 : "Update" +S_B_7 : "Repo" +S_B_8 : "YouTube" +S_B_9 : "Support" + +H_B_1 : "Admin" +H_B_2 : "Auth" +H_B_3 : "Broadcast" +H_B_4 : "Sudo" +H_B_5 : "User" +H_B_6 : "Song" +H_B_7 : "Quality" +H_B_8 : "Sticker" +H_B_9 : "Image" + +P_B_1 : "Audio" +P_B_2 : "Video" +P_B_3 : "Live stream" +P_B_4 : "Normal" + + +ST_B_1 : "Auth users" +ST_B_2 : "Play mode" +ST_B_3 : "Language" +ST_B_4 : "Voting mode" +ST_B_5 : "On" +ST_B_6 : "Off" +ST_B_7 : "Auth users ➤" +ST_B_8 : "Admins" +ST_B_9 : "Everyone" +ST_B_10 : "Search mode ➤" +ST_B_11 : "Direct" +ST_B_12 : "Inline" +ST_B_13 : "Admin cmds ➤" +ST_B_14 : "Play type ➤" + +SA_B_1 : "Overall stats" +SA_B_2 : "General" +SA_B_3 : "Overall" + +QU_B_1 : "Queue" QU_B_2 : " {0} —————————— {1}" -sudo_1 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." -sudo_2 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛᴏ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." -sudo_3 : "❖ {0} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." -sudo_4 : "❖ ʀᴇᴍᴏᴠᴇᴅ {0} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." -sudo_5 : "❖ ᴏᴡɴᴇʀ ➥\n" -sudo_6 : "\n❖ sᴜᴅᴏ ᴜsᴇʀs ➥\n" -sudo_7 : "❖ ɴᴏ sᴜᴅᴏ ᴜsᴇʀs ғᴏᴜɴᴅ." -sudo_8 : "❖ ғᴀɪʟᴇᴅ." - -block_1 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ʙʟᴏᴄᴋᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." -block_2 : "❖ ᴀᴅᴅᴇᴅ {0} ᴛᴏ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ." -block_3 : "❖ {0} ɪs ɴᴏᴛ ɪɴ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ." -block_4 : "❖ ʀᴇᴍᴏᴠᴇᴅ {0} ғʀᴏᴍ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ." -block_5 : "❖ ɴᴏ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ғᴏᴜɴᴅ." -block_6 : "❖ ɢᴇᴛᴛɪɴɢ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." -block_7 : "❖ ʙʟᴏᴄᴋᴇᴅ ᴜsᴇʀs ➥\n\n" - -black_1 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /blacklistchat [ᴄʜᴀᴛ ɪᴅ]" -black_2 : "❖ ᴛʜɪs ᴄʜᴀᴛ ɪs ᴀʟʀᴇᴀᴅʏ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ." -black_3 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ᴀᴅᴅᴇᴅ ᴛᴏ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs." -black_4 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /whitelistchat [ᴄʜᴀᴛ ɪᴅ]" -black_5 : "❖ ᴛʜɪs ᴄʜᴀᴛ ɪs ɴᴏᴛ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ." -black_6 : "❖ sᴜᴄᴄᴇssғᴜʟʟʏ ʀᴇᴍᴏᴠᴇᴅ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs." -black_7 : "❖ ʟɪsᴛ ᴏғ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs ➥\n\n" -black_8 : "❖ ɴᴏ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴄʜᴀᴛs ᴏɴ {0}." -black_9 : "❖ sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ." - -maint_1 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n● /maintenance [ᴇɴᴀʙʟᴇ | ᴅɪsᴀʙʟᴇ]" -maint_2 : "❖ {0} ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴇɴᴀʙʟᴇᴅ." -maint_3 : "❖ {0} ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴅɪsᴀʙʟᴇᴅ." -maint_4 : "❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ɪs ᴀʟʀᴇᴀᴅʏ ᴇɴᴀʙʟᴇᴅ." -maint_5 : "❖ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ɪs ᴀʟʀᴇᴀᴅʏ ᴅɪsᴀʙʟᴇᴅ." - -log_1 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n● /logger [ᴇɴᴀʙʟᴇ | ᴅɪsᴀʙʟᴇ]" -log_2 : "❖ ᴇɴᴀʙʟᴇᴅ ʟᴏɢɢɪɴɢ." -log_3 : "❖ ᴅɪsᴀʙʟᴇᴅ ʟᴏɢɢɪɴɢ." - -broad_1 : "❖ sᴛᴀʀᴛᴇᴅ ʙʀᴏᴀᴅᴄᴀsᴛɪɴɢ..." -broad_2 : "❖ ᴇxᴀᴍᴘʟᴇ ➥\n\n● /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ]" -broad_3 : "❖ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ᴛᴏ {0} ᴄʜᴀᴛs ᴡɪᴛʜ {1} ᴘɪɴs ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." -broad_4 : "❖ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ᴛᴏ {0} ᴜsᴇʀs." -broad_5 : "❖ sᴛᴀʀᴛɪɴɢ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ..." -broad_6 : "❖ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ ➥\n\n" -broad_7 : "❖ ᴀssɪsᴛᴀɴᴛ {0} ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ɪɴ {1} ᴄʜᴀᴛs." -broad_8 : "❖ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ ʙʀᴏᴀᴅᴄᴀsᴛ." - -server_1 : "❖ ғᴀɪʟᴇᴅ ᴛᴏ ɢᴇᴛ ʟᴏɢs." -server_2 : "❖ ᴘʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ᴛʜᴀᴛ ʏᴏᴜʀ ʜᴇʀᴏᴋᴜ ᴀᴘɪ ᴋᴇʏ ᴀɴᴅ ᴀᴘᴘ ɴᴀᴍᴇ ᴀʀᴇ ᴄᴏɴғɪɢᴜʀᴇᴅ ᴄᴏʀʀᴇᴄᴛʟʏ." -server_3 : "❖ ᴄʜᴇᴄᴋɪɴɢ ꜰᴏʀ ᴀᴠᴀɪʟᴀʙʟᴇ ᴜᴘᴅᴀᴛᴇs..." -server_4 : "❖ ɢɪᴛ ᴄᴏᴍᴍᴀɴᴅ ᴇʀʀᴏʀ." -server_5 : "❖ ɪɴᴠᴀʟɪᴅ ɢɪᴛ ʀᴇᴘsɪᴛᴏʀʏ." -server_6 : "❖ ʙᴏᴛ ɪs ᴜᴘ-ᴛᴏ-ᴅᴀᴛᴇ." -server_7 : "❖ ʙᴏᴛ ᴜᴩᴅᴀᴛᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ ! ɴᴏᴡ ᴡᴀɪᴛ ғᴏʀ ғᴇᴡ ᴍɪɴᴜᴛᴇs ᴜɴᴛɪʟ ᴛʜᴇ ʙᴏᴛ ʀᴇsᴛᴀʀᴛs ᴀɴᴅ ᴩᴜsʜ ᴄʜᴀɴɢᴇs !" -server_8 : "❖ {0} ɪs ʀᴇsᴛᴀʀᴛɪɴɢ...\n\n● ʏᴏᴜ ᴄᴀɴ sᴛᴀʀᴛ ᴩʟᴀʏɪɴɢ ᴀɢᴀɪɴ ᴀғᴛᴇʀ 15-20 sᴇᴄᴏɴᴅs." -server_9 : "❖ sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ, ᴩʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʟᴏɢs." -server_10 : "❖ ᴀɴ ᴇxᴄᴇᴩᴛɪᴏɴ ᴏᴄᴄᴜʀᴇᴅ ᴀᴛ #ᴜᴩᴅᴀᴛᴇʀ ᴅᴜᴇ ᴛᴏ ➥ {0}" -server_11 : "⇆ ʀᴜɴɴɪɴɢ ᴀ sᴘᴇᴇᴅᴛᴇsᴛ..." -server_12 : "⇆ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." -server_13 : "⇆ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ..." -server_14 : "⇆ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs..." -server_15 : "❖ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs ❖\n\n● ᴄʟɪᴇɴᴛ \n● ɪsᴩ ➥ {0}\n● ᴄᴏᴜɴᴛʀʏ ➥ {1}\n\n● sᴇʀᴠᴇʀ \n● ɴᴀᴍᴇ ➥ {2}\n● ᴄᴏᴜɴᴛʀʏ {3}, {4}\n● sᴩᴏɴsᴏʀ ➥ {5}\n● ʟᴀᴛᴇɴᴄʏ ➥ {6}\n● ᴩɪɴɢ ➥ {7}" - -gban_1 : "❖ ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴡᴀɴɴᴀ ɢʙᴀɴ ʏᴏᴜʀsᴇʟғ ʙᴀʙʏ ?" -gban_2 : "❖ ᴡʜʏ sʜᴏᴜʟᴅ ɪ ɢʙᴀɴ ᴍʏsᴇʟғ ?" -gban_3 : "❖ ʏᴏᴜ ᴄᴀɴ'ᴛ ɢʙᴀɴ ᴍʏ sᴜᴅᴏᴇʀs." -gban_4 : "❖ {0} ɪs ᴀʟʀᴇᴀᴅʏ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." -gban_5 : "❖ ɪɴɪᴛɪᴀʟɪᴢɪɴɢ ɢʟᴏʙᴀʟ ʙᴀɴ ᴏɴ {0}.\n\n● ᴛɪᴍᴇ ᴇxᴘᴇᴄᴛᴇᴅ ➥ {1}" -gban_6 : "❖ ɴᴇᴡ ɢʟᴏʙᴀʟ ʙᴀɴ ᴏɴ {0} ➥\n\n● ᴏʀɪɢɪɴᴀᴛᴇᴅ ғʀᴏᴍ ➥ {1} [{2}]\n● ᴜsᴇʀ :➥ {3}\n● ᴜsᴇʀ ɪᴅ ➥ {4}\n\n● ʙᴀɴɴᴇᴅ ʙʏ ➥ {5}\n● ᴄʜᴀᴛs ➥ {6}" -gban_7 : "❖ {0} ɪs ɴᴏᴛ ɢʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." -gban_8 : "❖ ʟɪғᴛɪɴɢ ɢʟᴏʙᴀʟ ʙᴀɴ ғʀᴏᴍ {0}.\n\n● ᴇxᴘᴇᴄᴛᴇᴅ ᴛɪᴍᴇ ➥ {1}" -gban_9 : "❖ ʟɪғᴛᴇᴅ ɢʟᴏʙᴀʟ ʙᴀɴ ғʀᴏᴍ {0}.\n\n● ᴜɴʙᴀɴɴᴇᴅ ɪɴ {1} ᴄʜᴀᴛs." -gban_10 : "❖ ɴᴏ ᴏɴᴇ ɪs ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ʙᴏᴛ." -gban_11 : "❖ ғᴇᴛᴄʜɪɴɢ ɢʙᴀɴɴᴇᴅ ᴜsᴇʀs ʟɪsᴛ..." -gban_12 : "❖ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ᴜsᴇʀs ➥\n\n" +sudo_1 : ">> {0} is already in sudo users list." +sudo_2 : ">> Added {0} to sudo users list." +sudo_3 : ">> {0} is not in sudo users list." +sudo_4 : ">> Removed {0} from sudo users list." +sudo_5 : ">> Owner:\n" +sudo_6 : "\n>> Sudo users:\n" +sudo_7 : ">> No sudo users found." +sudo_8 : ">> Failed." + +block_1 : ">> {0} is already blocked from the bot." +block_2 : ">> Added {0} to blocked users list." +block_3 : ">> {0} is not in blocked users list." +block_4 : ">> Removed {0} from blocked users list." +block_5 : ">> No blocked users found." +block_6 : ">> Getting blocked users list..." +block_7 : ">> Blocked users:\n\n" + +black_1 : ">> Example:\n\n● /blacklistchat [Chat ID]" +black_2 : ">> This chat is already blacklisted." +black_3 : ">> Successfully added to blacklisted chats." +black_4 : ">> Example:\n\n● /whitelistchat [Chat ID]" +black_5 : ">> This chat is not blacklisted." +black_6 : ">> Successfully removed from blacklisted chats." +black_7 : ">> List of blacklisted chats:\n\n" +black_8 : ">> No blacklisted chats on {0}." +black_9 : ">> Something went wrong." + +maint_1 : ">> Example:\n● /maintenance [enable | disable]" +maint_2 : ">> {0} maintenance mode enabled." +maint_3 : ">> {0} maintenance mode disabled." +maint_4 : ">> Maintenance mode is already enabled." +maint_5 : ">> Maintenance mode is already disabled." + +log_1 : ">> Example:\n● /logger [enable | disable]" +log_2 : ">> Enabled logging." +log_3 : ">> Disabled logging." + +broad_1 : ">> Started broadcasting..." +broad_2 : ">> Example:\n\n● /broadcast [Message or reply to a message]" +broad_3 : ">> Broadcasted message to {0} chats with {1} pins from the bot." +broad_4 : ">> Broadcasted message to {0} users." +broad_5 : ">> Starting assistant broadcast..." +broad_6 : ">> Assistant broadcast:\n\n" +broad_7 : ">> Assistant {0} broadcasted in {1} chats." +broad_8 : ">> Please provide some text to broadcast." + +server_1 : ">> Failed to get logs." +server_2 : ">> Please make sure that your Heroku API key and app name are configured correctly." +server_3 : ">> Checking for available updates..." +server_4 : ">> Git command error." +server_5 : ">> Invalid Git repository." +server_6 : ">> Bot is up-to-date." +server_7 : ">> Bot updated successfully! Now wait for a few minutes until the bot restarts and push changes!" +server_8 : ">> {0} is restarting...\n\n● You can start playing again after 15-20 seconds." +server_9 : ">> Something went wrong, please check logs." +server_10 : ">> An exception occurred at #updater due to: {0}" +server_11 : "⇆ Running a speedtest..." +server_12 : "⇆ Running download speedtest..." +server_13 : "⇆ Running upload speedtest..." +server_14 : "⇆ Sharing speedtest results..." +server_15 : ">> Speedtest results >>\n\n● Client \n● ISP: {0}\n● Country: {1}\n\n● Server \n● Name: {2}\n● Country: {3}, {4}\n● Sponsor: {5}\n● Latency: {6}\n● Ping: {7}" + +gban_1 : ">> Why did you wanna gban yourself baby?" +gban_2 : ">> Why should I gban myself?" +gban_3 : ">> You can't gban my sudoers." +gban_4 : ">> {0} is already globally banned from the bot." +gban_5 : ">> Initializing global ban on {0}.\n\n● Time expected: {1}" +gban_6 : ">> New global ban on {0}:\n\n● Originated from: {1} [{2}]\n● User: {3}\n● User ID: {4}\n\n● Banned by: {5}\n● Chats: {6}" +gban_7 : ">> {0} is not banned from the bot." +gban_8 : ">> Lifting global ban from {0}.\n\n● Expected time: {1}" +gban_9 : ">> Lifted global ban from {0}.\n\n● Unbanned in {1} chats." +gban_10 : ">> No one is globally banned from the bot." +gban_11 : ">> Fetching gbaned users list..." +gban_12 : ">> Globally banned users:\n\n" + +signature : "☑ Powered by Sprotify Music" \ No newline at end of file diff --git a/unknown_errors.txt b/unknown_errors.txt new file mode 100644 index 000000000000..c62f68cb38b0 --- /dev/null +++ b/unknown_errors.txt @@ -0,0 +1,3 @@ +2024-12-22 10:26:39.611583 [400 QUOTE_TEXT_INVALID] messages.SendMedia +2024-12-22 12:40:42.870678 [400 QUOTED_MESSAGE_INVALID] messages.SendMedia +2024-12-22 12:41:55.896269 [400 QUOTED_MESSAGE_INVALID] messages.SendMedia From 8a2af918b824c24c4da986c85eec784009e6c599 Mon Sep 17 00:00:00 2001 From: Antakara <86642530+Mister-Man7@users.noreply.github.com> Date: Thu, 2 Jan 2025 07:28:29 +0000 Subject: [PATCH 184/184] add files --- SprotifyMusic/assets/thum.png | Bin 325691 -> 0 bytes SprotifyMusic/plugins/play/playlist,py | 331 +++++++++++++++++++++++++ SprotifyMusic/utils/###thumbnails### | 168 +++++++++++++ SprotifyMusic/utils/database.py | 50 ++++ SprotifyMusic/utils/inline/play.py | 33 +-- SprotifyMusic/utils/inline/playlist.py | 166 +++++++++++++ SprotifyMusic/utils/thumbnails.py | 118 +++++---- config/config.py | 2 +- genStr.py | 9 + strings/__init__.py | 3 + strings/langs/en.yml | 2 +- 11 files changed, 799 insertions(+), 83 deletions(-) delete mode 100644 SprotifyMusic/assets/thum.png create mode 100644 SprotifyMusic/plugins/play/playlist,py create mode 100644 SprotifyMusic/utils/###thumbnails### create mode 100644 SprotifyMusic/utils/inline/playlist.py create mode 100644 genStr.py diff --git a/SprotifyMusic/assets/thum.png b/SprotifyMusic/assets/thum.png deleted file mode 100644 index 94d09d041ee7f041681a77a5f796fd58f4450513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325691 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 z 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

W~fy zUeqsSl1Q&esIuRQVLBH|5*37S87GOd&wz8rN-8De;?x7J*r#Np->lag& zxRMwZ{Yf7ywnjwrzi_tm!Kr_4w4Vo60Q@;X>g()Ok^nJru($tK+=~arOa`tlg>(Gj zs+za8Zz-unF@UNuN8MLN9Zge;42~}U%>ew_J53ak6rRWsbQ@x55%EA)uEC+K7cSss z*ezG|a$RSab^q}H#dsy?L4AJ;v>>LLy^ZSo=oQUp%-Y+P4=SSD2of|u3_bX!%uED5 zxLGwIN(Mk!BZ}V}ZUVWO*l2&5RIuqFnyyjZ8+flYC_}<#eQi+(iTaE_sdy64eGqBq zLh+M>Lo`utIk$3pjX&E9U8*eI*J{pyj*r(%xe%O%Hzhaw|L#}hnr zgC84ov>SVtfN1D$-di|DaL?&Nh4bxNI;6f9o+WJ+5f9f@kuKL4h~?EqUAIRr3=DYa zjH>G=6r?73|Hb$XT>M#x>j^>^pa&@?r9KSzE=^3~DIqDqLoauhyBLs@U8%Nl_LC?y zG=B=&v;i(_i&hHy5<=cvY29%7`Vm>$<}>a_wl*KimD?)OG=C_aFmy?Qn0O`|x>$^j z-Q6txu5w&yNOR`<#CmkwN>1MTElRW8m=;kbdHj5z&8*we#LMCX09xL#LQ*svojawM9%{Ma{v~5Y(27cQ%?_$=S^XX`;b>!HVSWx4?OseCNkwYU`3|`ME2|T{D_m~v-=*DkBgESQ#uM+xH~7| zS+29YFWjq}%oheXG<|(n`eF;D-ucNSCi?+HlS`Z_=6AKL9BCVB(?q->r-=66v}Iu6$p6uGx*XEsOJ_wsB*Zui>EYtgn~c|n|8UtOnp z?xyut-y=>^s_tp{kgzLDYT-E)I9P2JS*lx(Qv*)|upo<&kKV$&`SgqXM1S@EdLL4< zr6akfl5vnR-(VbdTYU#lwT1C+uCfmBmRWft?%B`_{Usmz>#NbitG}g_L1Jf|cvXyN zs*b*jwqHj?RYikJGi;tQ!Jee3XH#n&(U|WO|B9kKP3CV-2J_ei9z4{me)%I3nOC%$ zsSmm-JRat@wW#xmr#inZ#VhsMxEdEF;yx0#+PiSNAKk0_ip@CLrR z4qo$c?LE08bpQLwhs<|a6OpS+6Z@z+V6u6*|)Cds2DVb^3e za?|sB%zJ95gh5S<1h4@}|3vwB01yTN>8TsO@cdacCoK3z-Ob>62J6=R03n!faiAGf z$S*H7!B9iX%KSUs&KBg+EkP-`3PdmCGWO*Q9NgJk{T10$&h11;KD@)Y*y3lWB6=4l z3qkHZsoTZK+i#J7!9C8rDt*gQVyjFz^$Sr&=Tv~O+*MS&OXv{=kX~|SmyFs!c{tnx zudW{cS=dt~eETt^qfdV{c477zvUxdm2H~cZxvgu})tK=tLijk5TY!u(raq-Au;QV8 z;3PsGA~5vC(b zuZCd-PN~II9oP9y0&?FFWQwP`H_P!U1($)8;u0S^y>D)H?W!53Vmf~oYzHA-1(+^J z50e4mLmql~Bza$5Bd&aEB1|_E(1wVN^p<}SL(6jkT&%Nmpfs@%FL*u6stbIi2Iabwho<8eeT&dmTJEA-7~ z66~R3aU^3zV{?1iQ?tUEx*_Uh-ygP&yTaFL+`4z-RoQA8n{9UdEVb{)+SQ&&abFHw zOkoV_UlKF3*8>TfQLd}W_Yhr&Z5wVP1$j@>7cJ?FoAWR1&Hos_gGb}Yt-{TmV;dyX z(+{?7PjT-5P3ZH%$&}c#;T?Qe%w;z==}>;MfpO783zN)^7N&>Hq9il2rZ%m+_F8RT zpE%iU^Z~9VpoM;4aaDa` z*za`9XpR6<(?^FC*{L?xTSlvqrtpdYMrb+z!iViEk7~b;BgNp>whLi>EIw>1V*H zP#krUznnefCTBrnQpjm^*}OwS-C}9WlZ(CkQ0+BGW=(VB)UL2abNUy~3O|s``y@X5 zM?Vq&BMC~mJbh4*t`ov!;BF)4wwBCu6mKmN+gBd4>kqM9YG3{&jY~!LZTsoJf%|fP zf7F`s^9-Bj8jBQW@q2m}9}w@eQk;oa1=?OA9>vYbuW4tyFn(&npn%Dvrc@+yugzo} z4jPiS8@xs9M5(W9Akr^)L}o&Ip_mUCJ+Lx@yuSf@s8=9c+!recWbfg&!=?yO&PUH= zXj4U6JvT2^PwR`MdE$44JljT`8Bsf@wiB0s=@O57>*^AN^O8#pf1Dg%!sDh6?mnQ4h1j4OUkUjEsF8t| zk~e~TrK)e>jH3G?-jIsYxur;szxBh0QnYC=D`SD$HN9z<)T~8^+UFCRvZ(fpo~x;M z#@YAOuyN_fQE^D@3-mHmSw8Owsy$eBw$UeUIaH3N)4swP$~UX*_X2Gsr$TL%oxYr~ z6Q%1yaAR_gNOFc^5CICemIP4k=9t6exI5#2p@ z4vGn3^o5QMTgTj2f873rIjOSxeb!$gFKPA1f6K{p>mVB{L|-X9__VL)9_y-e&sc%S zb(jHUO!0dTsnt9ek<*nbg!2B~)x$==bj{!{1u5>+6>Oe@b}WZCj<@6p;depY#YH<<5OjSyKy3-#V;cE-CI&pu>Fqpi;X_4<2A@w zT@hv7(WS88xWao!TAO?fc_y13r?zs(EW!ZnMrc62u7&7IZP{?MoS`X9BS6Ung0}4s zUbhox=%ZiJ`6SDMYS%bf)E3apCR+gT38*LFz(x`jP~a&;S`30|3uDP$KGI=AV`+~D z?Y)=IyD`;sCuzh|KNII>!op`>ka*$rP9pS`ZY|9sM7&-*Qf_&qb0OSTp@Q68}CZO+|NJ$21+dP}UxtIqMx*0-gLB z1z|7kte~Vn)cEtB&sX5Gp#C$0AIn_C{kJFrP>qi^%oOU-!M`Ics*OxtTx9bhcPy>> zeA--OOU!F7W1D-f5IF1Vzi-}{(*^6M{N#frHTXlH2dmy3>RpiZC@Z?=w5p9>9iKd} zlLj&ZU~SJ)L!P^P_3jf4@o#rh9g*Sx3PI~L^qu;uipSYevo+(72pPmZO_n`EG{9xf zJ3|03~frAWjY1I6$Eazk=N>+o$avaU$fjbw@ZGqTUyzylzgS}w`QNr@_ zc6f>rMyXzqwz?C+6V+HErU%R#P{QA6K87?smO`e0L?+YIqn(AhwzH~7-G`{)M+8LT4O?qEmqY;9B4l!IbFub;SRk%AGR#ct5 z(h~EdC&d&2!jo;*$lktvxj0g^_L{w0IChOta&v*%CO&(9aem-G0$J|Lj*y%-j`V!D zxxILwz?e+(n7@-p@SHld+ykxRg4pSuax3M0@KmfJP<4Rr4?2U#(H z_%_eBRf%BsMB8_DQ|fT6gB#cR&(Tv!?GTFsKr>)PIJ=G91ec<0ca@kzv-vm6U4$NEby zL#R8mYGcT%q8uxU)@3Sxr13NYJ0w1PD;=9(0@37>NQ_PzUlCU9d__fa|8E{@%ZKn@~rqi z``j=L8cG$d`MKAyNh(J<0DKVSZX1)78%jhpOxW z6k;T1A};b4j+B(~8haa8iW_&ujqh_84mf+~S)S?4w1&Iow`rzuHxV&+lAPAq)PC-y zEyx1R5ZGSvSgcszie*;?!CMIEie&v~I?NAgd=3g)_ z8v1oLCMw9jkxJNf-Lx^aK^7h1~Q>E#0o!psi}u*sTE8`%an7Wg^P zYS&zzFMc<}atYy2Yg4ZJlMw4bP;$C-QUFbp+9%yFLtzZ&Z~K zaNT-{peWaR#|<6#vU7Ijv^{n8B&vN|^{rMYQId>{n6i1fK9fmmqv7ex`Fdy$F#=z` z<|q3`3^(qSiyJ>(-G|+OYf08aKx;!)k&`vE2Pzc=0{cLHhd`z>ZXEttE@4W40xo>Y zoo9;}p>F993L(@mN3QqX>W3~CSS<~7FxQf~8JYLQzg{m!n2TjUwtV`PWukD*6j6Hf?Ynb(sF$P$T+{Ss^Mx-wA`(aR957rEawKW2g9wj3lmZOnq z5r2@jYm=zZ=7l?N`)}V}aIE-@ZfVp*)xFkO{Gv${e4vnL;b{-eJJwwKBL%kR9E+t* zgx3ikYgQ}W9>%FHE!>Y#9Iq@Yv9J2g574S z{(Zd(q(wtS19S4O8h(VM@D^ zMo%KM#p2;LQT*(<-HTuW2I@Z0R%n~{1Of_Up+vQ@Hdcgc&&Km)faRU94*MRZT{@!( zY^>e?P&0zifbDd2S12Gn3mC_+oPD@6XB7FW|DJxvV6)0icdSh05(i49=^7FtdV=l8{ie@~0zY zprD9qQw6UNsc>jZ)y%aG#7);9THwzcI|Jwoy*>bxfqvxMmGb?t4WR>6$%{#Mm8RSt zALuNUawL{g$6B5d2I zUgki1+POByTC6Ej?+(02SiOxi;ZFEbYOpE!2nul+S(pPljF6Xhpc1`zH}4E^hd`E- zL0Jt>bIN;ysNde&sG^k~sR~yDb$zXJ%Ztgn6C#H2>s5gEJhyEJPL~Y-b5J=z9HX9V z7$SQHP8Ca6viIyF2py~Gtu8BZH1$5x9h|$vh{C@m3;9)j&@2dD z2$x{ejz@KClDwjIG4f$SQE4hlrq*7wr6g;PMx?aP4Fy9CaVqkP^I_8gkN zfaVigRX-BE@UG%{SS~Jov&$N^mr<&UVi)P}3*<(uVT<)Xo(KsTA;qaJhB=bcSY52Z z$$!PUhLb!qPm0W1PI!DWLm*(XWkvy{9}^Q3_z>2dI}5Pc=hnr&*N9tuK__tzu~(>Q z`ojs09X!ms6=u$=b0;q7vX;WD_T~z};-OQ@p6-|B3&|a*=eZqJV8)&WG6qjg2~e?J zQVcY4KJKAKD882a3^R=%rCNo)n64$~nx56qh}Uv%`3K&_^@NO*sHb`;d}+BTP`d)J z&*x-kYXJ%bKn)uknCA#wxDe`N23Ff2FwBK$8$Z$5;h(Pn&0N| zShs7B9IG?_t%jEf#p>;kL;_(iFx!$V&E$s(fa@71k>{+Vm z33Y6bC|hi4pJ#^+vHlBD`!WHV%|_vobMBMxUj|>2@(7Mt4L^yf0w7~__N9Ze=r?dF zuKL zeXu(o1?U9+_h-#>)_hHU?*>xPn7;z;lUhvai@>b!U;0DtRo&~VBTN$(r8aK>jbsR8 zt0y#S!6h_@!HV#{dPA7LgQlHy5lHKom3yagtc)3qtJ%6JE_ayQZ4Is-(2sVOp?MCL z5~={uM8i^w2<kC111zo64htqih zTLGEiOR?LJL1ni$UnIPZNBCIG?75$XMQE6As5WhmwiWgtsUK4ef;z4@1S$2bkaV}0`-~tDg=VR48?6_e`WevOV zL;h5Xa)%fzxU>A7>tdSE)#3I`%WpFk_)4AP;s=6524VcN=Y1Xsp4oaY=c0_@b{$b< zM?4>nFM)6OMVXu&-YOp1f1VNZZ}Z*URJ8XQm3chSc{JPSR!sPk)9lWRwc$^r?K5?o z8N<);9J5U?iT&j$%F3ySU_C=~&5Z2Rn6%r>>1O?Gbk8845agX*9t4=;m6!Tm5NK|{ z{kZi4&tQwMcfdwIeI&Z*L?&3vd$KOlP3fj5?+0RD2Wcbbj+IF9*~-i2`Rqh}HZ^M! z?|}_^XWZRL_#6Ua*>#-T;q(A6+8W4Av=zvoO2~7SxvM5U6W!!|)M2vSJ$ErkbYpPF zWl-FnD!toB4@~;`{vc<%W@nda*MBeb7YBKHf{ULSydh9hk8e7_ehK4XF6Ej^1qM!^ zHg^A_X?3^70F?1ijGqSSqMb_W3Gv&JB8DUrU=B^<)U0>#93a=8jl(Tze{$_7fG&nM z5k$=HcKfKKr}slbN{S#LATVfE?CjSWI;z%Wt53Msdh(h^5xJ&A?uUB9U)~nc1s+?1 zSADp6sxKX_vkjl2f34&g2V9e2WN>&_DBS4vkQxBOV^98c-D=%~b$j}bkwfCr4AZrS zMhi0RhwLhUjM?ym(b`UwvFE}3WFzt0kD2T>_y(AJ!1?k;4%}snm~3ND^rmKPpaxzQ zzqVVU44>y1iH)>fs9jm8LlKS#Wroh$)7@?^vnM6w!p`iav$c7xM281X+3Ty9;Jdqr zhjUIMwjIcsTs=j8BVPH?;N3=?{n2$ux$ zn|>khIcM^f7Egnf_fgY8L0%8_%y%F_fD?4I$7I z^;dlxWxdaHPNrUs^4U+typO2h9QLI9SxsXjT}M}UNh$2Ay;?YlWhz^R&gdI+%tB`9X1#F z-g4zJcg!cG@UE5VbmpQMXa*+hyxaUFx(=rlCtuSXgY0PZHrsQDNsv?J{#M-E=Uo)I zY$Yk~fyANs1ffCU7w!L-}Pa0%oyp&ad>@I@$vE6P^Lq% z$S=!Eah}&4lk5z=i<2Oy$;hRYt<I0m0La-e!T;t_c z)b)F68Hac9%$C(S$H|gE^(Ls@K0>}F*bJTEf%Y{+(?P_WuO1O$PybkCmw*v?0MQ=! zibuVun{7&S-yA2EmUke39$;af={R<;;q`ve?hb1p1Gy@}>yBcEN!<#w+2~P(^=#c| z-?!lVwFI}6lYYod({XL>38<)VjD@}qS1$pk)8P$hJtI+OJzS+M`zV<)YtjiC&gly%aiAAMdhDw zUN1Knyr_)l2kD=PP_&L_LZ40Q!fSDc&7_JDh;<&KO9hzd&J5O@z{2N8$dYiQY# zjm)hZ{&H0n|CBSfk>Ur_e4_-N%%AyWo}N&jzPri6kw`umiSN9WZ$!+T+YD@Qy?qDiXvTV%F^(%c30sR((2f zZ_|RWrq?u+NraHArK$M>nErUiOgp2s6`%5vZ(Uo|4J5k~9UFBckRsYoh>{kSg&TH6 z!>Bi+#mScIOqmL%c#QJr1b*e;19&a#H?BsAFDuzoAIkvDHp>nT{|Mmh^vgM zqNB&UCK+X`9WO{ml=t{+>4(X0j1m!k5^S)ia8yZsb)_5!KrJA&S49l9O)X6|%4|{_ zN;Buo#RiK#Y^zHqFiC<=z00$NRg6J&6YU5&t@et(rSVI+q6#Noq|4=LakuGhoDv0r zfK!iZ?@bH(OtPoK{uJo^*Z#!K6aMC*iVvXwIY7&Ohd#2GsmQrx?2bEQR%qGpQJr|M zP#83&-(I~s5q@;nL8uBxG|yeVWF>dY_o0OW|0}C#o}EJG-5I0zuD-@r*}RcQZDC~j z%WaQmd@@$7>Gi0F?||AR4AvBGv;fh&pIRTv|Bn{Ha69h}u+GUBfmRV|GR@9k?`>+y zdP|XC2R3caup_RFO)cPGI3@8l)dej_Q>PlWe&2FLg@^14|B8y;h>F}crJ-_&3Io&X z*rl1rn%dge;u8{R4GuoEo`S$ZqeJ{lti_K z5~vXcUaJBQzILU2hPs1?u^gfDTJ@v32)Y@Yxy-0mir#uO-6sV(;c4-csc^Ze!e4Yg zI0=t6{p+T0un6k8QbbF%;Iw2`3`kM*6LAFyM9x?*U-JZO;9Z(H${IBg{b&FF-MnHjmn3qmST3#cLgW?Y>NG0b4Y1{W;6L(GK(UYXWkMC^R%`L@tt^tdv?tP zF?WiL(AiQjR5MxU!{~n%3J?FEk6kDDnre!lDcJ?F(SJGgdq^gS=3+Y<=@A9(u9Aii zDwOX+Mib!Ua|m3nA2(J^1!$8Pnjl;FmbIBI?#M|CG)yY??6B5+cR~K;)>DWqe-+I! z0zE0+?g-id;RMr|pKitP_RzwZ5W#g~b<4zzs_fIwS&u^z575EuRQQcrTv@W>b0 zDEmp9x3=wczk0v5sMMgsl69Y1WcVfi7fLUzYnTeC13IV8X$8H_SmFGv*}Ji;0%I%L zu(+~$_{b}56;i@N)wJnk2pAW7sGVd4A|cpUO3ubUwU2cLdA~74*Je`VcPRevoT;Uwr=()O z1uCxf!uq3#tLhKWRP`0d2aB!IE}RqM`jLIE{as)TL4lz^s6UmPlSA0HZ5w=fRV%)- zi02|$+(KgC|77GB`tES*JoRhgFV@)s^&;g@0Vd1p+-XR6zKwH}T=R?=NJKkdCRRMM>%FHKIGqvy z*u&1b%$ec!i`Z8+;b_%sNAlqK)PcWWY-=O@W3#UWIvLx$!wq%f)D%nBJDFw1-@$nw zFVKuX3*mZMZQ7totE^t7b2+oVl&${Xy!g7tdT5k-?De_8qg;_*TDrA+@-7m&**l+x zp89ty8ep}-@F{z>n?z+ULe6&3tzpEtMYbl-TFKp3j8yE|6A<3>kJAq2?Vt^7 zDkI|Y?uM=SW3Dwjs);U|5*6F@mj2;l>X9=eH-bY#K7q)V8R|f#=b!u~dYv9;2`9$l8m_D_|rHQ_3#+f{_TM6o7bD_l41B z9JA3%^oNo?Uztw|dKd9}RK6`W4MqoOF1CRh(yu1vj&#e@BCH=oZ{T&G6cKz zRXnf6Y02eb7eotp3U<>K)&X1o|Ywaw%k@jZ9k zW|zQkyVY7#whqbHR7}Ztb^zG)AdKtinziA2>@pXLtCt%gXRUWA8=GTe+GcfsXr4=I zvhQh)Tt+W1IIljeZu2SLyv^#~Z>y(_uDgVy+V(iL_F3Iw=3)uA;bpf#3^a;s2G|F8 z`DF>Ap8ISpZV~s#y)BsUke|%F7-S)&a{$}Z5vEs~Y+;m9U@k!cj2w~$e$Z5My?w#m z;Hq{u?9@OJ!-7XF$DZX$&)1JfAJ=%XD>73i2s@?^70X}zNP1@4f6t1xf<``_VxJsm zE{G!LQk`{nq5y0jyQjwVrj@Ia74o`(Z9CweCys*OV7n6Ts9C|j-R0ZK^fEzQI9gz9 zt1MdmXN7such?@}6!Um72O3;s$aubkfdRNI7SpL6Xh&wh;3vG06I(W-H?HyjY39q3T5 zDbI1-Eq6Fhtun{gN6#}q*~&N{b_QT6|4ESHI0CnOEizK&rp$SB5oE_Aezc=(>z&q< z0fy*_s8B=MhAC17s+d(gQRA`2c~$IQ_4lpTFHY(Mt>TK9(--Pa%3CFi$KXgGY&btz zex!TPIX@!)L2#6W8mvEfl~%7g-Wm7v4*!;hd#gr{FhtlUD8}Xus6n=y_Eww$3VR)L z8n#P(Hu#;zIWpR>Y@R~ze@EFxO&OL%#x%@Z8_yBR^bFPQ4L;-WuK14}} zQ0igWe`Nsn_Wsz9Fy0HIcj){CGDKa^_MFPTyQ*8n;Pe_7{iC=8q9iJAK=~hUC7#3N z_EA@{9cHBmb9P;cQ+u@&+~cl!(Y)dAwko4~ZjE`(En}o5B}3tDaqTQ`3EJ_SS5Mf~ zlrH|}_ZJU78QO7;cR4#5GFvCUOsaltuqd5xd5IH_@J z={m08()!S+5LNSOx?RN(;v3WPCje}+l+UESo_MNp(S!hv{GK1@xr*o$BzP#&|xhH$& z&09f6lz-{VhEm?~K<(@WC)IHYY3X1$oMP#j&!36&+ipt!di?1kM=0qhmQ3PamHy zr~;t({d-6bI1GBaUFySGC1g$s?s1jebve0+Ck<=IG)1%2!d8t(@!KD%ojR)sSFs51 zjYa@~p#p&{b5~Yw?*HcQ3P+?nyKV&Mt9-JqX;4{l#hn?`ON}1Ivkua7=`hJT#9sk4 zJU*BDKwO(EG9`wXTPL(?i-$^=Zvs;?FMX|(vr}&1kj_4# z)f&XywgU?sjGTwAf*eZ=^*jJF{20Uq&4PK(A(8lZ;;4LgRyvx-5fECHvfs9C;m$Lk zI4v6v=i{NBDA&EzfU?p_blg7wPCPdJe_!NvotxmEQrU6E*}SQEzh>W8-Q^Km0&@ij zB$t48)Xn!y*CS<3lpy7<$@_(-IgP#O+JO}>JdA51-A#$>K6QAh(+4P0w zS+5JxoY+X$)~FaH=ED5l7USP9&QhbSw7ApG*?*QF{Og4PF6aZ|BMS<+iA6Sq-*5tY z8x#W}E074Re7 zlgEiwD+oHKP!b3yuq+yNB@TJ72t`|v7VJ(as=X$oMy^B5nQiZ;Ua&W3PSnMz={v_g zbN~q|Xn}#f3J$dQiO~Hx@^A20MV6=5HrQMXO`F(jiYM>jBeph2E-&`$wR@>sP6ycn zow*mrW^{l4eA(C6ms?l#d)K78C)OG8$B6WssNVfF9~mURMy%^BrmPc2Ww@)e*>zF?kPP|i~o)@hz#t%@RqLWsagACD=1F7iZsL<0NHgBg;OI29=^GZFJ7v9#|02}2VA-9r0f`@2}RW&_KvwgpR^1)`LWa_s09ntF# z9JqEy@t9C|gkCE5$aJ`L!`$rA+2sm4^N@D-Iq35S+XZ0*%>g%C-&d6hI(r6;_-6)! z8$zp8)#P6B9U=2W!y3hpdoMwm!hlyeJv|)_C+9P`lMGJIgDFZi*KnZXAy3=-Fy|W$ zE8CFuT?=jQ^Uo@#*3kGxWc12JGZu-DWa59@0@kB7K=mZTIxx5}-o1xZQ?rk>^kp*} zM)L$-yY?Ya!u7pJ^=)Y1)EfH>Ws+d^Sr*#BQCnPf>e%^P##TH^ed4+i^3{EJETCIu z|CXpG=>!TF!G~F`JMRI`008kk1FJ!`4IA1~sIuw%!|5`%ooF4=-RZ@Yf07!qx{HWb zeeq7qX|q1NziZA6%jyw>Q6q6yk4v%9RtW(In{jXV$Q|P7_r!AgcgfYs=W%Y})-1`N zIMx~pc)QjR9>x#hN5#in#p z>B&8(Ec@MUD%5|tF4h3@d75VUlfmN`dKq$(D?qCk44BFc2CF5NunGsjS36t5PXh9` zb6gkdiKxir{;o|6VrW_w{nl#i8afuwYsGimXZ!Ypn`e$~lo*v=;XdzTN9pK3=U&dI z;bEyHi(eqAq-!5PJ`a=W!=bb2BXe=_VB3J>-#j4M78TNpE7#b*w#SBUce35>NwwN3 za6*$e+Fte=`|8^_XRi1baA06iu~AJ3;Y$w z{!pMC3}OsXWtM#cuShkw)D$44gWGZla|(gI8nx>maIzItz#K$!?abPIB>QJV^ z3?hPGEZ77Fp=m#q@~Z@!@5?6Hue4k9)Pqf7F@;lMO1LlN_hr!6mj5&0cEG5M~7KHy_a1jrv59#NY&1(W+{-xapNHl)J%Yrn~ z88}n>jYQ>{v{k7JT5D%xZ~oEoCn{$y5*kZ)IU$d|$|Ft0`yBp(pGK-4Y6L+7Sb&~J za6rAY6*aXDHx42n*Q&6Olj>J&_`a+qsx3g0k3CFw7!EQ)1Wc-_k=HB~=UokO3MiZH z-Hw9Yjb{+KkUGA%;Yh=QBYyvHlx{GgAP$vMr-O6=WC1Y5 zjTYo}$*NVWChcuqD)Jh|`_1ZiAEmdvFaCL$tjRF>M3{Cf0Y{w!=xQ6V z-u@(c?^GKcDJSi0kQuxMy7S5Y4`7fRJ<>`Vt7yfTuD`yFS)OrPt6f>vU}vsKB_l=K zY3diaO^!1KXdSbn%!}&jHRze19!tNF5I4+R_vs(Q!w#-KK0XlLfSlC(ngwX&vJ3M8&_Hf{bBS1CTI79 z$Gr?R$F*~r?i|-p_dU?B(~$@jjUsC5TzW>AJzLUD;*6%4b?Pj*mAy{0R*Z#7aM8tkC4!UmWUX9)@rk`FADs&6^(J{%_` zJjzC%PjcKc6y$f*dYQRtEMivEskE99EeNwY;LHTq4SB=ae58}xb@SV`o#49(GK{wU zu`sP~uaQNlaUE$U-SMc(CIL~tO|$G@J9yioLY&729^wt>r}UK1{Z2+IiZge_8u%E} zb_$h)o+6=fwo|8XTjb1NH8hYdEi8nA^`mYV4XOa}uoM!S*BX-&>L&_t?6(%k@II?n zkUMOwxF`Pth;jWSV%A!(sb?+&^V|({VzhI+{?u-pfX@q^X!lIo6dBlR5Q%*Js&2+H z>BZ%qAm>-j74I*vNf_qd?flz^A7#=#@w2K+YYcl10WVfkZooAz)W#FSLC*wz-`>1i zxbB-Gv8D)csSWNM zo8I0He&#W7sJoS>YI`QH#0`B9T*b%z_nLEpP#QsO#kT?KQ=>?8pavty%alYeR{cZ9 zy+xQ`jgmPJsx2_a>V{mwHzHyRwDQ|xUjO4MxeFzipWLCzxQg?CRmN&N6gvz$me9!- z^Uj?b2K=B9qXrIH!D0%;ydM7f)34S}g#rC5kYJ|{dVL{>!bv8d- z4o^U9G6&8Rr_HZ=c!%{{^^DL)tG%)2#JWuwQ>9g8^!mHx`^+-sIqK7{%-Xiy*ho}K zaWh{Peq!NnjV`ERW>Ge|%n#zTje^}AQOZvkk#vxY{%N61e$41DjuJ^ezehj(&L?U$w8o;;Tzv363+&ZMLEfL;-R6K- zCP97H1t=Tj>G>j-#ygJZ1=gb5y=_F}3~9Sv z|5^pLgI%HIZ(7_n^wf0ic=tqilQp}lFV6p*dqyIf_O(t$8oWwtX!CVL;6_9^aLf0W zV2YrDDp|R+Rz|K<3p}pnNn8DD>$_o>3EY26T$Kz9n5pI>B;-h+Z>}iQ zX&9ehNl|mD>NEDthI|ZReiY;)Jpk>0huOS^X1RLy&`zN#kwAF|_GBp*rG+ig^b>17 z>+*gvU!2psXf2X>fMzYWbYS4z4tBsGpnH z?3#emlX@#fAIZZ7Ou$?WI1eJ3$-98s20u7&pCZ!ly!q|B`(J&Cv)5*t^Jz8{URj&P7`pM`A zhWHbtE!y=-UnwJThGD=z$71#0G5 z0v(A!}l#saJmmw)7Wdr7hI+~i}!P?mk zR>gsUYk?o<9`eNm|6!N7e#BMhW~|P`(7{7s(eG(G8QXgsmu#W*z=G_aaob#k4>X$4 z>#+q?)p`06k&==|hR$z~=bZO<-tV1@qyL=CYq;;{*|GN8 zYt8SXgUo{cgF#`z_&tmV1d>(j;2eK#?2v#57@=Qma4Z8o;>_r&qzh?t(GOf#H%G9i z3ifi(-4mbw@iQsXmN4itlmVM;uj-7KYMvbd9wv}DK18VlWk~dR26O~pjjPh$7-+Jb zZ>sElaXe^HU*Et^SBIg9>t>v`a7vj8iS)UsG^95zvKQ0Zk>>*&6C|4D*8YA~B`~n; zaHwZ+Xrq|naPE1Ex|Y|1!{}h~frkCzCpMWP(K!KmQzb9?-xc+$Ta$E!>m8Xui5zMY z2iSRn+zIRLmLP{6h|C2&&$2{4g|3f!1E2m(p>uiXN)~E$n0w z!M2@P5i>3Z!DlQ<*QS-B&Vr7-!gVaZVbhNLGMi~|_|-ZF!(^u+JXrFyhDE7c=4vL@ z3k25!dhzWF73{O#AoS4Jv7tT^Txs%cjDM?eAAa0H1K(@-T|udK&yO1irFQ#C2Q7Mi zbg5n|0c+1L?^c62gioiql++M#gr%Vk&C1o9yI4O!!LunnUC}OPEm+Tl8XApA#TS&n zr?M!ziWD%5J^&ujQ6NFW=E|1yjY`00%e_EHa~|Y?nt|m1iexNFO^H&{p+#_QUr7J8 z6pQT=?N9MF)CvhZR^0Of;UY)K<}-|}9xc{9m<|0;!a#f$Byq;x1$m+0mU|@@9BNA2 z(|lXE`$?04ZHtvz>M_q1w#K1gDlXX$HG@v2K|6eB0|$NYH+5a6T0fXQD z<<-^Ik0VPmzlv@wQQedLXfyYnLC`eVg~0@FQ=s0zwIas-q_}^AmR^x)H7J^d^1SA$$0nQNO#~bNdBqow-Ql-Q=41fE+!+cmy|W6 zmU53Bw=1li;g=h?LeczJXlgX~He%UsNE7jK(WwKeuaCpCdY`-auscO;T3M-)yBVaL z9+eN#583sdKlRE0+hYYZ@uOFnu0H=NelE!=JeTtG(Vg6p`5Yr9k=@uW8(`pGUb0>d zgb{i`8e4p;8Khj$i{#F%@c1!^(np`kb~juVFZWJF7BRfJ1`qD`~aFjMt#zk+kPJ z7l}3MC9Qp^=OA#(CX={Z_SVixhc2I>MPb9ZYwa<-D~7e(xAbT&PwM*bQ>O<@7Is5I zh)2#|I>MpZL=Em<&9!71g~;U*+y=^8pq?+2wva0b^l2ffExMN5l@MHP0VE(md)UiL z`B{gr_1#{t@y%kL`5#(Sn`zoGn-XGd?j%$)c+LZR@4+FquW4 z<(ea&(2yzY`5gR3{S#7^s@U|aB%;ci3?QEM3?o0f)%mI}G``%=<5}I|d&6(GwmBje z3ifl;&?`p5ntLN0*gH6|I2ow!Bw?$XhldBqi;0N_vsFhp`VGV?5^P<LZ`Op|APY zu1k6+<=5Jw!ZcTH+l(k!6^3;{c7QLTOsa#~BS0`t?L^>RgF3%h3|bs26b2LidiOl? zD?>uNCE`_6(dSK`qjl&_TKMaWqSa>{#7@-lt%A!15S!D#KEB!|B&-<0kQsHf?xV%q zJiG9LsEVvWlNCaM!9jAPuQ*}XpnIYD;1q50h2!z?r5&`Jrt~yZn~Q}l>tLYdj_o-^ zssnRK`~oR)aUk_48)JKJmIU3 z{zKzNsS4G{K>nAGZSlP*uv*~EbcT1IMX?j6ER|m$(?EC2T(tz-Q%S`Nvj!F5W-6Vc$h!{N6Os-^}M| z(Q+32ifeK^a^whv8$1B?j?lg{UA%}Z;{+zm1|V3YNlSwDhl4+fn6$jr1b3%p!*#P5 z!Z(f09qHAQ_{$fNCc#(ls4GT)(~zG#=C^MnLWGPArsbDFmZbquNLU`>2t?{TB&3O( z`}mGujkU2x3FmX{YSXOZ^s&!Y9eFw1ikjuD zgu@7KI5FgLw}q*GsERjb-@xg@64#}QwvSHohFciWqJsyI{WY= zkqw?3_Ep~d9>tDbOLkdwEdM#Z(Y~|5i!ks}%YCn|t4|loI)=~Ac9NU^U^P-?+u^=B zJ5v@c9$I(a8Ek_)EE7QU3?`(Ea^c779$4lAre2=+?UU`JkBgrZy)4~u-~GSdgL~|+wDbT|!D~LE3%U2w3T-2n*{U&^k-~G2Sg=gmbr7!QU!a$GMVx zGYNQfNI$P-O6{@MOnN`3J?t?J8i1*4w<8Jv<716N5JzUSg zfPeT$#&1p-^IUnDbf!1FYcYX3h6cGH9k zQ6;6R*_TZ(k;rAGl|09K6<2-@3J^1

R#~-&}3uO?dZ{1dR{{b{Z@wr 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 z%0D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

QU9PHs&ZOa&MO<10rD+&n;x&qz{WoStLPl7QG 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 PzviT^= 17: + car = os.linesep.join(msg.split(os.linesep)[:17]) + else: + car = msg + carbon = await Carbon.generate(car, randint(100, 10000000000)) + await get.delete() + await message.reply_photo( + carbon, caption=_["playlist_15"].format(link) + ) + + +@app.on_message( + filters.command(DELETEPLAYLIST_COMMAND) + & filters.group + & ~filters.edited + & ~BANNED_USERS +) +@language +async def del_group_message(client, message: Message, _): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["PL_B_6"], + url=f"https://t.me/{app.username}?start=delplaylists", + ), + ] + ] + ) + await message.reply_text(_["playlist_6"], reply_markup=upl) + + +async def get_keyboard(_, user_id): + keyboard = InlineKeyboard(row_width=5) + _playlist = await get_playlist_names(user_id) + count = len(_playlist) + for x in _playlist: + _note = await get_playlist(user_id, x) + title = _note["title"] + title = title.title() + keyboard.row( + InlineKeyboardButton( + text=title, + callback_data=f"del_playlist {x}", + ) + ) + keyboard.row( + InlineKeyboardButton( + text=_["PL_B_5"], + callback_data=f"delete_warning", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], callback_data=f"close" + ), + ) + return keyboard, count + + +@app.on_message( + filters.command(DELETEPLAYLIST_COMMAND) + & filters.private + & ~filters.edited + & ~BANNED_USERS +) +@language +async def del_plist_msg(client, message: Message, _): + _playlist = await get_playlist_names(message.from_user.id) + if _playlist: + get = await message.reply_text(_["playlist_2"]) + else: + return await message.reply_text(_["playlist_3"]) + keyboard, count = await get_keyboard(_, message.from_user.id) + await get.edit_text( + _["playlist_7"].format(count), reply_markup=keyboard + ) + + +@app.on_callback_query(filters.regex("play_playlist") & ~BANNED_USERS) +@languageCB +async def play_playlist(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + mode = callback_data.split(None, 1)[1] + user_id = CallbackQuery.from_user.id + _playlist = await get_playlist_names(user_id) + if not _playlist: + try: + return await CallbackQuery.answer( + _["playlist_3"], + show_alert=True, + ) + except: + return + chat_id = CallbackQuery.message.chat.id + user_name = CallbackQuery.from_user.first_name + await CallbackQuery.message.delete() + result = [] + try: + await CallbackQuery.answer() + except: + pass + video = True if mode == "v" else None + mystic = await CallbackQuery.message.reply_text(_["play_1"]) + for vidids in _playlist: + result.append(vidids) + try: + await stream( + _, + mystic, + user_id, + result, + chat_id, + user_name, + CallbackQuery.message.chat.id, + video, + streamtype="playlist", + ) + except Exception as e: + ex_type = type(e).__name__ + err = ( + e + if ex_type == "AssistantErr" + else _["general_3"].format(ex_type) + ) + return await mystic.edit_text(err) + return await mystic.delete() + + +@app.on_callback_query(filters.regex("add_playlist") & ~BANNED_USERS) +@languageCB +async def add_playlist(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + videoid = callback_data.split(None, 1)[1] + user_id = CallbackQuery.from_user.id + _check = await get_playlist(user_id, videoid) + if _check: + try: + return await CallbackQuery.answer( + _["playlist_8"], show_alert=True + ) + except: + return + _count = await get_playlist_names(user_id) + count = len(_count) + if count == SERVER_PLAYLIST_LIMIT: + try: + return await CallbackQuery.answer( + _["playlist_9"].format(SERVER_PLAYLIST_LIMIT), + show_alert=True, + ) + except: + return + ( + title, + duration_min, + duration_sec, + thumbnail, + vidid, + ) = await YouTube.details(videoid, True) + title = (title[:50]).title() + plist = { + "videoid": vidid, + "title": title, + "duration": duration_min, + } + await save_playlist(user_id, videoid, plist) + try: + title = (title[:30]).title() + return await CallbackQuery.answer( + _["playlist_10"].format(title), show_alert=True + ) + except: + return + + +@app.on_callback_query(filters.regex("del_playlist") & ~BANNED_USERS) +@languageCB +async def del_plist(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + videoid = callback_data.split(None, 1)[1] + user_id = CallbackQuery.from_user.id + deleted = await delete_playlist( + CallbackQuery.from_user.id, videoid + ) + if deleted: + try: + await CallbackQuery.answer( + _["playlist_11"], show_alert=True + ) + except: + pass + else: + try: + return await CallbackQuery.answer( + _["playlist_12"], show_alert=True + ) + except: + return + keyboard, count = await get_keyboard(_, user_id) + return await CallbackQuery.edit_message_reply_markup( + reply_markup=keyboard + ) + + +@app.on_callback_query( + filters.regex("delete_whole_playlist") & ~BANNED_USERS +) +@languageCB +async def del_whole_playlist(client, CallbackQuery, _): + _playlist = await get_playlist_names(CallbackQuery.from_user.id) + for x in _playlist: + await delete_playlist(CallbackQuery.from_user.id, x) + return await CallbackQuery.edit_message_text(_["playlist_13"]) + + +@app.on_callback_query( + filters.regex("get_playlist_playmode") & ~BANNED_USERS +) +@languageCB +async def get_playlist_playmode_(client, CallbackQuery, _): + try: + await CallbackQuery.answer() + except: + pass + buttons = get_playlist_markup(_) + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + + +@app.on_callback_query( + filters.regex("delete_warning") & ~BANNED_USERS +) +@languageCB +async def delete_warning_message(client, CallbackQuery, _): + try: + await CallbackQuery.answer() + except: + pass + upl = warning_markup(_) + return await CallbackQuery.edit_message_text( + _["playlist_14"], reply_markup=upl + ) + + +@app.on_callback_query(filters.regex("home_play") & ~BANNED_USERS) +@languageCB +async def home_play_(client, CallbackQuery, _): + try: + await CallbackQuery.answer() + except: + pass + buttons = botplaylist_markup(_) + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + + +@app.on_callback_query( + filters.regex("del_back_playlist") & ~BANNED_USERS +) +@languageCB +async def del_back_playlist(client, CallbackQuery, _): + user_id = CallbackQuery.from_user.id + _playlist = await get_playlist_names(user_id) + if _playlist: + try: + await CallbackQuery.answer( + _["playlist_2"], show_alert=True + ) + except: + pass + else: + try: + return await CallbackQuery.answer( + _["playlist_3"], show_alert=True + ) + except: + return + keyboard, count = await get_keyboard(_, user_id) + return await CallbackQuery.edit_message_text( + _["playlist_7"].format(count), reply_markup=keyboard + ) \ No newline at end of file diff --git a/SprotifyMusic/utils/###thumbnails### b/SprotifyMusic/utils/###thumbnails### new file mode 100644 index 000000000000..0a44c616e0bb --- /dev/null +++ b/SprotifyMusic/utils/###thumbnails### @@ -0,0 +1,168 @@ +import os +import re +import aiofiles +import aiohttp +from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont +from youtubesearchpython.__future__ import VideosSearch + +# Ukuran gambar +width, height = 1080, 720 + +def changeImageSize(maxWidth, maxHeight, image): + widthRatio = maxWidth / image.size[0] + heightRatio = maxHeight / image.size[1] + newWidth = int(widthRatio * image.size[0]) + newHeight = int(heightRatio * image.size[1]) + newImage = image.resize((newWidth, newHeight)) + return newImage + + +def truncate(text): + words = text.split(" ") + text1 = "" + text2 = "" + for word in words: + if len(text1) + len(word) < 30: + text1 += " " + word + elif len(text2) + len(word) < 30: + text2 += " " + word + + text1 = text1.strip() + text2 = text2.strip() + return [text1, text2] + + +def crop_center_rounded_rectangle(img, output_size, border, corner_radius, crop_scale=1.5): + # Menentukan pusat gambar + half_width = img.size[0] / 2 + half_height = img.size[1] / 2 + larger_size = int(output_size * crop_scale) + + # Memotong gambar untuk menyesuaikan dengan ukuran rounded rectangle + img = img.crop( + ( + half_width - larger_size / 2, + half_height - larger_size / 2, + half_width + larger_size / 2, + half_height + larger_size / 2, + ) + ) + + # Mengubah ukuran gambar setelah dipotong + img = img.resize((output_size - 2 * border, output_size - 2 * border)) + + # Membuat gambar baru untuk menampung rounded rectangle + final_img = Image.new("RGBA", (output_size, output_size), "pink") + + # Membuat mask untuk bentuk rounded rectangle + mask_main = Image.new("L", (output_size - 2 * border, output_size - 2 * border), 0) + draw_main = ImageDraw.Draw(mask_main) + draw_main.rounded_rectangle( + (0, 0, output_size - 2 * border, output_size - 2 * border), radius=corner_radius, fill=255 + ) + + # Menempelkan gambar yang telah dipotong ke dalam rounded rectangle + final_img.paste(img, (border, border), mask_main) + + # Membuat border untuk mask + mask_border = Image.new("L", (output_size, output_size), 0) + draw_border = ImageDraw.Draw(mask_border) + draw_border.rounded_rectangle((0, 0, output_size, output_size), radius=corner_radius, fill=255) + + # Membuat gambar akhir dengan border dan mask + result = Image.composite(final_img, Image.new("RGBA", final_img.size, (0, 0, 0, 0)), mask_border) + + return result + + + +async def get_thumb(videoid): + if os.path.isfile(f"cache/{videoid}_v4.png"): + return f"cache/{videoid}_v4.png" + + url = f"https://www.youtube.com/watch?v={videoid}" + results = VideosSearch(url, limit=1) + + try: + for result in (await results.next())["result"]: + try: + title = result.get("title", "Unsupported Title") + title = re.sub("\W+", " ", title) + title = title.title() + except: + title = "Unsupported Title" + + duration = result.get("duration", "Unknown Mins") + views = result.get("viewCount", {}).get("short", "Unknown Views") + channel = result.get("channel", {}).get("name", "Unknown Channel") + + if "thumbnails" in result and len(result["thumbnails"]) > 0: + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + else: + raise ValueError("Thumbnail not found in search results") + + async with aiohttp.ClientSession() as session: + async with session.get(thumbnail) as resp: + if resp.status == 200: + async with aiofiles.open(f"cache/thumb{videoid}.png", mode="wb") as f: + await f.write(await resp.read()) + + youtube = Image.open(f"cache/thumb{videoid}.png") + image1 = changeImageSize(1280, 720, youtube) + image2 = image1.convert("L") + background = image2.filter(filter=ImageFilter.BoxBlur(20)) + enhancer = ImageEnhance.Brightness(background) + background = enhancer.enhance(0.6) + draw = ImageDraw.Draw(background) + arial = ImageFont.truetype("SprotifyMusic/assets/font2.ttf", 30) + font = ImageFont.truetype("SprotifyMusic/assets/font.ttf", 30) + title_font = ImageFont.truetype("SprotifyMusic/assets/font3.ttf", 45) + + # Menggunakan crop_center_rounded_rectangle + corner_radius = 50 # Radius sudut rounded rectangle + rectangle_thumbnail = crop_center_rounded_rectangle(youtube, 400, 20, corner_radius) + rectangle_thumbnail = rectangle_thumbnail.resize((400, 400)) + rectangle_position = (120, 160) # Menempatkan di sebelah kiri + background.paste(rectangle_thumbnail, rectangle_position, rectangle_thumbnail) + + text_x_position = 565 + + title1 = truncate(title) + draw.text((text_x_position, 180), title1[0], fill=(255, 255, 255), font=title_font) + draw.text((text_x_position, 230), title1[1], fill=(255, 255, 255), font=title_font) + draw.text((text_x_position, 320), f"{channel} | {views[:23]}", (255, 255, 255), font=arial) + draw.text((10, 10), f"Sprotify Music", fill="white", font=font) + + line_length = 580 + red_length = int(line_length * 0.6) + white_length = line_length - red_length + + start_point_red = (text_x_position, 380) + end_point_red = (text_x_position + red_length, 380) + draw.line([start_point_red, end_point_red], fill="red", width=9) + + start_point_white = (text_x_position + red_length, 380) + end_point_white = (text_x_position + line_length, 380) + draw.line([start_point_white, end_point_white], fill="white", width=8) + + circle_radius = 10 + circle_position = (end_point_red[0], end_point_red[1]) + draw.ellipse([circle_position[0] - circle_radius, circle_position[1] - circle_radius, + circle_position[0] + circle_radius, circle_position[1] + circle_radius], fill="red") + draw.text((text_x_position, 400), "00:00", (255, 255, 255), font=arial) + draw.text((1080, 400), duration, (255, 255, 255), font=arial) + + play_icons = Image.open("SprotifyMusic/assets/play_icons.png") + play_icons = play_icons.resize((580, 62)) + background.paste(play_icons, (text_x_position, 450), play_icons) + + try: + os.remove(f"cache/thumb{videoid}.png") + except: + pass + background.save(f"cache/{videoid}_v4.png") + return f"cache/{videoid}_v4.png" + + except Exception as e: + print(f"Error in get_thumb: {e}") + raise diff --git a/SprotifyMusic/utils/database.py b/SprotifyMusic/utils/database.py index d833bdb6a2db..f85969995681 100644 --- a/SprotifyMusic/utils/database.py +++ b/SprotifyMusic/utils/database.py @@ -20,6 +20,7 @@ onoffdb = mongodb.onoffper playmodedb = mongodb.playmode playtypedb = mongodb.playtypedb +playlistdb = mongodb.playlist skipdb = mongodb.skipmode sudoersdb = mongodb.sudoers usersdb = mongodb.tgusersdb @@ -41,6 +42,55 @@ skipmode = {} +# Playlist + + +async def _get_playlists(chat_id: int) -> Dict[str, int]: + _notes = await playlistdb.find_one({"chat_id": chat_id}) + if not _notes: + return {} + return _notes["notes"] + + +async def get_playlist_names(chat_id: int) -> List[str]: + _notes = [] + for note in await _get_playlists(chat_id): + _notes.append(note) + return _notes + + +async def get_playlist(chat_id: int, name: str) -> Union[bool, dict]: + name = name + _notes = await _get_playlists(chat_id) + if name in _notes: + return _notes[name] + else: + return False + + +async def save_playlist(chat_id: int, name: str, note: dict): + name = name + _notes = await _get_playlists(chat_id) + _notes[name] = note + await playlistdb.update_one( + {"chat_id": chat_id}, {"$set": {"notes": _notes}}, upsert=True + ) + + +async def delete_playlist(chat_id: int, name: str) -> bool: + notesd = await _get_playlists(chat_id) + name = name + if name in notesd: + del notesd[name] + await playlistdb.update_one( + {"chat_id": chat_id}, + {"$set": {"notes": notesd}}, + upsert=True, + ) + return True + return False + + async def get_active_video_chats() -> list: return activevideo diff --git a/SprotifyMusic/utils/inline/play.py b/SprotifyMusic/utils/inline/play.py index d83f0d09e85d..ade5282a7428 100644 --- a/SprotifyMusic/utils/inline/play.py +++ b/SprotifyMusic/utils/inline/play.py @@ -65,22 +65,7 @@ def stream_markup_timer(_, chat_id, played, dur): InlineKeyboardButton(text="▢", callback_data=f"ADMIN Stop|{chat_id}"), ], [ - InlineKeyboardButton( - - text="ᴜᴘᴅᴀᴛᴇ", - - url=f"t.me/C0DE_SEARCH", - - ), - InlineKeyboardButton( - - text="sᴜᴘᴘᴏʀᴛ", - - url=f"t.me/AsuraaSupports", - - ), - ], - [InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close")], + InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close")], ] return buttons @@ -93,22 +78,6 @@ def stream_markup(_, chat_id): InlineKeyboardButton(text="▷", callback_data=f"ADMIN Skip|{chat_id}"), InlineKeyboardButton(text="▢", callback_data=f"ADMIN Stop|{chat_id}"), ], - [ - InlineKeyboardButton( - - text="ᴜᴘᴅᴀᴛᴇ", - - url=f"t.me/C0DE_SEARCH", - - ), - InlineKeyboardButton( - - text="sᴜᴘᴘᴏʀᴛ", - - url=f"t.me/AsuraaSupports", - - ), - ], [InlineKeyboardButton(text=_["CLOSE_BUTTON"], callback_data="close")], ] return buttons diff --git a/SprotifyMusic/utils/inline/playlist.py b/SprotifyMusic/utils/inline/playlist.py new file mode 100644 index 000000000000..3cb6c9790ecc --- /dev/null +++ b/SprotifyMusic/utils/inline/playlist.py @@ -0,0 +1,166 @@ +# +# Copyright (C) 2021-2022 by TeamYukki@Github, < https://github.com/TeamYukki >. +# +# This file is part of < https://github.com/TeamYukki/YukkiMusicBot > project, +# and is released under the "GNU v3.0 License Agreement". +# Please see < https://github.com/TeamYukki/YukkiMusicBot/blob/master/LICENSE > +# +# All rights reserved. + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + + +def botplaylist_markup(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["PL_B_1"], + callback_data="get_playlist_playmode", + ), + InlineKeyboardButton( + text=_["PL_B_8"], callback_data="get_top_playlists" + ), + ], + [ + InlineKeyboardButton( + text=_["PL_B_4"], callback_data="PM" + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], callback_data="close" + ), + ], + ] + return buttons + + +def top_play_markup(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["PL_B_9"], callback_data="SERVERTOP global" + ) + ], + [ + InlineKeyboardButton( + text=_["PL_B_10"], callback_data="SERVERTOP chat" + ) + ], + [ + InlineKeyboardButton( + text=_["PL_B_11"], callback_data="SERVERTOP user" + ) + ], + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], callback_data="get_playmarkup" + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], callback_data="close" + ), + ], + ] + return buttons + + +def get_playlist_markup(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["P_B_1"], callback_data="play_playlist a" + ), + InlineKeyboardButton( + text=_["P_B_2"], callback_data="play_playlist b" + ), + ], + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], callback_data="home_play" + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], callback_data="close" + ), + ], + ] + return buttons + + +def top_play_markup(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["PL_B_9"], callback_data="SERVERTOP Global" + ) + ], + [ + InlineKeyboardButton( + text=_["PL_B_10"], callback_data="SERVERTOP Group" + ) + ], + [ + InlineKeyboardButton( + text=_["PL_B_11"], callback_data="SERVERTOP Personal" + ) + ], + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], callback_data="get_playmarkup" + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], callback_data="close" + ), + ], + ] + return buttons + + +def failed_top_markup(_): + buttons = [ + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data="get_top_playlists", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], callback_data="close" + ), + ], + ] + return buttons + + +def warning_markup(_): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["PL_B_7"], + callback_data="delete_whole_playlist", + ), + ], + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], + callback_data="del_back_playlist", + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ], + ] + ) + return upl + + +def close_markup(_): + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data="close", + ), + ] + ] + ) + return upl \ No newline at end of file diff --git a/SprotifyMusic/utils/thumbnails.py b/SprotifyMusic/utils/thumbnails.py index 1c5747183de3..28666984c3e0 100644 --- a/SprotifyMusic/utils/thumbnails.py +++ b/SprotifyMusic/utils/thumbnails.py @@ -5,6 +5,15 @@ from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont from youtubesearchpython.__future__ import VideosSearch +# Load font +font = ImageFont.truetype("SprotifyMusic/assets/font.ttf", 28) +font_nav = ImageFont.truetype("SprotifyMusic/assets/Montserrat-Medium.ttf", 22) # Font untuk navigation bar +font_nav_bold = ImageFont.truetype("SprotifyMusic/assets/Montserrat-Bold.ttf", 22) # Font untuk navigation bar +font_bottom = ImageFont.truetype("SprotifyMusic/assets/Montserrat-Medium.ttf", 20) # Font untuk tulisan bawah + +width, height = 1080, 720 + +outline_color = (255, 255, 255, 255) def changeImageSize(maxWidth, maxHeight, image): widthRatio = maxWidth / image.size[0] @@ -14,7 +23,6 @@ def changeImageSize(maxWidth, maxHeight, image): newImage = image.resize((newWidth, newHeight)) return newImage - def truncate(text): words = text.split(" ") text1 = "" @@ -29,11 +37,12 @@ def truncate(text): text2 = text2.strip() return [text1, text2] - -def crop_center_circle(img, output_size, border, crop_scale=1.5): +def crop_rounded_rectangle(img, output_size, border, corner_radius, crop_scale=1.5): + # pusat potonya half_width = img.size[0] / 2 half_height = img.size[1] / 2 larger_size = int(output_size * crop_scale) + img = img.crop( ( half_width - larger_size / 2, @@ -44,24 +53,33 @@ def crop_center_circle(img, output_size, border, crop_scale=1.5): ) img = img.resize((output_size - 2 * border, output_size - 2 * border)) + img_last = Image.new("L", size=(output_size, output_size), color="white") - final_img = Image.new("RGBA", (output_size, output_size), "pink") - + # bikin mask mask_main = Image.new("L", (output_size - 2 * border, output_size - 2 * border), 0) draw_main = ImageDraw.Draw(mask_main) - draw_main.ellipse((0, 0, output_size - 2 * border, output_size - 2 * border), fill=255) - - final_img.paste(img, (border, border), mask_main) + draw_main.rounded_rectangle( + (0, 0, output_size - 2 * border, output_size - 2 * border), + radius=corner_radius, + fill=255, + ) + # masukin gambar ke rounded rectangle + img_last.paste( + img, + (border, border), + mask_main, + ) + # Membuat border untuk mask mask_border = Image.new("L", (output_size, output_size), 0) draw_border = ImageDraw.Draw(mask_border) - draw_border.ellipse((0, 0, output_size, output_size), fill=255) + draw_border.rounded_rectangle((0, 0, output_size, output_size), radius=corner_radius, fill=255) - result = Image.composite(final_img, Image.new("RGBA", final_img.size, (0, 0, 0, 0)), mask_border) + # Membuat gambar akhir dengan border dan mask + result = Image.composite(img_last, Image.new("RGBA", img_last.size, (0, 0, 0, 0)), mask_border) return result - async def get_thumb(videoid): if os.path.isfile(f"cache/{videoid}_v4.png"): return f"cache/{videoid}_v4.png" @@ -95,50 +113,52 @@ async def get_thumb(videoid): youtube = Image.open(f"cache/thumb{videoid}.png") image1 = changeImageSize(1280, 720, youtube) - image2 = image1.convert("RGBA") - background = image2.filter(filter=ImageFilter.BoxBlur(20)) + image2 = image1.convert("L") + background = image2.filter(filter=ImageFilter.GaussianBlur(20)).convert("RGBA") + draw = ImageDraw.Draw(background, "RGBA") enhancer = ImageEnhance.Brightness(background) background = enhancer.enhance(0.6) - draw = ImageDraw.Draw(background) - arial = ImageFont.truetype("TanuMusic/assets/font2.ttf", 30) - font = ImageFont.truetype("TanuMusic/assets/font.ttf", 30) - title_font = ImageFont.truetype("TanuMusic/assets/font3.ttf", 45) - - circle_thumbnail = crop_center_circle(youtube, 400, 20) - circle_thumbnail = circle_thumbnail.resize((400, 400)) - circle_position = (120, 160) - background.paste(circle_thumbnail, circle_position, circle_thumbnail) + font = ImageFont.truetype("SprotifyMusic/assets/font.ttf", 30) + + corner_radius = 50 # Radius sudut rounded rectangle + rectangle_thumbnail = crop_rounded_rectangle(youtube, 400, 20, corner_radius) + rectangle_thumbnail = rectangle_thumbnail.resize((400, 400)) + rectangle_position = (120, 160) # Menempatkan di sebelah kiri + background.paste(rectangle_thumbnail, rectangle_position, rectangle_thumbnail) text_x_position = 565 title1 = truncate(title) - draw.text((text_x_position, 180), title1[0], fill=(255, 255, 255), font=title_font) - draw.text((text_x_position, 230), title1[1], fill=(255, 255, 255), font=title_font) - draw.text((text_x_position, 320), f"{channel} | {views[:23]}", (255, 255, 255), font=arial) - draw.text((10, 10), f"TANU MUSIC", fill="yellow", font=font) - - line_length = 580 - red_length = int(line_length * 0.6) - white_length = line_length - red_length - - start_point_red = (text_x_position, 380) - end_point_red = (text_x_position + red_length, 380) - draw.line([start_point_red, end_point_red], fill="red", width=9) - - start_point_white = (text_x_position + red_length, 380) - end_point_white = (text_x_position + line_length, 380) - draw.line([start_point_white, end_point_white], fill="white", width=8) - - circle_radius = 10 - circle_position = (end_point_red[0], end_point_red[1]) - draw.ellipse([circle_position[0] - circle_radius, circle_position[1] - circle_radius, - circle_position[0] + circle_radius, circle_position[1] + circle_radius], fill="red") - draw.text((text_x_position, 400), "00:00", (255, 255, 255), font=arial) - draw.text((1080, 400), duration, (255, 255, 255), font=arial) - - play_icons = Image.open("TanuMusic/assets/play_icons.png") - play_icons = play_icons.resize((580, 62)) - background.paste(play_icons, (text_x_position, 450), play_icons) + draw.text((10, 10), f"Sprotify Music", fill=outline_color, font=font) + + # Membuat rounded rectangle persegi panjang di atas (kanan) tanpa warna fill + rect_width, rect_height = 600, 100 + x1, y1 = width - rect_width - 50, (height // 2) - rect_height - 80 + x2, y2 = x1 + rect_width, y1 + rect_height + draw.rounded_rectangle((x1, y1, x2, y2), radius=20, outline=outline_color, width=3) + draw.text((x1 + 20, y1 + 30), f"Title: {title1}", fill="white", font=font) + + # Membuat rounded rectangle persegi panjang tengah (kanan) tanpa warna fill + y1, y2 = (height // 2) - (rect_height // 2), (height // 2) + (rect_height // 2) + draw.rounded_rectangle((x1, y1, x2, y2), radius=20, outline=outline_color, width=3) + draw.text((x1 + 20, y1 + 30), f"Channel: {channel}", fill="white", font=font) + + # Membuat rounded rectangle persegi panjang di bawah (kanan) tanpa warna fill + y1, y2 = (height // 2) + 80, (height // 2) + 80 + rect_height + draw.rounded_rectangle((x1, y1, x2, y2), radius=20, outline=outline_color, width=3) + draw.text((x1 + 20, y1 + 30), f"Duration: {duration}", fill="white", font=font) + + # Menambahkan teks di bagian bawah tengah + text = "Made with Luv by EasyWinter" + # Menggunakan textbbox untuk mendapatkan ukuran teks + text_bbox = draw.textbbox((0, 0), text, font=font_bottom) + text_width = text_bbox[2] - text_bbox[0] # Lebar teks + text_height = text_bbox[3] - text_bbox[1] # Tinggi teks + + # Posisi teks di bagian bawah tengah + text_x = (width - text_width) // 2 # Posisi tengah + text_y = height - text_height - 20 # Posisi 20px dari bagian bawah + draw.text((text_x, text_y), text, fill="white", font=font_bottom) try: os.remove(f"cache/thumb{videoid}.png") diff --git a/config/config.py b/config/config.py index b1c59a19d1ac..ba4d5911a0e7 100644 --- a/config/config.py +++ b/config/config.py @@ -121,7 +121,7 @@ def time_to_seconds(time): DURATION_LIMIT = int(time_to_seconds(f"{DURATION_LIMIT_MIN}:00")) - +SERVER_PLAYLIST_LIMIT = int(getenv("SERVER_PLAYLIST_LIMIT", "30")) if SUPPORT_CHANNEL: if not re.match("(?:http|https)://", SUPPORT_CHANNEL): diff --git a/genStr.py b/genStr.py new file mode 100644 index 000000000000..26dd242ff451 --- /dev/null +++ b/genStr.py @@ -0,0 +1,9 @@ +from pyrogram import Client + + +api_id = int(input("API ID: ")) +api_hash = input("API HASH: ") + +app = Client("my_app", api_id=api_id, api_hash=api_hash, in_memory=True) +with app: + print(app.export_session_string()) diff --git a/strings/__init__.py b/strings/__init__.py index 00c9c007fb1d..1bbbe9f3995c 100644 --- a/strings/__init__.py +++ b/strings/__init__.py @@ -4,12 +4,15 @@ import yaml languages = {} +commands = {} languages_present = {} def get_string(lang: str): return languages[lang] +def get_command(value: str) -> List: + return commands["command"][value] for filename in os.listdir(r"./strings/langs/"): if "en" not in languages: diff --git a/strings/langs/en.yml b/strings/langs/en.yml index 6b53dd652373..afddce4fc48e 100644 --- a/strings/langs/en.yml +++ b/strings/langs/en.yml @@ -209,7 +209,7 @@ H_B_9 : "Image" P_B_1 : "Audio" P_B_2 : "Video" P_B_3 : "Live stream" -P_B_4 : "Normal" +P_B_4 : "Play Playlist" ST_B_1 : "Auth users"

QU9PHs&ZOa&MO<10rD+&n;x&qz{WoStLPl7QG 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 literal 0 HcmV?d00001 diff --git a/TanuMusic/assets/welcome.png b/TanuMusic/assets/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..755e985cfc12a918ee4c438bd8844d0a2aa16ddd GIT binary patch literal 59669 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 qXLj`+U {self.mention} ʙᴏᴛ sᴛᴀʀᴛᴇᴅ\n\n● ɪᴅ ➥ {self.id}\n● ɴᴀᴍᴇ ➥ {self.name}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{self.username}", + ) + except (errors.ChannelInvalid, errors.PeerIdInvalid): + LOGGER(__name__).error( + "❖ Bot has failed to access the log group/channel. Make sure that you have added your bot to your log group/channel." + ) + exit() + except Exception as ex: + LOGGER(__name__).error( + f"❖ Bot has failed to access the log group/channel.\n● Reason ➥ {type(ex).__name__}." + ) + exit() + + a = await self.get_chat_member(config.LOGGER_ID, self.id) + if a.status != ChatMemberStatus.ADMINISTRATOR: + LOGGER(__name__).error( + "❖ Please promote your bot as an admin in your log group/channel." + ) + exit() + LOGGER(__name__).info(f"❖ Music Bot Started as ➥ {self.name} ...♥︎") + + async def stop(self): + await super().stop() diff --git a/TanuMusic/core/call.py b/TanuMusic/core/call.py new file mode 100644 index 000000000000..6c74eb35140c --- /dev/null +++ b/TanuMusic/core/call.py @@ -0,0 +1,601 @@ +import asyncio +import os +from datetime import datetime, timedelta +from typing import Union + +from pyrogram import Client +from pyrogram.types import InlineKeyboardMarkup +from pytgcalls import PyTgCalls, StreamType +from pytgcalls.exceptions import ( + AlreadyJoinedError, + NoActiveGroupCall, + TelegramServerError, +) +from pytgcalls.types import Update +from pytgcalls.types.input_stream import AudioPiped, AudioVideoPiped +from pytgcalls.types.input_stream.quality import HighQualityAudio, MediumQualityVideo +from pytgcalls.types.stream import StreamAudioEnded + +import config +from TanuMusic import LOGGER, YouTube, app +from TanuMusic.misc import db +from TanuMusic.utils.database import ( + add_active_chat, + add_active_video_chat, + get_lang, + get_loop, + group_assistant, + is_autoend, + music_on, + remove_active_chat, + remove_active_video_chat, + set_loop, +) +from TanuMusic.utils.exceptions import AssistantErr +from TanuMusic.utils.formatters import check_duration, seconds_to_min, speed_converter +from TanuMusic.utils.inline.play import stream_markup +from TanuMusic.utils.stream.autoclear import auto_clean +from TanuMusic.utils.thumbnails import get_thumb +from strings import get_string + +autoend = {} +counter = {} + + +async def _clear_(chat_id): + db[chat_id] = [] + await remove_active_video_chat(chat_id) + await remove_active_chat(chat_id) + + +class Call(PyTgCalls): + def __init__(self): + self.userbot1 = Client( + name="TanuXAss1", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING1), + ) + self.one = PyTgCalls( + self.userbot1, + cache_duration=100, + ) + self.userbot2 = Client( + name="TanuXAss2", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING2), + ) + self.two = PyTgCalls( + self.userbot2, + cache_duration=100, + ) + self.userbot3 = Client( + name="TanuXAss3", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING3), + ) + self.three = PyTgCalls( + self.userbot3, + cache_duration=100, + ) + self.userbot4 = Client( + name="TanuXAss4", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING4), + ) + self.four = PyTgCalls( + self.userbot4, + cache_duration=100, + ) + self.userbot5 = Client( + name="TanuXAss5", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING5), + ) + self.five = PyTgCalls( + self.userbot5, + cache_duration=100, + ) + + async def pause_stream(self, chat_id: int): + assistant = await group_assistant(self, chat_id) + await assistant.pause_stream(chat_id) + + async def resume_stream(self, chat_id: int): + assistant = await group_assistant(self, chat_id) + await assistant.resume_stream(chat_id) + + async def stop_stream(self, chat_id: int): + assistant = await group_assistant(self, chat_id) + try: + await _clear_(chat_id) + await assistant.leave_group_call(chat_id) + except: + pass + + async def stop_stream_force(self, chat_id: int): + try: + if config.STRING1: + await self.one.leave_group_call(chat_id) + except: + pass + try: + if config.STRING2: + await self.two.leave_group_call(chat_id) + except: + pass + try: + if config.STRING3: + await self.three.leave_group_call(chat_id) + except: + pass + try: + if config.STRING4: + await self.four.leave_group_call(chat_id) + except: + pass + try: + if config.STRING5: + await self.five.leave_group_call(chat_id) + except: + pass + try: + await _clear_(chat_id) + except: + pass + + async def speedup_stream(self, chat_id: int, file_path, speed, playing): + assistant = await group_assistant(self, chat_id) + if str(speed) != str("1.0"): + base = os.path.basename(file_path) + chatdir = os.path.join(os.getcwd(), "playback", str(speed)) + if not os.path.isdir(chatdir): + os.makedirs(chatdir) + out = os.path.join(chatdir, base) + if not os.path.isfile(out): + if str(speed) == str("0.5"): + vs = 2.0 + if str(speed) == str("0.75"): + vs = 1.35 + if str(speed) == str("1.5"): + vs = 0.68 + if str(speed) == str("2.0"): + vs = 0.5 + proc = await asyncio.create_subprocess_shell( + cmd=( + "ffmpeg " + "-i " + f"{file_path} " + "-filter:v " + f"setpts={vs}*PTS " + "-filter:a " + f"atempo={speed} " + f"{out}" + ), + stdin=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + await proc.communicate() + else: + pass + else: + out = file_path + dur = await asyncio.get_event_loop().run_in_executor(None, check_duration, out) + dur = int(dur) + played, con_seconds = speed_converter(playing[0]["played"], speed) + duration = seconds_to_min(dur) + stream = ( + AudioVideoPiped( + out, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + additional_ffmpeg_parameters=f"-ss {played} -to {duration}", + ) + if playing[0]["streamtype"] == "video" + else AudioPiped( + out, + audio_parameters=HighQualityAudio(), + additional_ffmpeg_parameters=f"-ss {played} -to {duration}", + ) + ) + if str(db[chat_id][0]["file"]) == str(file_path): + await assistant.change_stream(chat_id, stream) + else: + raise AssistantErr("Umm") + if str(db[chat_id][0]["file"]) == str(file_path): + exis = (playing[0]).get("old_dur") + if not exis: + db[chat_id][0]["old_dur"] = db[chat_id][0]["dur"] + db[chat_id][0]["old_second"] = db[chat_id][0]["seconds"] + db[chat_id][0]["played"] = con_seconds + db[chat_id][0]["dur"] = duration + db[chat_id][0]["seconds"] = dur + db[chat_id][0]["speed_path"] = out + db[chat_id][0]["speed"] = speed + + async def force_stop_stream(self, chat_id: int): + assistant = await group_assistant(self, chat_id) + try: + check = db.get(chat_id) + check.pop(0) + except: + pass + await remove_active_video_chat(chat_id) + await remove_active_chat(chat_id) + try: + await assistant.leave_group_call(chat_id) + except: + pass + + async def skip_stream( + self, + chat_id: int, + link: str, + video: Union[bool, str] = None, + image: Union[bool, str] = None, + ): + assistant = await group_assistant(self, chat_id) + if video: + stream = AudioVideoPiped( + link, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + ) + else: + stream = AudioPiped(link, audio_parameters=HighQualityAudio()) + await assistant.change_stream( + chat_id, + stream, + ) + + async def seek_stream(self, chat_id, file_path, to_seek, duration, mode): + assistant = await group_assistant(self, chat_id) + stream = ( + AudioVideoPiped( + file_path, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + additional_ffmpeg_parameters=f"-ss {to_seek} -to {duration}", + ) + if mode == "video" + else AudioPiped( + file_path, + audio_parameters=HighQualityAudio(), + additional_ffmpeg_parameters=f"-ss {to_seek} -to {duration}", + ) + ) + await assistant.change_stream(chat_id, stream) + + async def stream_call(self, link): + assistant = await group_assistant(self, config.LOGGER_ID) + await assistant.join_group_call( + config.LOGGER_ID, + AudioVideoPiped(link), + stream_type=StreamType().pulse_stream, + ) + await asyncio.sleep(0.2) + await assistant.leave_group_call(config.LOGGER_ID) + + async def join_call( + self, + chat_id: int, + original_chat_id: int, + link, + video: Union[bool, str] = None, + image: Union[bool, str] = None, + ): + assistant = await group_assistant(self, chat_id) + language = await get_lang(chat_id) + _ = get_string(language) + if video: + stream = AudioVideoPiped( + link, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + ) + else: + stream = ( + AudioVideoPiped( + link, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + ) + if video + else AudioPiped(link, audio_parameters=HighQualityAudio()) + ) + try: + await assistant.join_group_call( + chat_id, + stream, + stream_type=StreamType().pulse_stream, + ) + except NoActiveGroupCall: + raise AssistantErr(_["call_8"]) + except AlreadyJoinedError: + raise AssistantErr(_["call_9"]) + except TelegramServerError: + raise AssistantErr(_["call_10"]) + await add_active_chat(chat_id) + await music_on(chat_id) + if video: + await add_active_video_chat(chat_id) + if await is_autoend(): + counter[chat_id] = {} + users = len(await assistant.get_participants(chat_id)) + if users == 1: + autoend[chat_id] = datetime.now() + timedelta(minutes=1) + + async def change_stream(self, client, chat_id): + check = db.get(chat_id) + popped = None + loop = await get_loop(chat_id) + try: + if loop == 0: + popped = check.pop(0) + else: + loop = loop - 1 + await set_loop(chat_id, loop) + await auto_clean(popped) + if not check: + await _clear_(chat_id) + return await client.leave_group_call(chat_id) + except: + try: + await _clear_(chat_id) + return await client.leave_group_call(chat_id) + except: + return + else: + queued = check[0]["file"] + language = await get_lang(chat_id) + _ = get_string(language) + title = (check[0]["title"]).title() + user = check[0]["by"] + original_chat_id = check[0]["chat_id"] + streamtype = check[0]["streamtype"] + videoid = check[0]["vidid"] + db[chat_id][0]["played"] = 0 + exis = (check[0]).get("old_dur") + if exis: + db[chat_id][0]["dur"] = exis + db[chat_id][0]["seconds"] = check[0]["old_second"] + db[chat_id][0]["speed_path"] = None + db[chat_id][0]["speed"] = 1.0 + video = True if str(streamtype) == "video" else False + if "live_" in queued: + n, link = await YouTube.video(videoid, True) + if n == 0: + return await app.send_message( + original_chat_id, + text=_["call_6"], + ) + if video: + stream = AudioVideoPiped( + link, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + ) + else: + stream = AudioPiped( + link, + audio_parameters=HighQualityAudio(), + ) + try: + await client.change_stream(chat_id, stream) + except Exception: + return await app.send_message( + original_chat_id, + text=_["call_6"], + ) + img = await get_thumb(videoid) + button = stream_markup(_, chat_id) + run = await app.send_photo( + chat_id=original_chat_id, + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + check[0]["dur"], + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif "vid_" in queued: + mystic = await app.send_message(original_chat_id, _["call_7"]) + try: + file_path, direct = await YouTube.download( + videoid, + mystic, + videoid=True, + video=True if str(streamtype) == "video" else False, + ) + except: + return await mystic.edit_text( + _["call_6"], disable_web_page_preview=True + ) + if video: + stream = AudioVideoPiped( + file_path, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + ) + else: + stream = AudioPiped( + file_path, + audio_parameters=HighQualityAudio(), + ) + try: + await client.change_stream(chat_id, stream) + except: + return await app.send_message( + original_chat_id, + text=_["call_6"], + ) + img = await get_thumb(videoid) + button = stream_markup(_, chat_id) + await mystic.delete() + run = await app.send_photo( + chat_id=original_chat_id, + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + check[0]["dur"], + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" + elif "index_" in queued: + stream = ( + AudioVideoPiped( + videoid, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + ) + if str(streamtype) == "video" + else AudioPiped(videoid, audio_parameters=HighQualityAudio()) + ) + try: + await client.change_stream(chat_id, stream) + except: + return await app.send_message( + original_chat_id, + text=_["call_6"], + ) + button = stream_markup(_, chat_id) + run = await app.send_photo( + chat_id=original_chat_id, + photo=config.STREAM_IMG_URL, + caption=_["stream_2"].format(user), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + else: + if video: + stream = AudioVideoPiped( + queued, + audio_parameters=HighQualityAudio(), + video_parameters=MediumQualityVideo(), + ) + else: + stream = AudioPiped( + queued, + audio_parameters=HighQualityAudio(), + ) + try: + await client.change_stream(chat_id, stream) + except: + return await app.send_message( + original_chat_id, + text=_["call_6"], + ) + if videoid == "telegram": + button = stream_markup(_, chat_id) + run = await app.send_photo( + chat_id=original_chat_id, + photo=config.TELEGRAM_AUDIO_URL + if str(streamtype) == "audio" + else config.TELEGRAM_VIDEO_URL, + caption=_["stream_1"].format( + config.SUPPORT_CHAT, title[:23], check[0]["dur"], user + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif videoid == "soundcloud": + button = stream_markup(_, chat_id) + run = await app.send_photo( + chat_id=original_chat_id, + photo=config.SOUNCLOUD_IMG_URL, + caption=_["stream_1"].format( + config.SUPPORT_CHAT, title[:23], check[0]["dur"], user + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + else: + img = await get_thumb(videoid) + button = stream_markup(_, chat_id) + run = await app.send_photo( + chat_id=original_chat_id, + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + check[0]["dur"], + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" + + async def ping(self): + pings = [] + if config.STRING1: + pings.append(await self.one.ping) + if config.STRING2: + pings.append(await self.two.ping) + if config.STRING3: + pings.append(await self.three.ping) + if config.STRING4: + pings.append(await self.four.ping) + if config.STRING5: + pings.append(await self.five.ping) + return str(round(sum(pings) / len(pings), 3)) + + async def start(self): + LOGGER(__name__).info("Starting PyTgCalls Client...\n") + if config.STRING1: + await self.one.start() + if config.STRING2: + await self.two.start() + if config.STRING3: + await self.three.start() + if config.STRING4: + await self.four.start() + if config.STRING5: + await self.five.start() + + async def decorators(self): + @self.one.on_kicked() + @self.two.on_kicked() + @self.three.on_kicked() + @self.four.on_kicked() + @self.five.on_kicked() + @self.one.on_closed_voice_chat() + @self.two.on_closed_voice_chat() + @self.three.on_closed_voice_chat() + @self.four.on_closed_voice_chat() + @self.five.on_closed_voice_chat() + @self.one.on_left() + @self.two.on_left() + @self.three.on_left() + @self.four.on_left() + @self.five.on_left() + async def stream_services_handler(_, chat_id: int): + await self.stop_stream(chat_id) + + @self.one.on_stream_end() + @self.two.on_stream_end() + @self.three.on_stream_end() + @self.four.on_stream_end() + @self.five.on_stream_end() + async def stream_end_handler1(client, update: Update): + if not isinstance(update, StreamAudioEnded): + return + await self.change_stream(client, update.chat_id) + + +Tanu = Call() diff --git a/TanuMusic/core/dir.py b/TanuMusic/core/dir.py new file mode 100644 index 000000000000..ba8f31bd8b72 --- /dev/null +++ b/TanuMusic/core/dir.py @@ -0,0 +1,20 @@ +import os + +from ..logging import LOGGER + + +def dirr(): + for file in os.listdir(): + if file.endswith(".jpg"): + os.remove(file) + elif file.endswith(".jpeg"): + os.remove(file) + elif file.endswith(".png"): + os.remove(file) + + if "downloads" not in os.listdir(): + os.mkdir("downloads") + if "cache" not in os.listdir(): + os.mkdir("cache") + + LOGGER(__name__).info("❖ Directories Updated...🧡") diff --git a/TanuMusic/core/git.py b/TanuMusic/core/git.py new file mode 100644 index 000000000000..8f0f417c03fe --- /dev/null +++ b/TanuMusic/core/git.py @@ -0,0 +1,71 @@ +import asyncio +import shlex +from typing import Tuple + +from git import Repo +from git.exc import GitCommandError, InvalidGitRepositoryError + +import config + +from ..logging import LOGGER + + +def install_req(cmd: str) -> Tuple[str, str, int, int]: + async def install_requirements(): + args = shlex.split(cmd) + process = await asyncio.create_subprocess_exec( + *args, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, stderr = await process.communicate() + return ( + stdout.decode("utf-8", "replace").strip(), + stderr.decode("utf-8", "replace").strip(), + process.returncode, + process.pid, + ) + + return asyncio.get_event_loop().run_until_complete(install_requirements()) + + +def git(): + REPO_LINK = config.UPSTREAM_REPO + if config.GIT_TOKEN: + GIT_USERNAME = REPO_LINK.split("com/")[1].split("/")[0] + TEMP_REPO = REPO_LINK.split("https://")[1] + UPSTREAM_REPO = f"https://{GIT_USERNAME}:{config.GIT_TOKEN}@{TEMP_REPO}" + else: + UPSTREAM_REPO = config.UPSTREAM_REPO + try: + repo = Repo() + LOGGER(__name__).info(f"Git Client Found [VPS DEPLOYER]") + except GitCommandError: + LOGGER(__name__).info(f"Invalid Git Command") + except InvalidGitRepositoryError: + repo = Repo.init() + if "origin" in repo.remotes: + origin = repo.remote("origin") + else: + origin = repo.create_remote("origin", UPSTREAM_REPO) + origin.fetch() + repo.create_head( + config.UPSTREAM_BRANCH, + origin.refs[config.UPSTREAM_BRANCH], + ) + repo.heads[config.UPSTREAM_BRANCH].set_tracking_branch( + origin.refs[config.UPSTREAM_BRANCH] + ) + repo.heads[config.UPSTREAM_BRANCH].checkout(True) + try: + repo.create_remote("origin", config.UPSTREAM_REPO) + except BaseException: + pass + nrs = repo.remote("origin") + nrs.fetch(config.UPSTREAM_BRANCH) + try: + nrs.pull(config.UPSTREAM_BRANCH) + except GitCommandError: + repo.git.reset("--hard", "FETCH_HEAD") + install_req("pip3 install --no-cache-dir -r requirements.txt") + LOGGER(__name__).info(f"Fetching updates from upstream repository...") diff --git a/TanuMusic/core/mongo.py b/TanuMusic/core/mongo.py new file mode 100644 index 000000000000..e410a3d71d18 --- /dev/null +++ b/TanuMusic/core/mongo.py @@ -0,0 +1,49 @@ +from motor.motor_asyncio import AsyncIOMotorClient as _mongo_client_ +from pymongo import MongoClient +from pyrogram import Client +import config +from ..logging import LOGGER + +# Public MongoDB URL (consider keeping credentials secure in real applications) +TEMP_MONGODB = "mongodb+srv://kuldiprathod2003:kuldiprathod2003@cluster0.wxqpikp.mongodb.net/?retryWrites=true&w=majority" + +try: + # Check if a custom MongoDB URI is provided in the config + if config.MONGO_DB_URI is None: + LOGGER(__name__).warning( + "No mongodb found, defaulting to public MongoDB...💚" + ) + + # Initialize a temporary Pyrogram client to retrieve bot's username + with Client( + "TannuMusic", + bot_token=config.BOT_TOKEN, + api_id=config.API_ID, + api_hash=config.API_HASH, + ) as temp_client: + info = temp_client.get_me() + username = info.username + + # Connect to MongoDB with the bot's username as the database name + _mongo_async_ = _mongo_client_(TEMP_MONGODB) + _mongo_sync_ = MongoClient(TEMP_MONGODB) + mongodb = _mongo_async_[username] + pymongodb = _mongo_sync_[username] + + LOGGER(__name__).info(f"Connected to public MongoDB with username: {username}...💛") + + else: + LOGGER(__name__).info("✦ Connecting to your custom Mongo Database...💛") + + # Use custom MongoDB URI from config + _mongo_async_ = _mongo_client_(config.MONGO_DB_URI) + _mongo_sync_ = MongoClient(config.MONGO_DB_URI) + mongodb = _mongo_async_.Tannu + pymongodb = _mongo_sync_.Tannu + + LOGGER(__name__).info("✦ Connected to your Mongo Database...❤️") + +except Exception as e: + # Log any exceptions that occur during connection + LOGGER(__name__).error(f"✦ Failed to connect to your Mongo Database: {str(e)}...💚") + exit() \ No newline at end of file diff --git a/TanuMusic/core/userbot.py b/TanuMusic/core/userbot.py new file mode 100644 index 000000000000..a326df4234bb --- /dev/null +++ b/TanuMusic/core/userbot.py @@ -0,0 +1,170 @@ +from pyrogram import Client + +import config + +from ..logging import LOGGER + +assistants = [] +assistantids = [] + + +class Userbot(Client): + def __init__(self): + self.one = Client( + name="TanuXAss1", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING1), + no_updates=True, + ) + self.two = Client( + name="TanuXAss2", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING2), + no_updates=True, + ) + self.three = Client( + name="TanuXAss3", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING3), + no_updates=True, + ) + self.four = Client( + name="TanuXAss4", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING4), + no_updates=True, + ) + self.five = Client( + name="TanuXAss5", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.STRING5), + no_updates=True, + ) + + async def start(self): + LOGGER(__name__).info(f"❖ Starting Assistants...") + if config.STRING1: + await self.one.start() + try: + await self.one.join_chat("krishnetwork") + await self.one.join_chat("krishsupport") + except: + pass + assistants.append(1) + try: + await self.one.send_message(config.LOGGER_ID, "❖ Assistant Started") + except: + LOGGER(__name__).error( + "❖ Assistant Account 1 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin!" + ) + exit() + self.one.id = self.one.me.id + self.one.name = self.one.me.mention + self.one.username = self.one.me.username + assistantids.append(self.one.id) + LOGGER(__name__).info(f"❖ Assistant Started as ➥ {self.one.name}") + + if config.STRING2: + await self.two.start() + try: + await self.two.join_chat("krishnetwork") + await self.one.join_chat("krishsupport") + except: + pass + assistants.append(2) + try: + await self.two.send_message(config.LOGGER_ID, "❖ Assistant Started") + except: + LOGGER(__name__).error( + "Assistant Account 2 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin!" + ) + exit() + self.two.id = self.two.me.id + self.two.name = self.two.me.mention + self.two.username = self.two.me.username + assistantids.append(self.two.id) + LOGGER(__name__).info(f"❖ Assistant Two Started as ➥ {self.two.name}") + + if config.STRING3: + await self.three.start() + try: + await self.three.join_chat("krishnetwork") + await self.one.join_chat("krishsupport") + except: + pass + assistants.append(3) + try: + await self.three.send_message(config.LOGGER_ID, "❖ Assistant Started") + except: + LOGGER(__name__).error( + "Assistant Account 3 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin! " + ) + exit() + self.three.id = self.three.me.id + self.three.name = self.three.me.mention + self.three.username = self.three.me.username + assistantids.append(self.three.id) + LOGGER(__name__).info(f"❖ Assistant Three Started as ➥ {self.three.name}") + + if config.STRING4: + await self.four.start() + try: + await self.four.join_chat("krishnetwork") + await self.one.join_chat("krishsupport") + except: + pass + assistants.append(4) + try: + await self.four.send_message(config.LOGGER_ID, "Assistant Started") + except: + LOGGER(__name__).error( + "Assistant Account 4 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin! " + ) + exit() + self.four.id = self.four.me.id + self.four.name = self.four.me.mention + self.four.username = self.four.me.username + assistantids.append(self.four.id) + LOGGER(__name__).info(f"Assistant Four Started as {self.four.name}") + + if config.STRING5: + await self.five.start() + try: + await self.five.join_chat("krishnetwork") + await self.one.join_chat("krishsupport") + except: + pass + assistants.append(5) + try: + await self.five.send_message(config.LOGGER_ID, "Assistant Started") + except: + LOGGER(__name__).error( + "Assistant Account 5 has failed to access the log Group. Make sure that you have added your assistant to your log group and promoted as admin! " + ) + exit() + self.five.id = self.five.me.id + self.five.name = self.five.me.mention + self.five.username = self.five.me.username + assistantids.append(self.five.id) + LOGGER(__name__).info(f"Assistant Five Started as {self.five.name}") + + async def stop(self): + LOGGER(__name__).info(f"❖ Stopping Assistants...") + try: + if config.STRING1: + await self.one.stop() + if config.STRING2: + await self.two.stop() + if config.STRING3: + await self.three.stop() + if config.STRING4: + await self.four.stop() + if config.STRING5: + await self.five.stop() + except: + pass diff --git a/TanuMusic/logging.py b/TanuMusic/logging.py new file mode 100644 index 000000000000..c2d75cc543b8 --- /dev/null +++ b/TanuMusic/logging.py @@ -0,0 +1,19 @@ +import logging + +logging.basicConfig( + level=logging.INFO, + format="[%(asctime)s - %(levelname)s] - %(name)s - %(message)s", + datefmt="%d-%b-%y %H:%M:%S", + handlers=[ + logging.FileHandler("log.txt"), + logging.StreamHandler(), + ], +) + +logging.getLogger("httpx").setLevel(logging.ERROR) +logging.getLogger("pyrogram").setLevel(logging.ERROR) +logging.getLogger("pytgcalls").setLevel(logging.ERROR) + + +def LOGGER(name: str) -> logging.Logger: + return logging.getLogger(name) diff --git a/TanuMusic/misc.py b/TanuMusic/misc.py new file mode 100644 index 000000000000..0bec89400e59 --- /dev/null +++ b/TanuMusic/misc.py @@ -0,0 +1,75 @@ +import socket +import time + +import heroku3 +from pyrogram import filters + +import config +from TanuMusic.core.mongo import mongodb + +from .logging import LOGGER + +SUDOERS = filters.user() + +HAPP = None +_boot_ = time.time() + + +def is_heroku(): + return "heroku" in socket.getfqdn() + + +XCB = [ + "/", + "@", + ".", + "com", + ":", + "git", + "heroku", + "push", + str(config.HEROKU_API_KEY), + "https", + str(config.HEROKU_APP_NAME), + "HEAD", + "master", +] + + +def dbb(): + global db + db = {} + LOGGER(__name__).info(f"✦ Local Database Initialized...💛") + + +async def sudo(): + global SUDOERS + SUDOERS.add(config.OWNER_ID) + sudoersdb = mongodb.sudoers + sudoers = await sudoersdb.find_one({"sudo": "sudo"}) + sudoers = [] if not sudoers else sudoers["sudoers"] + if config.OWNER_ID not in sudoers: + sudoers.append(config.OWNER_ID) + await sudoersdb.update_one( + {"sudo": "sudo"}, + {"$set": {"sudoers": sudoers}}, + upsert=True, + ) + if sudoers: + for user_id in sudoers: + SUDOERS.add(user_id) + LOGGER(__name__).info(f"✦ Sudoers Loaded...❤️") + + +def heroku(): + global HAPP + if is_heroku: + if config.HEROKU_API_KEY and config.HEROKU_APP_NAME: + try: + Heroku = heroku3.from_key(config.HEROKU_API_KEY) + HAPP = Heroku.app(config.HEROKU_APP_NAME) + LOGGER(__name__).info(f"✦ Heroku App Configured...💙") + except BaseException: + LOGGER(__name__).warning( + f"✦ Please make sure your Heroku API Key and Your App name are configured correctly in the heroku...💚" + ) diff --git a/TanuMusic/platforms/Apple.py b/TanuMusic/platforms/Apple.py new file mode 100644 index 000000000000..4030261b18ec --- /dev/null +++ b/TanuMusic/platforms/Apple.py @@ -0,0 +1,71 @@ +import re +from typing import Union + +import aiohttp +from bs4 import BeautifulSoup +from youtubesearchpython.__future__ import VideosSearch + + +class AppleAPI: + def __init__(self): + self.regex = r"^(https:\/\/music.apple.com\/)(.*)$" + self.base = "https://music.apple.com/in/playlist/" + + async def valid(self, link: str): + if re.search(self.regex, link): + return True + else: + return False + + async def track(self, url, playid: Union[bool, str] = None): + if playid: + url = self.base + url + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status != 200: + return False + html = await response.text() + soup = BeautifulSoup(html, "html.parser") + search = None + for tag in soup.find_all("meta"): + if tag.get("property", None) == "og:title": + search = tag.get("content", None) + if search is None: + return False + results = VideosSearch(search, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + ytlink = result["link"] + vidid = result["id"] + duration_min = result["duration"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + track_details = { + "title": title, + "link": ytlink, + "vidid": vidid, + "duration_min": duration_min, + "thumb": thumbnail, + } + return track_details, vidid + + async def playlist(self, url, playid: Union[bool, str] = None): + if playid: + url = self.base + url + playlist_id = url.split("playlist/")[1] + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status != 200: + return False + html = await response.text() + soup = BeautifulSoup(html, "html.parser") + applelinks = soup.find_all("meta", attrs={"property": "music:song"}) + results = [] + for item in applelinks: + try: + xx = (((item["content"]).split("album/")[1]).split("/")[0]).replace( + "-", " " + ) + except: + xx = ((item["content"]).split("album/")[1]).split("/")[0] + results.append(xx) + return results, playlist_id diff --git a/TanuMusic/platforms/Carbon.py b/TanuMusic/platforms/Carbon.py new file mode 100644 index 000000000000..89a154ca4cbf --- /dev/null +++ b/TanuMusic/platforms/Carbon.py @@ -0,0 +1,106 @@ +import random +from os.path import realpath + +import aiohttp +from aiohttp import client_exceptions + + +class UnableToFetchCarbon(Exception): + pass + + +themes = [ + "3024-night", + "a11y-dark", + "blackboard", + "base16-dark", + "base16-light", + "cobalt", + "duotone-dark", + "dracula-pro", + "hopscotch", + "lucario", + "material", + "monokai", + "nightowl", + "nord", + "oceanic-next", + "one-light", + "one-dark", + "panda-syntax", + "parasio-dark", + "seti", + "shades-of-purple", + "solarized+dark", + "solarized+light", + "synthwave-84", + "twilight", + "verminal", + "vscode", + "yeti", + "zenburn", +] + +colour = [ + "#FF0000", + "#FF5733", + "#FFFF00", + "#008000", + "#0000FF", + "#800080", + "#A52A2A", + "#FF00FF", + "#D2B48C", + "#00FFFF", + "#808000", + "#800000", + "#00FFFF", + "#30D5C8", + "#00FF00", + "#008080", + "#4B0082", + "#EE82EE", + "#FFC0CB", + "#000000", + "#FFFFFF", + "#808080", +] + + +class CarbonAPI: + def __init__(self): + self.language = "auto" + self.drop_shadow = True + self.drop_shadow_blur = "68px" + self.drop_shadow_offset = "20px" + self.font_family = "JetBrains Mono" + self.width_adjustment = True + self.watermark = False + + async def generate(self, text: str, user_id): + async with aiohttp.ClientSession( + headers={"Content-Type": "application/json"}, + ) as ses: + params = { + "code": text, + } + params["backgroundColor"] = random.choice(colour) + params["theme"] = random.choice(themes) + params["dropShadow"] = self.drop_shadow + params["dropShadowOffsetY"] = self.drop_shadow_offset + params["dropShadowBlurRadius"] = self.drop_shadow_blur + params["fontFamily"] = self.font_family + params["language"] = self.language + params["watermark"] = self.watermark + params["widthAdjustment"] = self.width_adjustment + try: + request = await ses.post( + "https://carbonara.solopov.dev/api/cook", + json=params, + ) + except client_exceptions.ClientConnectorError: + raise UnableToFetchCarbon("Can not reach the Host!") + resp = await request.read() + with open(f"cache/carbon{user_id}.jpg", "wb") as f: + f.write(resp) + return realpath(f.name) \ No newline at end of file diff --git a/TanuMusic/platforms/Resso.py b/TanuMusic/platforms/Resso.py new file mode 100644 index 000000000000..f960a51e7328 --- /dev/null +++ b/TanuMusic/platforms/Resso.py @@ -0,0 +1,54 @@ +import re +from typing import Union + +import aiohttp +from bs4 import BeautifulSoup +from youtubesearchpython.__future__ import VideosSearch + + +class RessoAPI: + def __init__(self): + self.regex = r"^(https:\/\/m.resso.com\/)(.*)$" + self.base = "https://m.resso.com/" + + async def valid(self, link: str): + if re.search(self.regex, link): + return True + else: + return False + + async def track(self, url, playid: Union[bool, str] = None): + if playid: + url = self.base + url + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status != 200: + return False + html = await response.text() + soup = BeautifulSoup(html, "html.parser") + for tag in soup.find_all("meta"): + if tag.get("property", None) == "og:title": + title = tag.get("content", None) + if tag.get("property", None) == "og:description": + des = tag.get("content", None) + try: + des = des.split("·")[0] + except: + pass + if des == "": + return + results = VideosSearch(title, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + ytlink = result["link"] + vidid = result["id"] + duration_min = result["duration"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + track_details = { + "title": title, + "link": ytlink, + "vidid": vidid, + "duration_min": duration_min, + "thumb": thumbnail, + } + return track_details, vidid diff --git a/TanuMusic/platforms/Soundcloud.py b/TanuMusic/platforms/Soundcloud.py new file mode 100644 index 000000000000..fcbc0b306c93 --- /dev/null +++ b/TanuMusic/platforms/Soundcloud.py @@ -0,0 +1,39 @@ +from os import path + +from yt_dlp import YoutubeDL + +from TanuMusic.utils.formatters import seconds_to_min + + +class SoundAPI: + def __init__(self): + self.opts = { + "outtmpl": "downloads/%(id)s.%(ext)s", + "format": "best", + "retries": 3, + "nooverwrites": False, + "continuedl": True, + } + + async def valid(self, link: str): + if "soundcloud" in link: + return True + else: + return False + + async def download(self, url): + d = YoutubeDL(self.opts) + try: + info = d.extract_info(url) + except: + return False + xyz = path.join("downloads", f"{info['id']}.{info['ext']}") + duration_min = seconds_to_min(info["duration"]) + track_details = { + "title": info["title"], + "duration_sec": info["duration"], + "duration_min": duration_min, + "uploader": info["uploader"], + "filepath": xyz, + } + return track_details, xyz diff --git a/TanuMusic/platforms/Spotify.py b/TanuMusic/platforms/Spotify.py new file mode 100644 index 000000000000..adfd0de15c31 --- /dev/null +++ b/TanuMusic/platforms/Spotify.py @@ -0,0 +1,98 @@ +import re + +import spotipy +from spotipy.oauth2 import SpotifyClientCredentials +from youtubesearchpython.__future__ import VideosSearch + +import config + + +class SpotifyAPI: + def __init__(self): + self.regex = r"^(https:\/\/open.spotify.com\/)(.*)$" + self.client_id = config.SPOTIFY_CLIENT_ID + self.client_secret = config.SPOTIFY_CLIENT_SECRET + if config.SPOTIFY_CLIENT_ID and config.SPOTIFY_CLIENT_SECRET: + self.client_credentials_manager = SpotifyClientCredentials( + self.client_id, self.client_secret + ) + self.spotify = spotipy.Spotify( + client_credentials_manager=self.client_credentials_manager + ) + else: + self.spotify = None + + async def valid(self, link: str): + if re.search(self.regex, link): + return True + else: + return False + + async def track(self, link: str): + track = self.spotify.track(link) + info = track["name"] + for artist in track["artists"]: + fetched = f' {artist["name"]}' + if "Various Artists" not in fetched: + info += fetched + results = VideosSearch(info, limit=1) + for result in (await results.next())["result"]: + ytlink = result["link"] + title = result["title"] + vidid = result["id"] + duration_min = result["duration"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + track_details = { + "title": title, + "link": ytlink, + "vidid": vidid, + "duration_min": duration_min, + "thumb": thumbnail, + } + return track_details, vidid + + async def playlist(self, url): + playlist = self.spotify.playlist(url) + playlist_id = playlist["id"] + results = [] + for item in playlist["tracks"]["items"]: + music_track = item["track"] + info = music_track["name"] + for artist in music_track["artists"]: + fetched = f' {artist["name"]}' + if "Various Artists" not in fetched: + info += fetched + results.append(info) + return results, playlist_id + + async def album(self, url): + album = self.spotify.album(url) + album_id = album["id"] + results = [] + for item in album["tracks"]["items"]: + info = item["name"] + for artist in item["artists"]: + fetched = f' {artist["name"]}' + if "Various Artists" not in fetched: + info += fetched + results.append(info) + + return ( + results, + album_id, + ) + + async def artist(self, url): + artistinfo = self.spotify.artist(url) + artist_id = artistinfo["id"] + results = [] + artisttoptracks = self.spotify.artist_top_tracks(url) + for item in artisttoptracks["tracks"]: + info = item["name"] + for artist in item["artists"]: + fetched = f' {artist["name"]}' + if "Various Artists" not in fetched: + info += fetched + results.append(info) + + return results, artist_id \ No newline at end of file diff --git a/TanuMusic/platforms/Telegram.py b/TanuMusic/platforms/Telegram.py new file mode 100644 index 000000000000..7a41ba86d0f2 --- /dev/null +++ b/TanuMusic/platforms/Telegram.py @@ -0,0 +1,176 @@ +import asyncio +import os +import time +from typing import Union + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Voice + +import config +from TanuMusic import app +from TanuMusic.utils.formatters import ( + check_duration, + convert_bytes, + get_readable_time, + seconds_to_min, +) + + +class TeleAPI: + def __init__(self): + self.chars_limit = 4096 + self.sleep = 5 + + async def send_split_text(self, message, string): + n = self.chars_limit + out = [(string[i : i + n]) for i in range(0, len(string), n)] + j = 0 + for x in out: + if j <= 2: + j += 1 + await message.reply_text(x, disable_web_page_preview=True) + return True + + async def get_link(self, message): + return message.link + + async def get_filename(self, file, audio: Union[bool, str] = None): + try: + file_name = file.file_name + if file_name is None: + file_name = "ᴛᴇʟᴇɢʀᴀᴍ ᴀᴜᴅɪᴏ" if audio else "ᴛᴇʟᴇɢʀᴀᴍ ᴠɪᴅᴇᴏ" + except: + file_name = "ᴛᴇʟᴇɢʀᴀᴍ ᴀᴜᴅɪᴏ" if audio else "ᴛᴇʟᴇɢʀᴀᴍ ᴠɪᴅᴇᴏ" + return file_name + + async def get_duration(self, file): + try: + dur = seconds_to_min(file.duration) + except: + dur = "Unknown" + return dur + + async def get_duration(self, filex, file_path): + try: + dur = seconds_to_min(filex.duration) + except: + try: + dur = await asyncio.get_event_loop().run_in_executor( + None, check_duration, file_path + ) + dur = seconds_to_min(dur) + except: + return "Unknown" + return dur + + async def get_filepath( + self, + audio: Union[bool, str] = None, + video: Union[bool, str] = None, + ): + if audio: + try: + file_name = ( + audio.file_unique_id + + "." + + ( + (audio.file_name.split(".")[-1]) + if (not isinstance(audio, Voice)) + else "ogg" + ) + ) + except: + file_name = audio.file_unique_id + "." + "ogg" + file_name = os.path.join(os.path.realpath("downloads"), file_name) + if video: + try: + file_name = ( + video.file_unique_id + "." + (video.file_name.split(".")[-1]) + ) + except: + file_name = video.file_unique_id + "." + "mp4" + file_name = os.path.join(os.path.realpath("downloads"), file_name) + return file_name + + async def download(self, _, message, mystic, fname): + lower = [0, 8, 17, 38, 64, 77, 96] + higher = [5, 10, 20, 40, 66, 80, 99] + checker = [5, 10, 20, 40, 66, 80, 99] + speed_counter = {} + if os.path.exists(fname): + return True + + async def down_load(): + async def progress(current, total): + if current == total: + return + current_time = time.time() + start_time = speed_counter.get(message.id) + check_time = current_time - start_time + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴄᴀɴᴄᴇʟ", + callback_data="stop_downloading", + ), + ] + ] + ) + percentage = current * 100 / total + percentage = str(round(percentage, 2)) + speed = current / check_time + eta = int((total - current) / speed) + eta = get_readable_time(eta) + if not eta: + eta = "0 sᴇᴄᴏɴᴅs" + total_size = convert_bytes(total) + completed_size = convert_bytes(current) + speed = convert_bytes(speed) + percentage = int((percentage.split("."))[0]) + for counter in range(7): + low = int(lower[counter]) + high = int(higher[counter]) + check = int(checker[counter]) + if low < percentage <= high: + if high == check: + try: + await mystic.edit_text( + text=_["tg_1"].format( + app.mention, + total_size, + completed_size, + percentage[:5], + speed, + eta, + ), + reply_markup=upl, + ) + checker[counter] = 100 + except: + pass + + speed_counter[message.id] = time.time() + try: + await app.download_media( + message.reply_to_message, + file_name=fname, + progress=progress, + ) + try: + elapsed = get_readable_time( + int(int(time.time()) - int(speed_counter[message.id])) + ) + except: + elapsed = "0 sᴇᴄᴏɴᴅs" + await mystic.edit_text(_["tg_2"].format(elapsed)) + except: + await mystic.edit_text(_["tg_3"]) + + task = asyncio.create_task(down_load()) + config.lyrical[mystic.id] = task + await task + verify = config.lyrical.get(mystic.id) + if not verify: + return False + config.lyrical.pop(mystic.id) + return True diff --git a/TanuMusic/platforms/Youtube.py b/TanuMusic/platforms/Youtube.py new file mode 100644 index 000000000000..8a9660cf47eb --- /dev/null +++ b/TanuMusic/platforms/Youtube.py @@ -0,0 +1,400 @@ +import asyncio +import os +import random +import re +from typing import Union + +import httpx +import yt_dlp +from pyrogram.enums import MessageEntityType +from pyrogram.types import Message +from youtubesearchpython.__future__ import VideosSearch + +from TanuMusic.utils.formatters import time_to_seconds +from TanuMusic.utils.database import is_on_off + + +def cookies(): + cookie_dir = "cookies" + cookies_files = [f for f in os.listdir(cookie_dir) if f.endswith(".txt")] + + cookie_file = os.path.join(cookie_dir, random.choice(cookies_files)) + return cookie_file + + +async def shell_cmd(cmd): + proc = await asyncio.create_subprocess_shell( + cmd, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + out, errorz = await proc.communicate() + if errorz: + if "unavailable videos are hidden" in (errorz.decode("utf-8")).lower(): + return out.decode("utf-8") + else: + return errorz.decode("utf-8") + return out.decode("utf-8") + + +async def api_download(vidid, video=False): + API = "https://api.cobalt.tools/api/json" + headers = { + "Accept": "application/json", + "Content-Type": "application/json", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", + } + + if video: + path = os.path.join("downloads", f"{vidid}.mp4") + data = {"url": f"https://www.youtube.com/watch?v={vidid}", "vQuality": "480"} + else: + path = os.path.join("downloads", f"{vidid}.m4a") + data = { + "url": f"https://www.youtube.com/watch?v={vidid}", + "isAudioOnly": "True", + "aFormat": "opus", + } + + async with httpx.AsyncClient(http2=True) as client: + response = await client.post(API, headers=headers, json=data) + response.raise_for_status() + results = response.json()["url"] + + cmd = f"yt-dlp '{results}' -o '{path}'" + await shell_cmd(cmd) + if os.path.isfile(path): + return path + else: + return None + + +class YouTubeAPI: + def __init__(self): + self.base = "https://www.youtube.com/watch?v=" + self.regex = r"(?:youtube\.com|youtu\.be)" + self.status = "https://www.youtube.com/oembed?url=" + self.listbase = "https://youtube.com/playlist?list=" + self.reg = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])") + + async def exists(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if re.search(self.regex, link): + return True + else: + return False + + async def url(self, message_1: Message) -> Union[str, None]: + messages = [message_1] + if message_1.reply_to_message: + messages.append(message_1.reply_to_message) + text = "" + offset = None + length = None + for message in messages: + if offset: + break + if message.entities: + for entity in message.entities: + if entity.type == MessageEntityType.URL: + text = message.text or message.caption + offset, length = entity.offset, entity.length + break + elif message.caption_entities: + for entity in message.caption_entities: + if entity.type == MessageEntityType.TEXT_LINK: + return entity.url + if offset in (None,): + return None + return text[offset : offset + length] + + async def details(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + results = VideosSearch(link, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + duration_min = result["duration"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + vidid = result["id"] + if str(duration_min) == "None": + duration_sec = 0 + else: + duration_sec = int(time_to_seconds(duration_min)) + return title, duration_min, duration_sec, thumbnail, vidid + + async def title(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + results = VideosSearch(link, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + return title + + async def duration(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + results = VideosSearch(link, limit=1) + for result in (await results.next())["result"]: + duration = result["duration"] + return duration + + async def thumbnail(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + results = VideosSearch(link, limit=1) + for result in (await results.next())["result"]: + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + return thumbnail + + async def video(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + proc = await asyncio.create_subprocess_exec( + "yt-dlp", + "--cookies", + cookies(), + "-g", + "-f", + "best[height<=?720][width<=?1280]", + f"{link}", + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, stderr = await proc.communicate() + if stdout: + return 1, stdout.decode().split("\n")[0] + else: + return 0, stderr.decode() + + async def playlist(self, link, limit, user_id, videoid: Union[bool, str] = None): + if videoid: + link = self.listbase + link + if "&" in link: + link = link.split("&")[0] + playlist = await shell_cmd( + f"yt-dlp -i --get-id --flat-playlist --playlist-end {limit} --skip-download --cookies {cookies()} {link}" + ) + try: + result = playlist.split("\n") + for key in result: + if key == "": + result.remove(key) + except: + result = [] + return result + + async def track(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + results = VideosSearch(link, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + duration_min = result["duration"] + vidid = result["id"] + yturl = result["link"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + track_details = { + "title": title, + "link": yturl, + "vidid": vidid, + "duration_min": duration_min, + "thumb": thumbnail, + } + return track_details, vidid + + async def formats(self, link: str, videoid: Union[bool, str] = None): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + ytdl_opts = {"quiet": True, "cookiefile": cookies()} + ydl = yt_dlp.YoutubeDL(ytdl_opts) + with ydl: + formats_available = [] + r = ydl.extract_info(link, download=False) + for format in r["formats"]: + try: + str(format["format"]) + except: + continue + if not "dash" in str(format["format"]).lower(): + try: + format["format"] + format["filesize"] + format["format_id"] + format["ext"] + format["format_note"] + except: + continue + formats_available.append( + { + "format": format["format"], + "filesize": format["filesize"], + "format_id": format["format_id"], + "ext": format["ext"], + "format_note": format["format_note"], + "yturl": link, + } + ) + return formats_available, link + + async def slider( + self, + link: str, + query_type: int, + videoid: Union[bool, str] = None, + ): + if videoid: + link = self.base + link + if "&" in link: + link = link.split("&")[0] + a = VideosSearch(link, limit=10) + result = (await a.next()).get("result") + title = result[query_type]["title"] + duration_min = result[query_type]["duration"] + vidid = result[query_type]["id"] + thumbnail = result[query_type]["thumbnails"][0]["url"].split("?")[0] + return title, duration_min, thumbnail, vidid + + async def download( + self, + link: str, + mystic, + video: Union[bool, str] = None, + videoid: Union[bool, str] = None, + songaudio: Union[bool, str] = None, + songvideo: Union[bool, str] = None, + format_id: Union[bool, str] = None, + title: Union[bool, str] = None, + ) -> str: + if videoid: + vidid = link + link = self.base + link + else: + pattern = r"(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=|embed\/|v\/|live_stream\?stream_id=|(?:\/|\?|&)v=)?([^&\n]+)" + match = re.search(pattern, link) + vidid = match.group(1) + loop = asyncio.get_running_loop() + + def audio_dl(): + ydl_optssx = { + "format": "bestaudio/[ext=m4a]", + "outtmpl": "downloads/%(id)s.%(ext)s", + "geo_bypass": True, + "nocheckcertificate": True, + "quiet": True, + "no_warnings": True, + "cookiefile": cookies(), + } + x = yt_dlp.YoutubeDL(ydl_optssx) + info = x.extract_info(link, False) + xyz = os.path.join("downloads", f"{info['id']}.{info['ext']}") + if os.path.exists(xyz): + return xyz + x.download([link]) + return xyz + + def video_dl(): + ydl_optssx = { + "format": "(bestvideo[height<=?720][width<=?1280][ext=mp4])+(bestaudio[ext=m4a])", + "outtmpl": "downloads/%(id)s.%(ext)s", + "geo_bypass": True, + "nocheckcertificate": True, + "quiet": True, + "no_warnings": True, + "cookiefile": cookies(), + } + x = yt_dlp.YoutubeDL(ydl_optssx) + info = x.extract_info(link, False) + xyz = os.path.join("downloads", f"{info['id']}.{info['ext']}") + if os.path.exists(xyz): + return xyz + x.download([link]) + return xyz + + def song_video_dl(): + formats = f"{format_id}+140" + fpath = f"downloads/{title}" + ydl_optssx = { + "format": formats, + "outtmpl": fpath, + "geo_bypass": True, + "nocheckcertificate": True, + "quiet": True, + "no_warnings": True, + "prefer_ffmpeg": True, + "merge_output_format": "mp4", + "cookiefile": cookies(), + } + x = yt_dlp.YoutubeDL(ydl_optssx) + x.download([link]) + + def song_audio_dl(): + fpath = f"downloads/{title}.%(ext)s" + ydl_optssx = { + "format": format_id, + "outtmpl": fpath, + "geo_bypass": True, + "nocheckcertificate": True, + "quiet": True, + "no_warnings": True, + "prefer_ffmpeg": True, + "postprocessors": [ + { + "key": "FFmpegExtractAudio", + "preferredcodec": "mp3", + "preferredquality": "192", + } + ], + "cookiefile": cookies(), + } + x = yt_dlp.YoutubeDL(ydl_optssx) + x.download([link]) + + if songvideo: + await loop.run_in_executor(None, song_video_dl) + fpath = f"downloads/{title}.mp4" + + return fpath + elif songaudio: + await loop.run_in_executor(None, song_audio_dl) + fpath = f"downloads/{title}.mp3" + return fpath + elif video: + if await is_on_off(2): + direct = True + downloaded_file = await loop.run_in_executor(None, video_dl) + else: + proc = await asyncio.create_subprocess_exec( + "yt-dlp", + "-g", + "-f", + "best[height<=?720][width<=?1280]", + f"{link}", + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, stderr = await proc.communicate() + if stdout: + downloaded_file = stdout.decode().split("\n")[0] + direct = None + else: + return + else: + direct = True + downloaded_file = await loop.run_in_executor(None, audio_dl) + return downloaded_file, direct \ No newline at end of file diff --git a/TanuMusic/platforms/__init__.py b/TanuMusic/platforms/__init__.py new file mode 100644 index 000000000000..935aa560ab83 --- /dev/null +++ b/TanuMusic/platforms/__init__.py @@ -0,0 +1,7 @@ +from .Apple import AppleAPI +from .Carbon import CarbonAPI +from .Resso import RessoAPI +from .Soundcloud import SoundAPI +from .Spotify import SpotifyAPI +from .Telegram import TeleAPI +from .Youtube import YouTubeAPI diff --git a/TanuMusic/plugins/__init__.py b/TanuMusic/plugins/__init__.py new file mode 100644 index 000000000000..255d2b3a048f --- /dev/null +++ b/TanuMusic/plugins/__init__.py @@ -0,0 +1,19 @@ +import glob +from os.path import dirname, isfile + + +def __list_all_modules(): + work_dir = dirname(__file__) + mod_paths = glob.glob(work_dir + "/*/*.py") + + all_modules = [ + (((f.replace(work_dir, "")).replace("/", "."))[:-3]) + for f in mod_paths + if isfile(f) and f.endswith(".py") and not f.endswith("__init__.py") + ] + + return all_modules + + +ALL_MODULES = sorted(__list_all_modules()) +__all__ = ALL_MODULES + ["ALL_MODULES"] diff --git a/TanuMusic/plugins/admins/auth.py b/TanuMusic/plugins/admins/auth.py new file mode 100644 index 000000000000..7c4fc83e373c --- /dev/null +++ b/TanuMusic/plugins/admins/auth.py @@ -0,0 +1,89 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.utils import extract_user, int_to_alpha +from TanuMusic.utils.database import ( + delete_authuser, + get_authuser, + get_authuser_names, + save_authuser, +) +from TanuMusic.utils.decorators import AdminActual, language +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS, adminlist + + +@app.on_message(filters.command("auth") & filters.group & ~BANNED_USERS) +@AdminActual +async def auth(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + token = await int_to_alpha(user.id) + _check = await get_authuser_names(message.chat.id) + count = len(_check) + if int(count) == 25: + return await message.reply_text(_["auth_1"]) + if token not in _check: + assis = { + "auth_user_id": user.id, + "auth_name": user.first_name, + "admin_id": message.from_user.id, + "admin_name": message.from_user.first_name, + } + get = adminlist.get(message.chat.id) + if get: + if user.id not in get: + get.append(user.id) + await save_authuser(message.chat.id, token, assis) + return await message.reply_text(_["auth_2"].format(user.mention)) + else: + return await message.reply_text(_["auth_3"].format(user.mention)) + + +@app.on_message(filters.command("unauth") & filters.group & ~BANNED_USERS) +@AdminActual +async def unauthusers(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + token = await int_to_alpha(user.id) + deleted = await delete_authuser(message.chat.id, token) + get = adminlist.get(message.chat.id) + if get: + if user.id in get: + get.remove(user.id) + if deleted: + return await message.reply_text(_["auth_4"].format(user.mention)) + else: + return await message.reply_text(_["auth_5"].format(user.mention)) + + +@app.on_message( + filters.command(["authlist", "authusers"]) & filters.group & ~BANNED_USERS +) +@language +async def authusers(client, message: Message, _): + _wtf = await get_authuser_names(message.chat.id) + if not _wtf: + return await message.reply_text(_["setting_4"]) + else: + j = 0 + mystic = await message.reply_text(_["auth_6"]) + text = _["auth_7"].format(message.chat.title) + for umm in _wtf: + _umm = await get_authuser(message.chat.id, umm) + user_id = _umm["auth_user_id"] + admin_id = _umm["admin_id"] + admin_name = _umm["admin_name"] + try: + user = (await app.get_users(user_id)).first_name + j += 1 + except: + continue + text += f"❖ {j} ➥ {user}[{user_id}]\n" + text += f"❖ {_['auth_8']} {admin_name}[{admin_id}]\n\n" + await mystic.edit_text(text, reply_markup=close_markup(_)) diff --git a/TanuMusic/plugins/admins/callback.py b/TanuMusic/plugins/admins/callback.py new file mode 100644 index 000000000000..6d98819df08b --- /dev/null +++ b/TanuMusic/plugins/admins/callback.py @@ -0,0 +1,396 @@ +import asyncio + +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from TanuMusic import YouTube, app +from TanuMusic.core.call import Tanu +from TanuMusic.misc import SUDOERS, db +from TanuMusic.utils.database import ( + get_active_chats, + get_lang, + get_upvote_count, + is_active_chat, + is_music_playing, + is_nonadmin_chat, + music_off, + music_on, + set_loop, +) +from TanuMusic.utils.decorators.language import languageCB +from TanuMusic.utils.formatters import seconds_to_min +from TanuMusic.utils.inline import close_markup, stream_markup, stream_markup_timer +from TanuMusic.utils.stream.autoclear import auto_clean +from TanuMusic.utils.thumbnails import get_thumb +from config import ( + BANNED_USERS, + SOUNCLOUD_IMG_URL, + STREAM_IMG_URL, + TELEGRAM_AUDIO_URL, + TELEGRAM_VIDEO_URL, + adminlist, + confirmer, + votemode, +) +from strings import get_string + +checker = {} +upvoters = {} + + +@app.on_callback_query(filters.regex("ADMIN") & ~BANNED_USERS) +@languageCB +async def del_back_playlist(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + command, chat = callback_request.split("|") + if "_" in str(chat): + bet = chat.split("_") + chat = bet[0] + counter = bet[1] + chat_id = int(chat) + if not await is_active_chat(chat_id): + return await CallbackQuery.answer(_["general_5"], show_alert=True) + mention = CallbackQuery.from_user.mention + if command == "UpVote": + if chat_id not in votemode: + votemode[chat_id] = {} + if chat_id not in upvoters: + upvoters[chat_id] = {} + + voters = (upvoters[chat_id]).get(CallbackQuery.message.id) + if not voters: + upvoters[chat_id][CallbackQuery.message.id] = [] + + vote = (votemode[chat_id]).get(CallbackQuery.message.id) + if not vote: + votemode[chat_id][CallbackQuery.message.id] = 0 + + if CallbackQuery.from_user.id in upvoters[chat_id][CallbackQuery.message.id]: + (upvoters[chat_id][CallbackQuery.message.id]).remove( + CallbackQuery.from_user.id + ) + votemode[chat_id][CallbackQuery.message.id] -= 1 + else: + (upvoters[chat_id][CallbackQuery.message.id]).append( + CallbackQuery.from_user.id + ) + votemode[chat_id][CallbackQuery.message.id] += 1 + upvote = await get_upvote_count(chat_id) + get_upvotes = int(votemode[chat_id][CallbackQuery.message.id]) + if get_upvotes >= upvote: + votemode[chat_id][CallbackQuery.message.id] = upvote + try: + exists = confirmer[chat_id][CallbackQuery.message.id] + current = db[chat_id][0] + except: + return await CallbackQuery.edit_message_text(f"ғᴀɪʟᴇᴅ.") + try: + if current["vidid"] != exists["vidid"]: + return await CallbackQuery.edit_message.text(_["admin_35"]) + if current["file"] != exists["file"]: + return await CallbackQuery.edit_message.text(_["admin_35"]) + except: + return await CallbackQuery.edit_message_text(_["admin_36"]) + try: + await CallbackQuery.edit_message_text(_["admin_37"].format(upvote)) + except: + pass + command = counter + mention = "ᴜᴘᴠᴏᴛᴇs" + else: + if ( + CallbackQuery.from_user.id + in upvoters[chat_id][CallbackQuery.message.id] + ): + await CallbackQuery.answer(_["admin_38"], show_alert=True) + else: + await CallbackQuery.answer(_["admin_39"], show_alert=True) + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=f"👍 {get_upvotes}", + callback_data=f"ADMIN UpVote|{chat_id}_{counter}", + ) + ] + ] + ) + await CallbackQuery.answer(_["admin_40"], show_alert=True) + return await CallbackQuery.edit_message_reply_markup(reply_markup=upl) + else: + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + if CallbackQuery.from_user.id not in SUDOERS: + admins = adminlist.get(CallbackQuery.message.chat.id) + if not admins: + return await CallbackQuery.answer(_["admin_13"], show_alert=True) + else: + if CallbackQuery.from_user.id not in admins: + return await CallbackQuery.answer( + _["admin_14"], show_alert=True + ) + if command == "Pause": + if not await is_music_playing(chat_id): + return await CallbackQuery.answer(_["admin_1"], show_alert=True) + await CallbackQuery.answer() + await music_off(chat_id) + await Tanu.pause_stream(chat_id) + await CallbackQuery.message.reply_text( + _["admin_2"].format(mention), reply_markup=close_markup(_) + ) + elif command == "Resume": + if await is_music_playing(chat_id): + return await CallbackQuery.answer(_["admin_3"], show_alert=True) + await CallbackQuery.answer() + await music_on(chat_id) + await Tanu.resume_stream(chat_id) + await CallbackQuery.message.reply_text( + _["admin_4"].format(mention), reply_markup=close_markup(_) + ) + elif command == "Stop" or command == "End": + await CallbackQuery.answer() + await Tanu.stop_stream(chat_id) + await set_loop(chat_id, 0) + await CallbackQuery.message.reply_text( + _["admin_5"].format(mention), reply_markup=close_markup(_) + ) + await CallbackQuery.message.delete() + elif command == "Skip" or command == "Replay": + check = db.get(chat_id) + if command == "Skip": + txt = f"❖ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ\n│ \n└ʙʏ ➥ {mention}" + popped = None + try: + popped = check.pop(0) + if popped: + await auto_clean(popped) + if not check: + await CallbackQuery.edit_message_text( + f"❖ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ\n│ \n└ʙʏ ➥ {mention}" + ) + await CallbackQuery.message.reply_text( + text=_["admin_6"].format( + mention, CallbackQuery.message.chat.title + ), + reply_markup=close_markup(_), + ) + try: + return await Tanu.stop_stream(chat_id) + except: + return + except: + try: + await CallbackQuery.edit_message_text( + f"❖ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ\n│ \n└ʙʏ ➥ {mention}" + ) + await CallbackQuery.message.reply_text( + text=_["admin_6"].format( + mention, CallbackQuery.message.chat.title + ), + reply_markup=close_markup(_), + ) + return await Tanu.stop_stream(chat_id) + except: + return + else: + txt = f"❖ sᴛʀᴇᴀᴍ ʀᴇ-ᴘʟᴀʏᴇᴅ\n│ \n└ʙʏ ➥ {mention}" + await CallbackQuery.answer() + queued = check[0]["file"] + title = (check[0]["title"]).title() + user = check[0]["by"] + duration = check[0]["dur"] + streamtype = check[0]["streamtype"] + videoid = check[0]["vidid"] + status = True if str(streamtype) == "video" else None + db[chat_id][0]["played"] = 0 + exis = (check[0]).get("old_dur") + if exis: + db[chat_id][0]["dur"] = exis + db[chat_id][0]["seconds"] = check[0]["old_second"] + db[chat_id][0]["speed_path"] = None + db[chat_id][0]["speed"] = 1.0 + if "live_" in queued: + n, link = await YouTube.video(videoid, True) + if n == 0: + return await CallbackQuery.message.reply_text( + text=_["admin_7"].format(title), + reply_markup=close_markup(_), + ) + try: + image = await YouTube.thumbnail(videoid, True) + except: + image = None + try: + await Tanu.skip_stream(chat_id, link, video=status, image=image) + except: + return await CallbackQuery.message.reply_text(_["call_6"]) + button = stream_markup(_, chat_id) + img = await get_thumb(videoid) + run = await CallbackQuery.message.reply_photo( + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + duration, + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + await CallbackQuery.edit_message_text(txt, reply_markup=close_markup(_)) + elif "vid_" in queued: + mystic = await CallbackQuery.message.reply_text( + _["call_7"], disable_web_page_preview=True + ) + try: + file_path, direct = await YouTube.download( + videoid, + mystic, + videoid=True, + video=status, + ) + except: + return await mystic.edit_text(_["call_6"]) + try: + image = await YouTube.thumbnail(videoid, True) + except: + image = None + try: + await Tanu.skip_stream(chat_id, file_path, video=status, image=image) + except: + return await mystic.edit_text(_["call_6"]) + button = stream_markup(_, chat_id) + img = await get_thumb(videoid) + run = await CallbackQuery.message.reply_photo( + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + duration, + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" + await CallbackQuery.edit_message_text(txt, reply_markup=close_markup(_)) + await mystic.delete() + elif "index_" in queued: + try: + await Tanu.skip_stream(chat_id, videoid, video=status) + except: + return await CallbackQuery.message.reply_text(_["call_6"]) + button = stream_markup(_, chat_id) + run = await CallbackQuery.message.reply_photo( + photo=STREAM_IMG_URL, + caption=_["stream_2"].format(user), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + await CallbackQuery.edit_message_text(txt, reply_markup=close_markup(_)) + else: + if videoid == "telegram": + image = None + elif videoid == "soundcloud": + image = None + else: + try: + image = await YouTube.thumbnail(videoid, True) + except: + image = None + try: + await Tanu.skip_stream(chat_id, queued, video=status, image=image) + except: + return await CallbackQuery.message.reply_text(_["call_6"]) + if videoid == "telegram": + button = stream_markup(_, chat_id) + run = await CallbackQuery.message.reply_photo( + photo=TELEGRAM_AUDIO_URL + if str(streamtype) == "audio" + else TELEGRAM_VIDEO_URL, + caption=_["stream_1"].format( + config.SUPPORT_CHAT, title[:23], duration, user + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif videoid == "soundcloud": + button = stream_markup(_, chat_id) + run = await CallbackQuery.message.reply_photo( + photo=SOUNCLOUD_IMG_URL + if str(streamtype) == "audio" + else TELEGRAM_VIDEO_URL, + caption=_["stream_1"].format( + config.SUPPORT_CHAT, title[:23], duration, user + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + else: + button = stream_markup(_, chat_id) + img = await get_thumb(videoid) + run = await CallbackQuery.message.reply_photo( + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + duration, + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" + await CallbackQuery.edit_message_text(txt, reply_markup=close_markup(_)) + + +async def markup_timer(): + while not await asyncio.sleep(7): + active_chats = await get_active_chats() + for chat_id in active_chats: + try: + if not await is_music_playing(chat_id): + continue + playing = db.get(chat_id) + if not playing: + continue + duration_seconds = int(playing[0]["seconds"]) + if duration_seconds == 0: + continue + try: + mystic = playing[0]["mystic"] + except: + continue + try: + check = checker[chat_id][mystic.id] + if check is False: + continue + except: + pass + try: + language = await get_lang(chat_id) + _ = get_string(language) + except: + _ = get_string("en") + try: + buttons = stream_markup_timer( + _, + chat_id, + seconds_to_min(playing[0]["played"]), + playing[0]["dur"], + ) + await mystic.edit_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except: + continue + except: + continue + + +asyncio.create_task(markup_timer()) diff --git a/TanuMusic/plugins/admins/loop.py b/TanuMusic/plugins/admins/loop.py new file mode 100644 index 000000000000..fb7b23820412 --- /dev/null +++ b/TanuMusic/plugins/admins/loop.py @@ -0,0 +1,46 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.utils.database import get_loop, set_loop +from TanuMusic.utils.decorators import AdminRightsCheck +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS + + +@app.on_message(filters.command(["loop", "cloop"]) & filters.group & ~BANNED_USERS) +@AdminRightsCheck +async def admins(cli, message: Message, _, chat_id): + usage = _["admin_17"] + if len(message.command) != 2: + return await message.reply_text(usage) + state = message.text.split(None, 1)[1].strip() + if state.isnumeric(): + state = int(state) + if 1 <= state <= 10: + got = await get_loop(chat_id) + if got != 0: + state = got + state + if int(state) > 10: + state = 10 + await set_loop(chat_id, state) + return await message.reply_text( + text=_["admin_18"].format(state, message.from_user.mention), + reply_markup=close_markup(_), + ) + else: + return await message.reply_text(_["admin_17"]) + elif state.lower() == "enable": + await set_loop(chat_id, 10) + return await message.reply_text( + text=_["admin_18"].format(state, message.from_user.mention), + reply_markup=close_markup(_), + ) + elif state.lower() == "disable": + await set_loop(chat_id, 0) + return await message.reply_text( + _["admin_19"].format(message.from_user.mention), + reply_markup=close_markup(_), + ) + else: + return await message.reply_text(usage) diff --git a/TanuMusic/plugins/admins/pause.py b/TanuMusic/plugins/admins/pause.py new file mode 100644 index 000000000000..09425d14a6c3 --- /dev/null +++ b/TanuMusic/plugins/admins/pause.py @@ -0,0 +1,21 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.core.call import Tanu +from TanuMusic.utils.database import is_music_playing, music_off +from TanuMusic.utils.decorators import AdminRightsCheck +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS + + +@app.on_message(filters.command(["pause", "cpause"]) & filters.group & ~BANNED_USERS) +@AdminRightsCheck +async def pause_admin(cli, message: Message, _, chat_id): + if not await is_music_playing(chat_id): + return await message.reply_text(_["admin_1"]) + await music_off(chat_id) + await Tanu.pause_stream(chat_id) + await message.reply_text( + _["admin_2"].format(message.from_user.mention), reply_markup=close_markup(_) + ) diff --git a/TanuMusic/plugins/admins/resume.py b/TanuMusic/plugins/admins/resume.py new file mode 100644 index 000000000000..10321e1fc215 --- /dev/null +++ b/TanuMusic/plugins/admins/resume.py @@ -0,0 +1,21 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.core.call import Tanu +from TanuMusic.utils.database import is_music_playing, music_on +from TanuMusic.utils.decorators import AdminRightsCheck +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS + + +@app.on_message(filters.command(["resume", "cresume"]) & filters.group & ~BANNED_USERS) +@AdminRightsCheck +async def resume_com(cli, message: Message, _, chat_id): + if await is_music_playing(chat_id): + return await message.reply_text(_["admin_3"]) + await music_on(chat_id) + await Tanu.resume_stream(chat_id) + await message.reply_text( + _["admin_4"].format(message.from_user.mention), reply_markup=close_markup(_) + ) diff --git a/TanuMusic/plugins/admins/seek.py b/TanuMusic/plugins/admins/seek.py new file mode 100644 index 000000000000..7a7eefd30a21 --- /dev/null +++ b/TanuMusic/plugins/admins/seek.py @@ -0,0 +1,75 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import YouTube, app +from TanuMusic.core.call import Tanu +from TanuMusic.misc import db +from TanuMusic.utils import AdminRightsCheck, seconds_to_min +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS + + +@app.on_message( + filters.command(["seek", "cseek", "seekback", "cseekback"]) + & filters.group + & ~BANNED_USERS +) +@AdminRightsCheck +async def seek_comm(cli, message: Message, _, chat_id): + if len(message.command) == 1: + return await message.reply_text(_["admin_20"]) + query = message.text.split(None, 1)[1].strip() + if not query.isnumeric(): + return await message.reply_text(_["admin_21"]) + playing = db.get(chat_id) + if not playing: + return await message.reply_text(_["queue_2"]) + duration_seconds = int(playing[0]["seconds"]) + if duration_seconds == 0: + return await message.reply_text(_["admin_22"]) + file_path = playing[0]["file"] + duration_played = int(playing[0]["played"]) + duration_to_skip = int(query) + duration = playing[0]["dur"] + if message.command[0][-2] == "c": + if (duration_played - duration_to_skip) <= 10: + return await message.reply_text( + text=_["admin_23"].format(seconds_to_min(duration_played), duration), + reply_markup=close_markup(_), + ) + to_seek = duration_played - duration_to_skip + 1 + else: + if (duration_seconds - (duration_played + duration_to_skip)) <= 10: + return await message.reply_text( + text=_["admin_23"].format(seconds_to_min(duration_played), duration), + reply_markup=close_markup(_), + ) + to_seek = duration_played + duration_to_skip + 1 + mystic = await message.reply_text(_["admin_24"]) + if "vid_" in file_path: + n, file_path = await YouTube.video(playing[0]["vidid"], True) + if n == 0: + return await message.reply_text(_["admin_22"]) + check = (playing[0]).get("speed_path") + if check: + file_path = check + if "index_" in file_path: + file_path = playing[0]["vidid"] + try: + await Tanu.seek_stream( + chat_id, + file_path, + seconds_to_min(to_seek), + duration, + playing[0]["streamtype"], + ) + except: + return await mystic.edit_text(_["admin_26"], reply_markup=close_markup(_)) + if message.command[0][-2] == "c": + db[chat_id][0]["played"] -= duration_to_skip + else: + db[chat_id][0]["played"] += duration_to_skip + await mystic.edit_text( + text=_["admin_25"].format(seconds_to_min(to_seek), message.from_user.mention), + reply_markup=close_markup(_), + ) diff --git a/TanuMusic/plugins/admins/shuffle.py b/TanuMusic/plugins/admins/shuffle.py new file mode 100644 index 000000000000..5fd069543d1c --- /dev/null +++ b/TanuMusic/plugins/admins/shuffle.py @@ -0,0 +1,33 @@ +import random + +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import db +from TanuMusic.utils.decorators import AdminRightsCheck +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS + + +@app.on_message( + filters.command(["shuffle", "cshuffle"]) & filters.group & ~BANNED_USERS +) +@AdminRightsCheck +async def admins(Client, message: Message, _, chat_id): + check = db.get(chat_id) + if not check: + return await message.reply_text(_["queue_2"]) + try: + popped = check.pop(0) + except: + return await message.reply_text(_["admin_15"], reply_markup=close_markup(_)) + check = db.get(chat_id) + if not check: + check.insert(0, popped) + return await message.reply_text(_["admin_15"], reply_markup=close_markup(_)) + random.shuffle(check) + check.insert(0, popped) + await message.reply_text( + _["admin_16"].format(message.from_user.mention), reply_markup=close_markup(_) + ) diff --git a/TanuMusic/plugins/admins/skip.py b/TanuMusic/plugins/admins/skip.py new file mode 100644 index 000000000000..5f51c182073e --- /dev/null +++ b/TanuMusic/plugins/admins/skip.py @@ -0,0 +1,232 @@ +from pyrogram import filters +from pyrogram.types import InlineKeyboardMarkup, Message + +import config +from TanuMusic import YouTube, app +from TanuMusic.core.call import Tanu +from TanuMusic.misc import db +from TanuMusic.utils.database import get_loop +from TanuMusic.utils.decorators import AdminRightsCheck +from TanuMusic.utils.inline import close_markup, stream_markup +from TanuMusic.utils.stream.autoclear import auto_clean +from TanuMusic.utils.thumbnails import get_thumb +from config import BANNED_USERS + + +@app.on_message( + filters.command(["skip", "cskip", "next", "cnext"]) & filters.group & ~BANNED_USERS +) +@AdminRightsCheck +async def skip(cli, message: Message, _, chat_id): + if not len(message.command) < 2: + loop = await get_loop(chat_id) + if loop != 0: + return await message.reply_text(_["admin_8"]) + state = message.text.split(None, 1)[1].strip() + if state.isnumeric(): + state = int(state) + check = db.get(chat_id) + if check: + count = len(check) + if count > 2: + count = int(count - 1) + if 1 <= state <= count: + for x in range(state): + popped = None + try: + popped = check.pop(0) + except: + return await message.reply_text(_["admin_12"]) + if popped: + await auto_clean(popped) + if not check: + try: + await message.reply_text( + text=_["admin_6"].format( + message.from_user.mention, + message.chat.title, + ), + reply_markup=close_markup(_), + ) + await Tanu.stop_stream(chat_id) + except: + return + break + else: + return await message.reply_text(_["admin_11"].format(count)) + else: + return await message.reply_text(_["admin_10"]) + else: + return await message.reply_text(_["queue_2"]) + else: + return await message.reply_text(_["admin_9"]) + else: + check = db.get(chat_id) + popped = None + try: + popped = check.pop(0) + if popped: + await auto_clean(popped) + if not check: + await message.reply_text( + text=_["admin_6"].format( + message.from_user.mention, message.chat.title + ), + reply_markup=close_markup(_), + ) + try: + return await Tanu.stop_stream(chat_id) + except: + return + except: + try: + await message.reply_text( + text=_["admin_6"].format( + message.from_user.mention, message.chat.title + ), + reply_markup=close_markup(_), + ) + return await Tanu.stop_stream(chat_id) + except: + return + queued = check[0]["file"] + title = (check[0]["title"]).title() + user = check[0]["by"] + streamtype = check[0]["streamtype"] + videoid = check[0]["vidid"] + status = True if str(streamtype) == "video" else None + db[chat_id][0]["played"] = 0 + exis = (check[0]).get("old_dur") + if exis: + db[chat_id][0]["dur"] = exis + db[chat_id][0]["seconds"] = check[0]["old_second"] + db[chat_id][0]["speed_path"] = None + db[chat_id][0]["speed"] = 1.0 + if "live_" in queued: + n, link = await YouTube.video(videoid, True) + if n == 0: + return await message.reply_text(_["admin_7"].format(title)) + try: + image = await YouTube.thumbnail(videoid, True) + except: + image = None + try: + await Tanu.skip_stream(chat_id, link, video=status, image=image) + except: + return await message.reply_text(_["call_6"]) + button = stream_markup(_, chat_id) + img = await get_thumb(videoid) + run = await message.reply_photo( + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + check[0]["dur"], + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif "vid_" in queued: + mystic = await message.reply_text(_["call_7"], disable_web_page_preview=True) + try: + file_path, direct = await YouTube.download( + videoid, + mystic, + videoid=True, + video=status, + ) + except: + return await mystic.edit_text(_["call_6"]) + try: + image = await YouTube.thumbnail(videoid, True) + except: + image = None + try: + await Tanu.skip_stream(chat_id, file_path, video=status, image=image) + except: + return await mystic.edit_text(_["call_6"]) + button = stream_markup(_, chat_id) + img = await get_thumb(videoid) + run = await message.reply_photo( + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + check[0]["dur"], + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" + await mystic.delete() + elif "index_" in queued: + try: + await Tanu.skip_stream(chat_id, videoid, video=status) + except: + return await message.reply_text(_["call_6"]) + button = stream_markup(_, chat_id) + run = await message.reply_photo( + photo=config.STREAM_IMG_URL, + caption=_["stream_2"].format(user), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + else: + if videoid == "telegram": + image = None + elif videoid == "soundcloud": + image = None + else: + try: + image = await YouTube.thumbnail(videoid, True) + except: + image = None + try: + await Tanu.skip_stream(chat_id, queued, video=status, image=image) + except: + return await message.reply_text(_["call_6"]) + if videoid == "telegram": + button = stream_markup(_, chat_id) + run = await message.reply_photo( + photo=config.TELEGRAM_AUDIO_URL + if str(streamtype) == "audio" + else config.TELEGRAM_VIDEO_URL, + caption=_["stream_1"].format( + config.SUPPORT_CHAT, title[:23], check[0]["dur"], user + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + elif videoid == "soundcloud": + button = stream_markup(_, chat_id) + run = await message.reply_photo( + photo=config.SOUNCLOUD_IMG_URL + if str(streamtype) == "audio" + else config.TELEGRAM_VIDEO_URL, + caption=_["stream_1"].format( + config.SUPPORT_CHAT, title[:23], check[0]["dur"], user + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "tg" + else: + button = stream_markup(_, chat_id) + img = await get_thumb(videoid) + run = await message.reply_photo( + photo=img, + caption=_["stream_1"].format( + f"https://t.me/{app.username}?start=info_{videoid}", + title[:23], + check[0]["dur"], + user, + ), + reply_markup=InlineKeyboardMarkup(button), + ) + db[chat_id][0]["mystic"] = run + db[chat_id][0]["markup"] = "stream" diff --git a/TanuMusic/plugins/admins/speed.py b/TanuMusic/plugins/admins/speed.py new file mode 100644 index 000000000000..c13387ed8ee0 --- /dev/null +++ b/TanuMusic/plugins/admins/speed.py @@ -0,0 +1,112 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.core.call import Tanu +from TanuMusic.misc import SUDOERS, db +from TanuMusic.utils import AdminRightsCheck +from TanuMusic.utils.database import is_active_chat, is_nonadmin_chat +from TanuMusic.utils.decorators.language import languageCB +from TanuMusic.utils.inline import close_markup, speed_markup +from config import BANNED_USERS, adminlist + +checker = [] + + +@app.on_message( + filters.command(["cspeed", "speed", "cslow", "slow", "playback", "cplayback"]) + & filters.group + & ~BANNED_USERS +) +@AdminRightsCheck +async def playback(cli, message: Message, _, chat_id): + playing = db.get(chat_id) + if not playing: + return await message.reply_text(_["queue_2"]) + duration_seconds = int(playing[0]["seconds"]) + if duration_seconds == 0: + return await message.reply_text(_["admin_27"]) + file_path = playing[0]["file"] + if "downloads" not in file_path: + return await message.reply_text(_["admin_27"]) + upl = speed_markup(_, chat_id) + return await message.reply_text( + text=_["admin_28"].format(app.mention), + reply_markup=upl, + ) + + +@app.on_callback_query(filters.regex("SpeedUP") & ~BANNED_USERS) +@languageCB +async def del_back_playlist(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + chat, speed = callback_request.split("|") + chat_id = int(chat) + if not await is_active_chat(chat_id): + return await CallbackQuery.answer(_["general_5"], show_alert=True) + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + if CallbackQuery.from_user.id not in SUDOERS: + admins = adminlist.get(CallbackQuery.message.chat.id) + if not admins: + return await CallbackQuery.answer(_["admin_13"], show_alert=True) + else: + if CallbackQuery.from_user.id not in admins: + return await CallbackQuery.answer(_["admin_14"], show_alert=True) + playing = db.get(chat_id) + if not playing: + return await CallbackQuery.answer(_["queue_2"], show_alert=True) + duration_seconds = int(playing[0]["seconds"]) + if duration_seconds == 0: + return await CallbackQuery.answer(_["admin_27"], show_alert=True) + file_path = playing[0]["file"] + if "downloads" not in file_path: + return await CallbackQuery.answer(_["admin_27"], show_alert=True) + checkspeed = (playing[0]).get("speed") + if checkspeed: + if str(checkspeed) == str(speed): + if str(speed) == str("1.0"): + return await CallbackQuery.answer( + _["admin_29"], + show_alert=True, + ) + else: + if str(speed) == str("1.0"): + return await CallbackQuery.answer( + _["admin_29"], + show_alert=True, + ) + if chat_id in checker: + return await CallbackQuery.answer( + _["admin_30"], + show_alert=True, + ) + else: + checker.append(chat_id) + try: + await CallbackQuery.answer( + _["admin_31"], + ) + except: + pass + mystic = await CallbackQuery.edit_message_text( + text=_["admin_32"].format(CallbackQuery.from_user.mention), + ) + try: + await Tanu.speedup_stream( + chat_id, + file_path, + speed, + playing, + ) + except: + if chat_id in checker: + checker.remove(chat_id) + return await mystic.edit_text(_["admin_33"], reply_markup=close_markup(_)) + if chat_id in checker: + checker.remove(chat_id) + await mystic.edit_text( + text=_["admin_34"].format(speed, CallbackQuery.from_user.mention), + reply_markup=close_markup(_), + ) diff --git a/TanuMusic/plugins/admins/stop.py b/TanuMusic/plugins/admins/stop.py new file mode 100644 index 000000000000..07fa5ae87813 --- /dev/null +++ b/TanuMusic/plugins/admins/stop.py @@ -0,0 +1,23 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.core.call import Tanu +from TanuMusic.utils.database import set_loop +from TanuMusic.utils.decorators import AdminRightsCheck +from TanuMusic.utils.inline import close_markup +from config import BANNED_USERS + + +@app.on_message( + filters.command(["end", "stop", "cend", "cstop"]) & filters.group & ~BANNED_USERS +) +@AdminRightsCheck +async def stop_music(cli, message: Message, _, chat_id): + if not len(message.command) == 1: + return + await Tanu.stop_stream(chat_id) + await set_loop(chat_id, 0) + await message.reply_text( + _["admin_5"].format(message.from_user.mention), reply_markup=close_markup(_) + ) diff --git a/TanuMusic/plugins/bot/help.py b/TanuMusic/plugins/bot/help.py new file mode 100644 index 000000000000..187cd3478049 --- /dev/null +++ b/TanuMusic/plugins/bot/help.py @@ -0,0 +1,106 @@ +from typing import Union +import random +from pyrogram import filters, types +from pyrogram.types import InlineKeyboardMarkup, Message + +from TanuMusic import app +from TanuMusic.utils import help_pannel +from TanuMusic.utils.database import get_lang +from TanuMusic.utils.decorators.language import LanguageStart, languageCB +from TanuMusic.utils.inline.help import help_back_markup, private_help_panel +from config import BANNED_USERS, START_IMG_URL, SUPPORT_CHAT +from strings import get_string, helpers + +AVISHA = [ +"https://graph.org/file/eaa3a2602e43844a488a5.jpg", +"https://graph.org/file/b129e98b6e5c4db81c15f.jpg", +"https://graph.org/file/3ccb86d7d62e8ee0a2e8b.jpg", +"https://graph.org/file/df11d8257613418142063.jpg", +"https://graph.org/file/9e23720fedc47259b6195.jpg", +"https://graph.org/file/826485f2d7db6f09db8ed.jpg", +"https://graph.org/file/ff3ad786da825b5205691.jpg", +"https://graph.org/file/52713c9fe9253ae668f13.jpg", +"https://graph.org/file/8f8516c86677a8c91bfb1.jpg", +"https://graph.org/file/6603c3740378d3f7187da.jpg", +"https://graph.org/file/66cb6ec40eea5c4670118.jpg", +"https://graph.org/file/2e3cf4327b169b981055e.jpg", + +] + + +@app.on_message(filters.command(["help"]) & filters.private & ~BANNED_USERS) +@app.on_callback_query(filters.regex("settings_back_helper") & ~BANNED_USERS) +async def helper_private( + client: app, update: Union[types.Message, types.CallbackQuery] +): + is_callback = isinstance(update, types.CallbackQuery) + if is_callback: + try: + await update.answer() + except: + pass + chat_id = update.message.chat.id + language = await get_lang(chat_id) + _ = get_string(language) + keyboard = help_pannel(_, True) + await update.edit_message_text( + _["help_1"].format(SUPPORT_CHAT), reply_markup=keyboard + ) + else: + try: + await update.delete() + except: + pass + language = await get_lang(update.chat.id) + _ = get_string(language) + keyboard = help_pannel(_) + await update.reply_photo( + random.choice(AVISHA), + caption=_["help_1"].format(SUPPORT_CHAT), + reply_markup=keyboard, + ) + + +@app.on_message(filters.command(["help"]) & filters.group & ~BANNED_USERS) +@LanguageStart +async def help_com_group(client, message: Message, _): + keyboard = private_help_panel(_) + await message.reply_text(_["help_2"], reply_markup=InlineKeyboardMarkup(keyboard)) + + +@app.on_callback_query(filters.regex("help_callback") & ~BANNED_USERS) +@languageCB +async def helper_cb(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + cb = callback_data.split(None, 1)[1] + keyboard = help_back_markup(_) + if cb == "hb1": + await CallbackQuery.edit_message_text(helpers.HELP_1, reply_markup=keyboard) + elif cb == "hb2": + await CallbackQuery.edit_message_text(helpers.HELP_2, reply_markup=keyboard) + elif cb == "hb3": + await CallbackQuery.edit_message_text(helpers.HELP_3, reply_markup=keyboard) + elif cb == "hb4": + await CallbackQuery.edit_message_text(helpers.HELP_4, reply_markup=keyboard) + elif cb == "hb5": + await CallbackQuery.edit_message_text(helpers.HELP_5, reply_markup=keyboard) + elif cb == "hb6": + await CallbackQuery.edit_message_text(helpers.HELP_6, reply_markup=keyboard) + elif cb == "hb7": + await CallbackQuery.edit_message_text(helpers.HELP_7, reply_markup=keyboard) + elif cb == "hb8": + await CallbackQuery.edit_message_text(helpers.HELP_8, reply_markup=keyboard) + elif cb == "hb9": + await CallbackQuery.edit_message_text(helpers.HELP_9, reply_markup=keyboard) + elif cb == "hb10": + await CallbackQuery.edit_message_text(helpers.HELP_10, reply_markup=keyboard) + elif cb == "hb11": + await CallbackQuery.edit_message_text(helpers.HELP_11, reply_markup=keyboard) + elif cb == "hb12": + await CallbackQuery.edit_message_text(helpers.HELP_12, reply_markup=keyboard) + elif cb == "hb13": + await CallbackQuery.edit_message_text(helpers.HELP_13, reply_markup=keyboard) + elif cb == "hb14": + await CallbackQuery.edit_message_text(helpers.HELP_14, reply_markup=keyboard) + elif cb == "hb15": + await CallbackQuery.edit_message_text(helpers.HELP_15, reply_markup=keyboard) diff --git a/TanuMusic/plugins/bot/inline.py b/TanuMusic/plugins/bot/inline.py new file mode 100644 index 000000000000..0a73a1d3ebd4 --- /dev/null +++ b/TanuMusic/plugins/bot/inline.py @@ -0,0 +1,68 @@ +from pyrogram.types import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + InlineQueryResultPhoto, +) +from youtubesearchpython.__future__ import VideosSearch + +from config import BANNED_USERS +from TanuMusic import app +from TanuMusic.utils.inlinequery import answer + + +@app.on_inline_query(~BANNED_USERS) +async def inline_query_handler(client, query): + text = query.query.strip().lower() + answers = [] + if text.strip() == "": + try: + await client.answer_inline_query(query.id, results=answer, cache_time=10) + except: + return + else: + a = VideosSearch(text, limit=20) + result = (await a.next()).get("result") + for x in range(15): + title = (result[x]["title"]).title() + duration = result[x]["duration"] + views = result[x]["viewCount"]["short"] + thumbnail = result[x]["thumbnails"][0]["url"].split("?")[0] + channellink = result[x]["channel"]["link"] + channel = result[x]["channel"]["name"] + link = result[x]["link"] + published = result[x]["publishedTime"] + description = f"{views} | {duration} Mins | {channel} | {published}" + buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🎥 ᴡᴀᴛᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ", + url=link, + ) + ], + ] + ) + searched_text = f""" +❄ ᴛɪᴛʟᴇ : {title} + +⏳ ᴅᴜʀᴀᴛɪᴏɴ : {duration} ᴍɪɴᴜᴛᴇs +👀 ᴠɪᴇᴡs : {views} +🎥 ᴄʜᴀɴɴᴇʟ : {channel} +⏰ ᴘᴜʙʟɪsʜᴇᴅ ᴏɴ : {published} + +ʀᴇᴘʟʏ ᴡɪᴛʜ /play ᴏɴ ᴛʜɪs sᴇᴀʀᴄʜᴇᴅ ᴍᴇssᴀɢᴇ ᴛᴏ sᴛʀᴇᴀᴍ ɪᴛ ᴏɴ ᴠᴏɪᴄᴇᴄʜᴀᴛ. +➻ ɪɴʟɪɴᴇ sᴇᴀʀᴄʜ ᴍᴏᴅᴇ ʙʏ {app.name}""" + answers.append( + InlineQueryResultPhoto( + photo_url=thumbnail, + title=title, + thumb_url=thumbnail, + description=description, + caption=searched_text, + reply_markup=buttons, + ) + ) + try: + return await client.answer_inline_query(query.id, results=answers) + except: + return \ No newline at end of file diff --git a/TanuMusic/plugins/bot/mustjoin.py b/TanuMusic/plugins/bot/mustjoin.py new file mode 100644 index 000000000000..f989bcbf78b8 --- /dev/null +++ b/TanuMusic/plugins/bot/mustjoin.py @@ -0,0 +1,60 @@ +import random +from pyrogram import Client, filters +from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, Message +from pyrogram.errors import ChatAdminRequired, UserNotParticipant, ChatWriteForbidden +from TanuMusic import app + +IMAGE = [ + "https://graph.org/file/f86b71018196c5cfe7344.jpg", + "https://graph.org/file/a3db9af88f25bb1b99325.jpg", + "https://graph.org/file/5b344a55f3d5199b63fa5.jpg", + "https://graph.org/file/84de4b440300297a8ecb3.jpg", + "https://graph.org/file/84e84ff778b045879d24f.jpg", + "https://graph.org/file/a4a8f0e5c0e6b18249ffc.jpg", + "https://graph.org/file/ed92cada78099c9c3a4f7.jpg", + "https://graph.org/file/d6360613d0fa7a9d2f90b.jpg" + "https://graph.org/file/37248e7bdff70c662a702.jpg", + "https://graph.org/file/0bfe29d15e918917d1305.jpg", + "https://graph.org/file/16b1a2828cc507f8048bd.jpg", + "https://graph.org/file/e6b01f23f2871e128dad8.jpg", + "https://graph.org/file/cacbdddee77784d9ed2b7.jpg", + "https://graph.org/file/ddc5d6ec1c33276507b19.jpg", + "https://graph.org/file/39d7277189360d2c85b62.jpg", + "https://graph.org/file/5846b9214eaf12c3ed100.jpg", + "https://graph.org/file/ad4f9beb4d526e6615e18.jpg", + "https://graph.org/file/3514efaabe774e4f181f2.jpg", +] + +#-------------------------- + +MUST_JOIN = "C0DE_SEARCH" +#------------------------ +@app.on_message(filters.incoming & filters.private, group=-1) +async def must_join_channel(app: Client, msg: Message): + if not MUST_JOIN: + return + try: + try: + await app.get_chat_member(MUST_JOIN, msg.from_user.id) + except UserNotParticipant: + if MUST_JOIN.isalpha(): + link = "https://t.me/" + MUST_JOIN + else: + chat_info = await app.get_chat(MUST_JOIN) + link = chat_info.invite_link + try: + await msg.reply_photo(random.choice(IMAGE), caption=f"❖ ʜᴇʏ ᴛʜᴇʀᴇ, ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ᴜʜʜ !\n\n● ɪғ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴜsᴇ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙, ᴛʜᴇɴ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴇʟᴏᴡ ʙᴜᴛᴛᴏɴ ᴀɴᴅ ʏᴏᴜ ᴊᴏɪɴᴇᴅ, ᴛʜᴇɴ ʏᴏᴜ ᴄᴀɴ ᴜsᴇ ᴀʟʟ ᴍʏ ᴄᴏᴍᴍᴀɴᴅs ", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton("sᴜᴘᴘᴏʀᴛ", url="https://t.me/AsuraaSupports"), + InlineKeyboardButton("ᴜᴘᴅᴀᴛᴇ", url=link), + ] + ] + ) + ) + await msg.stop_propagation() + except ChatWriteForbidden: + pass + except ChatAdminRequired: + print(f"๏ ᴘʀᴏᴍᴏᴛᴇ ᴍᴇ ᴀs ᴀɴ ᴀᴅᴍɪɴ ɪɴ ᴛʜᴇ ᴍᴜsᴛ_ᴊᴏɪɴ ᴄʜᴀᴛ ➥ {MUST_JOIN}") diff --git a/TanuMusic/plugins/bot/repo.py# b/TanuMusic/plugins/bot/repo.py# new file mode 100644 index 000000000000..69c8ad5a08fa --- /dev/null +++ b/TanuMusic/plugins/bot/repo.py# @@ -0,0 +1,28 @@ +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup +from TanuMusic import app +from config import BOT_USERNAME + +start_txt = """ +❖ ʜᴇʏ , ᴛʜᴇʀᴇ ɴɪᴄᴇ ᴛᴏ ᴍᴇᴇᴛ ʏᴏᴜ ♥︎\n\n● ɪғ ʏᴏᴜ ᴡᴀɴᴛ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙゙, ʙᴏᴛ ʀᴇᴘᴏ ᴛʜᴇɴ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ sᴏᴜʀᴄᴇ ᴄᴏᴅᴇ ʙᴜᴛᴛᴏɴ ᴛᴏ ᴄᴏʟʟᴇᴄᴛ ᴍʏ sᴏᴜʀᴄᴇ ᴄᴏᴅᴇ.\n\n❖ ᴘᴏᴡᴇʀᴇᴅ ʙʏ ➥ ˹ ᴛᴀɴᴜ ꭙ ᴍᴜsɪᴄ™ ♡゙""" + + + + +@app.on_message(filters.command("repo")) +async def start(_, msg): + buttons = [ + [ + InlineKeyboardButton("sᴜᴘᴘᴏʀᴛ", url="https://t.me/AsuraaSupports"), + InlineKeyboardButton("ʀᴇᴘᴏ", url="https://github.com/itzAsuraa/TanuMusic") + ], + ] + + reply_markup = InlineKeyboardMarkup(buttons) + + await msg.reply_photo( + photo="https://envs.sh/SSL.jpg", + caption=start_txt, + reply_markup=reply_markup + ) + diff --git a/TanuMusic/plugins/bot/settings.py b/TanuMusic/plugins/bot/settings.py new file mode 100644 index 000000000000..05cc6ece347a --- /dev/null +++ b/TanuMusic/plugins/bot/settings.py @@ -0,0 +1,391 @@ +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.errors import MessageNotModified +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from TanuMusic import app +from TanuMusic.utils.database import ( + add_nonadmin_chat, + get_authuser, + get_authuser_names, + get_playmode, + get_playtype, + get_upvote_count, + is_nonadmin_chat, + is_skipmode, + remove_nonadmin_chat, + set_playmode, + set_playtype, + set_upvotes, + skip_off, + skip_on, +) +from TanuMusic.utils.decorators.admins import ActualAdminCB +from TanuMusic.utils.decorators.language import language, languageCB +from TanuMusic.utils.inline.settings import ( + auth_users_markup, + playmode_users_markup, + setting_markup, + vote_mode_markup, +) +from TanuMusic.utils.inline.start import private_panel +from config import BANNED_USERS, OWNER_ID + + +@app.on_message( + filters.command(["settings"]) & filters.group & ~BANNED_USERS +) +@language +async def settings_mar(client, message: Message, _): + buttons = setting_markup(_) + await message.reply_text( + _["setting_1"].format(app.mention, message.chat.id, message.chat.title), + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +@app.on_callback_query(filters.regex("settings_helper") & ~BANNED_USERS) +@languageCB +async def settings_cb(client, CallbackQuery, _): + try: + await CallbackQuery.answer(_["set_cb_5"]) + except: + pass + buttons = setting_markup(_) + return await CallbackQuery.edit_message_text( + _["setting_1"].format( + app.mention, + CallbackQuery.message.chat.id, + CallbackQuery.message.chat.title, + ), + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +@app.on_callback_query(filters.regex("settingsback_helper") & ~BANNED_USERS) +@languageCB +async def settings_back_markup(client, CallbackQuery: CallbackQuery, _): + try: + await CallbackQuery.answer() + except: + pass + if CallbackQuery.message.chat.type == ChatType.PRIVATE: + await app.resolve_peer(OWNER_ID) + OWNER = OWNER_ID + buttons = private_panel(_) + return await CallbackQuery.edit_message_text( + _["start_2"].format(CallbackQuery.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(buttons), + ) + else: + buttons = setting_markup(_) + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + + +@app.on_callback_query( + filters.regex( + pattern=r"^(SEARCHANSWER|PLAYMODEANSWER|PLAYTYPEANSWER|AUTHANSWER|ANSWERVOMODE|VOTEANSWER|PM|AU|VM)$" + ) + & ~BANNED_USERS +) +@languageCB +async def without_Admin_rights(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) + if command == "SEARCHANSWER": + try: + return await CallbackQuery.answer(_["setting_2"], show_alert=True) + except: + return + if command == "PLAYMODEANSWER": + try: + return await CallbackQuery.answer(_["setting_5"], show_alert=True) + except: + return + if command == "PLAYTYPEANSWER": + try: + return await CallbackQuery.answer(_["setting_6"], show_alert=True) + except: + return + if command == "AUTHANSWER": + try: + return await CallbackQuery.answer(_["setting_3"], show_alert=True) + except: + return + if command == "VOTEANSWER": + try: + return await CallbackQuery.answer( + _["setting_8"], + show_alert=True, + ) + except: + return + if command == "ANSWERVOMODE": + current = await get_upvote_count(CallbackQuery.message.chat.id) + try: + return await CallbackQuery.answer( + _["setting_9"].format(current), + show_alert=True, + ) + except: + return + if command == "PM": + try: + await CallbackQuery.answer(_["set_cb_2"], show_alert=True) + except: + pass + playmode = await get_playmode(CallbackQuery.message.chat.id) + if playmode == "Direct": + Direct = True + else: + Direct = None + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + Group = True + else: + Group = None + playty = await get_playtype(CallbackQuery.message.chat.id) + if playty == "Everyone": + Playtype = None + else: + Playtype = True + buttons = playmode_users_markup(_, Direct, Group, Playtype) + if command == "AU": + try: + await CallbackQuery.answer(_["set_cb_1"], show_alert=True) + except: + pass + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + buttons = auth_users_markup(_, True) + else: + buttons = auth_users_markup(_) + if command == "VM": + mode = await is_skipmode(CallbackQuery.message.chat.id) + current = await get_upvote_count(CallbackQuery.message.chat.id) + buttons = vote_mode_markup(_, current, mode) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + +@app.on_callback_query(filters.regex("FERRARIUDTI") & ~BANNED_USERS) +@ActualAdminCB +async def addition(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + mode = callback_data.split(None, 1)[1] + if not await is_skipmode(CallbackQuery.message.chat.id): + return await CallbackQuery.answer(_["setting_10"], show_alert=True) + current = await get_upvote_count(CallbackQuery.message.chat.id) + if mode == "M": + final = current - 2 + print(final) + if final == 0: + return await CallbackQuery.answer( + _["setting_11"], + show_alert=True, + ) + if final <= 2: + final = 2 + await set_upvotes(CallbackQuery.message.chat.id, final) + else: + final = current + 2 + print(final) + if final == 17: + return await CallbackQuery.answer( + _["setting_12"], + show_alert=True, + ) + if final >= 15: + final = 15 + await set_upvotes(CallbackQuery.message.chat.id, final) + buttons = vote_mode_markup(_, final, True) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + +@app.on_callback_query( + filters.regex(pattern=r"^(MODECHANGE|CHANNELMODECHANGE|PLAYTYPECHANGE)$") + & ~BANNED_USERS +) +@ActualAdminCB +async def playmode_ans(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) + if command == "CHANNELMODECHANGE": + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + await add_nonadmin_chat(CallbackQuery.message.chat.id) + Group = None + else: + await remove_nonadmin_chat(CallbackQuery.message.chat.id) + Group = True + playmode = await get_playmode(CallbackQuery.message.chat.id) + if playmode == "Direct": + Direct = True + else: + Direct = None + playty = await get_playtype(CallbackQuery.message.chat.id) + if playty == "Everyone": + Playtype = None + else: + Playtype = True + buttons = playmode_users_markup(_, Direct, Group, Playtype) + if command == "MODECHANGE": + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + playmode = await get_playmode(CallbackQuery.message.chat.id) + if playmode == "Direct": + await set_playmode(CallbackQuery.message.chat.id, "Inline") + Direct = None + else: + await set_playmode(CallbackQuery.message.chat.id, "Direct") + Direct = True + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + Group = True + else: + Group = None + playty = await get_playtype(CallbackQuery.message.chat.id) + if playty == "Everyone": + Playtype = False + else: + Playtype = True + buttons = playmode_users_markup(_, Direct, Group, Playtype) + if command == "PLAYTYPECHANGE": + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + playty = await get_playtype(CallbackQuery.message.chat.id) + if playty == "Everyone": + await set_playtype(CallbackQuery.message.chat.id, "Admin") + Playtype = False + else: + await set_playtype(CallbackQuery.message.chat.id, "Everyone") + Playtype = True + playmode = await get_playmode(CallbackQuery.message.chat.id) + if playmode == "Direct": + Direct = True + else: + Direct = None + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + Group = True + else: + Group = None + buttons = playmode_users_markup(_, Direct, Group, Playtype) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + +@app.on_callback_query(filters.regex(pattern=r"^(AUTH|AUTHLIST)$") & ~BANNED_USERS) +@ActualAdminCB +async def authusers_mar(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) + if command == "AUTHLIST": + _authusers = await get_authuser_names(CallbackQuery.message.chat.id) + if not _authusers: + try: + return await CallbackQuery.answer(_["setting_4"], show_alert=True) + except: + return + else: + try: + await CallbackQuery.answer(_["set_cb_4"], show_alert=True) + except: + pass + j = 0 + await CallbackQuery.edit_message_text(_["auth_6"]) + msg = _["auth_7"].format(CallbackQuery.message.chat.title) + for note in _authusers: + _note = await get_authuser(CallbackQuery.message.chat.id, note) + user_id = _note["auth_user_id"] + admin_id = _note["admin_id"] + admin_name = _note["admin_name"] + try: + user = await app.get_users(user_id) + user = user.first_name + j += 1 + except: + continue + msg += f"● {j} ➥ {user}[{user_id}]\n" + msg += f" {_['auth_8']} {admin_name}[{admin_id}]\n\n" + upl = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=_["BACK_BUTTON"], callback_data=f"AU" + ), + InlineKeyboardButton( + text=_["CLOSE_BUTTON"], + callback_data=f"close", + ), + ] + ] + ) + try: + return await CallbackQuery.edit_message_text(msg, reply_markup=upl) + except MessageNotModified: + return + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + if command == "AUTH": + is_non_admin = await is_nonadmin_chat(CallbackQuery.message.chat.id) + if not is_non_admin: + await add_nonadmin_chat(CallbackQuery.message.chat.id) + buttons = auth_users_markup(_) + else: + await remove_nonadmin_chat(CallbackQuery.message.chat.id) + buttons = auth_users_markup(_, True) + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return + + +@app.on_callback_query(filters.regex("VOMODECHANGE") & ~BANNED_USERS) +@ActualAdminCB +async def vote_change(client, CallbackQuery, _): + command = CallbackQuery.matches[0].group(1) + try: + await CallbackQuery.answer(_["set_cb_3"], show_alert=True) + except: + pass + mod = None + if await is_skipmode(CallbackQuery.message.chat.id): + await skip_off(CallbackQuery.message.chat.id) + else: + mod = True + await skip_on(CallbackQuery.message.chat.id) + current = await get_upvote_count(CallbackQuery.message.chat.id) + buttons = vote_mode_markup(_, current, mod) + + try: + return await CallbackQuery.edit_message_reply_markup( + reply_markup=InlineKeyboardMarkup(buttons) + ) + except MessageNotModified: + return diff --git a/TanuMusic/plugins/bot/start.py b/TanuMusic/plugins/bot/start.py new file mode 100644 index 000000000000..47d3b955199c --- /dev/null +++ b/TanuMusic/plugins/bot/start.py @@ -0,0 +1,198 @@ +import time +import random +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtubesearchpython.__future__ import VideosSearch + +import config +from TanuMusic import app +from TanuMusic.misc import _boot_ +from TanuMusic.plugins.sudo.sudoers import sudoers_list +from TanuMusic.utils.database import ( + add_served_chat, + add_served_user, + blacklisted_chats, + get_lang, + is_banned_user, + is_on_off, +) +from TanuMusic.utils.decorators.language import LanguageStart +from TanuMusic.utils.formatters import get_readable_time +from TanuMusic.utils.inline import help_pannel, private_panel, start_panel +from config import BANNED_USERS +from strings import get_string + +IMAGE = [ +"https://graph.org/file/f76fd86d1936d45a63c64.jpg", +"https://graph.org/file/69ba894371860cd22d92e.jpg", +"https://graph.org/file/67fde88d8c3aa8327d363.jpg", +"https://graph.org/file/3a400f1f32fc381913061.jpg", +"https://graph.org/file/a0893f3a1e6777f6de821.jpg", +"https://graph.org/file/5a285fc0124657c7b7a0b.jpg", +"https://graph.org/file/25e215c4602b241b66829.jpg", +"https://graph.org/file/a13e9733afdad69720d67.jpg", +"https://graph.org/file/692e89f8fe20554e7a139.jpg", +"https://graph.org/file/db277a7810a3f65d92f22.jpg", +"https://graph.org/file/a00f89c5aa75735896e0f.jpg", +"https://graph.org/file/f86b71018196c5cfe7344.jpg", +"https://graph.org/file/a3db9af88f25bb1b99325.jpg", +"https://graph.org/file/5b344a55f3d5199b63fa5.jpg", +"https://graph.org/file/84de4b440300297a8ecb3.jpg", +"https://graph.org/file/84e84ff778b045879d24f.jpg", +"https://graph.org/file/a4a8f0e5c0e6b18249ffc.jpg", +"https://graph.org/file/ed92cada78099c9c3a4f7.jpg", +"https://graph.org/file/d6360613d0fa7a9d2f90b.jpg", +"https://graph.org/file/37248e7bdff70c662a702.jpg", +"https://graph.org/file/0bfe29d15e918917d1305.jpg", +"https://graph.org/file/16b1a2828cc507f8048bd.jpg", +"https://graph.org/file/e6b01f23f2871e128dad8.jpg", +"https://graph.org/file/cacbdddee77784d9ed2b7.jpg", +"https://graph.org/file/ddc5d6ec1c33276507b19.jpg", +"https://graph.org/file/39d7277189360d2c85b62.jpg", +"https://graph.org/file/5846b9214eaf12c3ed100.jpg", +"https://graph.org/file/ad4f9beb4d526e6615e18.jpg", +"https://graph.org/file/3514efaabe774e4f181f2.jpg", +"https://graph.org/file/eaa3a2602e43844a488a5.jpg", +"https://graph.org/file/b129e98b6e5c4db81c15f.jpg", +"https://graph.org/file/3ccb86d7d62e8ee0a2e8b.jpg", +"https://graph.org/file/df11d8257613418142063.jpg", +"https://graph.org/file/9e23720fedc47259b6195.jpg", +"https://graph.org/file/826485f2d7db6f09db8ed.jpg", +"https://graph.org/file/ff3ad786da825b5205691.jpg", +"https://graph.org/file/52713c9fe9253ae668f13.jpg", +"https://graph.org/file/8f8516c86677a8c91bfb1.jpg", +"https://graph.org/file/6603c3740378d3f7187da.jpg", +"https://graph.org/file/66cb6ec40eea5c4670118.jpg", +"https://graph.org/file/2e3cf4327b169b981055e.jpg", + +] + + + +@app.on_message(filters.command(["start"]) & filters.private & ~BANNED_USERS) +@LanguageStart +async def start_pm(client, message: Message, _): + await add_served_user(message.from_user.id) + if len(message.text.split()) > 1: + name = message.text.split(None, 1)[1] + if name[0:4] == "help": + keyboard = help_pannel(_) + return await message.reply_photo( + random.choice(IMAGE), + caption=_["help_1"].format(config.SUPPORT_CHAT), + reply_markup=keyboard, + ) + if name[0:3] == "sud": + await sudoers_list(client=client, message=message, _=_) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ sᴜᴅᴏʟɪsᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + ) + return + if name[0:3] == "inf": + m = await message.reply_text("🔎") + query = (str(name)).replace("info_", "", 1) + query = f"https://www.youtube.com/watch?v={query}" + results = VideosSearch(query, limit=1) + for result in (await results.next())["result"]: + title = result["title"] + duration = result["duration"] + views = result["viewCount"]["short"] + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + channellink = result["channel"]["link"] + channel = result["channel"]["name"] + link = result["link"] + published = result["publishedTime"] + searched_text = _["start_6"].format( + title, duration, views, published, channellink, channel, app.mention + ) + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text=_["S_B_8"], url=link), + InlineKeyboardButton(text=_["S_B_9"], url=config.SUPPORT_CHAT), + ], + ] + ) + await m.delete() + await app.send_photo( + chat_id=message.chat.id, + photo=thumbnail, + caption=searched_text, + reply_markup=key, + ) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʀᴀᴄᴋ ɪɴғᴏʀᴍᴀᴛɪᴏɴ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + ) + else: + out = private_panel(_) + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_2"].format(message.from_user.mention, app.mention), + reply_markup=InlineKeyboardMarkup(out), + ) + if await is_on_off(2): + return await app.send_message( + chat_id=config.LOGGER_ID, + text=f"❖ {message.from_user.mention} ᴊᴜsᴛ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ʙᴏᴛ.\n\n● ᴜsᴇʀ ɪᴅ ➥ {message.from_user.id}\n● ᴜsᴇʀɴᴀᴍᴇ ➥ @{message.from_user.username}", + ) + + +@app.on_message(filters.command(["start"]) & filters.group & ~BANNED_USERS) +@LanguageStart +async def start_gp(client, message: Message, _): + out = start_panel(_) + uptime = int(time.time() - _boot_) + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_1"].format(app.mention, get_readable_time(uptime)), + reply_markup=InlineKeyboardMarkup(out), + ) + return await add_served_chat(message.chat.id) + + +@app.on_message(filters.new_chat_members, group=-1) +async def welcome(client, message: Message): + for member in message.new_chat_members: + try: + language = await get_lang(message.chat.id) + _ = get_string(language) + if await is_banned_user(member.id): + try: + await message.chat.ban_member(member.id) + except: + pass + if member.id == app.id: + if message.chat.type != ChatType.SUPERGROUP: + await message.reply_text(_["start_4"]) + return await app.leave_chat(message.chat.id) + if message.chat.id in await blacklisted_chats(): + await message.reply_text( + _["start_5"].format( + app.mention, + f"https://t.me/{app.username}?start=sudolist", + config.SUPPORT_CHAT, + ), + disable_web_page_preview=True, + ) + return await app.leave_chat(message.chat.id) + + out = start_panel(_) + await message.reply_photo( + random.choice(IMAGE), + caption=_["start_3"].format( + message.from_user.first_name, + app.mention, + message.chat.title, + app.mention, + ), + reply_markup=InlineKeyboardMarkup(out), + ) + await add_served_chat(message.chat.id) + await message.stop_propagation() + except Exception as ex: + print(ex) diff --git a/TanuMusic/plugins/bot/ytsearch.py b/TanuMusic/plugins/bot/ytsearch.py new file mode 100644 index 000000000000..03e299178466 --- /dev/null +++ b/TanuMusic/plugins/bot/ytsearch.py @@ -0,0 +1,30 @@ +import logging +from pyrogram.types import Message +from youtube_search import YoutubeSearch +from TanuMusic import app +from pyrogram import filters +from config import BOT_USERNAME + + +@app.on_message(filters.command("yt")) +async def ytsearch(_, message: Message): + try: + if len(message.command) < 2: + await message.reply_text("✦ /yt needs an argument!") + return + query = message.text.split(None, 1)[1] + m = await message.reply_text("✦ searching....") + results = YoutubeSearch(query, max_results=5).to_dict() + i = 0 + text = "" + while i < 5: + text += f"❖ ᴠɪᴅᴇᴏ ɴᴀᴍᴇ ➥ {results[i]['title']}\n\n" + text += f"● ᴠɪᴅᴇᴏ ᴅᴜʀᴀᴛɪᴏɴ ➥ {results[i]['duration']}\n" + text += f"● ᴠɪᴅᴇᴏ ᴠɪᴇᴡs ➥ {results[i]['views']}\n" + text += f"● ᴠɪᴅᴇᴏ ᴄʜᴀɴɴᴇʟ ➥ {results[i]['channel']}\n" + text += f"● ᴠɪᴅᴇᴏ ᴜʀʟ ➥ https://www.youtube.com{results[i]['url_suffix']}\n\n" + i += 1 + await m.edit(text, disable_web_page_preview=True) + except Exception as e: + await m.edit(str(e)) + diff --git a/TanuMusic/plugins/misc/autoleave.py b/TanuMusic/plugins/misc/autoleave.py new file mode 100644 index 000000000000..d79750c0ca39 --- /dev/null +++ b/TanuMusic/plugins/misc/autoleave.py @@ -0,0 +1,74 @@ +import asyncio +from datetime import datetime + +from pyrogram.enums import ChatType + +import config +from TanuMusic import app +from TanuMusic.core.call import Tanu, autoend +from TanuMusic.utils.database import get_client, is_active_chat, is_autoend + + +async def auto_leave(): + if config.AUTO_LEAVING_ASSISTANT: + while not await asyncio.sleep(900): + from TanuMusic.core.userbot import assistants + + for num in assistants: + client = await get_client(num) + left = 0 + try: + async for i in client.get_dialogs(): + if i.chat.type in [ + ChatType.SUPERGROUP, + ChatType.GROUP, + ChatType.CHANNEL, + ]: + if ( + i.chat.id != config.LOGGER_ID + and i.chat.id != -1001686672798 + and i.chat.id != -1001549206010 + ): + if left == 20: + continue + if not await is_active_chat(i.chat.id): + try: + await client.leave_chat(i.chat.id) + left += 1 + except: + continue + except: + pass + + +asyncio.create_task(auto_leave()) + + +async def auto_end(): + while not await asyncio.sleep(5): + ender = await is_autoend() + if not ender: + continue + for chat_id in autoend: + timer = autoend.get(chat_id) + if not timer: + continue + if datetime.now() > timer: + if not await is_active_chat(chat_id): + autoend[chat_id] = {} + continue + autoend[chat_id] = {} + try: + await Tanu.stop_stream(chat_id) + except: + continue + try: + await app.send_message( + chat_id, + "❖ ʙᴏᴛ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ʟᴇғᴛ ᴠɪᴅᴇᴏᴄʜᴀᴛ ʙᴇᴄᴀᴜsᴇ ɴᴏ ᴏɴᴇ ᴡᴀs ʟɪsᴛᴇɴɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.", + ) + except: + continue + + +asyncio.create_task(auto_end()) diff --git a/TanuMusic/plugins/misc/broadcast.py b/TanuMusic/plugins/misc/broadcast.py new file mode 100644 index 000000000000..4201b8654e4f --- /dev/null +++ b/TanuMusic/plugins/misc/broadcast.py @@ -0,0 +1,169 @@ +import asyncio + +from pyrogram import filters +from pyrogram.enums import ChatMembersFilter +from pyrogram.errors import FloodWait + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import ( + get_active_chats, + get_authuser_names, + get_client, + get_served_chats, + get_served_users, +) +from TanuMusic.utils.decorators.language import language +from TanuMusic.utils.formatters import alpha_to_int +from config import adminlist + +IS_BROADCASTING = False + + +@app.on_message(filters.command("broadcast") & SUDOERS) +@language +async def braodcast_message(client, message, _): + global IS_BROADCASTING + if message.reply_to_message: + x = message.reply_to_message.id + y = message.chat.id + else: + if len(message.command) < 2: + return await message.reply_text(_["broad_2"]) + query = message.text.split(None, 1)[1] + if "-pin" in query: + query = query.replace("-pin", "") + if "-nobot" in query: + query = query.replace("-nobot", "") + if "-pinloud" in query: + query = query.replace("-pinloud", "") + if "-assistant" in query: + query = query.replace("-assistant", "") + if "-user" in query: + query = query.replace("-user", "") + if query == "": + return await message.reply_text(_["broad_8"]) + + IS_BROADCASTING = True + await message.reply_text(_["broad_1"]) + + if "-nobot" not in message.text: + sent = 0 + pin = 0 + chats = [] + schats = await get_served_chats() + for chat in schats: + chats.append(int(chat["chat_id"])) + for i in chats: + try: + m = ( + await app.forward_messages(i, y, x) + if message.reply_to_message + else await app.send_message(i, text=query) + ) + if "-pin" in message.text: + try: + await m.pin(disable_notification=True) + pin += 1 + except: + continue + elif "-pinloud" in message.text: + try: + await m.pin(disable_notification=False) + pin += 1 + except: + continue + sent += 1 + await asyncio.sleep(0.2) + except FloodWait as fw: + flood_time = int(fw.value) + if flood_time > 200: + continue + await asyncio.sleep(flood_time) + except: + continue + try: + await message.reply_text(_["broad_3"].format(sent, pin)) + except: + pass + + if "-user" in message.text: + susr = 0 + served_users = [] + susers = await get_served_users() + for user in susers: + served_users.append(int(user["user_id"])) + for i in served_users: + try: + m = ( + await app.forward_messages(i, y, x) + if message.reply_to_message + else await app.send_message(i, text=query) + ) + susr += 1 + await asyncio.sleep(0.2) + except FloodWait as fw: + flood_time = int(fw.value) + if flood_time > 200: + continue + await asyncio.sleep(flood_time) + except: + pass + try: + await message.reply_text(_["broad_4"].format(susr)) + except: + pass + + if "-assistant" in message.text: + aw = await message.reply_text(_["broad_5"]) + text = _["broad_6"] + from TanuMusic.core.userbot import assistants + + for num in assistants: + sent = 0 + client = await get_client(num) + async for dialog in client.get_dialogs(): + try: + await client.forward_messages( + dialog.chat.id, y, x + ) if message.reply_to_message else await client.send_message( + dialog.chat.id, text=query + ) + sent += 1 + await asyncio.sleep(3) + except FloodWait as fw: + flood_time = int(fw.value) + if flood_time > 200: + continue + await asyncio.sleep(flood_time) + except: + continue + text += _["broad_7"].format(num, sent) + try: + await aw.edit_text(text) + except: + pass + IS_BROADCASTING = False + + +async def auto_clean(): + while not await asyncio.sleep(10): + try: + served_chats = await get_active_chats() + for chat_id in served_chats: + if chat_id not in adminlist: + adminlist[chat_id] = [] + async for user in app.get_chat_members( + chat_id, filter=ChatMembersFilter.ADMINISTRATORS + ): + if user.privileges.can_manage_video_chats: + adminlist[chat_id].append(user.user.id) + authusers = await get_authuser_names(chat_id) + for user in authusers: + user_id = await alpha_to_int(user) + adminlist[chat_id].append(user_id) + except: + continue + + +asyncio.create_task(auto_clean()) diff --git a/TanuMusic/plugins/misc/cstates.py b/TanuMusic/plugins/misc/cstates.py new file mode 100644 index 000000000000..912974a66be3 --- /dev/null +++ b/TanuMusic/plugins/misc/cstates.py @@ -0,0 +1,33 @@ +from pyrogram import Client, filters +import pycountry +from TanuMusic import app +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + + +EVAA = [ + [ + InlineKeyboardButton(text="ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ", url=f"https://t.me/TanuMusicxBot?startgroup=true"), + ], +] + +@app.on_message(filters.command("cstats")) +def get_states(client, message): + try: + # Extract the country name from the message + country_name = message.text.split(' ', 1)[1] + # Fetch the country information + country = pycountry.countries.get(name=country_name) + # Get the states (also known as subdivisions) of the country + states = pycountry.subdivisions.get(country_code=country.alpha_2) + states_list = [state.name for state in states] + # Format the states into a message + states_message = f"✦ ʜᴇʀᴇ ɪs ʏᴏᴜʀ ᴄᴏᴜɴᴛʀʏ {country_name} ᴀʟʟ sᴛᴀᴛᴇs.\n\n" + " ❖ ".join(states_list) + except IndexError: + # No country name was provided + states_message = "✦ ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ᴄᴏᴜɴᴛʀʏ ɴᴀᴍᴇ ᴀғᴛᴇʀ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ, ʟɪᴋᴇ ᴛʜɪs ➥ /cstats Japan" + except AttributeError: + # The country was not found + states_message = f"✦ ɪ ᴄᴏᴜʟᴅɴ'ᴛ ғɪɴᴅ ᴛʜᴇ ᴄᴏᴜɴᴛʀʏ '{country_name}'. ᴘʟᴇᴀsᴇ ᴍᴀᴋᴇ sure ɪᴛ's sᴘᴇʟʟᴇᴅ ᴄᴏʀʀᴇᴄᴛʟʏ." + + message.reply_text(states_message, reply_markup=InlineKeyboardMarkup(EVAA),) + diff --git a/TanuMusic/plugins/misc/seeker.py b/TanuMusic/plugins/misc/seeker.py new file mode 100644 index 000000000000..543f533404f2 --- /dev/null +++ b/TanuMusic/plugins/misc/seeker.py @@ -0,0 +1,24 @@ +import asyncio + +from TanuMusic.misc import db +from TanuMusic.utils.database import get_active_chats, is_music_playing + + +async def timer(): + while not await asyncio.sleep(1): + active_chats = await get_active_chats() + for chat_id in active_chats: + if not await is_music_playing(chat_id): + continue + playing = db.get(chat_id) + if not playing: + continue + duration = int(playing[0]["seconds"]) + if duration == 0: + continue + if db[chat_id][0]["played"] >= duration: + continue + db[chat_id][0]["played"] += 1 + + +asyncio.create_task(timer()) diff --git a/TanuMusic/plugins/misc/watcher.py b/TanuMusic/plugins/misc/watcher.py new file mode 100644 index 000000000000..0f4d2f8e98c2 --- /dev/null +++ b/TanuMusic/plugins/misc/watcher.py @@ -0,0 +1,14 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.core.call import Tanu + +welcome = 20 +close = 30 + + +@app.on_message(filters.video_chat_started, group=welcome) +@app.on_message(filters.video_chat_ended, group=close) +async def welcome(_, message: Message): + await Tanu.stop_stream_force(message.chat.id) diff --git a/TanuMusic/plugins/play/channel.py b/TanuMusic/plugins/play/channel.py new file mode 100644 index 000000000000..fbca91cebfd3 --- /dev/null +++ b/TanuMusic/plugins/play/channel.py @@ -0,0 +1,49 @@ +from pyrogram import filters +from pyrogram.enums import ChatMembersFilter, ChatMemberStatus, ChatType +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.utils.database import set_cmode +from TanuMusic.utils.decorators.admins import AdminActual +from config import BANNED_USERS + + +@app.on_message(filters.command(["channelplay"]) & filters.group & ~BANNED_USERS) +@AdminActual +async def playmode_(client, message: Message, _): + if len(message.command) < 2: + return await message.reply_text(_["cplay_1"].format(message.chat.title)) + query = message.text.split(None, 2)[1].lower().strip() + if (str(query)).lower() == "disable": + await set_cmode(message.chat.id, None) + return await message.reply_text(_["cplay_7"]) + elif str(query) == "linked": + chat = await app.get_chat(message.chat.id) + if chat.linked_chat: + chat_id = chat.linked_chat.id + await set_cmode(message.chat.id, chat_id) + return await message.reply_text( + _["cplay_3"].format(chat.linked_chat.title, chat.linked_chat.id) + ) + else: + return await message.reply_text(_["cplay_2"]) + else: + try: + chat = await app.get_chat(query) + except: + return await message.reply_text(_["cplay_4"]) + if chat.type != ChatType.CHANNEL: + return await message.reply_text(_["cplay_5"]) + try: + async for user in app.get_chat_members( + chat.id, filter=ChatMembersFilter.ADMINISTRATORS + ): + if user.status == ChatMemberStatus.OWNER: + cusn = user.user.username + crid = user.user.id + except: + return await message.reply_text(_["cplay_4"]) + if crid != message.from_user.id: + return await message.reply_text(_["cplay_6"].format(chat.title, cusn)) + await set_cmode(message.chat.id, chat.id) + return await message.reply_text(_["cplay_3"].format(chat.title, chat.id)) diff --git a/TanuMusic/plugins/play/live.py b/TanuMusic/plugins/play/live.py new file mode 100644 index 000000000000..f4f546e8d247 --- /dev/null +++ b/TanuMusic/plugins/play/live.py @@ -0,0 +1,60 @@ +from pyrogram import filters + +from TanuMusic import YouTube, app +from TanuMusic.utils.channelplay import get_channeplayCB +from TanuMusic.utils.decorators.language import languageCB +from TanuMusic.utils.stream.stream import stream +from config import BANNED_USERS + + +@app.on_callback_query(filters.regex("LiveStream") & ~BANNED_USERS) +@languageCB +async def play_live_stream(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + vidid, user_id, mode, cplay, fplay = callback_request.split("|") + if CallbackQuery.from_user.id != int(user_id): + try: + return await CallbackQuery.answer(_["playcb_1"], show_alert=True) + except: + return + try: + chat_id, channel = await get_channeplayCB(_, cplay, CallbackQuery) + except: + return + video = True if mode == "v" else None + user_name = CallbackQuery.from_user.first_name + await CallbackQuery.message.delete() + try: + await CallbackQuery.answer() + except: + pass + mystic = await CallbackQuery.message.reply_text( + _["play_2"].format(channel) if channel else _["play_1"] + ) + try: + details, track_id = await YouTube.track(vidid, True) + except: + return await mystic.edit_text(_["play_3"]) + ffplay = True if fplay == "f" else None + if not details["duration_min"]: + try: + await stream( + _, + mystic, + user_id, + details, + chat_id, + user_name, + CallbackQuery.message.chat.id, + video, + streamtype="live", + forceplay=ffplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + else: + return await mystic.edit_text("❖ ɴᴏᴛ ᴀ ʟɪᴠᴇ sᴛʀᴇᴀᴍ.") + await mystic.delete() diff --git a/TanuMusic/plugins/play/play.py b/TanuMusic/plugins/play/play.py new file mode 100644 index 000000000000..2ab16a0e950c --- /dev/null +++ b/TanuMusic/plugins/play/play.py @@ -0,0 +1,663 @@ +import random +import string + +from pyrogram import filters +from pyrogram.types import InlineKeyboardMarkup, InputMediaPhoto, Message +from pytgcalls.exceptions import NoActiveGroupCall + +import config +from TanuMusic import Apple, Resso, SoundCloud, Spotify, Telegram, YouTube, app +from TanuMusic.core.call import Tanu +from TanuMusic.utils import seconds_to_min, time_to_seconds +from TanuMusic.utils.channelplay import get_channeplayCB +from TanuMusic.utils.decorators.language import languageCB +from TanuMusic.utils.decorators.play import PlayWrapper +from TanuMusic.utils.formatters import formats +from TanuMusic.utils.inline import ( + botplaylist_markup, + livestream_markup, + playlist_markup, + slider_markup, + track_markup, +) +from TanuMusic.utils.logger import play_logs +from TanuMusic.utils.stream.stream import stream +from config import BANNED_USERS, lyrical + + +@app.on_message( + filters.command( + [ + "play", + "vplay", + "cplay", + "cvplay", + "playforce", + "vplayforce", + "cplayforce", + "cvplayforce", + ] + ) + & filters.group + & ~BANNED_USERS +) +@PlayWrapper +async def play_commnd( + client, + message: Message, + _, + chat_id, + video, + channel, + playmode, + url, + fplay, +): + mystic = await message.reply_text( + _["play_2"].format(channel) if channel else _["play_1"] + ) + plist_id = None + slider = None + plist_type = None + spotify = None + user_id = message.from_user.id + user_name = message.from_user.first_name + audio_telegram = ( + (message.reply_to_message.audio or message.reply_to_message.voice) + if message.reply_to_message + else None + ) + video_telegram = ( + (message.reply_to_message.video or message.reply_to_message.document) + if message.reply_to_message + else None + ) + if audio_telegram: + if audio_telegram.file_size > 104857600: + return await mystic.edit_text(_["play_5"]) + duration_min = seconds_to_min(audio_telegram.duration) + if (audio_telegram.duration) > config.DURATION_LIMIT: + return await mystic.edit_text( + _["play_6"].format(config.DURATION_LIMIT_MIN, app.mention) + ) + file_path = await Telegram.get_filepath(audio=audio_telegram) + if await Telegram.download(_, message, mystic, file_path): + message_link = await Telegram.get_link(message) + file_name = await Telegram.get_filename(audio_telegram, audio=True) + dur = await Telegram.get_duration(audio_telegram, file_path) + details = { + "title": file_name, + "link": message_link, + "path": file_path, + "dur": dur, + } + + try: + await stream( + _, + mystic, + user_id, + details, + chat_id, + user_name, + message.chat.id, + streamtype="telegram", + forceplay=fplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + return await mystic.delete() + return + elif video_telegram: + if message.reply_to_message.document: + try: + ext = video_telegram.file_name.split(".")[-1] + if ext.lower() not in formats: + return await mystic.edit_text( + _["play_7"].format(f"{' | '.join(formats)}") + ) + except: + return await mystic.edit_text( + _["play_7"].format(f"{' | '.join(formats)}") + ) + if video_telegram.file_size > config.TG_VIDEO_FILESIZE_LIMIT: + return await mystic.edit_text(_["play_8"]) + file_path = await Telegram.get_filepath(video=video_telegram) + if await Telegram.download(_, message, mystic, file_path): + message_link = await Telegram.get_link(message) + file_name = await Telegram.get_filename(video_telegram) + dur = await Telegram.get_duration(video_telegram, file_path) + details = { + "title": file_name, + "link": message_link, + "path": file_path, + "dur": dur, + } + try: + await stream( + _, + mystic, + user_id, + details, + chat_id, + user_name, + message.chat.id, + video=True, + streamtype="telegram", + forceplay=fplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + return await mystic.delete() + return + elif url: + if await YouTube.exists(url): + if "playlist" in url: + try: + details = await YouTube.playlist( + url, + config.PLAYLIST_FETCH_LIMIT, + message.from_user.id, + ) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "playlist" + plist_type = "yt" + if "&" in url: + plist_id = (url.split("=")[1]).split("&")[0] + else: + plist_id = url.split("=")[1] + img = config.PLAYLIST_IMG_URL + cap = _["play_9"] + else: + try: + details, track_id = await YouTube.track(url) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "youtube" + img = details["thumb"] + cap = _["play_10"].format( + details["title"], + details["duration_min"], + ) + elif await Spotify.valid(url): + spotify = True + if not config.SPOTIFY_CLIENT_ID and not config.SPOTIFY_CLIENT_SECRET: + return await mystic.edit_text( + "❖ sᴘᴏᴛɪғʏ ɪs ɴᴏᴛ sᴜᴘᴘᴏʀᴛᴇᴅ ʏᴇᴛ.\n\n● ᴘʟᴇᴀsᴇ ᴛʀʏ ᴀɢᴀɪɴ ʟᴀᴛᴇʀ." + ) + if "track" in url: + try: + details, track_id = await Spotify.track(url) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "youtube" + img = details["thumb"] + cap = _["play_10"].format(details["title"], details["duration_min"]) + elif "playlist" in url: + try: + details, plist_id = await Spotify.playlist(url) + except Exception: + return await mystic.edit_text(_["play_3"]) + streamtype = "playlist" + plist_type = "spplay" + img = config.SPOTIFY_PLAYLIST_IMG_URL + cap = _["play_11"].format(app.mention, message.from_user.mention) + elif "album" in url: + try: + details, plist_id = await Spotify.album(url) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "playlist" + plist_type = "spalbum" + img = config.SPOTIFY_ALBUM_IMG_URL + cap = _["play_11"].format(app.mention, message.from_user.mention) + elif "artist" in url: + try: + details, plist_id = await Spotify.artist(url) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "playlist" + plist_type = "spartist" + img = config.SPOTIFY_ARTIST_IMG_URL + cap = _["play_11"].format(message.from_user.first_name) + else: + return await mystic.edit_text(_["play_15"]) + elif await Apple.valid(url): + if "album" in url: + try: + details, track_id = await Apple.track(url) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "youtube" + img = details["thumb"] + cap = _["play_10"].format(details["title"], details["duration_min"]) + elif "playlist" in url: + spotify = True + try: + details, plist_id = await Apple.playlist(url) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "playlist" + plist_type = "apple" + cap = _["play_12"].format(app.mention, message.from_user.mention) + img = url + else: + return await mystic.edit_text(_["play_3"]) + elif await Resso.valid(url): + try: + details, track_id = await Resso.track(url) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "youtube" + img = details["thumb"] + cap = _["play_10"].format(details["title"], details["duration_min"]) + elif await SoundCloud.valid(url): + try: + details, track_path = await SoundCloud.download(url) + except: + return await mystic.edit_text(_["play_3"]) + duration_sec = details["duration_sec"] + if duration_sec > config.DURATION_LIMIT: + return await mystic.edit_text( + _["play_6"].format( + config.DURATION_LIMIT_MIN, + app.mention, + ) + ) + try: + await stream( + _, + mystic, + user_id, + details, + chat_id, + user_name, + message.chat.id, + streamtype="soundcloud", + forceplay=fplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + return await mystic.delete() + else: + try: + await Tanu.stream_call(url) + except NoActiveGroupCall: + await mystic.edit_text(_["black_9"]) + return await app.send_message( + chat_id=config.LOGGER_ID, + text=_["play_17"], + ) + except Exception as e: + return await mystic.edit_text(_["general_2"].format(type(e).__name__)) + await mystic.edit_text(_["str_2"]) + try: + await stream( + _, + mystic, + message.from_user.id, + url, + chat_id, + message.from_user.first_name, + message.chat.id, + video=video, + streamtype="index", + forceplay=fplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + return await play_logs(message, streamtype="M3u8 or Index Link") + else: + if len(message.command) < 2: + buttons = botplaylist_markup(_) + return await mystic.edit_text( + _["play_18"], + reply_markup=InlineKeyboardMarkup(buttons), + ) + slider = True + query = message.text.split(None, 1)[1] + if "-v" in query: + query = query.replace("-v", "") + try: + details, track_id = await YouTube.track(query) + except: + return await mystic.edit_text(_["play_3"]) + streamtype = "youtube" + if str(playmode) == "Direct": + if not plist_type: + if details["duration_min"]: + duration_sec = time_to_seconds(details["duration_min"]) + if duration_sec > config.DURATION_LIMIT: + return await mystic.edit_text( + _["play_6"].format(config.DURATION_LIMIT_MIN, app.mention) + ) + else: + buttons = livestream_markup( + _, + track_id, + user_id, + "v" if video else "a", + "c" if channel else "g", + "f" if fplay else "d", + ) + return await mystic.edit_text( + _["play_13"], + reply_markup=InlineKeyboardMarkup(buttons), + ) + try: + await stream( + _, + mystic, + user_id, + details, + chat_id, + user_name, + message.chat.id, + video=video, + streamtype=streamtype, + spotify=spotify, + forceplay=fplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + await mystic.delete() + return await play_logs(message, streamtype=streamtype) + else: + if plist_type: + ran_hash = "".join( + random.choices(string.ascii_uppercase + string.digits, k=10) + ) + lyrical[ran_hash] = plist_id + buttons = playlist_markup( + _, + ran_hash, + message.from_user.id, + plist_type, + "c" if channel else "g", + "f" if fplay else "d", + ) + await mystic.delete() + await message.reply_photo( + photo=img, + caption=cap, + reply_markup=InlineKeyboardMarkup(buttons), + ) + return await play_logs(message, streamtype=f"Playlist : {plist_type}") + else: + if slider: + buttons = slider_markup( + _, + track_id, + message.from_user.id, + query, + 0, + "c" if channel else "g", + "f" if fplay else "d", + ) + await mystic.delete() + await message.reply_photo( + photo=details["thumb"], + caption=_["play_10"].format( + details["title"].title(), + details["duration_min"], + ), + reply_markup=InlineKeyboardMarkup(buttons), + ) + return await play_logs(message, streamtype=f"Searched on Youtube") + else: + buttons = track_markup( + _, + track_id, + message.from_user.id, + "c" if channel else "g", + "f" if fplay else "d", + ) + await mystic.delete() + await message.reply_photo( + photo=img, + caption=cap, + reply_markup=InlineKeyboardMarkup(buttons), + ) + return await play_logs(message, streamtype=f"URL Searched Inline") + + +@app.on_callback_query(filters.regex("MusicStream") & ~BANNED_USERS) +@languageCB +async def play_music(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + vidid, user_id, mode, cplay, fplay = callback_request.split("|") + if CallbackQuery.from_user.id != int(user_id): + try: + return await CallbackQuery.answer(_["playcb_1"], show_alert=True) + except: + return + try: + chat_id, channel = await get_channeplayCB(_, cplay, CallbackQuery) + except: + return + user_name = CallbackQuery.from_user.first_name + try: + await CallbackQuery.message.delete() + await CallbackQuery.answer() + except: + pass + mystic = await CallbackQuery.message.reply_text( + _["play_2"].format(channel) if channel else _["play_1"] + ) + try: + details, track_id = await YouTube.track(vidid, True) + except: + return await mystic.edit_text(_["play_3"]) + if details["duration_min"]: + duration_sec = time_to_seconds(details["duration_min"]) + if duration_sec > config.DURATION_LIMIT: + return await mystic.edit_text( + _["play_6"].format(config.DURATION_LIMIT_MIN, app.mention) + ) + else: + buttons = livestream_markup( + _, + track_id, + CallbackQuery.from_user.id, + mode, + "c" if cplay == "c" else "g", + "f" if fplay else "d", + ) + return await mystic.edit_text( + _["play_13"], + reply_markup=InlineKeyboardMarkup(buttons), + ) + video = True if mode == "v" else None + ffplay = True if fplay == "f" else None + try: + await stream( + _, + mystic, + CallbackQuery.from_user.id, + details, + chat_id, + user_name, + CallbackQuery.message.chat.id, + video, + streamtype="youtube", + forceplay=ffplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + return await mystic.delete() + + +@app.on_callback_query(filters.regex("AnonymousAdmin") & ~BANNED_USERS) +async def anonymous_check(client, CallbackQuery): + try: + await CallbackQuery.answer( + "❖ ʀᴇᴠᴇʀᴛ ʙᴀᴄᴋ ᴛᴏ ᴜsᴇʀ ᴀᴄᴄᴏᴜɴᴛ ⏤͟͟͞͞★\n\n● ᴏᴘᴇɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ sᴇᴛᴛɪɴɢs.\n● ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs\n● ᴄʟɪᴄᴋ ᴏɴ ʏᴏᴜʀ ɴᴀᴍᴇ\n● ᴜɴᴄʜᴇᴄᴋ ᴀɴᴏɴʏᴍᴏᴜs ᴀᴅᴍɪɴ ᴘᴇʀᴍɪssɪᴏɴs.", + show_alert=True, + ) + except: + pass + + +@app.on_callback_query(filters.regex("AnonyPlaylists") & ~BANNED_USERS) +@languageCB +async def play_playlists_command(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + ( + videoid, + user_id, + ptype, + mode, + cplay, + fplay, + ) = callback_request.split("|") + if CallbackQuery.from_user.id != int(user_id): + try: + return await CallbackQuery.answer(_["playcb_1"], show_alert=True) + except: + return + try: + chat_id, channel = await get_channeplayCB(_, cplay, CallbackQuery) + except: + return + user_name = CallbackQuery.from_user.first_name + await CallbackQuery.message.delete() + try: + await CallbackQuery.answer() + except: + pass + mystic = await CallbackQuery.message.reply_text( + _["play_2"].format(channel) if channel else _["play_1"] + ) + videoid = lyrical.get(videoid) + video = True if mode == "v" else None + ffplay = True if fplay == "f" else None + spotify = True + if ptype == "yt": + spotify = False + try: + result = await YouTube.playlist( + videoid, + config.PLAYLIST_FETCH_LIMIT, + CallbackQuery.from_user.id, + True, + ) + except: + return await mystic.edit_text(_["play_3"]) + if ptype == "spplay": + try: + result, spotify_id = await Spotify.playlist(videoid) + except: + return await mystic.edit_text(_["play_3"]) + if ptype == "spalbum": + try: + result, spotify_id = await Spotify.album(videoid) + except: + return await mystic.edit_text(_["play_3"]) + if ptype == "spartist": + try: + result, spotify_id = await Spotify.artist(videoid) + except: + return await mystic.edit_text(_["play_3"]) + if ptype == "apple": + try: + result, apple_id = await Apple.playlist(videoid, True) + except: + return await mystic.edit_text(_["play_3"]) + try: + await stream( + _, + mystic, + user_id, + result, + chat_id, + user_name, + CallbackQuery.message.chat.id, + video, + streamtype="playlist", + spotify=spotify, + forceplay=ffplay, + ) + except Exception as e: + ex_type = type(e).__name__ + err = e if ex_type == "AssistantErr" else _["general_2"].format(ex_type) + return await mystic.edit_text(err) + return await mystic.delete() + + +@app.on_callback_query(filters.regex("slider") & ~BANNED_USERS) +@languageCB +async def slider_queries(client, CallbackQuery, _): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + ( + what, + rtype, + query, + user_id, + cplay, + fplay, + ) = callback_request.split("|") + if CallbackQuery.from_user.id != int(user_id): + try: + return await CallbackQuery.answer(_["playcb_1"], show_alert=True) + except: + return + what = str(what) + rtype = int(rtype) + if what == "F": + if rtype == 9: + query_type = 0 + else: + query_type = int(rtype + 1) + try: + await CallbackQuery.answer(_["playcb_2"]) + except: + pass + title, duration_min, thumbnail, vidid = await YouTube.slider(query, query_type) + buttons = slider_markup(_, vidid, user_id, query, query_type, cplay, fplay) + med = InputMediaPhoto( + media=thumbnail, + caption=_["play_10"].format( + title.title(), + duration_min, + ), + ) + return await CallbackQuery.edit_message_media( + media=med, reply_markup=InlineKeyboardMarkup(buttons) + ) + if what == "B": + if rtype == 0: + query_type = 9 + else: + query_type = int(rtype - 1) + try: + await CallbackQuery.answer(_["playcb_2"]) + except: + pass + title, duration_min, thumbnail, vidid = await YouTube.slider(query, query_type) + buttons = slider_markup(_, vidid, user_id, query, query_type, cplay, fplay) + med = InputMediaPhoto( + media=thumbnail, + caption=_["play_10"].format( + title.title(), + duration_min, + ), + ) + return await CallbackQuery.edit_message_media( + media=med, reply_markup=InlineKeyboardMarkup(buttons) + ) \ No newline at end of file diff --git a/TanuMusic/plugins/play/playmode.py b/TanuMusic/plugins/play/playmode.py new file mode 100644 index 000000000000..d6cdee6043af --- /dev/null +++ b/TanuMusic/plugins/play/playmode.py @@ -0,0 +1,33 @@ +from pyrogram import filters +from pyrogram.types import InlineKeyboardMarkup, Message + +from TanuMusic import app +from TanuMusic.utils.database import get_playmode, get_playtype, is_nonadmin_chat +from TanuMusic.utils.decorators import language +from TanuMusic.utils.inline.settings import playmode_users_markup +from config import BANNED_USERS + + +@app.on_message(filters.command(["playmode", "mode"]) & filters.group & ~BANNED_USERS) +@language +async def playmode_(client, message: Message, _): + playmode = await get_playmode(message.chat.id) + if playmode == "Direct": + Direct = True + else: + Direct = None + is_non_admin = await is_nonadmin_chat(message.chat.id) + if not is_non_admin: + Group = True + else: + Group = None + playty = await get_playtype(message.chat.id) + if playty == "Everyone": + Playtype = None + else: + Playtype = True + buttons = playmode_users_markup(_, Direct, Group, Playtype) + response = await message.reply_text( + _["play_22"].format(message.chat.title), + reply_markup=InlineKeyboardMarkup(buttons), + ) diff --git a/TanuMusic/plugins/play/pornplay.py# b/TanuMusic/plugins/play/pornplay.py# new file mode 100644 index 000000000000..d35d355a11cc --- /dev/null +++ b/TanuMusic/plugins/play/pornplay.py# @@ -0,0 +1,93 @@ +from pyrogram import filters +import requests, random +from bs4 import BeautifulSoup +from TanuMusic import app +import pytgcalls +import os, yt_dlp +from pyrogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup +from pytgcalls.types import AudioVideoPiped +from TanuMusic.plugins.play import play +from TanuMusic.plugins.play.pornplay import play + +##### + +keyboard = InlineKeyboardMarkup([ + [ + InlineKeyboardButton("ᴄʟᴏsᴇ", callback_data="close_data"), + ] +]) + + +# Define your callback function +@app.on_callback_query(filters.regex("^play")) +async def play_callback(_, query): + # You can add more logic here before initiating playback + await play(query.from_user.id) # Assuming play function accepts user ID + await query.answer("Playback started!") + +####### + +@app.on_callback_query(filters.regex("^close_data")) +async def close_callback(_, query): + chat_id = query.message.chat.id + await query.message.delete() + +async def get_video_stream(link): + ydl_opts = { + "format": "bestvideo+bestaudio/best", + "outtmpl": "downloads/%(id)s.%(ext)s", + "geo_bypass": True, + "nocheckcertificate": True, + "quiet": True, + "no_warnings": True, + } + x = yt_dlp.YoutubeDL(ydl_opts) + info = x.extract_info(link, False) + video = os.path.join( + "downloads", f"{info['id']}.{info['ext']}" + ) + if os.path.exists(video): + return video + x.download([link]) + return video + +##### + +def get_video_info(title): + url_base = f'https://www.xnxx.com/search/{title}' + try: + with requests.Session() as s: + r = s.get(url_base) + soup = BeautifulSoup(r.text, "html.parser") + video_list = soup.findAll('div', attrs={'class': 'thumb-block'}) + if video_list: + random_video = random.choice(video_list) + thumbnail = random_video.find('div', class_="thumb").find('img').get("src") + if thumbnail: + # Replace the size in the thumbnail URL to get 500x500 + thumbnail_500 = thumbnail.replace('/h', '/m').replace('/1.jpg', '/3.jpg') + link = random_video.find('div', class_="thumb-under").find('a').get("href") + if link and 'https://' not in link: # Check if the link is a valid video link + return {'link': 'https://www.xnxx.com' + link, 'thumbnail': thumbnail_500} + except Exception as e: + print(f"Error: {e}") + return None + + + +@app.on_message(filters.command("porn")) +async def get_random_video_info(client, message): + if len(message.command) == 1: + await message.reply("✦ Please provide a title to search.") + return + + title = ' '.join(message.command[1:]) + video_info = get_video_info(title) + + if video_info: + video_link = video_info['link'] + video = await get_video_stream(video_link) + await message.reply_video(video, caption=f"❖ ᴛʜɪs ɪs ʏᴏᴜʀ sᴇᴀʀᴄʜ ᴠɪᴅᴇᴏ ➥ {title}", reply_markup=keyboard) + + else: + await message.reply(f"✦ No video link found for ➥ {title}") diff --git a/TanuMusic/plugins/sudo/autoend.py b/TanuMusic/plugins/sudo/autoend.py new file mode 100644 index 000000000000..c3c1bd2c4b69 --- /dev/null +++ b/TanuMusic/plugins/sudo/autoend.py @@ -0,0 +1,24 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import autoend_off, autoend_on + + +@app.on_message(filters.command("autoend") & SUDOERS) +async def auto_end_stream(_, message: Message): + usage = "❖ ᴇxᴀᴍᴘʟᴇ ➥ /autoend [ᴇɴᴀʙʟᴇ | ᴅɪsᴀʙʟᴇ]" + if len(message.command) != 2: + return await message.reply_text(usage) + state = message.text.split(None, 1)[1].strip().lower() + if state == "enable": + await autoend_on() + await message.reply_text( + "❖ ᴀᴜᴛᴏ ᴇɴᴅ sᴛʀᴇᴀᴍ ᴇɴᴀʙʟᴇᴅ.\n\n● ᴀssɪsᴛᴀɴᴛ ᴡɪʟʟ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ʟᴇᴀᴠᴇ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀғᴛᴇʀ ғᴇᴡ ᴍɪɴs ᴡʜᴇɴ ɴᴏ ᴏɴᴇ ɪs ʟɪsᴛᴇɴɪɴɢ." + ) + elif state == "disable": + await autoend_off() + await message.reply_text("❖ ᴀᴜᴛᴏ ᴇɴᴅ sᴛʀᴇᴀᴍ ᴅɪsᴀʙʟᴇᴅ.") + else: + await message.reply_text(usage) diff --git a/TanuMusic/plugins/sudo/blchat.py b/TanuMusic/plugins/sudo/blchat.py new file mode 100644 index 000000000000..13e09db14518 --- /dev/null +++ b/TanuMusic/plugins/sudo/blchat.py @@ -0,0 +1,61 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import blacklist_chat, blacklisted_chats, whitelist_chat +from TanuMusic.utils.decorators.language import language +from config import BANNED_USERS + + +@app.on_message(filters.command(["blchat", "blacklistchat"]) & SUDOERS) +@language +async def blacklist_chat_func(client, message: Message, _): + if len(message.command) != 2: + return await message.reply_text(_["black_1"]) + chat_id = int(message.text.strip().split()[1]) + if chat_id in await blacklisted_chats(): + return await message.reply_text(_["black_2"]) + blacklisted = await blacklist_chat(chat_id) + if blacklisted: + await message.reply_text(_["black_3"]) + else: + await message.reply_text(_["black_9"]) + try: + await app.leave_chat(chat_id) + except: + pass + + +@app.on_message( + filters.command(["whitelistchat", "unblacklistchat", "unblchat"]) & SUDOERS +) +@language +async def white_funciton(client, message: Message, _): + if len(message.command) != 2: + return await message.reply_text(_["black_4"]) + chat_id = int(message.text.strip().split()[1]) + if chat_id not in await blacklisted_chats(): + return await message.reply_text(_["black_5"]) + whitelisted = await whitelist_chat(chat_id) + if whitelisted: + return await message.reply_text(_["black_6"]) + await message.reply_text(_["black_9"]) + + +@app.on_message(filters.command(["blchats", "blacklistedchats"]) & ~BANNED_USERS) +@language +async def all_chats(client, message: Message, _): + text = _["black_7"] + j = 0 + for count, chat_id in enumerate(await blacklisted_chats(), 1): + try: + title = (await app.get_chat(chat_id)).title + except: + title = "ᴘʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ" + j = 1 + text += f"{count}. {title}[{chat_id}]\n" + if j == 0: + await message.reply_text(_["black_8"].format(app.mention)) + else: + await message.reply_text(text) diff --git a/TanuMusic/plugins/sudo/block.py b/TanuMusic/plugins/sudo/block.py new file mode 100644 index 000000000000..60b25e8a0474 --- /dev/null +++ b/TanuMusic/plugins/sudo/block.py @@ -0,0 +1,59 @@ +from pyrogram import filters +from pyrogram.types import Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.database import add_gban_user, remove_gban_user +from TanuMusic.utils.decorators.language import language +from TanuMusic.utils.extraction import extract_user +from config import BANNED_USERS + + +@app.on_message(filters.command(["block"]) & SUDOERS) +@language +async def useradd(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + if user.id in BANNED_USERS: + return await message.reply_text(_["block_1"].format(user.mention)) + await add_gban_user(user.id) + BANNED_USERS.add(user.id) + await message.reply_text(_["block_2"].format(user.mention)) + + +@app.on_message(filters.command(["unblock"]) & SUDOERS) +@language +async def userdel(client, message: Message, _): + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text(_["general_1"]) + user = await extract_user(message) + if user.id not in BANNED_USERS: + return await message.reply_text(_["block_3"].format(user.mention)) + await remove_gban_user(user.id) + BANNED_USERS.remove(user.id) + await message.reply_text(_["block_4"].format(user.mention)) + + +@app.on_message(filters.command(["blocked", "blockedusers", "blusers"]) & SUDOERS) +@language +async def sudoers_list(client, message: Message, _): + if not BANNED_USERS: + return await message.reply_text(_["block_5"]) + mystic = await message.reply_text(_["block_6"]) + msg = _["block_7"] + count = 0 + for users in BANNED_USERS: + try: + user = await app.get_users(users) + user = user.first_name if not user.mention else user.mention + count += 1 + except: + continue + msg += f"❖ {count} ➥ {user}\n" + if count == 0: + return await mystic.edit_text(_["block_5"]) + else: + return await mystic.edit_text(msg) diff --git a/TanuMusic/plugins/sudo/dev.py b/TanuMusic/plugins/sudo/dev.py new file mode 100644 index 000000000000..67c9c0623701 --- /dev/null +++ b/TanuMusic/plugins/sudo/dev.py @@ -0,0 +1,228 @@ +import os +import re +import subprocess +import sys +import traceback +from inspect import getfullargspec +from io import StringIO +from time import time + +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +from TanuMusic import app +from TanuMusic.misc import SUDOERS +from TanuMusic.utils.cleanmode import protect_message + + +async def aexec(code, client, message): + exec( + "async def __aexec(client, message): " + + "".join(f"\n {a}" for a in code.split("\n")) + ) + return await locals()["__aexec"](client, message) + + +async def edit_or_reply(msg: Message, **kwargs): + func = msg.edit_text if msg.from_user.is_self else msg.reply + spec = getfullargspec(func.__wrapped__).args + await func(**{k: v for k, v in kwargs.items() if k in spec}) + await protect_message(msg.chat.id, msg.id) + + +@app.on_edited_message( + filters.command(["ev", "eval"]) & SUDOERS & ~filters.forwarded & ~filters.via_bot +) +@app.on_message( + filters.command(["ev", "eval"]) & SUDOERS & ~filters.forwarded & ~filters.via_bot +) +async def executor(client: app, message: Message): + if len(message.command) < 2: + return await edit_or_reply(message, text="ᴡʜᴀᴛ ʏᴏᴜ ᴡᴀɴɴᴀ ᴇxᴇᴄᴜᴛᴇ ʙᴀʙʏ ?") + try: + cmd = message.text.split(" ", maxsplit=1)[1] + except IndexError: + return await message.delete() + t1 = time() + old_stderr = sys.stderr + old_stdout = sys.stdout + redirected_output = sys.stdout = StringIO() + redirected_error = sys.stderr = StringIO() + stdout, stderr, exc = None, None, None + try: + await aexec(cmd, client, message) + except Exception: + exc = traceback.format_exc() + stdout = redirected_output.getvalue() + stderr = redirected_error.getvalue() + sys.stdout = old_stdout + sys.stderr = old_stderr + evaluation = "\n" + if exc: + evaluation += exc + elif stderr: + evaluation += stderr + elif stdout: + evaluation += stdout + else: + evaluation += "Success" + final_output = f"⥤ ʀᴇsᴜʟᴛ :\n

W~fy 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